Home | History | Annotate | Download | only in svg
      1 /*
      2  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
      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 #ifndef SVGMatrix_h
     21 #define SVGMatrix_h
     22 
     23 #if ENABLE(SVG)
     24 #include "AffineTransform.h"
     25 #include "SVGException.h"
     26 
     27 namespace WebCore {
     28 
     29 // Only used in the bindings.
     30 class SVGMatrix : public AffineTransform {
     31 public:
     32     SVGMatrix() { }
     33     SVGMatrix(const AffineTransform& other)
     34         : AffineTransform(other)
     35     {
     36     }
     37 
     38     SVGMatrix(double a, double b, double c, double d, double e, double f)
     39         : AffineTransform(a, b, c, d, e, f)
     40     {
     41     }
     42 
     43     SVGMatrix translate(double tx, double ty)
     44     {
     45         AffineTransform copy = *this;
     46         copy.translate(tx, ty);
     47         return static_cast<SVGMatrix>(copy);
     48     }
     49 
     50     SVGMatrix scale(double s)
     51     {
     52         AffineTransform copy = *this;
     53         copy.scale(s, s);
     54         return static_cast<SVGMatrix>(copy);
     55     }
     56 
     57     SVGMatrix scaleNonUniform(double sx, double sy)
     58     {
     59         AffineTransform copy = *this;
     60         copy.scale(sx, sy);
     61         return static_cast<SVGMatrix>(copy);
     62     }
     63 
     64     SVGMatrix rotate(double d)
     65     {
     66         AffineTransform copy = *this;
     67         copy.rotate(d);
     68         return static_cast<SVGMatrix>(copy);
     69     }
     70 
     71     SVGMatrix flipX()
     72     {
     73         AffineTransform copy = *this;
     74         copy.flipX();
     75         return static_cast<SVGMatrix>(copy);
     76     }
     77 
     78     SVGMatrix flipY()
     79     {
     80         AffineTransform copy = *this;
     81         copy.flipY();
     82         return static_cast<SVGMatrix>(copy);
     83     }
     84 
     85     SVGMatrix skewX(double angle)
     86     {
     87         AffineTransform copy = *this;
     88         copy.skewX(angle);
     89         return static_cast<SVGMatrix>(copy);
     90     }
     91 
     92     SVGMatrix skewY(double angle)
     93     {
     94         AffineTransform copy = *this;
     95         copy.skewY(angle);
     96         return static_cast<SVGMatrix>(copy);
     97     }
     98 
     99     SVGMatrix multiply(const SVGMatrix& other)
    100     {
    101         AffineTransform copy = *this;
    102         copy *= static_cast<const AffineTransform&>(other);
    103         return static_cast<SVGMatrix>(copy);
    104     }
    105 
    106     SVGMatrix inverse(ExceptionCode& ec) const
    107     {
    108         AffineTransform transform = AffineTransform::inverse();
    109         if (!isInvertible())
    110             ec = SVGException::SVG_MATRIX_NOT_INVERTABLE;
    111 
    112         return transform;
    113     }
    114 
    115     SVGMatrix rotateFromVector(double x, double y, ExceptionCode& ec)
    116     {
    117         if (!x || !y)
    118             ec = SVGException::SVG_INVALID_VALUE_ERR;
    119 
    120         AffineTransform copy = *this;
    121         copy.rotateFromVector(x, y);
    122         return static_cast<SVGMatrix>(copy);
    123     }
    124 
    125 };
    126 
    127 } // namespace WebCore
    128 
    129 #endif // ENABLE(SVG)
    130 #endif
    131