1/* 2 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 */ 19 20#include "config.h" 21 22#include "core/rendering/svg/RenderSVGTextPath.h" 23 24#include "core/rendering/svg/SVGPathData.h" 25#include "core/rendering/svg/SVGRenderSupport.h" 26#include "core/svg/SVGPathElement.h" 27#include "core/svg/SVGTextPathElement.h" 28 29namespace blink { 30 31RenderSVGTextPath::RenderSVGTextPath(Element* element) 32 : RenderSVGInline(element) 33{ 34} 35 36bool RenderSVGTextPath::isChildAllowed(RenderObject* child, RenderStyle*) const 37{ 38 if (child->isText()) 39 return SVGRenderSupport::isRenderableTextNode(child); 40 41#if ENABLE(SVG_FONTS) 42 // 'altGlyph' is supported by the content model for 'textPath', but... 43 ASSERT(child->node()); 44 if (isSVGAltGlyphElement(*child->node())) 45 return false; 46#endif 47 48 return child->isSVGInline() && !child->isSVGTextPath(); 49} 50 51Path RenderSVGTextPath::layoutPath() const 52{ 53 SVGTextPathElement* textPathElement = toSVGTextPathElement(node()); 54 Element* targetElement = SVGURIReference::targetElementFromIRIString(textPathElement->href()->currentValue()->value(), textPathElement->treeScope()); 55 if (!isSVGPathElement(targetElement)) 56 return Path(); 57 58 SVGPathElement& pathElement = toSVGPathElement(*targetElement); 59 60 Path pathData; 61 updatePathFromGraphicsElement(&pathElement, pathData); 62 63 // Spec: The transform attribute on the referenced 'path' element represents a 64 // supplemental transformation relative to the current user coordinate system for 65 // the current 'text' element, including any adjustments to the current user coordinate 66 // system due to a possible transform attribute on the current 'text' element. 67 // http://www.w3.org/TR/SVG/text.html#TextPathElement 68 pathData.transform(pathElement.animatedLocalTransform()); 69 return pathData; 70} 71 72float RenderSVGTextPath::startOffset() const 73{ 74 return toSVGTextPathElement(node())->startOffset()->currentValue()->valueAsPercentage(); 75} 76 77} 78