SVGPaintServerPatternCg.cpp [plain text]
#include "config.h"
#if ENABLE(SVG)
#include "SVGPaintServerPattern.h"
#include "CgSupport.h"
#include "GraphicsContext.h"
#include "ImageBuffer.h"
#include "RenderObject.h"
#include "SVGPatternElement.h"
namespace WebCore {
static void patternCallback(void* info, CGContextRef context)
{
ImageBuffer* patternImage = reinterpret_cast<ImageBuffer*>(info);
CGContextDrawImage(context, CGRect(FloatRect(FloatPoint(), patternImage->size())), patternImage->cgImage());
}
bool SVGPaintServerPattern::setup(GraphicsContext*& context, const RenderObject* object, SVGPaintTargetType type, bool isPaintingText) const
{
CGContextRef contextRef = context->platformContext();
FloatRect targetRect;
if (isPaintingText) {
IntRect textBoundary = const_cast<RenderObject*>(object)->absoluteBoundingBoxRect();
targetRect = object->absoluteTransform().inverse().mapRect(textBoundary);
} else
targetRect = object->relativeBBox(false);
m_ownerElement->buildPattern(targetRect);
if (!tile())
return false;
context->save();
context->concatCTM(patternTransform());
context->translate(patternBoundaries().x(), patternBoundaries().y());
CGContextSetPatternPhase(contextRef, CGSizeMake(0.0f, -0.01f));
RenderStyle* style = object->style();
CGContextSetAlpha(contextRef, style->opacity());
CGPatternCallbacks callbacks = {0, patternCallback, 0};
ASSERT(!m_pattern);
m_pattern = CGPatternCreate(tile(),
CGRect(FloatRect(FloatPoint(), tile()->size())),
CGContextGetCTM(contextRef),
patternBoundaries().width(),
patternBoundaries().height(),
kCGPatternTilingConstantSpacing,
true, &callbacks);
if (!m_patternSpace)
m_patternSpace = CGColorSpaceCreatePattern(0);
if ((type & ApplyToFillTargetType) && style->svgStyle()->hasFill()) {
CGFloat alpha = style->svgStyle()->fillOpacity();
CGContextSetFillColorSpace(contextRef, m_patternSpace);
CGContextSetFillPattern(contextRef, m_pattern, &alpha);
if (isPaintingText)
context->setTextDrawingMode(cTextFill);
}
if ((type & ApplyToStrokeTargetType) && style->svgStyle()->hasStroke()) {
CGFloat alpha = style->svgStyle()->strokeOpacity();
CGContextSetStrokeColorSpace(contextRef, m_patternSpace);
CGContextSetStrokePattern(contextRef, m_pattern, &alpha);
applyStrokeStyleToContext(context, style, object);
if (isPaintingText)
context->setTextDrawingMode(cTextStroke);
}
return true;
}
void SVGPaintServerPattern::teardown(GraphicsContext*& context, const RenderObject*, SVGPaintTargetType, bool) const
{
CGPatternRelease(m_pattern);
m_pattern = 0;
context->restore();
}
}
#endif