1 /**********************************************
2 * Copyright (C) 2010 Lukas Laag
3 * This file is part of lib-gwt-svg.
4 *
5 * libgwtsvg is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * libgwtsvg is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with libgwtsvg. If not, see http://www.gnu.org/licenses/
17 **********************************************/
18 /*
19 * Copyright (c) 2004 World Wide Web Consortium,
20 *
21 * (Massachusetts Institute of Technology, European Research Consortium for
22 * Informatics and Mathematics, Keio University). All Rights Reserved. This
23 * work is distributed under the W3C(r) Software License [1] in the hope that
24 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
25 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
26 *
27 * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
28 */
29
30 package org.vectomatic.dom.svg;
31
32 import com.google.gwt.core.client.JavaScriptException;
33 import com.google.gwt.core.client.JavaScriptObject;
34
35 /**
36 * <p>Many of SVG's graphics operations utilize 2x3 matrices of the form:</p>
37 * <pre>
38 * [a c e]
39 * [b d f]</pre> <p>which, when expanded into a 3x3 matrix for the purposes
40 * of matrix arithmetic, become:</p> <pre>
41 * [a c e]
42 * [b d f]
43 * [0 0 1]</pre>
44 */
45 public class OMSVGMatrix extends JavaScriptObject {
46 protected OMSVGMatrix() {
47 }
48
49 // Implementation of the svg::SVGMatrix W3C IDL interface
50 /**
51 * The <var>a</var> component of the matrix.
52 */
53 public final native float getA() /*-{
54 return this.a;
55 }-*/;
56 /**
57 * The <var>a</var> component of the matrix.
58 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised on an attempt
59 * to change the value of a <a href="svgdom.html#ReadOnlyNodes">read only
60 * attribute</a>.
61 */
62 public final native void setA(float value) throws JavaScriptException /*-{
63 this.a = value;
64 }-*/;
65 /**
66 * The <var>b</var> component of the matrix.
67 */
68 public final native float getB() /*-{
69 return this.b;
70 }-*/;
71 /**
72 * The <var>b</var> component of the matrix.
73 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised on an attempt
74 * to change the value of a <a href="svgdom.html#ReadOnlyNodes">read only
75 * attribute</a>.
76 */
77 public final native void setB(float value) throws JavaScriptException /*-{
78 this.b = value;
79 }-*/;
80 /**
81 * The <var>c</var> component of the matrix.
82 */
83 public final native float getC() /*-{
84 return this.c;
85 }-*/;
86 /**
87 * The <var>c</var> component of the matrix.
88 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised on an attempt
89 * to change the value of a <a href="svgdom.html#ReadOnlyNodes">read only
90 * attribute</a>.
91 */
92 public final native void setC(float value) throws JavaScriptException /*-{
93 this.c = value;
94 }-*/;
95 /**
96 * The <var>d</var> component of the matrix.
97 */
98 public final native float getD() /*-{
99 return this.d;
100 }-*/;
101 /**
102 * The <var>d</var> component of the matrix.
103 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised on an attempt
104 * to change the value of a <a href="svgdom.html#ReadOnlyNodes">read only
105 * attribute</a>.
106 */
107 public final native void setD(float value) throws JavaScriptException /*-{
108 this.d = value;
109 }-*/;
110 /**
111 * The <var>e</var> component of the matrix.
112 */
113 public final native float getE() /*-{
114 return this.e;
115 }-*/;
116 /**
117 * The <var>e</var> component of the matrix.
118 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised on an attempt
119 * to change the value of a <a href="svgdom.html#ReadOnlyNodes">read only
120 * attribute</a>.
121 */
122 public final native void setE(float value) throws JavaScriptException /*-{
123 this.e = value;
124 }-*/;
125 /**
126 * The <var>f</var> component of the matrix.
127 */
128 public final native float getF() /*-{
129 return this.f;
130 }-*/;
131 /**
132 * The <var>f</var> component of the matrix.
133 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised on an attempt
134 * to change the value of a <a href="svgdom.html#ReadOnlyNodes">read only
135 * attribute</a>.
136 */
137 public final native void setF(float value) throws JavaScriptException /*-{
138 this.f = value;
139 }-*/;
140 /**
141 * Performs matrix multiplication. This matrix is post-multiplied by another
142 * matrix, returning the resulting new matrix.
143 * @param secondMatrix The matrix which is post-multiplied to this matrix.
144 * @return The resulting matrix.
145 */
146 public final native OMSVGMatrix multiply(OMSVGMatrix secondMatrix) /*-{
147 return this.multiply(secondMatrix);
148 }-*/;
149 /**
150 * Returns the inverse matrix.
151 * @return The inverse matrix.
152 * @throws SVGException(SVG_MATRIX_NOT_INVERTABLE) Raised if this matrix is
153 * not invertable.
154 */
155 public final native OMSVGMatrix inverse() throws JavaScriptException /*-{
156 return this.inverse();
157 }-*/;
158 /**
159 * Post-multiplies a translation transformation on the current matrix and
160 * returns the resulting matrix.
161 * @param x The distance to translate along the x-axis.
162 * @param y The distance to translate along the y-axis.
163 * @return The resulting matrix.
164 */
165 public final native OMSVGMatrix translate(float x, float y) /*-{
166 return this.translate(x, y);
167 }-*/;
168 /**
169 * Post-multiplies a uniform scale transformation on the current matrix and
170 * returns the resulting matrix.
171 * @param scaleFactor Scale factor in both X and Y.
172 * @return The resulting matrix.
173 */
174 public final native OMSVGMatrix scale(float scaleFactor) /*-{
175 return this.scale(scaleFactor);
176 }-*/;
177 /**
178 * Post-multiplies a non-uniform scale transformation on the current matrix
179 * and returns the resulting matrix.
180 * @param scaleFactorX Scale factor in X.
181 * @param scaleFactorY Scale factor in Y.
182 * @return The resulting matrix.
183 */
184 public final native OMSVGMatrix scaleNonUniform(float scaleFactorX, float scaleFactorY) /*-{
185 return this.scaleNonUniform(scaleFactorX, scaleFactorY);
186 }-*/;
187 /**
188 * Post-multiplies a rotation transformation on the current matrix and returns
189 * the resulting matrix.
190 * @param angle Rotation angle.
191 * @return The resulting matrix.
192 */
193 public final native OMSVGMatrix rotate(float angle) /*-{
194 return this.rotate(angle);
195 }-*/;
196 /**
197 * Post-multiplies a rotation transformation on the current matrix and returns
198 * the resulting matrix. The rotation angle is determined by taking (+/-)
199 * atan(y/x). The direction of the vector (x, y) determines whether the positive
200 * or negative angle value is used.
201 * @param x The X coordinate of the vector (x,y). Must not be zero.
202 * @param y The Y coordinate of the vector (x,y). Must not be zero.
203 * @return The resulting matrix.
204 * @throws SVGException(SVG_INVALID_VALUE_ERR) Raised if one of the parameters
205 * has an invalid value.
206 */
207 public final native OMSVGMatrix rotateFromVector(float x, float y) throws JavaScriptException /*-{
208 return this.rotateFromVector(x, y);
209 }-*/;
210 /**
211 * Post-multiplies the transformation [-1 0 0 1 0 0] and returns the resulting
212 * matrix.
213 * @return The resulting matrix.
214 */
215 public final native OMSVGMatrix flipX() /*-{
216 return this.flipX();
217 }-*/;
218 /**
219 * Post-multiplies the transformation [1 0 0 -1 0 0] and returns the resulting
220 * matrix.
221 * @return The resulting matrix.
222 */
223 public final native OMSVGMatrix flipY() /*-{
224 return this.flipY();
225 }-*/;
226 /**
227 * Post-multiplies a skewX transformation on the current matrix and returns
228 * the resulting matrix.
229 * @param angle Skew angle.
230 * @return The resulting matrix.
231 */
232 public final native OMSVGMatrix skewX(float angle) /*-{
233 return this.skewX(angle);
234 }-*/;
235 /**
236 * Post-multiplies a skewY transformation on the current matrix and returns
237 * the resulting matrix.
238 * @param angle Skew angle.
239 * @return The resulting matrix.
240 */
241 public final native OMSVGMatrix skewY(float angle) /*-{
242 return this.skewY(angle);
243 }-*/;
244
245 // Helper methods
246 /**
247 * Returns a textual description of the matrix for debugging purposes.
248 * @return a textual description of the matrix.
249 */
250 public final String getDescription() {
251 StringBuilder builder = new StringBuilder();
252 builder.append(getA());
253 builder.append(" ");
254 builder.append(getB());
255 builder.append(" ");
256 builder.append(getC());
257 builder.append(" ");
258 builder.append(getD());
259 builder.append(" ");
260 builder.append(getE());
261 builder.append(" ");
262 builder.append(getF());
263 return builder.toString();
264 }
265 /**
266 * Returns true if this matrix is the identity matrix
267 * @return
268 * true if this matrix is the identity matrix
269 */
270 public final boolean isIdentity() {
271 return getA() == 1 && getB() == 0 && getC() == 0 && getD() == 1 && getE() == 0 && getF() == 0;
272 }
273 }