summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp')
-rw-r--r--Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp54
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