18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG)
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSVGTextPath.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FloatQuad.h"
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RenderBlock.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGInlineTextBox.h"
28f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "SVGNames.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGPathElement.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGRootInlineBox.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGTextPathElement.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGTransformList.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderSVGTextPath::RenderSVGTextPath(Node* n)
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : RenderSVGInline(n)
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_startOffset(0.0f)
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_exactAlignment(true)
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_stretchMethod(false)
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPath RenderSVGTextPath::layoutPath() const
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    SVGTextPathElement* textPathElement = static_cast<SVGTextPathElement*>(node());
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String pathId = SVGURIReference::getTarget(textPathElement->href());
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* targetElement = textPathElement->document()->getElementById(pathId);
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!targetElement || !targetElement->hasTagName(SVGNames::pathTag))
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return Path();
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SVGPathElement* pathElement = static_cast<SVGPathElement*>(targetElement);
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Path pathData;
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    pathElement->toPathData(pathData);
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Spec:  The transform attribute on the referenced 'path' element represents a
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // supplemental transformation relative to the current user coordinate system for
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the current 'text' element, including any adjustments to the current user coordinate
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // system due to a possible transform attribute on the current 'text' element.
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // http://www.w3.org/TR/SVG/text.html#TextPathElement
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    pathData.transform(pathElement->animatedLocalTransform());
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pathData;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfloat RenderSVGTextPath::startOffset() const
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return static_cast<SVGTextPathElement*>(node())->startOffset().valueAsPercentage();
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderSVGTextPath::exactAlignment() const
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return static_cast<SVGTextPathElement*>(node())->spacing() == SVG_TEXTPATH_SPACINGTYPE_EXACT;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderSVGTextPath::stretchMethod() const
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return static_cast<SVGTextPathElement*>(node())->method() == SVG_TEXTPATH_METHODTYPE_STRETCH;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG)
83