Changeset 65229 in webkit
- Timestamp:
- Aug 12, 2010 3:11:08 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 7 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r65226 r65229 1 2010-08-12 Nikolas Zimmermann <nzimmermann@rim.com> 2 3 Reviewed by Dirk Schulze. 4 5 SVG masking performance very slow 6 https://bugs.webkit.org/show_bug.cgi?id=43622 7 8 Update mask results, now that mask image buffers are as big as the finaled rendered size on screen. 9 Add new test covering zooming into masks, to show that it doesn't pixelate anymore. 10 11 * platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.checksum: 12 * platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png: 13 * platform/mac/svg/batik/masking/maskRegions-expected.checksum: 14 * platform/mac/svg/batik/masking/maskRegions-expected.png: 15 * platform/mac/svg/custom/grayscale-gradient-mask-expected.checksum: 16 * platform/mac/svg/custom/grayscale-gradient-mask-expected.png: 17 * platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.checksum: Added. 18 * platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png: Added. 19 * platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.txt: Added. 20 * svg/zoom/page/zoom-mask-with-percentages.svg: Added. 21 1 22 2010-07-14 Marcus Bulach <bulach@chromium.org> 2 23 -
trunk/LayoutTests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.checksum
r57511 r65229 1 12ac53d50854581aa61d0a7b692d688e1 62a68fa8de7ea652f54ced5930397a1e -
trunk/LayoutTests/platform/mac/svg/batik/masking/maskRegions-expected.checksum
r52449 r65229 1 367e3619b5c94ebd2bc6d7a884c5fde1 1 c8563205e30594d271e4f9ca61aa1817 -
trunk/LayoutTests/platform/mac/svg/custom/grayscale-gradient-mask-expected.checksum
r53197 r65229 1 86c9087a83ecdd5b74c9a4a877f643db 1 63c76778f56ccf67c8ad2e82f15dc4e4 -
trunk/WebCore/Android.mk
r65228 r65229 691 691 rendering/SVGCharacterData.cpp \ 692 692 rendering/SVGCharacterLayoutInfo.cpp \ 693 rendering/SVGImageBufferTools.cpp \ 693 694 rendering/SVGInlineFlowBox.cpp \ 694 695 rendering/SVGInlineTextBox.cpp \ -
trunk/WebCore/CMakeLists.txt
r65228 r65229 1583 1583 rendering/SVGCharacterData.cpp 1584 1584 rendering/SVGCharacterLayoutInfo.cpp 1585 rendering/SVGImageBufferTools.cpp 1585 1586 rendering/SVGInlineFlowBox.cpp 1586 1587 rendering/SVGInlineTextBox.cpp -
trunk/WebCore/ChangeLog
r65228 r65229 1 2010-08-12 Nikolas Zimmermann <nzimmermann@rim.com> 2 3 Reviewed by Dirk Schulze. 4 5 SVG masking performance very slow 6 https://bugs.webkit.org/show_bug.cgi?id=43622 7 8 Create ImageBuffers only as large as the final rendered size on screen. Only gradient on text on CG handled this correctly so far. 9 Refactored the code into a new SVGImageBufferTools class, and use the code from RenderSVGResourceMasker -> makes the IE9 demo SVG dice usable. 10 Clippers, Patterns and Filters remain to be converted. 11 12 Test: svg/zoom/page/zoom-mask-with-percentages.svg 13 14 * Android.mk: Add SVGImageBufferTools.* to build. 15 * CMakeLists.txt: Ditto. 16 * GNUmakefile.am: Ditto. 17 * WebCore.gypi: Ditto. 18 * WebCore.pro: Ditto. 19 * WebCore.xcodeproj/project.pbxproj: Ditto. 20 * rendering/RenderSVGAllInOne.cpp: Ditto. 21 * rendering/RenderSVGResourceGradient.cpp: Refactored CG gradient specific "create image buffer in absolute coordinates" code into SVGImageBufferTools class. 22 (WebCore::createMaskAndSwapContextForTextGradient): 23 (WebCore::clipToTextMask): 24 (WebCore::RenderSVGResourceGradient::applyResource): 25 * rendering/RenderSVGResourceMasker.cpp: Use new SVGImageBufferTools class, to avoid pixelation when zooming and to create image buffers as big as the final rendered size on screen, not more. 26 (WebCore::RenderSVGResourceMasker::invalidateClients): 27 (WebCore::RenderSVGResourceMasker::applyResource): 28 (WebCore::RenderSVGResourceMasker::drawContentIntoMaskImage): 29 (WebCore::RenderSVGResourceMasker::calculateMaskContentRepaintRect): 30 (WebCore::RenderSVGResourceMasker::resourceBoundingBox): 31 * rendering/RenderSVGResourceMasker.h: 32 * rendering/SVGImageBufferTools.cpp: Added. 33 (WebCore::SVGImageBufferTools::absoluteTransformFromContext): 34 (WebCore::SVGImageBufferTools::createImageBuffer): 35 (WebCore::SVGImageBufferTools::clipToImageBuffer): 36 * rendering/SVGImageBufferTools.h: Added. 37 (WebCore::SVGImageBufferTools::SVGImageBufferTools): 38 (WebCore::SVGImageBufferTools::~SVGImageBufferTools): 39 1 40 2010-08-10 Jeremy Orlow <jorlow@chromium.org> 2 41 -
trunk/WebCore/GNUmakefile.am
r65228 r65229 3873 3873 WebCore/rendering/SVGInlineFlowBox.cpp \ 3874 3874 WebCore/rendering/SVGInlineFlowBox.h \ 3875 WebCore/rendering/SVGImageBufferTools.cpp \ 3876 WebCore/rendering/SVGImageBufferTools.h \ 3875 3877 WebCore/rendering/SVGInlineTextBox.cpp \ 3876 3878 WebCore/rendering/SVGInlineTextBox.h \ -
trunk/WebCore/WebCore.gypi
r65228 r65229 3447 3447 'rendering/SVGInlineFlowBox.cpp', 3448 3448 'rendering/SVGInlineFlowBox.h', 3449 'rendering/SVGImageBufferTools.cpp', 3450 'rendering/SVGImageBufferTools.h', 3449 3451 'rendering/SVGInlineTextBox.cpp', 3450 3452 'rendering/SVGInlineTextBox.h', -
trunk/WebCore/WebCore.pro
r65228 r65229 1919 1919 rendering/SVGCharacterData.h \ 1920 1920 rendering/SVGCharacterLayoutInfo.h \ 1921 rendering/SVGImageBufferTools.h \ 1921 1922 rendering/SVGInlineFlowBox.h \ 1922 1923 rendering/SVGInlineTextBox.h \ … … 2972 2973 rendering/SVGCharacterData.cpp \ 2973 2974 rendering/SVGCharacterLayoutInfo.cpp \ 2975 rendering/SVGImageBufferTools.cpp \ 2974 2976 rendering/SVGInlineFlowBox.cpp \ 2975 2977 rendering/SVGInlineTextBox.cpp \ -
trunk/WebCore/WebCore.xcodeproj/project.pbxproj
r65228 r65229 180 180 08C34AFD1179C072002D7456 /* RenderSVGResourceRadialGradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08C34AFB1179C072002D7456 /* RenderSVGResourceRadialGradient.cpp */; }; 181 181 08C34AFE1179C072002D7456 /* RenderSVGResourceRadialGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 08C34AFC1179C072002D7456 /* RenderSVGResourceRadialGradient.h */; }; 182 08C46B691212F15E0011AF40 /* SVGImageBufferTools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08C46B671212F15D0011AF40 /* SVGImageBufferTools.cpp */; }; 183 08C46B6A1212F15E0011AF40 /* SVGImageBufferTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 08C46B681212F15D0011AF40 /* SVGImageBufferTools.h */; }; 182 184 08C4C5180EF19A4000E4840F /* WMLImageElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08C4C5140EF19A4000E4840F /* WMLImageElement.cpp */; }; 183 185 08C4C5190EF19A4000E4840F /* WMLImageElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 08C4C5150EF19A4000E4840F /* WMLImageElement.h */; }; … … 5887 5889 08C34AFB1179C072002D7456 /* RenderSVGResourceRadialGradient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGResourceRadialGradient.cpp; sourceTree = "<group>"; }; 5888 5890 08C34AFC1179C072002D7456 /* RenderSVGResourceRadialGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGResourceRadialGradient.h; sourceTree = "<group>"; }; 5891 08C46B671212F15D0011AF40 /* SVGImageBufferTools.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGImageBufferTools.cpp; sourceTree = "<group>"; }; 5892 08C46B681212F15D0011AF40 /* SVGImageBufferTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGImageBufferTools.h; sourceTree = "<group>"; }; 5889 5893 08C4C5140EF19A4000E4840F /* WMLImageElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WMLImageElement.cpp; sourceTree = "<group>"; }; 5890 5894 08C4C5150EF19A4000E4840F /* WMLImageElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLImageElement.h; sourceTree = "<group>"; }; … … 17091 17095 B2B33A5D0B887CEF00C15984 /* SVGCharacterLayoutInfo.cpp */, 17092 17096 B2B33A5E0B887CEF00C15984 /* SVGCharacterLayoutInfo.h */, 17097 08C46B671212F15D0011AF40 /* SVGImageBufferTools.cpp */, 17098 08C46B681212F15D0011AF40 /* SVGImageBufferTools.h */, 17093 17099 853CA9E20AEEC608002372DC /* SVGInlineFlowBox.cpp */, 17094 17100 853CA9E30AEEC608002372DC /* SVGInlineFlowBox.h */, … … 20142 20148 97DD4D870FDF4D6E00ECF9A4 /* XSSAuditor.h in Headers */, 20143 20149 CE172E011136E8CE0062A533 /* ZoomMode.h in Headers */, 20150 08C46B6A1212F15E0011AF40 /* SVGImageBufferTools.h in Headers */, 20144 20151 7AB0B1C11211A62200A76940 /* InspectorStorageAgent.h in Headers */, 20145 20152 2EED575312109ED0007656BB /* BlobRegistryImpl.h in Headers */, … … 22569 22576 E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */, 22570 22577 97DD4D860FDF4D6E00ECF9A4 /* XSSAuditor.cpp in Sources */, 22578 08C46B691212F15E0011AF40 /* SVGImageBufferTools.cpp in Sources */, 22571 22579 7AB0B1C01211A62200A76940 /* InspectorStorageAgent.cpp in Sources */, 22572 22580 2EED575212109ED0007656BB /* BlobRegistryImpl.cpp in Sources */, -
trunk/WebCore/rendering/RenderSVGAllInOne.cpp
r64196 r65229 54 54 #include "SVGCharacterData.cpp" 55 55 #include "SVGCharacterLayoutInfo.cpp" 56 #include "SVGImageBufferTools.cpp" 56 57 #include "SVGInlineFlowBox.cpp" 57 58 #include "SVGInlineTextBox.cpp" -
trunk/WebCore/rendering/RenderSVGResourceGradient.cpp
r64275 r65229 29 29 #include "GradientAttributes.h" 30 30 #include "GraphicsContext.h" 31 #include "SVGImageBufferTools.h" 31 32 #include "SVGRenderSupport.h" 32 33 #include <wtf/UnusedParam.h> … … 73 74 74 75 #if PLATFORM(CG) 75 static inline AffineTransform absoluteTransformFromContext(GraphicsContext* context)76 {77 // Extract current transformation matrix used in the original context. Note that this coordinate78 // system is flipped compared to SVGs internal coordinate system, done in WebKit level. Fix79 // this transformation by flipping the y component.80 return context->getCTM() * AffineTransform().flipY();81 }82 83 76 static inline bool createMaskAndSwapContextForTextGradient(GraphicsContext*& context, 84 77 GraphicsContext*& savedContext, … … 87 80 { 88 81 const RenderObject* textRootBlock = SVGRenderSupport::findTextRootObject(object); 89 90 AffineTransform transform(absoluteTransformFromContext(context)); 91 FloatRect maskAbsoluteBoundingBox = transform.mapRect(textRootBlock->repaintRectInLocalCoordinates()); 92 93 IntRect maskImageRect = enclosingIntRect(maskAbsoluteBoundingBox); 94 if (maskImageRect.isEmpty()) 82 ASSERT(textRootBlock); 83 84 AffineTransform absoluteTransform(SVGImageBufferTools::absoluteTransformFromContext(context)); 85 FloatRect absoluteTargetRect = absoluteTransform.mapRect(textRootBlock->repaintRectInLocalCoordinates()); 86 87 OwnPtr<ImageBuffer> maskImage; 88 if (!SVGImageBufferTools::createImageBuffer(context, absoluteTransform, absoluteTargetRect, maskImage, DeviceRGB)) 95 89 return false; 96 90 97 // Allocate an image buffer as big as the absolute unclipped size of the object 98 OwnPtr<ImageBuffer> maskImage = ImageBuffer::create(maskImageRect.size()); 99 if (!maskImage) 100 return false; 101 102 GraphicsContext* maskImageContext = maskImage->context(); 103 104 // Transform the mask image coordinate system to absolute screen coordinates 105 maskImageContext->translate(-maskAbsoluteBoundingBox.x(), -maskAbsoluteBoundingBox.y()); 106 maskImageContext->concatCTM(transform); 107 91 ASSERT(maskImage); 92 savedContext = context; 93 context = maskImage->context(); 108 94 imageBuffer = maskImage.release(); 109 savedContext = context;110 context = maskImageContext;111 112 95 return true; 113 96 } … … 115 98 static inline AffineTransform clipToTextMask(GraphicsContext* context, 116 99 OwnPtr<ImageBuffer>& imageBuffer, 100 FloatRect& repaintRect, 117 101 const RenderObject* object, 118 102 GradientData* gradientData) 119 103 { 120 104 const RenderObject* textRootBlock = SVGRenderSupport::findTextRootObject(object); 121 122 // The mask image has been created in the device coordinate space, as the image should not be scaled. 123 // So the actual masking process has to be done in the device coordinate space as well. 124 AffineTransform transform(absoluteTransformFromContext(context)); 125 context->concatCTM(transform.inverse()); 126 context->clipToImageBuffer(transform.mapRect(textRootBlock->repaintRectInLocalCoordinates()), imageBuffer.get()); 127 context->concatCTM(transform); 105 ASSERT(textRootBlock); 106 107 repaintRect = textRootBlock->repaintRectInLocalCoordinates(); 108 109 AffineTransform absoluteTransform(SVGImageBufferTools::absoluteTransformFromContext(context)); 110 FloatRect absoluteTargetRect = absoluteTransform.mapRect(repaintRect); 111 112 SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, absoluteTargetRect, imageBuffer.get()); 128 113 129 114 AffineTransform matrix; … … 233 218 m_savedContext = 0; 234 219 235 gradientData->gradient->setGradientSpaceTransform(clipToTextMask(context, m_imageBuffer, object, gradientData)); 220 FloatRect repaintRect; 221 gradientData->gradient->setGradientSpaceTransform(clipToTextMask(context, m_imageBuffer, repaintRect, object, gradientData)); 236 222 context->setFillGradient(gradientData->gradient); 237 223 238 const RenderObject* textRootBlock = SVGRenderSupport::findTextRootObject(object); 239 context->fillRect(textRootBlock->repaintRectInLocalCoordinates()); 240 224 context->fillRect(repaintRect); 241 225 m_imageBuffer.clear(); 242 226 } -
trunk/WebCore/rendering/RenderSVGResourceMasker.cpp
r64275 r65229 36 36 #include "RenderSVGResource.h" 37 37 #include "SVGElement.h" 38 #include "SVGImageBufferTools.h" 38 39 #include "SVGMaskElement.h" 39 40 #include "SVGStyledElement.h" … … 62 63 void RenderSVGResourceMasker::invalidateClients() 63 64 { 64 m_mask Boundaries = FloatRect();65 m_maskContentBoundaries = FloatRect(); 65 66 if (!m_masker.isEmpty()) { 66 67 deleteAllValues(m_masker); … … 96 97 97 98 MaskerData* maskerData = m_masker.get(object); 98 if (!maskerData->maskImage && !maskerData->emptyMask) { 99 100 AffineTransform absoluteTransform(SVGImageBufferTools::absoluteTransformFromContext(context)); 101 FloatRect maskRect = absoluteTransform.mapRect(object->repaintRectInLocalCoordinates()); 102 103 if (!maskerData->maskImage && !maskRect.isEmpty()) { 99 104 SVGMaskElement* maskElement = static_cast<SVGMaskElement*>(node()); 100 105 if (!maskElement) 101 106 return false; 102 createMaskImage(maskerData, maskElement, object); 107 108 if (!SVGImageBufferTools::createImageBuffer(context, absoluteTransform, maskRect, maskerData->maskImage, LinearRGB)) 109 return false; 110 111 ASSERT(maskerData->maskImage); 112 drawContentIntoMaskImage(maskRect, maskerData, maskElement, object); 103 113 } 104 114 … … 106 116 return false; 107 117 108 context->clipToImageBuffer(maskerData->maskRect, maskerData->maskImage.get());118 SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, maskRect, maskerData->maskImage.get()); 109 119 return true; 110 120 } 111 121 112 void RenderSVGResourceMasker::createMaskImage(MaskerData* maskerData, const SVGMaskElement* maskElement, RenderObject* object) 113 { 114 FloatRect objectBoundingBox = object->objectBoundingBox(); 115 116 // Mask rect clipped with clippingBoundingBox and filterBoundingBox as long as they are present. 117 maskerData->maskRect = object->repaintRectInLocalCoordinates(); 118 if (maskerData->maskRect.isEmpty()) { 119 maskerData->emptyMask = true; 120 return; 121 } 122 123 if (m_maskBoundaries.isEmpty()) 124 calculateMaskContentRepaintRect(); 125 126 FloatRect repaintRect = m_maskBoundaries; 127 AffineTransform contextTransform; 128 // We need to scale repaintRect for objectBoundingBox to get the drawing area. 122 void RenderSVGResourceMasker::drawContentIntoMaskImage(const FloatRect& maskRect, MaskerData* maskerData, const SVGMaskElement* maskElement, RenderObject* object) 123 { 124 IntRect maskImageRect = enclosingIntRect(maskRect); 125 maskImageRect.setLocation(IntPoint()); 126 127 // Eventually adjust the mask image context according to the target objectBoundingBox. 129 128 if (maskElement->maskContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { 129 GraphicsContext* maskImageContext = maskerData->maskImage->context(); 130 ASSERT(maskImageContext); 131 132 FloatRect objectBoundingBox = object->objectBoundingBox(); 133 AffineTransform contextTransform; 134 contextTransform.translate(objectBoundingBox.x(), objectBoundingBox.y()); 130 135 contextTransform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height()); 131 FloatPoint contextAdjustment = repaintRect.location(); 132 repaintRect = contextTransform.mapRect(repaintRect); 133 repaintRect.move(objectBoundingBox.x(), objectBoundingBox.y()); 134 contextTransform.translate(-contextAdjustment.x(), -contextAdjustment.y()); 135 } 136 repaintRect.intersect(maskerData->maskRect); 137 maskerData->maskRect = repaintRect; 138 IntRect maskImageRect = enclosingIntRect(maskerData->maskRect); 139 140 maskImageRect.setLocation(IntPoint()); 141 142 // Don't create ImageBuffers with image size of 0 143 if (maskImageRect.isEmpty()) { 144 maskerData->emptyMask = true; 145 return; 146 } 147 148 // FIXME: This changes color space to linearRGB, the default color space 149 // for masking operations in SVG. We need a switch for the other color-space 150 // attribute values sRGB, inherit and auto. 151 maskerData->maskImage = ImageBuffer::create(maskImageRect.size(), LinearRGB); 152 if (!maskerData->maskImage) 153 return; 154 155 GraphicsContext* maskImageContext = maskerData->maskImage->context(); 156 ASSERT(maskImageContext); 157 158 maskImageContext->save(); 159 160 if (maskElement->maskContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE) 161 maskImageContext->translate(-maskerData->maskRect.x(), -maskerData->maskRect.y()); 162 maskImageContext->concatCTM(contextTransform); 163 164 // draw the content into the ImageBuffer 136 maskImageContext->concatCTM(contextTransform); 137 } 138 139 // Draw the content into the ImageBuffer. 165 140 for (Node* node = maskElement->firstChild(); node; node = node->nextSibling()) { 166 141 RenderObject* renderer = node->renderer(); … … 173 148 } 174 149 175 maskImageContext->restore();176 177 150 #if !PLATFORM(CG) 178 151 maskerData->maskImage->transformColorSpace(DeviceRGB, LinearRGB); … … 207 180 if (!style || style->display() == NONE || style->visibility() != VISIBLE) 208 181 continue; 209 m_mask Boundaries.unite(renderer->localToParentTransform().mapRect(renderer->repaintRectInLocalCoordinates()));182 m_maskContentBoundaries.unite(renderer->localToParentTransform().mapRect(renderer->repaintRectInLocalCoordinates())); 210 183 } 211 184 } … … 213 186 FloatRect RenderSVGResourceMasker::resourceBoundingBox(RenderObject* object) 214 187 { 215 // Resource was not layouted yet. Give back clipping rect of the mask.216 188 SVGMaskElement* maskElement = static_cast<SVGMaskElement*>(node()); 189 ASSERT(maskElement); 190 217 191 FloatRect objectBoundingBox = object->objectBoundingBox(); 218 192 FloatRect maskBoundaries = maskElement->maskBoundingBox(objectBoundingBox); 193 194 // Resource was not layouted yet. Give back clipping rect of the mask. 219 195 if (selfNeedsLayout()) 220 196 return maskBoundaries; 221 197 222 if (m_mask Boundaries.isEmpty())198 if (m_maskContentBoundaries.isEmpty()) 223 199 calculateMaskContentRepaintRect(); 224 200 225 if (!maskElement) 226 return FloatRect(); 227 228 FloatRect maskRect = m_maskBoundaries; 201 FloatRect maskRect = m_maskContentBoundaries; 229 202 if (maskElement->maskContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { 230 203 AffineTransform transform; 231 204 transform.translate(objectBoundingBox.x(), objectBoundingBox.y()); 232 205 transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height()); 233 maskRect = 206 maskRect = transform.mapRect(maskRect); 234 207 } 235 208 -
trunk/WebCore/rendering/RenderSVGResourceMasker.h
r64275 r65229 37 37 38 38 struct MaskerData { 39 MaskerData()40 : emptyMask(false)41 {42 }43 44 39 OwnPtr<ImageBuffer> maskImage; 45 FloatRect maskRect;46 bool emptyMask;47 40 }; 48 41 … … 67 60 68 61 private: 69 void createMaskImage(MaskerData*, const SVGMaskElement*, RenderObject*);62 void drawContentIntoMaskImage(const FloatRect& maskRect, MaskerData*, const SVGMaskElement*, RenderObject*); 70 63 void calculateMaskContentRepaintRect(); 71 64 72 FloatRect m_mask Boundaries;65 FloatRect m_maskContentBoundaries; 73 66 HashMap<RenderObject*, MaskerData*> m_masker; 74 67 };
Note: See TracChangeset
for help on using the changeset viewer.