diff options
Diffstat (limited to 'Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp')
-rw-r--r-- | Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp | 54 |
1 files changed, 24 insertions, 30 deletions
diff --git a/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp b/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp index 496a7be59..bc9d02a27 100644 --- a/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp @@ -21,8 +21,6 @@ */ #include "config.h" - -#if ENABLE(SVG) #include "RenderSVGResourceGradient.h" #include "GradientAttributes.h" @@ -32,8 +30,8 @@ namespace WebCore { -RenderSVGResourceGradient::RenderSVGResourceGradient(SVGGradientElement& node, PassRef<RenderStyle> style) - : RenderSVGResourceContainer(node, std::move(style)) +RenderSVGResourceGradient::RenderSVGResourceGradient(SVGGradientElement& node, RenderStyle&& style) + : RenderSVGResourceContainer(node, WTFMove(style)) , m_shouldCollectGradientAttributes(true) #if USE(CG) , m_savedContext(0) @@ -48,7 +46,7 @@ void RenderSVGResourceGradient::removeAllClientsFromCache(bool markForInvalidati markAllClientsForInvalidation(markForInvalidation ? RepaintInvalidation : ParentOnlyInvalidation); } -void RenderSVGResourceGradient::removeClientFromCache(RenderObject& client, bool markForInvalidation) +void RenderSVGResourceGradient::removeClientFromCache(RenderElement& client, bool markForInvalidation) { m_gradientMap.remove(&client); markClientForInvalidation(client, markForInvalidation ? RepaintInvalidation : ParentOnlyInvalidation); @@ -57,35 +55,33 @@ void RenderSVGResourceGradient::removeClientFromCache(RenderObject& client, bool #if USE(CG) static inline bool createMaskAndSwapContextForTextGradient(GraphicsContext*& context, GraphicsContext*& savedContext, std::unique_ptr<ImageBuffer>& imageBuffer, RenderObject* object) { - RenderObject* textRootBlock = RenderSVGText::locateRenderSVGTextAncestor(object); + auto* textRootBlock = RenderSVGText::locateRenderSVGTextAncestor(*object); ASSERT(textRootBlock); - AffineTransform absoluteTransform; - SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(textRootBlock, absoluteTransform); - + AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(*textRootBlock); FloatRect repaintRect = textRootBlock->repaintRectInLocalCoordinates(); - std::unique_ptr<ImageBuffer> maskImage; - if (!SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, maskImage, ColorSpaceDeviceRGB, Unaccelerated)) + + auto maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, ColorSpaceSRGB, context->renderingMode()); + if (!maskImage) return false; - GraphicsContext* maskImageContext = maskImage->context(); - ASSERT(maskImageContext); + GraphicsContext& maskImageContext = maskImage->context(); ASSERT(maskImage); savedContext = context; - context = maskImageContext; - imageBuffer = std::move(maskImage); + context = &maskImageContext; + imageBuffer = WTFMove(maskImage); return true; } -static inline AffineTransform clipToTextMask(GraphicsContext* context, std::unique_ptr<ImageBuffer>& imageBuffer, FloatRect& targetRect, RenderObject* object, bool boundingBoxMode, const AffineTransform& gradientTransform) +static inline AffineTransform clipToTextMask(GraphicsContext& context, std::unique_ptr<ImageBuffer>& imageBuffer, FloatRect& targetRect, RenderObject* object, bool boundingBoxMode, const AffineTransform& gradientTransform) { - RenderObject* textRootBlock = RenderSVGText::locateRenderSVGTextAncestor(object); + auto* textRootBlock = RenderSVGText::locateRenderSVGTextAncestor(*object); ASSERT(textRootBlock); - AffineTransform absoluteTransform; - SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(textRootBlock, absoluteTransform); + AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(*textRootBlock); targetRect = textRootBlock->repaintRectInLocalCoordinates(); + SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, targetRect, imageBuffer, false); AffineTransform matrix; @@ -122,9 +118,9 @@ bool RenderSVGResourceGradient::applyResource(RenderElement& renderer, const Ren if (gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && objectBoundingBox.isEmpty()) return false; - OwnPtr<GradientData>& gradientData = m_gradientMap.add(&renderer, nullptr).iterator->value; + auto& gradientData = m_gradientMap.add(&renderer, nullptr).iterator->value; if (!gradientData) - gradientData = adoptPtr(new GradientData); + gradientData = std::make_unique<GradientData>(); bool isPaintingText = resourceMode & ApplyToTextMode; @@ -152,7 +148,7 @@ bool RenderSVGResourceGradient::applyResource(RenderElement& renderer, const Ren // Depending on font scaling factor, we may need to rescale the gradient here since // text painting removes the scale factor from the context. AffineTransform additionalTextTransform; - if (shouldTransformOnTextPainting(&renderer, additionalTextTransform)) + if (shouldTransformOnTextPainting(renderer, additionalTextTransform)) gradientData->userspaceTransform *= additionalTextTransform; } gradientData->gradient->setGradientSpaceTransform(gradientData->userspaceTransform); @@ -179,13 +175,13 @@ bool RenderSVGResourceGradient::applyResource(RenderElement& renderer, const Ren if (resourceMode & ApplyToFillMode) { context->setAlpha(svgStyle.fillOpacity()); - context->setFillGradient(gradientData->gradient); + context->setFillGradient(*gradientData->gradient); context->setFillRule(svgStyle.fillRule()); } else if (resourceMode & ApplyToStrokeMode) { if (svgStyle.vectorEffect() == VE_NON_SCALING_STROKE) gradientData->gradient->setGradientSpaceTransform(transformOnNonScalingStroke(&renderer, gradientData->userspaceTransform)); context->setAlpha(svgStyle.strokeOpacity()); - context->setStrokeGradient(gradientData->gradient); + context->setStrokeGradient(*gradientData->gradient); SVGRenderSupport::applyStrokeStyleToContext(context, style, renderer); } @@ -210,8 +206,8 @@ void RenderSVGResourceGradient::postApplyResource(RenderElement& renderer, Graph calculateGradientTransform(gradientTransform); FloatRect targetRect; - gradientData->gradient->setGradientSpaceTransform(clipToTextMask(context, m_imageBuffer, targetRect, &renderer, gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX, gradientTransform)); - context->setFillGradient(gradientData->gradient); + gradientData->gradient->setGradientSpaceTransform(clipToTextMask(*context, m_imageBuffer, targetRect, &renderer, gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX, gradientTransform)); + context->setFillGradient(*gradientData->gradient); context->fillRect(targetRect); m_imageBuffer.reset(); @@ -224,13 +220,13 @@ void RenderSVGResourceGradient::postApplyResource(RenderElement& renderer, Graph if (path) context->fillPath(*path); else if (shape) - shape->fillShape(context); + shape->fillShape(*context); } if (resourceMode & ApplyToStrokeMode) { if (path) context->strokePath(*path); else if (shape) - shape->strokeShape(context); + shape->strokeShape(*context); } } @@ -263,5 +259,3 @@ GradientSpreadMethod RenderSVGResourceGradient::platformSpreadMethodFromSVGType( } } - -#endif |