Home | History | Annotate | Download | only in svg
      1 /*
      2  * Copyright (C) 2002, 2003 The Karbon Developers
      3  * Copyright (C) 2006 Alexander Kellett <lypanov (at) kde.org>
      4  * Copyright (C) 2006, 2007 Rob Buis <buis (at) kde.org>
      5  * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
      6  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
      7  *
      8  * This library is free software; you can redistribute it and/or
      9  * modify it under the terms of the GNU Library General Public
     10  * License as published by the Free Software Foundation; either
     11  * version 2 of the License, or (at your option) any later version.
     12  *
     13  * This library is distributed in the hope that it will be useful,
     14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16  * Library General Public License for more details.
     17  *
     18  * You should have received a copy of the GNU Library General Public License
     19  * along with this library; see the file COPYING.LIB.  If not, write to
     20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     21  * Boston, MA 02110-1301, USA.
     22  */
     23 
     24 #include "config.h"
     25 
     26 #if ENABLE(SVG)
     27 #include "SVGPathSegListBuilder.h"
     28 
     29 #include "ExceptionCode.h"
     30 #include "SVGPathElement.h"
     31 #include "SVGPathSegArc.h"
     32 #include "SVGPathSegClosePath.h"
     33 #include "SVGPathSegCurvetoCubic.h"
     34 #include "SVGPathSegCurvetoCubicSmooth.h"
     35 #include "SVGPathSegCurvetoQuadratic.h"
     36 #include "SVGPathSegCurvetoQuadraticSmooth.h"
     37 #include "SVGPathSegLineto.h"
     38 #include "SVGPathSegLinetoHorizontal.h"
     39 #include "SVGPathSegLinetoVertical.h"
     40 #include "SVGPathSegList.h"
     41 #include "SVGPathSegMoveto.h"
     42 
     43 namespace WebCore {
     44 
     45 SVGPathSegListBuilder::SVGPathSegListBuilder()
     46     : m_pathElement(0)
     47     , m_pathSegList(0)
     48     , m_pathSegRole(PathSegUndefinedRole)
     49 {
     50 }
     51 
     52 void SVGPathSegListBuilder::moveTo(const FloatPoint& targetPoint, bool, PathCoordinateMode mode)
     53 {
     54     ASSERT(m_pathElement);
     55     ASSERT(m_pathSegList);
     56     if (mode == AbsoluteCoordinates)
     57         m_pathSegList->append(m_pathElement->createSVGPathSegMovetoAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole));
     58     else
     59         m_pathSegList->append(m_pathElement->createSVGPathSegMovetoRel(targetPoint.x(), targetPoint.y(), m_pathSegRole));
     60 }
     61 
     62 void SVGPathSegListBuilder::lineTo(const FloatPoint& targetPoint, PathCoordinateMode mode)
     63 {
     64     ASSERT(m_pathElement);
     65     ASSERT(m_pathSegList);
     66     if (mode == AbsoluteCoordinates)
     67         m_pathSegList->append(m_pathElement->createSVGPathSegLinetoAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole));
     68     else
     69         m_pathSegList->append(m_pathElement->createSVGPathSegLinetoRel(targetPoint.x(), targetPoint.y(), m_pathSegRole));
     70 }
     71 
     72 void SVGPathSegListBuilder::lineToHorizontal(float x, PathCoordinateMode mode)
     73 {
     74     ASSERT(m_pathElement);
     75     ASSERT(m_pathSegList);
     76     if (mode == AbsoluteCoordinates)
     77         m_pathSegList->append(m_pathElement->createSVGPathSegLinetoHorizontalAbs(x, m_pathSegRole));
     78     else
     79         m_pathSegList->append(m_pathElement->createSVGPathSegLinetoHorizontalRel(x, m_pathSegRole));
     80 }
     81 
     82 void SVGPathSegListBuilder::lineToVertical(float y, PathCoordinateMode mode)
     83 {
     84     ASSERT(m_pathElement);
     85     ASSERT(m_pathSegList);
     86     if (mode == AbsoluteCoordinates)
     87         m_pathSegList->append(m_pathElement->createSVGPathSegLinetoVerticalAbs(y, m_pathSegRole));
     88     else
     89         m_pathSegList->append(m_pathElement->createSVGPathSegLinetoVerticalRel(y, m_pathSegRole));
     90 }
     91 
     92 void SVGPathSegListBuilder::curveToCubic(const FloatPoint& point1, const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
     93 {
     94     ASSERT(m_pathElement);
     95     ASSERT(m_pathSegList);
     96     if (mode == AbsoluteCoordinates)
     97         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicAbs(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y(), m_pathSegRole));
     98     else
     99         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicRel(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y(), m_pathSegRole));
    100 }
    101 
    102 void SVGPathSegListBuilder::curveToCubicSmooth(const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
    103 {
    104     ASSERT(m_pathElement);
    105     ASSERT(m_pathSegList);
    106     if (mode == AbsoluteCoordinates)
    107         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicSmoothAbs(targetPoint.x(), targetPoint.y(), point2.x(), point2.y(), m_pathSegRole));
    108     else
    109         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicSmoothRel(targetPoint.x(), targetPoint.y(), point2.x(), point2.y(), m_pathSegRole));
    110 }
    111 
    112 void SVGPathSegListBuilder::curveToQuadratic(const FloatPoint& point1, const FloatPoint& targetPoint, PathCoordinateMode mode)
    113 {
    114     ASSERT(m_pathElement);
    115     ASSERT(m_pathSegList);
    116     if (mode == AbsoluteCoordinates)
    117         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticAbs(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), m_pathSegRole));
    118     else
    119         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticRel(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), m_pathSegRole));
    120 }
    121 
    122 void SVGPathSegListBuilder::curveToQuadraticSmooth(const FloatPoint& targetPoint, PathCoordinateMode mode)
    123 {
    124     ASSERT(m_pathElement);
    125     ASSERT(m_pathSegList);
    126     if (mode == AbsoluteCoordinates)
    127         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticSmoothAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole));
    128     else
    129         m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticSmoothRel(targetPoint.x(), targetPoint.y(), m_pathSegRole));
    130 }
    131 
    132 void SVGPathSegListBuilder::arcTo(float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, const FloatPoint& targetPoint, PathCoordinateMode mode)
    133 {
    134     ASSERT(m_pathElement);
    135     ASSERT(m_pathSegList);
    136     if (mode == AbsoluteCoordinates)
    137         m_pathSegList->append(m_pathElement->createSVGPathSegArcAbs(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag, m_pathSegRole));
    138     else
    139         m_pathSegList->append(m_pathElement->createSVGPathSegArcRel(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag, m_pathSegRole));
    140 }
    141 
    142 void SVGPathSegListBuilder::closePath()
    143 {
    144     ASSERT(m_pathElement);
    145     ASSERT(m_pathSegList);
    146     m_pathSegList->append(m_pathElement->createSVGPathSegClosePath(m_pathSegRole));
    147 }
    148 
    149 }
    150 
    151 #endif // ENABLE(SVG)
    152