1 //////////////////////////////////////////////////////////////////////////////
2 // Name:        SVGTextElement.cpp
3 // Purpose:     svg text element
4 // Author:      Alex Thuering
5 // Created:     2005/05/10
6 // RCS-ID:      $Id: SVGTextElement.cpp,v 1.6 2016/07/28 09:05:28 ntalex Exp $
7 // Copyright:   (c) 2005 Alex Thuering
8 // Licence:     wxWindows licence
9 //////////////////////////////////////////////////////////////////////////////
10 
11 #include "SVGTextElement.h"
12 #include "SVGCanvas.h"
13 #include <math.h>
14 
GetBBox(wxSVG_COORDINATES coordinates)15 wxSVGRect wxSVGTextElement::GetBBox(wxSVG_COORDINATES coordinates) {
16 	wxSVGMatrix matrix = wxSVGLocatable::GetCTM(this);
17 	WX_SVG_CREATE_M_CANVAS_ITEM
18 	wxSVGRect bbox;
19 	if (coordinates == wxSVG_COORDINATES_USER) {
20 		bbox = m_canvasItem->GetBBox();
21 	} else {
22 		wxSVGMatrix m = GetMatrix(coordinates);
23 		bbox = m_canvasItem->GetBBox(&m);
24 	}
25 	WX_SVG_CLEAR_M_CANVAS_ITEM
26 	return bbox.MatrixTransform(matrix);
27 	//return bbox;
28 }
29 
GetResultBBox(wxSVG_COORDINATES coordinates)30 wxSVGRect wxSVGTextElement::GetResultBBox(wxSVG_COORDINATES coordinates) {
31 	wxCSSStyleDeclaration style = GetResultStyle(*this);
32 	if (style.GetStroke().GetPaintType() == wxSVG_PAINTTYPE_NONE)
33 		return GetBBox(coordinates);
34 	WX_SVG_CREATE_M_CANVAS_ITEM
35 	wxSVGRect bbox;
36 	if (coordinates == wxSVG_COORDINATES_USER) {
37 		bbox = m_canvasItem->GetResultBBox(style);
38 	} else {
39 		wxSVGMatrix m = GetMatrix(coordinates);
40 		bbox = m_canvasItem->GetResultBBox(style, &m);
41 	}
42 	WX_SVG_CLEAR_M_CANVAS_ITEM
43 	return bbox;
44 }
45 
SetCanvasItem(wxSVGCanvasItem * canvasItem)46 void wxSVGTextElement::SetCanvasItem(wxSVGCanvasItem* canvasItem) {
47 	if (m_canvasItem)
48 		delete m_canvasItem;
49 	m_canvasItem = canvasItem;
50 }
51 
GetNumberOfChars()52 long wxSVGTextElement::GetNumberOfChars() {
53 	WX_SVG_CREATE_M_CANVAS_ITEM
54 	long number = ((wxSVGCanvasText*) m_canvasItem)->GetNumberOfChars();
55 	WX_SVG_CLEAR_M_CANVAS_ITEM
56 	return number;
57 }
58 
GetComputedTextLength()59 double wxSVGTextElement::GetComputedTextLength() {
60 	wxSVGMatrix matrix = wxSVGLocatable::GetCTM(this);
61 	WX_SVG_CREATE_M_CANVAS_ITEM
62 	double length = ((wxSVGCanvasText*) m_canvasItem)->GetComputedTextLength();
63 	WX_SVG_CLEAR_M_CANVAS_ITEM
64 	return length * sqrt(matrix.GetA() * matrix.GetA() + matrix.GetB() * matrix.GetB());
65 }
66 
GetSubStringLength(unsigned long charnum,unsigned long nchars)67 double wxSVGTextElement::GetSubStringLength(unsigned long charnum, unsigned long nchars) {
68 	wxSVGMatrix matrix = wxSVGLocatable::GetCTM(this);
69 	WX_SVG_CREATE_M_CANVAS_ITEM
70 	double length = ((wxSVGCanvasText*) m_canvasItem)->GetSubStringLength(charnum, nchars);
71 	WX_SVG_CLEAR_M_CANVAS_ITEM
72 	return length * sqrt(matrix.GetA() * matrix.GetA() + matrix.GetB() * matrix.GetB());
73 }
74 
GetStartPositionOfChar(unsigned long charnum)75 wxSVGPoint wxSVGTextElement::GetStartPositionOfChar(unsigned long charnum) {
76 	wxSVGPoint real_position;
77 	wxSVGMatrix matrix = wxSVGLocatable::GetCTM(this);
78 	WX_SVG_CREATE_M_CANVAS_ITEM
79 	wxSVGPoint position = ((wxSVGCanvasText*) m_canvasItem)->GetStartPositionOfChar(charnum);
80 	WX_SVG_CLEAR_M_CANVAS_ITEM
81 	real_position.SetX(matrix.GetA() * position.GetX() + matrix.GetB() * position.GetY() + matrix.GetE());
82 	real_position.SetY(matrix.GetB() * position.GetX() + matrix.GetD() * position.GetY() + matrix.GetF());
83 	return real_position;
84 }
85 
GetEndPositionOfChar(unsigned long charnum)86 wxSVGPoint wxSVGTextElement::GetEndPositionOfChar(unsigned long charnum) {
87 	wxSVGPoint real_position;
88 	wxSVGMatrix matrix = wxSVGLocatable::GetCTM(this);
89 	WX_SVG_CREATE_M_CANVAS_ITEM
90 	wxSVGPoint position = ((wxSVGCanvasText*) m_canvasItem)->GetEndPositionOfChar(charnum);
91 	WX_SVG_CLEAR_M_CANVAS_ITEM
92 	real_position.SetX(matrix.GetA() * position.GetX() + matrix.GetB() * position.GetY() + matrix.GetE());
93 	real_position.SetY(matrix.GetB() * position.GetX() + matrix.GetD() * position.GetY() + matrix.GetF());
94 	return real_position;
95 }
96 
GetExtentOfChar(unsigned long charnum)97 wxSVGRect wxSVGTextElement::GetExtentOfChar(unsigned long charnum) {
98 	wxSVGMatrix matrix = wxSVGLocatable::GetCTM(this);
99 	WX_SVG_CREATE_M_CANVAS_ITEM
100 	wxSVGRect extent = ((wxSVGCanvasText*) m_canvasItem)->GetExtentOfChar(charnum);
101 	WX_SVG_CLEAR_M_CANVAS_ITEM
102 	return extent.MatrixTransform(matrix);
103 }
104 
GetRotationOfChar(unsigned long charnum)105 double wxSVGTextElement::GetRotationOfChar(unsigned long charnum) {
106 	WX_SVG_CREATE_M_CANVAS_ITEM
107 	double rotation = ((wxSVGCanvasText*) m_canvasItem)->GetRotationOfChar(charnum);
108 	WX_SVG_CLEAR_M_CANVAS_ITEM
109 	return rotation;
110 }
111 
GetCharNumAtPosition(const wxSVGPoint & point)112 long wxSVGTextElement::GetCharNumAtPosition(const wxSVGPoint& point) {
113 	WX_SVG_CREATE_M_CANVAS_ITEM
114 	long charnum = ((wxSVGCanvasText*) m_canvasItem)->GetCharNumAtPosition(point);
115 	WX_SVG_CLEAR_M_CANVAS_ITEM
116 	return charnum;
117 }
118