diff options
Diffstat (limited to 'pango')
-rw-r--r-- | pango/Makefile.am | 1 | ||||
-rw-r--r-- | pango/pango-matrix.c | 250 | ||||
-rw-r--r-- | pango/pango-utils.c | 225 |
3 files changed, 251 insertions, 225 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am index 0a7edc8c..e2b9bd11 100644 --- a/pango/Makefile.am +++ b/pango/Makefile.am @@ -84,6 +84,7 @@ libpango_1_0_la_SOURCES = \ pango-script-table.h \ pango-tabs.c \ pango-utils.c \ + pango-matrix.c \ reorder-items.c \ shape.c \ pango-enum-types.c diff --git a/pango/pango-matrix.c b/pango/pango-matrix.c new file mode 100644 index 00000000..58be83e1 --- /dev/null +++ b/pango/pango-matrix.c @@ -0,0 +1,250 @@ +/* Pango + * pango-matrix.c: Matrix manipulation routines + * + * Copyright (C) 2000 Red Hat Software + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <config.h> +#include <math.h> + +#include "pango-types.h" +#include "pango-impl-utils.h" + +GType +pango_matrix_get_type (void) +{ + static GType our_type = 0; + + if (our_type == 0) + our_type = g_boxed_type_register_static (I_("PangoMatrix"), + (GBoxedCopyFunc) pango_matrix_copy, + (GBoxedFreeFunc) pango_matrix_free); + + return our_type; +} + +/** + * pango_matrix_copy: + * @matrix: a #PangoMatrix, can be %NULL + * + * Copies a #PangoMatrix. + * + * Return value: the newly allocated #PangoMatrix, which should + * be freed with pango_matrix_free(), or %NULL if + * @matrix was %NULL. + * + * Since: 1.6 + **/ +PangoMatrix * +pango_matrix_copy (const PangoMatrix *matrix) +{ + PangoMatrix *new_matrix; + + if (matrix) + { + new_matrix = g_slice_new (PangoMatrix); + *new_matrix = *matrix; + } + else + new_matrix = NULL; + + return new_matrix; +} + +/** + * pango_matrix_free: + * @matrix: a #PangoMatrix, or %NULL + * + * Free a #PangoMatrix created with pango_matrix_copy(). + * Does nothing if @matrix is %NULL. + * + * Since: 1.6 + **/ +void +pango_matrix_free (PangoMatrix *matrix) +{ + if (matrix) + g_slice_free (PangoMatrix, matrix); +} + +/** + * pango_matrix_translate: + * @matrix: a #PangoMatrix + * @tx: amount to translate in the X direction + * @ty: amount to translate in the Y direction + * + * Changes the transformation represented by @matrix to be the + * transformation given by first translating by (@tx, @ty) + * then applying the original transformation. + * + * Since: 1.6 + **/ +void +pango_matrix_translate (PangoMatrix *matrix, + double tx, + double ty) +{ + g_return_if_fail (matrix != NULL); + + matrix->x0 = matrix->xx * tx + matrix->xy * ty + matrix->x0; + matrix->y0 = matrix->yx * tx + matrix->yy * ty + matrix->y0; +} + +/** + * pango_matrix_scale: + * @matrix: a #PangoMatrix + * @scale_x: amount to scale by in X direction + * @scale_y: amount to scale by in Y direction + * + * Changes the transformation represented by @matrix to be the + * transformation given by first scaling by @sx in the X direction + * and @sy in the Y direction then applying the original + * transformation. + * + * Since: 1.6 + **/ +void +pango_matrix_scale (PangoMatrix *matrix, + double scale_x, + double scale_y) +{ + g_return_if_fail (matrix != NULL); + + matrix->xx *= scale_x; + matrix->xy *= scale_y; + matrix->yx *= scale_x; + matrix->yy *= scale_y; +} + +/** + * pango_matrix_rotate: + * @matrix: a #PangoMatrix + * @degrees: degrees to rotate counter-clockwise + * + * Changes the transformation represented by @matrix to be the + * transformation given by first rotating by @degrees degrees + * counter-clokwise then applying the original transformation. + * + * Since: 1.6 + **/ +void +pango_matrix_rotate (PangoMatrix *matrix, + double degrees) +{ + PangoMatrix tmp; + gdouble r, s, c; + + g_return_if_fail (matrix != NULL); + + r = degrees * (G_PI / 180.); + s = sin (r); + c = cos (r); + + tmp.xx = c; + tmp.xy = s; + tmp.yx = -s; + tmp.yy = c; + tmp.x0 = 0; + tmp.y0 = 0; + + pango_matrix_concat (matrix, &tmp); +} + +/** + * pango_matrix_concat: + * @matrix: a #PangoMatrix + * @new_matrix: a #PangoMatrix + * + * Changes the transformation represented by @matrix to be the + * transformation given by first applying transformation + * given by @new_matrix then applying the original transformation. + * + * Since: 1.6 + **/ +void +pango_matrix_concat (PangoMatrix *matrix, + const PangoMatrix *new_matrix) +{ + PangoMatrix tmp; + + g_return_if_fail (matrix != NULL); + + tmp = *matrix; + + matrix->xx = tmp.xx * new_matrix->xx + tmp.xy * new_matrix->yx; + matrix->xy = tmp.xx * new_matrix->xy + tmp.xy * new_matrix->yy; + matrix->yx = tmp.yx * new_matrix->xx + tmp.yy * new_matrix->yx; + matrix->yy = tmp.yx * new_matrix->xy + tmp.yy * new_matrix->yy; + matrix->x0 = tmp.xx * new_matrix->x0 + tmp.xy * new_matrix->y0 + tmp.x0; + matrix->y0 = tmp.yx * new_matrix->y0 + tmp.yy * new_matrix->y0 + tmp.y0; +} + +/** + * pango_matrix_get_font_scale_factor: + * @matrix: a #PangoMatrix, may be %NULL + * + * Returns the scale factor of a matrix on the height of the font. + * That is, the scale factor in the direction perpendicular to the + * vector that the X coordinate is mapped to. + * + * Return value: the scale factor of @matrix on the height of the font, + * or 1.0 if @matrix is %NULL. + * + * Since: 1.12 + **/ +double +pango_matrix_get_font_scale_factor (const PangoMatrix *matrix) +{ +/* + * Based on cairo-matrix.c:_cairo_matrix_compute_scale_factors() + * + * Copyright 2005, Keith Packard + */ + double det; + + if (!matrix) + return 1.0; + + det = matrix->xx * matrix->yy - matrix->yx * matrix->xy; + + if (det == 0) + { + return 0.0; + } + else + { + double x = matrix->xx; + double y = matrix->yx; + double major, minor; + + major = sqrt (x*x + y*y); + + /* + * ignore mirroring + */ + if (det < 0) + det = - det; + + if (major) + minor = det / major; + else + minor = 0.0; + + return minor; + } +} diff --git a/pango/pango-utils.c b/pango/pango-utils.c index 5094f083..70f32dbe 100644 --- a/pango/pango-utils.c +++ b/pango/pango-utils.c @@ -21,7 +21,6 @@ #include <config.h> #include <errno.h> -#include <math.h> #include <string.h> #include <stdlib.h> @@ -929,230 +928,6 @@ pango_parse_stretch (const char *str, return FALSE; } -GType -pango_matrix_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static (I_("PangoMatrix"), - (GBoxedCopyFunc) pango_matrix_copy, - (GBoxedFreeFunc) pango_matrix_free); - - return our_type; -} - -/** - * pango_matrix_copy: - * @matrix: a #PangoMatrix, can be %NULL - * - * Copies a #PangoMatrix. - * - * Return value: the newly allocated #PangoMatrix, which should - * be freed with pango_matrix_free(), or %NULL if - * @matrix was %NULL. - * - * Since: 1.6 - **/ -PangoMatrix * -pango_matrix_copy (const PangoMatrix *matrix) -{ - PangoMatrix *new_matrix; - - if (matrix) - { - new_matrix = g_slice_new (PangoMatrix); - *new_matrix = *matrix; - } - else - new_matrix = NULL; - - return new_matrix; -} - -/** - * pango_matrix_free: - * @matrix: a #PangoMatrix, or %NULL - * - * Free a #PangoMatrix created with pango_matrix_copy(). - * Does nothing if @matrix is %NULL. - * - * Since: 1.6 - **/ -void -pango_matrix_free (PangoMatrix *matrix) -{ - if (matrix) - g_slice_free (PangoMatrix, matrix); -} - -/** - * pango_matrix_translate: - * @matrix: a #PangoMatrix - * @tx: amount to translate in the X direction - * @ty: amount to translate in the Y direction - * - * Changes the transformation represented by @matrix to be the - * transformation given by first translating by (@tx, @ty) - * then applying the original transformation. - * - * Since: 1.6 - **/ -void -pango_matrix_translate (PangoMatrix *matrix, - double tx, - double ty) -{ - g_return_if_fail (matrix != NULL); - - matrix->x0 = matrix->xx * tx + matrix->xy * ty + matrix->x0; - matrix->y0 = matrix->yx * tx + matrix->yy * ty + matrix->y0; -} - -/** - * pango_matrix_scale: - * @matrix: a #PangoMatrix - * @scale_x: amount to scale by in X direction - * @scale_y: amount to scale by in Y direction - * - * Changes the transformation represented by @matrix to be the - * transformation given by first scaling by @sx in the X direction - * and @sy in the Y direction then applying the original - * transformation. - * - * Since: 1.6 - **/ -void -pango_matrix_scale (PangoMatrix *matrix, - double scale_x, - double scale_y) -{ - g_return_if_fail (matrix != NULL); - - matrix->xx *= scale_x; - matrix->xy *= scale_y; - matrix->yx *= scale_x; - matrix->yy *= scale_y; -} - -/** - * pango_matrix_rotate: - * @matrix: a #PangoMatrix - * @degrees: degrees to rotate counter-clockwise - * - * Changes the transformation represented by @matrix to be the - * transformation given by first rotating by @degrees degrees - * counter-clokwise then applying the original transformation. - * - * Since: 1.6 - **/ -void -pango_matrix_rotate (PangoMatrix *matrix, - double degrees) -{ - PangoMatrix tmp; - gdouble r, s, c; - - g_return_if_fail (matrix != NULL); - - r = degrees * (G_PI / 180.); - s = sin (r); - c = cos (r); - - tmp.xx = c; - tmp.xy = s; - tmp.yx = -s; - tmp.yy = c; - tmp.x0 = 0; - tmp.y0 = 0; - - pango_matrix_concat (matrix, &tmp); -} - -/** - * pango_matrix_concat: - * @matrix: a #PangoMatrix - * @new_matrix: a #PangoMatrix - * - * Changes the transformation represented by @matrix to be the - * transformation given by first applying transformation - * given by @new_matrix then applying the original transformation. - * - * Since: 1.6 - **/ -void -pango_matrix_concat (PangoMatrix *matrix, - const PangoMatrix *new_matrix) -{ - PangoMatrix tmp; - - g_return_if_fail (matrix != NULL); - - tmp = *matrix; - - matrix->xx = tmp.xx * new_matrix->xx + tmp.xy * new_matrix->yx; - matrix->xy = tmp.xx * new_matrix->xy + tmp.xy * new_matrix->yy; - matrix->yx = tmp.yx * new_matrix->xx + tmp.yy * new_matrix->yx; - matrix->yy = tmp.yx * new_matrix->xy + tmp.yy * new_matrix->yy; - matrix->x0 = tmp.xx * new_matrix->x0 + tmp.xy * new_matrix->y0 + tmp.x0; - matrix->y0 = tmp.yx * new_matrix->y0 + tmp.yy * new_matrix->y0 + tmp.y0; -} - -/** - * pango_matrix_get_font_scale_factor: - * @matrix: a #PangoMatrix, may be %NULL - * - * Returns the scale factor of a matrix on the height of the font. - * That is, the scale factor in the direction perpendicular to the - * vector that the X coordinate is mapped to. - * - * Return value: the scale factor of @matrix on the height of the font, - * or 1.0 if @matrix is %NULL. - * - * Since: 1.12 - **/ -double -pango_matrix_get_font_scale_factor (const PangoMatrix *matrix) -{ -/* - * Based on cairo-matrix.c:_cairo_matrix_compute_scale_factors() - * - * Copyright 2005, Keith Packard - */ - double det; - - if (!matrix) - return 1.0; - - det = matrix->xx * matrix->yy - matrix->yx * matrix->xy; - - if (det == 0) - { - return 0.0; - } - else - { - double x = matrix->xx; - double y = matrix->yx; - double major, minor; - - major = sqrt (x*x + y*y); - - /* - * ignore mirroring - */ - if (det < 0) - det = - det; - - if (major) - minor = det / major; - else - minor = 0.0; - - return minor; - } -} - static const char canon_map[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |