15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Research In Motion Limited 2010. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef SVGResources_h 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SVGResources_h 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/FastAllocBase.h" 2402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/HashSet.h" 2502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/Noncopyable.h" 2602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/OwnPtr.h" 2702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/PassOwnPtr.h" 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject; 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderSVGResourceClipper; 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderSVGResourceContainer; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderSVGResourceFilter; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderSVGResourceMarker; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderSVGResourceMasker; 3743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)class SVGElement; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SVGRenderStyle; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Holds a set of resources associated with a RenderObject 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SVGResources { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SVGResources); WTF_MAKE_FAST_ALLOCATED; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SVGResources(); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) static PassOwnPtr<SVGResources> buildResources(const RenderObject*, const SVGRenderStyle*); 471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) void layoutIfNeeded(); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) static bool supportsMarkers(const SVGElement&); 5043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ordinary resources 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceClipper* clipper() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData->clipper : 0; } 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMarker* markerStart() const { return m_markerData ? m_markerData->markerStart : 0; } 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMarker* markerMid() const { return m_markerData ? m_markerData->markerMid : 0; } 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMarker* markerEnd() const { return m_markerData ? m_markerData->markerEnd : 0; } 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMasker* masker() const { return m_clipperFilterMaskerData ? m_clipperFilterMaskerData->masker : 0; } 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceFilter* filter() const 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_clipperFilterMaskerData) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_clipperFilterMaskerData->filter; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Paint servers 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceContainer* fill() const { return m_fillStrokeData ? m_fillStrokeData->fill : 0; } 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceContainer* stroke() const { return m_fillStrokeData ? m_fillStrokeData->stroke : 0; } 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Chainable resources - linked through xlink:href 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceContainer* linkedResource() const { return m_linkedResource; } 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void buildSetOfResources(HashSet<RenderSVGResourceContainer*>&); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Methods operating on all cached resources 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeClientFromCache(RenderObject*, bool markForInvalidation = true) const; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resourceDestroyed(RenderSVGResourceContainer*); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void dump(const RenderObject*); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class SVGResourcesCycleSolver; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) bool hasResourceData() const; 86a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Only used by SVGResourcesCache cycle detection logic 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetClipper(); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetFilter(); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetMarkerStart(); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetMarkerMid(); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetMarkerEnd(); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetMasker(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetFill(); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetStroke(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetLinkedResource(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setClipper(RenderSVGResourceClipper*); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setFilter(RenderSVGResourceFilter*); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setMarkerStart(RenderSVGResourceMarker*); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setMarkerMid(RenderSVGResourceMarker*); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setMarkerEnd(RenderSVGResourceMarker*); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setMasker(RenderSVGResourceMasker*); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setFill(RenderSVGResourceContainer*); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setStroke(RenderSVGResourceContainer*); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool setLinkedResource(RenderSVGResourceContainer*); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // From SVG 1.1 2nd Edition 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // clipper: 'container elements' and 'graphics elements' 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // filter: 'container elements' and 'graphics elements' 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // masker: 'container elements' and 'graphics elements' 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // -> a, circle, defs, ellipse, glyph, g, image, line, marker, mask, missing-glyph, path, pattern, polygon, polyline, rect, svg, switch, symbol, text, use 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct ClipperFilterMaskerData { 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ClipperFilterMaskerData() 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : clipper(0) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , filter(0) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , masker(0) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassOwnPtr<ClipperFilterMaskerData> create() 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptPtr(new ClipperFilterMaskerData); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceClipper* clipper; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceFilter* filter; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMasker* masker; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // From SVG 1.1 2nd Edition 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // marker: line, path, polygon, polyline 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct MarkerData { 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MarkerData() 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : markerStart(0) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , markerMid(0) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , markerEnd(0) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassOwnPtr<MarkerData> create() 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptPtr(new MarkerData); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMarker* markerStart; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMarker* markerMid; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceMarker* markerEnd; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // From SVG 1.1 2nd Edition 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fill: 'shapes' and 'text content elements' 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // stroke: 'shapes' and 'text content elements' 1588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // -> altGlyph, circle, ellipse, line, path, polygon, polyline, rect, text, textPath, tspan 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct FillStrokeData { 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FillStrokeData() 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : fill(0) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , stroke(0) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassOwnPtr<FillStrokeData> create() 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptPtr(new FillStrokeData); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceContainer* fill; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceContainer* stroke; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<ClipperFilterMaskerData> m_clipperFilterMaskerData; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<MarkerData> m_markerData; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<FillStrokeData> m_fillStrokeData; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderSVGResourceContainer* m_linkedResource; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 186