1 //////////////////////////////////////////////////////////////////////////////
2 // Name:        SVGTransformable.cpp
3 // Purpose:
4 // Author:      Alex Thuering
5 // Created:     2005/05/05
6 // RCS-ID:      $Id: SVGTransformable.cpp,v 1.8 2014/03/27 21:20:10 ntalex Exp $
7 // Copyright:   (c) 2005 Alex Thuering
8 // Licence:     wxWindows licence
9 //////////////////////////////////////////////////////////////////////////////
10 
11 #include "SVGTransformable.h"
12 #include "svg.h"
13 #include <wx/log.h>
14 
Transform(const wxSVGMatrix & matrix)15 void wxSVGTransformable::Transform(const wxSVGMatrix& matrix) {
16   wxSVGTransformList& transforms = m_transform.GetBaseVal();
17   transforms.Add(new wxSVGTransform(matrix));
18   m_transform.ResetAnimVal();
19 }
20 
Translate(double tx,double ty)21 void wxSVGTransformable::Translate(double tx, double ty) {
22   wxSVGTransformList& transforms = m_transform.GetBaseVal();
23   wxSVGTransform* t = new wxSVGTransform; t->SetTranslate(tx,ty); transforms.Add(t);
24   m_transform.ResetAnimVal();
25 }
26 
Scale(double s)27 void wxSVGTransformable::Scale(double s) {
28   wxSVGTransformList& transforms = m_transform.GetBaseVal();
29   wxSVGTransform* t = new wxSVGTransform; t->SetScale(s,s); transforms.Add(t);
30   m_transform.ResetAnimVal();
31 }
32 
Scale(double sx,double sy)33 void wxSVGTransformable::Scale(double sx, double sy) {
34   wxSVGTransformList& transforms = m_transform.GetBaseVal();
35   wxSVGTransform* t = new wxSVGTransform; t->SetScale(sx,sy); transforms.Add(t);
36   m_transform.ResetAnimVal();
37 }
38 
Rotate(double angle,double cx,double cy)39 void wxSVGTransformable::Rotate(double angle, double cx, double cy) {
40   wxSVGTransformList& transforms = m_transform.GetBaseVal();
41   wxSVGTransform* t = new wxSVGTransform; t->SetRotate(angle, cx,cy); transforms.Add(t);
42   m_transform.ResetAnimVal();
43 }
44 
SkewX(double angle)45 void wxSVGTransformable::SkewX(double angle) {
46   wxSVGTransformList& transforms = m_transform.GetBaseVal();
47   wxSVGTransform* t = new wxSVGTransform; t->SetSkewX(angle); transforms.Add(t);
48   m_transform.ResetAnimVal();
49 }
50 
SkewY(double angle)51 void wxSVGTransformable::SkewY(double angle) {
52   wxSVGTransformList& transforms = m_transform.GetBaseVal();
53   wxSVGTransform* t = new wxSVGTransform; t->SetSkewY(angle); transforms.Add(t);
54   m_transform.ResetAnimVal();
55 }
56 
57 #define GET_TRANSFORMABLE(the_dtd, the_class)\
58 case the_dtd:\
59   return &((the_class&)element);
60 
GetSVGTransformable(wxSVGElement & element)61 wxSVGTransformable* wxSVGTransformable::GetSVGTransformable(wxSVGElement& element) {
62   if (&element == NULL || element.GetType() != wxSVGXML_ELEMENT_NODE) {
63       return NULL;
64   }
65   switch (element.GetDtd()) {
66     GET_TRANSFORMABLE(wxSVG_LINE_ELEMENT, wxSVGLineElement)
67     GET_TRANSFORMABLE(wxSVG_POLYLINE_ELEMENT, wxSVGPolylineElement)
68     GET_TRANSFORMABLE(wxSVG_POLYGON_ELEMENT, wxSVGPolygonElement)
69     GET_TRANSFORMABLE(wxSVG_RECT_ELEMENT, wxSVGRectElement)
70     GET_TRANSFORMABLE(wxSVG_CIRCLE_ELEMENT, wxSVGCircleElement)
71     GET_TRANSFORMABLE(wxSVG_ELLIPSE_ELEMENT, wxSVGEllipseElement)
72     GET_TRANSFORMABLE(wxSVG_PATH_ELEMENT, wxSVGPathElement)
73     GET_TRANSFORMABLE(wxSVG_TEXT_ELEMENT, wxSVGTextElement)
74 	GET_TRANSFORMABLE(wxSVG_A_ELEMENT, wxSVGAElement)
75     GET_TRANSFORMABLE(wxSVG_G_ELEMENT, wxSVGGElement)
76     GET_TRANSFORMABLE(wxSVG_USE_ELEMENT, wxSVGUseElement)
77 	GET_TRANSFORMABLE(wxSVG_IMAGE_ELEMENT, wxSVGImageElement)
78     default:
79       break;
80   }
81   return NULL;
82 }
83 
GetSVGTransformable(const wxSVGElement & element)84 const wxSVGTransformable* wxSVGTransformable::GetSVGTransformable(const wxSVGElement& element) {
85   return GetSVGTransformable((wxSVGElement&)element);
86 }
87 
UpdateMatrix(wxSVGMatrix & matrix) const88 void wxSVGTransformable::UpdateMatrix(wxSVGMatrix& matrix) const {
89   const wxSVGTransformList& transforms = GetTransform().GetAnimVal();
90 	for (unsigned int i = 0; i < transforms.Count(); i++)
91 		matrix = matrix.Multiply(transforms[i].GetMatrix());
92 }
93