Changeset 52580 in webkit
- Timestamp:
- Dec 27, 2009 9:08:50 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 34 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r52578 r52580 1 2009-12-27 Dirk Schulze <krit@webkit.org> 2 3 Reviewed by Nikolas Zimmermann. 4 5 SVG Mask result wrong, if two different objects call the same mask id 6 https://bugs.webkit.org/show_bug.cgi?id=32787 7 8 Two rects with different sizes and positions call the same mask id. Both 9 rects should be masked to two circles, dependent on the properties of the 10 rects. 11 12 * platform/mac/svg/custom/mask-on-multiple-objects-expected.checksum: Added. 13 * platform/mac/svg/custom/mask-on-multiple-objects-expected.png: Added. 14 * platform/mac/svg/custom/mask-on-multiple-objects-expected.txt: Added. 15 * svg/custom/mask-on-multiple-objects.svg: Added. 16 1 17 2009-12-27 Csaba Osztrogonác <ossy@webkit.org> 2 18 -
trunk/WebCore/ChangeLog
r52579 r52580 1 2009-12-27 Dirk Schulze <krit@webkit.org> 2 3 Reviewed by Nikolas Zimmermann. 4 5 SVG Mask result wrong, if two different objects call the same mask id 6 https://bugs.webkit.org/show_bug.cgi?id=32787 7 8 At the moment we create one resource per maskId. Some resources (like mask) 9 create ImageBuffers and depends on the properties of the RenderObject, 10 thus we can't use it for a second object. 11 This patch stores multiple mask resources for one maskId and different 12 RenderObject can use the same maskId. 13 Clipper, Filter and Patterns also need to store multiple resources later. 14 15 Test: svg/custom/mask-on-multiple-objects.svg 16 17 * rendering/RenderPath.cpp: 18 (WebCore::RenderPath::drawMarkersIfNeeded): 19 * rendering/RenderSVGContainer.cpp: 20 (WebCore::RenderSVGContainer::selfWillPaint): 21 * rendering/RenderSVGGradientStop.cpp: 22 (WebCore::RenderSVGGradientStop::styleDidChange): 23 * rendering/RenderSVGRoot.cpp: 24 (WebCore::RenderSVGRoot::selfWillPaint): 25 * rendering/SVGRenderSupport.cpp: 26 (WebCore::SVGRenderBase::prepareToRenderSVGContent): 27 (WebCore::SVGRenderBase::filterBoundingBoxForRenderer): 28 * rendering/SVGRenderTreeAsText.cpp: 29 (WebCore::writeRenderResources): 30 * svg/SVGClipPathElement.cpp: 31 (WebCore::SVGClipPathElement::canvasResource): 32 * svg/SVGClipPathElement.h: 33 * svg/SVGFilterElement.cpp: 34 (WebCore::SVGFilterElement::canvasResource): 35 * svg/SVGFilterElement.h: 36 * svg/SVGGradientElement.cpp: 37 (WebCore::SVGGradientElement::canvasResource): 38 * svg/SVGGradientElement.h: 39 * svg/SVGMarkerElement.cpp: 40 (WebCore::SVGMarkerElement::canvasResource): 41 * svg/SVGMarkerElement.h: 42 * svg/SVGMaskElement.cpp: 43 (WebCore::SVGMaskElement::svgAttributeChanged): 44 (WebCore::SVGMaskElement::childrenChanged): 45 (WebCore::SVGMaskElement::canvasResource): 46 * svg/SVGMaskElement.h: 47 * svg/SVGPatternElement.cpp: 48 (WebCore::SVGPatternElement::canvasResource): 49 * svg/SVGPatternElement.h: 50 * svg/SVGStyledElement.cpp: 51 (WebCore::SVGStyledElement::invalidateResourcesInAncestorChain): 52 * svg/SVGStyledElement.h: 53 (WebCore::SVGStyledElement::canvasResource): 54 * svg/graphics/SVGPaintServer.cpp: 55 (WebCore::getPaintServerById): 56 (WebCore::SVGPaintServer::fillPaintServer): 57 (WebCore::SVGPaintServer::strokePaintServer): 58 * svg/graphics/SVGPaintServer.h: 59 * svg/graphics/SVGResource.cpp: 60 (WebCore::getResourceById): 61 * svg/graphics/SVGResource.h: 62 * svg/graphics/SVGResourceClipper.cpp: 63 (WebCore::getClipperById): 64 * svg/graphics/SVGResourceClipper.h: 65 * svg/graphics/SVGResourceFilter.cpp: 66 (WebCore::getFilterById): 67 * svg/graphics/SVGResourceFilter.h: 68 * svg/graphics/SVGResourceMarker.cpp: 69 (WebCore::getMarkerById): 70 * svg/graphics/SVGResourceMarker.h: 71 * svg/graphics/SVGResourceMasker.cpp: 72 (WebCore::getMaskerById): 73 * svg/graphics/SVGResourceMasker.h: 74 1 75 2009-12-27 Nikolas Zimmermann <nzimmermann@rim.com> 2 76 -
trunk/WebCore/rendering/RenderPath.cpp
r52579 r52580 372 372 AtomicString endMarkerId(svgStyle->endMarker()); 373 373 374 SVGResourceMarker* startMarker = getMarkerById(doc, startMarkerId );375 SVGResourceMarker* midMarker = getMarkerById(doc, midMarkerId );376 SVGResourceMarker* endMarker = getMarkerById(doc, endMarkerId );374 SVGResourceMarker* startMarker = getMarkerById(doc, startMarkerId, this); 375 SVGResourceMarker* midMarker = getMarkerById(doc, midMarkerId, this); 376 SVGResourceMarker* endMarker = getMarkerById(doc, endMarkerId, this); 377 377 378 378 if (!startMarker && !startMarkerId.isEmpty()) -
trunk/WebCore/rendering/RenderSVGContainer.cpp
r46815 r52580 83 83 #if ENABLE(FILTERS) 84 84 const SVGRenderStyle* svgStyle = style()->svgStyle(); 85 SVGResourceFilter* filter = getFilterById(document(), svgStyle->filter() );85 SVGResourceFilter* filter = getFilterById(document(), svgStyle->filter(), this); 86 86 if (filter) 87 87 return true; -
trunk/WebCore/rendering/RenderSVGGradientStop.cpp
r40871 r52580 50 50 // but I can imagine a few cases we might not be catching, so let's not crash if our parent isn't a gradient. 51 51 if (SVGGradientElement* gradient = gradientElement()) { 52 if (SVGResource* resource = gradient->canvasResource( ))52 if (SVGResource* resource = gradient->canvasResource(this)) 53 53 resource->invalidate(); 54 54 } -
trunk/WebCore/rendering/RenderSVGRoot.cpp
r46815 r52580 114 114 #if ENABLE(FILTERS) 115 115 const SVGRenderStyle* svgStyle = style()->svgStyle(); 116 SVGResourceFilter* filter = getFilterById(document(), svgStyle->filter() );116 SVGResourceFilter* filter = getFilterById(document(), svgStyle->filter(), this); 117 117 if (filter) 118 118 return true; -
trunk/WebCore/rendering/SVGRenderSupport.cpp
r52394 r52580 117 117 118 118 #if ENABLE(FILTERS) 119 SVGResourceFilter* newFilter = getFilterById(document, filterId );119 SVGResourceFilter* newFilter = getFilterById(document, filterId, object); 120 120 if (newFilter == rootFilter) { 121 121 // Catch <text filter="url(#foo)">Test<tspan filter="url(#foo)">123</tspan></text>. … … 127 127 #endif 128 128 129 SVGResourceClipper* clipper = getClipperById(document, clipperId );130 SVGResourceMasker* masker = getMaskerById(document, maskerId );129 SVGResourceClipper* clipper = getClipperById(document, clipperId, object); 130 SVGResourceMasker* masker = getMaskerById(document, maskerId, object); 131 131 132 132 if (masker) { … … 236 236 { 237 237 #if ENABLE(FILTERS) 238 SVGResourceFilter* filter = getFilterById(object->document(), object->style()->svgStyle()->filter() );238 SVGResourceFilter* filter = getFilterById(object->document(), object->style()->svgStyle()->filter(), object); 239 239 if (filter) 240 240 return filter->filterBoundingBox(); -
trunk/WebCore/rendering/SVGRenderTreeAsText.cpp
r52312 r52580 522 522 523 523 SVGStyledElement* styled = static_cast<SVGStyledElement*>(svgElement); 524 RefPtr<SVGResource> resource(styled->canvasResource( ));524 RefPtr<SVGResource> resource(styled->canvasResource(node->renderer())); 525 525 if (!resource) 526 526 continue; -
trunk/WebCore/svg/SVGClipPathElement.cpp
r50583 r52580 90 90 } 91 91 92 SVGResource* SVGClipPathElement::canvasResource( )92 SVGResource* SVGClipPathElement::canvasResource(const RenderObject*) 93 93 { 94 94 if (!m_clipper) -
trunk/WebCore/svg/SVGClipPathElement.h
r49602 r52580 23 23 24 24 #if ENABLE(SVG) 25 #include "RenderObject.h" 25 26 #include "SVGExternalResourcesRequired.h" 26 27 #include "SVGLangSpace.h" … … 46 47 virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0); 47 48 48 virtual SVGResource* canvasResource( );49 virtual SVGResource* canvasResource(const RenderObject*); 49 50 50 51 private: -
trunk/WebCore/svg/SVGFilterElement.cpp
r51310 r52580 161 161 } 162 162 163 SVGResource* SVGFilterElement::canvasResource( )163 SVGResource* SVGFilterElement::canvasResource(const RenderObject*) 164 164 { 165 165 if (!attached()) -
trunk/WebCore/svg/SVGFilterElement.h
r49602 r52580 24 24 25 25 #if ENABLE(SVG) && ENABLE(FILTERS) 26 #include "RenderObject.h" 26 27 #include "SVGResourceFilter.h" 27 28 #include "SVGExternalResourcesRequired.h" … … 43 44 virtual ~SVGFilterElement(); 44 45 45 virtual SVGResource* canvasResource( );46 virtual SVGResource* canvasResource(const RenderObject*); 46 47 47 48 void setFilterRes(unsigned long filterResX, unsigned long filterResY) const; -
trunk/WebCore/svg/SVGGradientElement.cpp
r50583 r52580 115 115 } 116 116 117 SVGResource* SVGGradientElement::canvasResource( )117 SVGResource* SVGGradientElement::canvasResource(const RenderObject*) 118 118 { 119 119 if (!m_resource) { -
trunk/WebCore/svg/SVGGradientElement.h
r49602 r52580 23 23 24 24 #if ENABLE(SVG) 25 #include "RenderObject.h" 25 26 #include "SVGPaintServerGradient.h" 26 27 #include "SVGExternalResourcesRequired.h" … … 46 47 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); 47 48 48 virtual SVGResource* canvasResource( );49 virtual SVGResource* canvasResource(const RenderObject*); 49 50 50 51 protected: -
trunk/WebCore/svg/SVGMarkerElement.cpp
r52373 r52580 171 171 } 172 172 173 SVGResource* SVGMarkerElement::canvasResource( )173 SVGResource* SVGMarkerElement::canvasResource(const RenderObject*) 174 174 { 175 175 if (!m_marker) -
trunk/WebCore/svg/SVGMarkerElement.h
r52373 r52580 23 23 24 24 #if ENABLE(SVG) 25 25 #include "RenderObject.h" 26 26 #include "SVGAngle.h" 27 27 #include "SVGExternalResourcesRequired.h" … … 68 68 69 69 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); 70 virtual SVGResource* canvasResource( );70 virtual SVGResource* canvasResource(const RenderObject*); 71 71 72 72 private: -
trunk/WebCore/svg/SVGMaskElement.cpp
r52449 r52580 33 33 #include "ImageData.h" 34 34 #include "MappedAttribute.h" 35 #include "RenderObject.h" 35 36 #include "RenderSVGContainer.h" 36 37 #include "SVGLength.h" … … 107 108 SVGStyledElement::svgAttributeChanged(attrName); 108 109 109 if ( !m_masker)110 if (m_masker.isEmpty()) 110 111 return; 111 112 … … 118 119 SVGExternalResourcesRequired::isKnownAttribute(attrName) || 119 120 SVGStyledElement::isKnownAttribute(attrName)) 120 m_masker->invalidate(); 121 for (HashMap<const RenderObject*, RefPtr<SVGResourceMasker> >::iterator it = m_masker.begin(); it != m_masker.end(); ++it) 122 it->second->invalidate(); 121 123 } 122 124 … … 125 127 SVGStyledElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta); 126 128 127 if ( !m_masker)129 if (m_masker.isEmpty()) 128 130 return; 129 131 130 m_masker->invalidate(); 132 for (HashMap<const RenderObject*, RefPtr<SVGResourceMasker> >::iterator it = m_masker.begin(); it != m_masker.end(); ++it) 133 it->second->invalidate(); 131 134 } 132 135 … … 229 232 } 230 233 231 SVGResource* SVGMaskElement::canvasResource() 232 { 233 if (!m_masker) 234 m_masker = SVGResourceMasker::create(this); 235 return m_masker.get(); 234 SVGResource* SVGMaskElement::canvasResource(const RenderObject* object) 235 { 236 ASSERT(object); 237 238 if (m_masker.contains(object)) 239 return m_masker.get(object).get(); 240 241 RefPtr<SVGResourceMasker> masker = SVGResourceMasker::create(this); 242 SVGResourceMasker* maskerPtr = masker.get(); 243 m_masker.set(object, masker.release()); 244 245 return maskerPtr; 236 246 } 237 247 -
trunk/WebCore/svg/SVGMaskElement.h
r52403 r52580 28 28 #include "SVGTests.h" 29 29 #include "SVGURIReference.h" 30 #include <wtf/HashMap.h> 30 31 #include <wtf/PassOwnPtr.h> 31 32 … … 49 50 50 51 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); 51 virtual SVGResource* canvasResource( );52 virtual SVGResource* canvasResource(const RenderObject*); 52 53 53 54 PassOwnPtr<ImageBuffer> drawMaskerContent(const FloatRect& targetRect, FloatRect& maskRect) const; … … 69 70 ExternalResourcesRequired, externalResourcesRequired) 70 71 71 RefPtr<SVGResourceMasker> m_masker;72 HashMap<const RenderObject*, RefPtr<SVGResourceMasker> > m_masker; 72 73 }; 73 74 -
trunk/WebCore/svg/SVGPatternElement.cpp
r52373 r52580 264 264 } 265 265 266 SVGResource* SVGPatternElement::canvasResource( )266 SVGResource* SVGPatternElement::canvasResource(const RenderObject*) 267 267 { 268 268 if (!m_resource) -
trunk/WebCore/svg/SVGPatternElement.h
r49602 r52580 23 23 24 24 #if ENABLE(SVG) 25 #include "RenderObject.h" 25 26 #include "SVGExternalResourcesRequired.h" 26 27 #include "SVGFitToViewBox.h" … … 55 56 56 57 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); 57 virtual SVGResource* canvasResource( );58 virtual SVGResource* canvasResource(const RenderObject*); 58 59 59 60 private: -
trunk/WebCore/svg/SVGStyledElement.cpp
r52312 r52580 216 216 SVGElement* element = static_cast<SVGElement*>(node); 217 217 if (SVGStyledElement* styledElement = static_cast<SVGStyledElement*>(element->isStyled() ? element : 0)) { 218 if (SVGResource* resource = styledElement->canvasResource( ))218 if (SVGResource* resource = styledElement->canvasResource(node->renderer())) 219 219 resource->invalidate(); 220 220 } -
trunk/WebCore/svg/SVGStyledElement.h
r52288 r52580 49 49 50 50 virtual bool rendererIsNeeded(RenderStyle*); 51 virtual SVGResource* canvasResource( ) { return 0; }51 virtual SVGResource* canvasResource(const RenderObject*) { return 0; } 52 52 53 53 virtual bool mapToEntry(const QualifiedName&, MappedAttributeEntry&) const; -
trunk/WebCore/svg/graphics/SVGPaintServer.cpp
r46017 r52580 58 58 } 59 59 60 SVGPaintServer* getPaintServerById(Document* document, const AtomicString& id )61 { 62 SVGResource* resource = getResourceById(document, id );60 SVGPaintServer* getPaintServerById(Document* document, const AtomicString& id, const RenderObject* object) 61 { 62 SVGResource* resource = getResourceById(document, id, object); 63 63 if (resource && resource->isPaintServer()) 64 64 return static_cast<SVGPaintServer*>(resource); … … 86 86 paintType == SVGPaint::SVG_PAINTTYPE_URI_RGBCOLOR) { 87 87 AtomicString id(SVGURIReference::getTarget(fill->uri())); 88 fillPaintServer = getPaintServerById(item->document(), id );88 fillPaintServer = getPaintServerById(item->document(), id, item); 89 89 90 90 SVGElement* svgElement = static_cast<SVGElement*>(item->node()); … … 127 127 paintType == SVGPaint::SVG_PAINTTYPE_URI_RGBCOLOR) { 128 128 AtomicString id(SVGURIReference::getTarget(stroke->uri())); 129 strokePaintServer = getPaintServerById(item->document(), id );129 strokePaintServer = getPaintServerById(item->document(), id, item); 130 130 131 131 SVGElement* svgElement = static_cast<SVGElement*>(item->node()); -
trunk/WebCore/svg/graphics/SVGPaintServer.h
r45919 r52580 30 30 31 31 #include "DashArray.h" 32 #include "RenderObject.h" 32 33 #include "SVGResource.h" 33 34 … … 83 84 TextStream& operator<<(TextStream&, const SVGPaintServer&); 84 85 85 SVGPaintServer* getPaintServerById(Document*, const AtomicString& );86 SVGPaintServer* getPaintServerById(Document*, const AtomicString&, const RenderObject*); 86 87 87 88 void applyStrokeStyleToContext(GraphicsContext*, RenderStyle*, const RenderObject*); -
trunk/WebCore/svg/graphics/SVGResource.cpp
r51685 r52580 161 161 } 162 162 163 SVGResource* getResourceById(Document* document, const AtomicString& id )163 SVGResource* getResourceById(Document* document, const AtomicString& id, const RenderObject* object) 164 164 { 165 165 if (id.isEmpty()) … … 172 172 173 173 if (svgElement && svgElement->isStyled()) 174 return static_cast<SVGStyledElement*>(svgElement)->canvasResource( );174 return static_cast<SVGStyledElement*>(svgElement)->canvasResource(object); 175 175 176 176 return 0; -
trunk/WebCore/svg/graphics/SVGResource.h
r30430 r52580 29 29 #if ENABLE(SVG) 30 30 #include "PlatformString.h" 31 #include "RenderObject.h" 31 32 #include "StringHash.h" 32 33 … … 92 93 }; 93 94 94 SVGResource* getResourceById(Document*, const AtomicString& );95 SVGResource* getResourceById(Document*, const AtomicString&, const RenderObject*); 95 96 96 97 TextStream& operator<<(TextStream&, const SVGResource&); -
trunk/WebCore/svg/graphics/SVGResourceClipper.cpp
r40761 r52580 126 126 } 127 127 128 SVGResourceClipper* getClipperById(Document* document, const AtomicString& id )128 SVGResourceClipper* getClipperById(Document* document, const AtomicString& id, const RenderObject* object) 129 129 { 130 SVGResource* resource = getResourceById(document, id );130 SVGResource* resource = getResourceById(document, id, object); 131 131 if (resource && resource->isClipper()) 132 132 return static_cast<SVGResourceClipper*>(resource); -
trunk/WebCore/svg/graphics/SVGResourceClipper.h
r30430 r52580 28 28 29 29 #if ENABLE(SVG) 30 30 #include "Path.h" 31 #include "RenderObject.h" 31 32 #include "SVGResource.h" 32 #include "Path.h"33 33 34 34 namespace WebCore { … … 85 85 TextStream& operator<<(TextStream&, const ClipData&); 86 86 87 SVGResourceClipper* getClipperById(Document*, const AtomicString& );87 SVGResourceClipper* getClipperById(Document*, const AtomicString&, const RenderObject*); 88 88 89 89 } // namespace WebCore -
trunk/WebCore/svg/graphics/SVGResourceFilter.cpp
r52202 r52580 53 53 , m_sourceGraphicBuffer(0) 54 54 { 55 m_filterBuilder.set(new SVGFilterBuilder()); 55 m_filterBuilder.set(new SVGFilterBuilder()); 56 56 } 57 57 … … 205 205 } 206 206 207 SVGResourceFilter* getFilterById(Document* document, const AtomicString& id )208 { 209 SVGResource* resource = getResourceById(document, id );207 SVGResourceFilter* getFilterById(Document* document, const AtomicString& id, const RenderObject* object) 208 { 209 SVGResource* resource = getResourceById(document, id, object); 210 210 if (resource && resource->isFilter()) 211 211 return static_cast<SVGResourceFilter*>(resource); -
trunk/WebCore/svg/graphics/SVGResourceFilter.h
r51310 r52580 104 104 }; 105 105 106 SVGResourceFilter* getFilterById(Document*, const AtomicString& );106 SVGResourceFilter* getFilterById(Document*, const AtomicString&, const RenderObject*); 107 107 108 108 } // namespace WebCore -
trunk/WebCore/svg/graphics/SVGResourceMarker.cpp
r52579 r52580 123 123 } 124 124 125 SVGResourceMarker* getMarkerById(Document* document, const AtomicString& id )125 SVGResourceMarker* getMarkerById(Document* document, const AtomicString& id, const RenderObject* object) 126 126 { 127 SVGResource* resource = getResourceById(document, id );127 SVGResource* resource = getResourceById(document, id, object); 128 128 if (resource && resource->isMarker()) 129 129 return static_cast<SVGResourceMarker*>(resource); -
trunk/WebCore/svg/graphics/SVGResourceMarker.h
r52579 r52580 70 70 }; 71 71 72 SVGResourceMarker* getMarkerById(Document*, const AtomicString& );72 SVGResourceMarker* getMarkerById(Document*, const AtomicString&, const RenderObject*); 73 73 74 74 } // namespace WebCore -
trunk/WebCore/svg/graphics/SVGResourceMasker.cpp
r52449 r52580 77 77 } 78 78 79 SVGResourceMasker* getMaskerById(Document* document, const AtomicString& id )79 SVGResourceMasker* getMaskerById(Document* document, const AtomicString& id, const RenderObject* object) 80 80 { 81 SVGResource* resource = getResourceById(document, id );81 SVGResource* resource = getResourceById(document, id, object); 82 82 if (resource && resource->isMasker()) 83 83 return static_cast<SVGResourceMasker*>(resource); -
trunk/WebCore/svg/graphics/SVGResourceMasker.h
r52403 r52580 30 30 31 31 #include "GraphicsContext.h" 32 #include "RenderObject.h" 32 33 #include "SVGResource.h" 33 34 … … 65 66 }; 66 67 67 SVGResourceMasker* getMaskerById(Document*, const AtomicString& );68 SVGResourceMasker* getMaskerById(Document*, const AtomicString&, const RenderObject* object); 68 69 69 70 } // namespace WebCore
Note: See TracChangeset
for help on using the changeset viewer.