diff options
Diffstat (limited to 'Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp')
-rw-r--r-- | Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp b/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp index e02fab47b..f0d6744c0 100644 --- a/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp @@ -18,8 +18,6 @@ */ #include "config.h" - -#if ENABLE(SVG) #include "RenderSVGResourceMasker.h" #include "Element.h" @@ -31,10 +29,8 @@ namespace WebCore { -RenderSVGResourceType RenderSVGResourceMasker::s_resourceType = MaskerResourceType; - -RenderSVGResourceMasker::RenderSVGResourceMasker(SVGMaskElement& element, PassRef<RenderStyle> style) - : RenderSVGResourceContainer(element, std::move(style)) +RenderSVGResourceMasker::RenderSVGResourceMasker(SVGMaskElement& element, RenderStyle&& style) + : RenderSVGResourceContainer(element, WTFMove(style)) { } @@ -50,7 +46,7 @@ void RenderSVGResourceMasker::removeAllClientsFromCache(bool markForInvalidation markAllClientsForInvalidation(markForInvalidation ? LayoutAndBoundariesInvalidation : ParentOnlyInvalidation); } -void RenderSVGResourceMasker::removeClientFromCache(RenderObject& client, bool markForInvalidation) +void RenderSVGResourceMasker::removeClientFromCache(RenderElement& client, bool markForInvalidation) { m_masker.remove(&client); @@ -67,34 +63,31 @@ bool RenderSVGResourceMasker::applyResource(RenderElement& renderer, const Rende m_masker.set(&renderer, std::make_unique<MaskerData>()); MaskerData* maskerData = m_masker.get(&renderer); - - AffineTransform absoluteTransform; - SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(&renderer, absoluteTransform); - + AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer); FloatRect repaintRect = renderer.repaintRectInLocalCoordinates(); if (!maskerData->maskImage && !repaintRect.isEmpty()) { const SVGRenderStyle& svgStyle = style().svgStyle(); - ColorSpace colorSpace = svgStyle.colorInterpolation() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB; - if (!SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, maskerData->maskImage, colorSpace, Unaccelerated)) + ColorSpace colorSpace = svgStyle.colorInterpolation() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceSRGB; + // FIXME (149470): This image buffer should not be unconditionally unaccelerated. Making it match the context breaks alpha masking, though. + maskerData->maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, colorSpace, Unaccelerated); + if (!maskerData->maskImage) return false; - if (!drawContentIntoMaskImage(maskerData, colorSpace, &renderer)) { + if (!drawContentIntoMaskImage(maskerData, colorSpace, &renderer)) maskerData->maskImage.reset(); - } } if (!maskerData->maskImage) return false; - SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, repaintRect, maskerData->maskImage, missingMaskerData); + SVGRenderingContext::clipToImageBuffer(*context, absoluteTransform, repaintRect, maskerData->maskImage, missingMaskerData); return true; } bool RenderSVGResourceMasker::drawContentIntoMaskImage(MaskerData* maskerData, ColorSpace colorSpace, RenderObject* object) { - GraphicsContext* maskImageContext = maskerData->maskImage->context(); - ASSERT(maskImageContext); + GraphicsContext& maskImageContext = maskerData->maskImage->context(); // Eventually adjust the mask image context according to the target objectBoundingBox. AffineTransform maskContentTransformation; @@ -102,7 +95,7 @@ bool RenderSVGResourceMasker::drawContentIntoMaskImage(MaskerData* maskerData, C FloatRect objectBoundingBox = object->objectBoundingBox(); maskContentTransformation.translate(objectBoundingBox.x(), objectBoundingBox.y()); maskContentTransformation.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height()); - maskImageContext->concatCTM(maskContentTransformation); + maskImageContext.concatCTM(maskContentTransformation); } // Draw the content into the ImageBuffer. @@ -169,5 +162,3 @@ FloatRect RenderSVGResourceMasker::resourceBoundingBox(const RenderObject& objec } } - -#endif // ENABLE(SVG) |