1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
3
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
5
<refentry id="libgimpmath-GimpMatrix">
7
<refentrytitle>GimpMatrix</refentrytitle>
8
<manvolnum>3</manvolnum>
9
<refmiscinfo>LIBGIMPMATH Library</refmiscinfo>
13
<refname>GimpMatrix</refname><refpurpose>Utilities to set up and manipulate 3x3 transformation matrices.</refpurpose>
16
<refsynopsisdiv><title>Synopsis</title>
22
struct <link linkend="GimpMatrix2">GimpMatrix2</link>;
23
struct <link linkend="GimpMatrix3">GimpMatrix3</link>;
24
struct <link linkend="GimpMatrix4">GimpMatrix4</link>;
25
<link linkend="void">void</link> <link linkend="gimp-matrix2-identity">gimp_matrix2_identity</link> (<link linkend="GimpMatrix2">GimpMatrix2</link> *matrix);
26
<link linkend="void">void</link> <link linkend="gimp-matrix2-mult">gimp_matrix2_mult</link> (const <link linkend="GimpMatrix2">GimpMatrix2</link> *matrix1,
27
<link linkend="GimpMatrix2">GimpMatrix2</link> *matrix2);
28
<link linkend="void">void</link> <link linkend="gimp-matrix3-identity">gimp_matrix3_identity</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);
29
<link linkend="void">void</link> <link linkend="gimp-matrix3-mult">gimp_matrix3_mult</link> (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix1,
30
<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix2);
31
<link linkend="void">void</link> <link linkend="gimp-matrix3-translate">gimp_matrix3_translate</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
32
<link linkend="gdouble">gdouble</link> x,
33
<link linkend="gdouble">gdouble</link> y);
34
<link linkend="void">void</link> <link linkend="gimp-matrix3-scale">gimp_matrix3_scale</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
35
<link linkend="gdouble">gdouble</link> x,
36
<link linkend="gdouble">gdouble</link> y);
37
<link linkend="void">void</link> <link linkend="gimp-matrix3-rotate">gimp_matrix3_rotate</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
38
<link linkend="gdouble">gdouble</link> theta);
39
<link linkend="void">void</link> <link linkend="gimp-matrix3-xshear">gimp_matrix3_xshear</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
40
<link linkend="gdouble">gdouble</link> amount);
41
<link linkend="void">void</link> <link linkend="gimp-matrix3-yshear">gimp_matrix3_yshear</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
42
<link linkend="gdouble">gdouble</link> amount);
43
<link linkend="void">void</link> <link linkend="gimp-matrix3-affine">gimp_matrix3_affine</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
44
<link linkend="gdouble">gdouble</link> a,
45
<link linkend="gdouble">gdouble</link> b,
46
<link linkend="gdouble">gdouble</link> c,
47
<link linkend="gdouble">gdouble</link> d,
48
<link linkend="gdouble">gdouble</link> e,
49
<link linkend="gdouble">gdouble</link> f);
50
<link linkend="void">void</link> <link linkend="gimp-matrix3-transform-point">gimp_matrix3_transform_point</link> (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
51
<link linkend="gdouble">gdouble</link> x,
52
<link linkend="gdouble">gdouble</link> y,
53
<link linkend="gdouble">gdouble</link> *newx,
54
<link linkend="gdouble">gdouble</link> *newy);
55
<link linkend="gdouble">gdouble</link> <link linkend="gimp-matrix3-determinant">gimp_matrix3_determinant</link> (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);
56
<link linkend="void">void</link> <link linkend="gimp-matrix3-invert">gimp_matrix3_invert</link> (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);
57
<link linkend="gboolean">gboolean</link> <link linkend="gimp-matrix3-is-diagonal">gimp_matrix3_is_diagonal</link> (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);
58
<link linkend="gboolean">gboolean</link> <link linkend="gimp-matrix3-is-identity">gimp_matrix3_is_identity</link> (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);
59
<link linkend="gboolean">gboolean</link> <link linkend="gimp-matrix3-is-simple">gimp_matrix3_is_simple</link> (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);
60
<link linkend="void">void</link> <link linkend="gimp-matrix4-to-deg">gimp_matrix4_to_deg</link> (const <link linkend="GimpMatrix4">GimpMatrix4</link> *matrix,
61
<link linkend="gdouble">gdouble</link> *a,
62
<link linkend="gdouble">gdouble</link> *b,
63
<link linkend="gdouble">gdouble</link> *c);
76
<title>Description</title>
78
When doing image manipulation you will often need 3x3 transformation
79
matrices that define translation, rotation, scaling, shearing and
80
arbitrary perspective transformations using a 3x3 matrix. Here you'll
81
find a set of utility functions to set up those matrices and to perform
82
basic matrix manipulations and tests.
87
<title>Details</title>
89
<title><anchor id="GimpMatrix2"/>struct GimpMatrix2</title>
90
<indexterm><primary>GimpMatrix2</primary></indexterm><programlisting>struct GimpMatrix2 {
99
<title><anchor id="GimpMatrix3"/>struct GimpMatrix3</title>
100
<indexterm><primary>GimpMatrix3</primary></indexterm><programlisting>struct GimpMatrix3 {
106
A three by three matrix.
109
<title><anchor id="GimpMatrix4"/>struct GimpMatrix4</title>
110
<indexterm><primary>GimpMatrix4</primary></indexterm><programlisting>struct GimpMatrix4 {
116
A four by four matrix.
119
<title><anchor id="gimp-matrix2-identity"/>gimp_matrix2_identity ()</title>
120
<indexterm><primary>gimp_matrix2_identity</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix2_identity (<link linkend="GimpMatrix2">GimpMatrix2</link> *matrix);</programlisting>
122
Sets the matrix to the identity matrix.</para>
125
</para><variablelist role="params">
126
<varlistentry><term><parameter>matrix</parameter> :</term>
127
<listitem><simpara> A matrix.
128
</simpara></listitem></varlistentry>
129
</variablelist></refsect2>
131
<title><anchor id="gimp-matrix2-mult"/>gimp_matrix2_mult ()</title>
132
<indexterm><primary>gimp_matrix2_mult</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix2_mult (const <link linkend="GimpMatrix2">GimpMatrix2</link> *matrix1,
133
<link linkend="GimpMatrix2">GimpMatrix2</link> *matrix2);</programlisting>
135
Multiplies two matrices and puts the result into the second one.</para>
138
</para><variablelist role="params">
139
<varlistentry><term><parameter>matrix1</parameter> :</term>
140
<listitem><simpara> The first input matrix.
141
</simpara></listitem></varlistentry>
142
<varlistentry><term><parameter>matrix2</parameter> :</term>
143
<listitem><simpara> The second input matrix which will be overwritten by the result.
144
</simpara></listitem></varlistentry>
145
</variablelist></refsect2>
147
<title><anchor id="gimp-matrix3-identity"/>gimp_matrix3_identity ()</title>
148
<indexterm><primary>gimp_matrix3_identity</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_identity (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);</programlisting>
150
Sets the matrix to the identity matrix.</para>
153
</para><variablelist role="params">
154
<varlistentry><term><parameter>matrix</parameter> :</term>
155
<listitem><simpara> A matrix.
156
</simpara></listitem></varlistentry>
157
</variablelist></refsect2>
159
<title><anchor id="gimp-matrix3-mult"/>gimp_matrix3_mult ()</title>
160
<indexterm><primary>gimp_matrix3_mult</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_mult (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix1,
161
<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix2);</programlisting>
163
Multiplies two matrices and puts the result into the second one.</para>
166
</para><variablelist role="params">
167
<varlistentry><term><parameter>matrix1</parameter> :</term>
168
<listitem><simpara> The first input matrix.
169
</simpara></listitem></varlistentry>
170
<varlistentry><term><parameter>matrix2</parameter> :</term>
171
<listitem><simpara> The second input matrix which will be overwritten by the result.
172
</simpara></listitem></varlistentry>
173
</variablelist></refsect2>
175
<title><anchor id="gimp-matrix3-translate"/>gimp_matrix3_translate ()</title>
176
<indexterm><primary>gimp_matrix3_translate</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_translate (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
177
<link linkend="gdouble">gdouble</link> x,
178
<link linkend="gdouble">gdouble</link> y);</programlisting>
180
Translates the matrix by x and y.</para>
183
</para><variablelist role="params">
184
<varlistentry><term><parameter>matrix</parameter> :</term>
185
<listitem><simpara> The matrix that is to be translated.
186
</simpara></listitem></varlistentry>
187
<varlistentry><term><parameter>x</parameter> :</term>
188
<listitem><simpara> Translation in X direction.
189
</simpara></listitem></varlistentry>
190
<varlistentry><term><parameter>y</parameter> :</term>
191
<listitem><simpara> Translation in Y direction.
192
</simpara></listitem></varlistentry>
193
</variablelist></refsect2>
195
<title><anchor id="gimp-matrix3-scale"/>gimp_matrix3_scale ()</title>
196
<indexterm><primary>gimp_matrix3_scale</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_scale (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
197
<link linkend="gdouble">gdouble</link> x,
198
<link linkend="gdouble">gdouble</link> y);</programlisting>
200
Scales the matrix by x and y</para>
203
</para><variablelist role="params">
204
<varlistentry><term><parameter>matrix</parameter> :</term>
205
<listitem><simpara> The matrix that is to be scaled.
206
</simpara></listitem></varlistentry>
207
<varlistentry><term><parameter>x</parameter> :</term>
208
<listitem><simpara> X scale factor.
209
</simpara></listitem></varlistentry>
210
<varlistentry><term><parameter>y</parameter> :</term>
211
<listitem><simpara> Y scale factor.
212
</simpara></listitem></varlistentry>
213
</variablelist></refsect2>
215
<title><anchor id="gimp-matrix3-rotate"/>gimp_matrix3_rotate ()</title>
216
<indexterm><primary>gimp_matrix3_rotate</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_rotate (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
217
<link linkend="gdouble">gdouble</link> theta);</programlisting>
219
Rotates the matrix by theta degrees.</para>
222
</para><variablelist role="params">
223
<varlistentry><term><parameter>matrix</parameter> :</term>
224
<listitem><simpara> The matrix that is to be rotated.
225
</simpara></listitem></varlistentry>
226
<varlistentry><term><parameter>theta</parameter> :</term>
227
<listitem><simpara> The angle of rotation (in radians).
228
</simpara></listitem></varlistentry>
229
</variablelist></refsect2>
231
<title><anchor id="gimp-matrix3-xshear"/>gimp_matrix3_xshear ()</title>
232
<indexterm><primary>gimp_matrix3_xshear</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_xshear (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
233
<link linkend="gdouble">gdouble</link> amount);</programlisting>
235
Shears the matrix in the X direction.</para>
238
</para><variablelist role="params">
239
<varlistentry><term><parameter>matrix</parameter> :</term>
240
<listitem><simpara> The matrix that is to be sheared.
241
</simpara></listitem></varlistentry>
242
<varlistentry><term><parameter>amount</parameter> :</term>
243
<listitem><simpara> X shear amount.
244
</simpara></listitem></varlistentry>
245
</variablelist></refsect2>
247
<title><anchor id="gimp-matrix3-yshear"/>gimp_matrix3_yshear ()</title>
248
<indexterm><primary>gimp_matrix3_yshear</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_yshear (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
249
<link linkend="gdouble">gdouble</link> amount);</programlisting>
251
Shears the matrix in the Y direction.</para>
254
</para><variablelist role="params">
255
<varlistentry><term><parameter>matrix</parameter> :</term>
256
<listitem><simpara> The matrix that is to be sheared.
257
</simpara></listitem></varlistentry>
258
<varlistentry><term><parameter>amount</parameter> :</term>
259
<listitem><simpara> Y shear amount.
260
</simpara></listitem></varlistentry>
261
</variablelist></refsect2>
263
<title><anchor id="gimp-matrix3-affine"/>gimp_matrix3_affine ()</title>
264
<indexterm><primary>gimp_matrix3_affine</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_affine (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
265
<link linkend="gdouble">gdouble</link> a,
266
<link linkend="gdouble">gdouble</link> b,
267
<link linkend="gdouble">gdouble</link> c,
268
<link linkend="gdouble">gdouble</link> d,
269
<link linkend="gdouble">gdouble</link> e,
270
<link linkend="gdouble">gdouble</link> f);</programlisting>
272
Applies the affine transformation given by six values to <parameter>matrix</parameter>.
273
The six values form define an affine transformation matrix as
282
</para><variablelist role="params">
283
<varlistentry><term><parameter>matrix</parameter> :</term>
284
<listitem><simpara> The input matrix.
285
</simpara></listitem></varlistentry>
286
<varlistentry><term><parameter>a</parameter> :</term>
288
</simpara></listitem></varlistentry>
289
<varlistentry><term><parameter>b</parameter> :</term>
291
</simpara></listitem></varlistentry>
292
<varlistentry><term><parameter>c</parameter> :</term>
294
</simpara></listitem></varlistentry>
295
<varlistentry><term><parameter>d</parameter> :</term>
297
</simpara></listitem></varlistentry>
298
<varlistentry><term><parameter>e</parameter> :</term>
300
</simpara></listitem></varlistentry>
301
<varlistentry><term><parameter>f</parameter> :</term>
303
</simpara></listitem></varlistentry>
304
</variablelist></refsect2>
306
<title><anchor id="gimp-matrix3-transform-point"/>gimp_matrix3_transform_point ()</title>
307
<indexterm><primary>gimp_matrix3_transform_point</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_transform_point (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix,
308
<link linkend="gdouble">gdouble</link> x,
309
<link linkend="gdouble">gdouble</link> y,
310
<link linkend="gdouble">gdouble</link> *newx,
311
<link linkend="gdouble">gdouble</link> *newy);</programlisting>
313
Transforms a point in 2D as specified by the transformation matrix.</para>
316
</para><variablelist role="params">
317
<varlistentry><term><parameter>matrix</parameter> :</term>
318
<listitem><simpara> The transformation matrix.
319
</simpara></listitem></varlistentry>
320
<varlistentry><term><parameter>x</parameter> :</term>
321
<listitem><simpara> The source X coordinate.
322
</simpara></listitem></varlistentry>
323
<varlistentry><term><parameter>y</parameter> :</term>
324
<listitem><simpara> The source Y coordinate.
325
</simpara></listitem></varlistentry>
326
<varlistentry><term><parameter>newx</parameter> :</term>
327
<listitem><simpara> The transformed X coordinate.
328
</simpara></listitem></varlistentry>
329
<varlistentry><term><parameter>newy</parameter> :</term>
330
<listitem><simpara> The transformed Y coordinate.
331
</simpara></listitem></varlistentry>
332
</variablelist></refsect2>
334
<title><anchor id="gimp-matrix3-determinant"/>gimp_matrix3_determinant ()</title>
335
<indexterm><primary>gimp_matrix3_determinant</primary></indexterm><programlisting><link linkend="gdouble">gdouble</link> gimp_matrix3_determinant (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);</programlisting>
337
Calculates the determinant of the given matrix.</para>
340
</para><variablelist role="params">
341
<varlistentry><term><parameter>matrix</parameter> :</term>
342
<listitem><simpara> The input matrix.
343
</simpara></listitem></varlistentry>
344
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara> The determinant.
345
</simpara></listitem></varlistentry>
346
</variablelist></refsect2>
348
<title><anchor id="gimp-matrix3-invert"/>gimp_matrix3_invert ()</title>
349
<indexterm><primary>gimp_matrix3_invert</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix3_invert (<link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);</programlisting>
351
Inverts the given matrix.</para>
354
</para><variablelist role="params">
355
<varlistentry><term><parameter>matrix</parameter> :</term>
356
<listitem><simpara> The matrix that is to be inverted.
357
</simpara></listitem></varlistentry>
358
</variablelist></refsect2>
360
<title><anchor id="gimp-matrix3-is-diagonal"/>gimp_matrix3_is_diagonal ()</title>
361
<indexterm><primary>gimp_matrix3_is_diagonal</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link> gimp_matrix3_is_diagonal (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);</programlisting>
363
Checks if the given matrix is diagonal.</para>
366
</para><variablelist role="params">
367
<varlistentry><term><parameter>matrix</parameter> :</term>
368
<listitem><simpara> The matrix that is to be tested.
369
</simpara></listitem></varlistentry>
370
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara> TRUE if the matrix is diagonal.
371
</simpara></listitem></varlistentry>
372
</variablelist></refsect2>
374
<title><anchor id="gimp-matrix3-is-identity"/>gimp_matrix3_is_identity ()</title>
375
<indexterm><primary>gimp_matrix3_is_identity</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link> gimp_matrix3_is_identity (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);</programlisting>
377
Checks if the given matrix is the identity matrix.</para>
380
</para><variablelist role="params">
381
<varlistentry><term><parameter>matrix</parameter> :</term>
382
<listitem><simpara> The matrix that is to be tested.
383
</simpara></listitem></varlistentry>
384
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara> TRUE if the matrix is the identity matrix.
385
</simpara></listitem></varlistentry>
386
</variablelist></refsect2>
388
<title><anchor id="gimp-matrix3-is-simple"/>gimp_matrix3_is_simple ()</title>
389
<indexterm><primary>gimp_matrix3_is_simple</primary></indexterm><programlisting><link linkend="gboolean">gboolean</link> gimp_matrix3_is_simple (const <link linkend="GimpMatrix3">GimpMatrix3</link> *matrix);</programlisting>
391
Checks if we'll need to interpolate when applying this matrix as
392
a transformation.</para>
395
</para><variablelist role="params">
396
<varlistentry><term><parameter>matrix</parameter> :</term>
397
<listitem><simpara> The matrix that is to be tested.
398
</simpara></listitem></varlistentry>
399
<varlistentry><term><emphasis>Returns</emphasis> :</term><listitem><simpara> TRUE if all entries of the upper left 2x2 matrix are either
401
</simpara></listitem></varlistentry>
402
</variablelist></refsect2>
404
<title><anchor id="gimp-matrix4-to-deg"/>gimp_matrix4_to_deg ()</title>
405
<indexterm><primary>gimp_matrix4_to_deg</primary></indexterm><programlisting><link linkend="void">void</link> gimp_matrix4_to_deg (const <link linkend="GimpMatrix4">GimpMatrix4</link> *matrix,
406
<link linkend="gdouble">gdouble</link> *a,
407
<link linkend="gdouble">gdouble</link> *b,
408
<link linkend="gdouble">gdouble</link> *c);</programlisting>
413
</para><variablelist role="params">
414
<varlistentry><term><parameter>matrix</parameter> :</term>
416
</simpara></listitem></varlistentry>
417
<varlistentry><term><parameter>a</parameter> :</term>
419
</simpara></listitem></varlistentry>
420
<varlistentry><term><parameter>b</parameter> :</term>
422
</simpara></listitem></varlistentry>
423
<varlistentry><term><parameter>c</parameter> :</term>
425
</simpara></listitem></varlistentry>
426
</variablelist></refsect2>
433
<title>See Also</title>
435
<link linkend="GimpVector2"><type>GimpVector2</type></link>
438
<link linkend="GimpVector3"><type>GimpVector3</type></link>
441
<link linkend="GimpVector4"><type>GimpVector4</type></link>