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