diff options
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | rsvg-affine.c | 273 | ||||
-rw-r--r-- | rsvg-art-composite.c | 7 | ||||
-rw-r--r-- | rsvg-art-draw.c | 7 | ||||
-rw-r--r-- | rsvg-filter.c | 7 | ||||
-rw-r--r-- | rsvg-image.c | 1 | ||||
-rw-r--r-- | rsvg-marker.c | 17 | ||||
-rw-r--r-- | rsvg-paint-server.c | 31 | ||||
-rw-r--r-- | rsvg-private.h | 48 | ||||
-rw-r--r-- | rsvg-shapes.c | 2 | ||||
-rw-r--r-- | rsvg-structure.c | 26 | ||||
-rw-r--r-- | rsvg-styles.c | 65 | ||||
-rw-r--r-- | rsvg-text.c | 2 | ||||
-rw-r--r-- | rsvg.c | 21 |
15 files changed, 402 insertions, 108 deletions
@@ -5,6 +5,8 @@ gnome-vfs can see. * *: Deprecate rsvg-gz. Move its functionality directly into RsvgHandle instead. Greatly simplifies much code. + * rsvg-affine.c: Steal libart's matrix affine code + * *: Use above instead of libart's matrix affine functions 2005-02-23 Caleb Moore <c.moore@student.unsw.edu.au> diff --git a/Makefile.am b/Makefile.am index e56a5159..c9cfcd52 100644 --- a/Makefile.am +++ b/Makefile.am @@ -29,6 +29,7 @@ lib_LTLIBRARIES = librsvg-2.la librsvg_2_la_SOURCES = \ rsvg-gz.c \ + rsvg-affine.c \ librsvg-features.c \ rsvg-bpath-util.c \ rsvg-bpath-util.h \ diff --git a/rsvg-affine.c b/rsvg-affine.c new file mode 100644 index 00000000..dd538a2e --- /dev/null +++ b/rsvg-affine.c @@ -0,0 +1,273 @@ +/* Libart_LGPL - library of basic graphic primitives + * Copyright (C) 1998 Raph Levien + * + * 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. + */ + +/* Simple manipulations with affine transformations */ + +#include "config.h" +#include "rsvg-private.h" + +#include <math.h> +#include <stdio.h> +#include <string.h> + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif /* M_PI */ + +/** + * _rsvg_affine_invert: Find the inverse of an affine transformation. + * @dst: Where the resulting affine is stored. + * @src: The original affine transformation. + * + * All non-degenerate affine transforms are invertible. If the original + * affine is degenerate or nearly so, expect numerical instability and + * very likely core dumps on Alpha and other fp-picky architectures. + * Otherwise, @dst multiplied with @src, or @src multiplied with @dst + * will be (to within roundoff error) the identity affine. + **/ +void +_rsvg_affine_invert (double dst[6], const double src[6]) +{ + double r_det; + + r_det = 1.0 / (src[0] * src[3] - src[1] * src[2]); + dst[0] = src[3] * r_det; + dst[1] = -src[1] * r_det; + dst[2] = -src[2] * r_det; + dst[3] = src[0] * r_det; + dst[4] = -src[4] * dst[0] - src[5] * dst[2]; + dst[5] = -src[4] * dst[1] - src[5] * dst[3]; +} + +/** + * _rsvg_affine_flip: Flip an affine transformation horizontally and/or vertically. + * @dst_affine: Where the resulting affine is stored. + * @src_affine: The original affine transformation. + * @horiz: Whether or not to flip horizontally. + * @vert: Whether or not to flip horizontally. + * + * Flips the affine transform. FALSE for both @horiz and @vert implements + * a simple copy operation. TRUE for both @horiz and @vert is a + * 180 degree rotation. It is ok for @src_affine and @dst_affine to + * be equal pointers. + **/ +void +_rsvg_affine_flip (double dst_affine[6], const double src_affine[6], int horz, int vert) +{ + dst_affine[0] = horz ? - src_affine[0] : src_affine[0]; + dst_affine[1] = horz ? - src_affine[1] : src_affine[1]; + dst_affine[2] = vert ? - src_affine[2] : src_affine[2]; + dst_affine[3] = vert ? - src_affine[3] : src_affine[3]; + dst_affine[4] = horz ? - src_affine[4] : src_affine[4]; + dst_affine[5] = vert ? - src_affine[5] : src_affine[5]; +} + +#define EPSILON 1e-6 + +/** + * _rsvg_affine_multiply: Multiply two affine transformation matrices. + * @dst: Where to store the result. + * @src1: The first affine transform to multiply. + * @src2: The second affine transform to multiply. + * + * Multiplies two affine transforms together, i.e. the resulting @dst + * is equivalent to doing first @src1 then @src2. Note that the + * PostScript concat operator multiplies on the left, i.e. "M concat" + * is equivalent to "CTM = multiply (M, CTM)"; + * + * It is safe to call this function with @dst equal to @src1 or @src2. + **/ +void +_rsvg_affine_multiply (double dst[6], const double src1[6], const double src2[6]) +{ + double d0, d1, d2, d3, d4, d5; + + d0 = src1[0] * src2[0] + src1[1] * src2[2]; + d1 = src1[0] * src2[1] + src1[1] * src2[3]; + d2 = src1[2] * src2[0] + src1[3] * src2[2]; + d3 = src1[2] * src2[1] + src1[3] * src2[3]; + d4 = src1[4] * src2[0] + src1[5] * src2[2] + src2[4]; + d5 = src1[4] * src2[1] + src1[5] * src2[3] + src2[5]; + dst[0] = d0; + dst[1] = d1; + dst[2] = d2; + dst[3] = d3; + dst[4] = d4; + dst[5] = d5; +} + +/** + * _rsvg_affine_identity: Set up the identity matrix. + * @dst: Where to store the resulting affine transform. + * + * Sets up an identity matrix. + **/ +void +_rsvg_affine_identity (double dst[6]) +{ + dst[0] = 1; + dst[1] = 0; + dst[2] = 0; + dst[3] = 1; + dst[4] = 0; + dst[5] = 0; +} + + +/** + * _rsvg_affine_scale: Set up a scaling matrix. + * @dst: Where to store the resulting affine transform. + * @sx: X scale factor. + * @sy: Y scale factor. + * + * Sets up a scaling matrix. + **/ +void +_rsvg_affine_scale (double dst[6], double sx, double sy) +{ + dst[0] = sx; + dst[1] = 0; + dst[2] = 0; + dst[3] = sy; + dst[4] = 0; + dst[5] = 0; +} + +/** + * _rsvg_affine_rotate: Set up a rotation affine transform. + * @dst: Where to store the resulting affine transform. + * @theta: Rotation angle in degrees. + * + * Sets up a rotation matrix. In the standard libart coordinate + * system, in which increasing y moves downward, this is a + * counterclockwise rotation. In the standard PostScript coordinate + * system, which is reversed in the y direction, it is a clockwise + * rotation. + **/ +void +_rsvg_affine_rotate (double dst[6], double theta) +{ + double s, c; + + s = sin (theta * M_PI / 180.0); + c = cos (theta * M_PI / 180.0); + dst[0] = c; + dst[1] = s; + dst[2] = -s; + dst[3] = c; + dst[4] = 0; + dst[5] = 0; +} + +/** + * _rsvg_affine_shear: Set up a shearing matrix. + * @dst: Where to store the resulting affine transform. + * @theta: Shear angle in degrees. + * + * Sets up a shearing matrix. In the standard libart coordinate system + * and a small value for theta, || becomes \\. Horizontal lines remain + * unchanged. + **/ +void +_rsvg_affine_shear (double dst[6], double theta) +{ + double t; + + t = tan (theta * M_PI / 180.0); + dst[0] = 1; + dst[1] = 0; + dst[2] = t; + dst[3] = 1; + dst[4] = 0; + dst[5] = 0; +} + +/** + * _rsvg_affine_translate: Set up a translation matrix. + * @dst: Where to store the resulting affine transform. + * @tx: X translation amount. + * @tx: Y translation amount. + * + * Sets up a translation matrix. + **/ +void +_rsvg_affine_translate (double dst[6], double tx, double ty) +{ + dst[0] = 1; + dst[1] = 0; + dst[2] = 0; + dst[3] = 1; + dst[4] = tx; + dst[5] = ty; +} + +/** + * _rsvg_affine_expansion: Find the affine's expansion factor. + * @src: The affine transformation. + * + * Finds the expansion factor, i.e. the square root of the factor + * by which the affine transform affects area. In an affine transform + * composed of scaling, rotation, shearing, and translation, returns + * the amount of scaling. + * + * Return value: the expansion factor. + **/ +double +_rsvg_affine_expansion (const double src[6]) +{ + return sqrt (fabs (src[0] * src[3] - src[1] * src[2])); +} + +/** + * _rsvg_affine_rectilinear: Determine whether the affine transformation is rectilinear. + * @src: The original affine transformation. + * + * Determines whether @src is rectilinear, i.e. grid-aligned + * rectangles are transformed to other grid-aligned rectangles. The + * implementation has epsilon-tolerance for roundoff errors. + * + * Return value: TRUE if @src is rectilinear. + **/ +int +_rsvg_affine_rectilinear (const double src[6]) +{ + return ((fabs (src[1]) < EPSILON && fabs (src[2]) < EPSILON) || + (fabs (src[0]) < EPSILON && fabs (src[3]) < EPSILON)); +} + +/** + * _rsvg_affine_equal: Determine whether two affine transformations are equal. + * @matrix1: An affine transformation. + * @matrix2: Another affine transformation. + * + * Determines whether @matrix1 and @matrix2 are equal, with + * epsilon-tolerance for roundoff errors. + * + * Return value: TRUE if @matrix1 and @matrix2 are equal. + **/ +int +_rsvg_affine_equal (double matrix1[6], double matrix2[6]) +{ + return (fabs (matrix1[0] - matrix2[0]) < EPSILON && + fabs (matrix1[1] - matrix2[1]) < EPSILON && + fabs (matrix1[2] - matrix2[2]) < EPSILON && + fabs (matrix1[3] - matrix2[3]) < EPSILON && + fabs (matrix1[4] - matrix2[4]) < EPSILON && + fabs (matrix1[5] - matrix2[5]) < EPSILON); +} diff --git a/rsvg-art-composite.c b/rsvg-art-composite.c index cbb80fae..bb06247a 100644 --- a/rsvg-art-composite.c +++ b/rsvg-art-composite.c @@ -37,7 +37,6 @@ #include "rsvg-art-mask.h" #include <libart_lgpl/art_rgba.h> -#include <libart_lgpl/art_affine.h> #include <libart_lgpl/art_rgb_svp.h> static void @@ -513,15 +512,15 @@ rsvg_art_affine_image(GdkPixbuf *img, GdkPixbuf *intermediate, intpix = gdk_pixbuf_get_pixels (intermediate); basebpp = has_alpha ? 4 : 3; - art_affine_invert(raw_inv_affine, affine); + _rsvg_affine_invert(raw_inv_affine, affine); /*scale to w and h*/ tmp_affine[0] = (double)w; tmp_affine[3] = (double)h; tmp_affine[1] = tmp_affine[2] = tmp_affine[4] = tmp_affine[5] = 0; - art_affine_multiply(tmp_affine, tmp_affine, affine); + _rsvg_affine_multiply(tmp_affine, tmp_affine, affine); - art_affine_invert(inv_affine, tmp_affine); + _rsvg_affine_invert(inv_affine, tmp_affine); /*apply the transformation*/ diff --git a/rsvg-art-draw.c b/rsvg-art-draw.c index 2f59db31..eba85002 100644 --- a/rsvg-art-draw.c +++ b/rsvg-art-draw.c @@ -31,7 +31,6 @@ #include <libart_lgpl/art_rgb_affine.h> #include <libart_lgpl/art_rgb_rgba_affine.h> #include <libart_lgpl/art_rgb_svp.h> -#include <libart_lgpl/art_affine.h> #include <libart_lgpl/art_svp_intersect.h> #include <libart_lgpl/art_svp_ops.h> @@ -127,7 +126,7 @@ rsvg_calculate_svp_bounds (const ArtSVP *svp, double * useraffine) float bigx, littlex, bigy, littley, assignedonce; RsvgFRect output; - art_affine_invert(affine, useraffine); + _rsvg_affine_invert(affine, useraffine); bigx = littlex = bigy = littley = assignedonce = 0; for (i = 0; i < svp->n_segs; i++) @@ -302,7 +301,7 @@ rsvg_render_outline (RsvgState *state, ArtVpath *vpath) /* todo: libart doesn't yet implement anamorphic scaling of strokes */ double stroke_width = state->stroke_width * - art_affine_expansion (state->affine); + _rsvg_affine_expansion (state->affine); if (stroke_width < 0.25) stroke_width = 0.25; @@ -560,7 +559,7 @@ void rsvg_art_render_image (RsvgDrawingCtx *ctx, GdkPixbuf * img, tmp_tmp_affine[4] = x; tmp_tmp_affine[5] = y; - art_affine_multiply(tmp_affine, tmp_tmp_affine, tmp_affine); + _rsvg_affine_multiply(tmp_affine, tmp_tmp_affine, tmp_affine); intermediate = gdk_pixbuf_new (GDK_COLORSPACE_RGB, 1, 8, gdk_pixbuf_get_width (pixbuf), diff --git a/rsvg-filter.c b/rsvg-filter.c index af3832ee..f6f997ff 100644 --- a/rsvg-filter.c +++ b/rsvg-filter.c @@ -28,7 +28,6 @@ #include "rsvg-image.h" #include "rsvg-css.h" #include <libart_lgpl/art_rgba.h> -#include <libart_lgpl/art_affine.h> #include <string.h> #include <math.h> @@ -3778,7 +3777,7 @@ rsvg_filter_primitive_turbulence_render (RsvgFilterPrimitive * self, output = _rsvg_pixbuf_new_cleared (GDK_COLORSPACE_RGB, 1, 8, width, height); output_pixels = gdk_pixbuf_get_pixels (output); - art_affine_invert(affine, ctx->paffine); + _rsvg_affine_invert(affine, ctx->paffine); for (y = 0; y < tileHeight; y++) { @@ -4624,7 +4623,7 @@ rsvg_filter_primitive_diffuse_lighting_render (RsvgFilterPrimitive * self, rawdy = oself->dy; } - art_affine_invert(iaffine, ctx->paffine); + _rsvg_affine_invert(iaffine, ctx->paffine); for (y = boundarys.y1; y < boundarys.y2; y++) for (x = boundarys.x1; x < boundarys.x2; x++) @@ -4806,7 +4805,7 @@ rsvg_filter_primitive_specular_lighting_render (RsvgFilterPrimitive * self, surfaceScale = oself->surfaceScale / 255.0; - art_affine_invert(iaffine, ctx->paffine); + _rsvg_affine_invert(iaffine, ctx->paffine); for (y = boundarys.y1; y < boundarys.y2; y++) for (x = boundarys.x1; x < boundarys.x2; x++) diff --git a/rsvg-image.c b/rsvg-image.c index 7950cee4..794f675b 100644 --- a/rsvg-image.c +++ b/rsvg-image.c @@ -30,7 +30,6 @@ #include <string.h> #include <math.h> #include <errno.h> -#include <libart_lgpl/art_affine.h> #include "rsvg-css.h" static const char s_UTF8_B64Alphabet[64] = { diff --git a/rsvg-marker.c b/rsvg-marker.c index df6d5078..aef7726b 100644 --- a/rsvg-marker.c +++ b/rsvg-marker.c @@ -32,7 +32,6 @@ #include "rsvg-mask.h" #include "rsvg-image.h" -#include <libart_lgpl/art_affine.h> #include <string.h> #include <math.h> #include <errno.h> @@ -189,7 +188,7 @@ rsvg_marker_render (RsvgMarker *self, gdouble x, gdouble y, gdouble orient, gdou RsvgState * state = rsvg_state_current(ctx); if (self->bbox) { - art_affine_scale(affine,linewidth * state->affine[0], + _rsvg_affine_scale(affine,linewidth * state->affine[0], linewidth * state->affine[3]); } else { for (i = 0; i < 6; i++) @@ -217,25 +216,25 @@ rsvg_marker_render (RsvgMarker *self, gdouble x, gdouble y, gdouble orient, gdou taffine[3] = h / self->vbh; taffine[4] = x; taffine[5] = y; - art_affine_multiply(affine, taffine, affine); + _rsvg_affine_multiply(affine, taffine, affine); } - art_affine_translate(taffine, -self->refX, -self->refY); + _rsvg_affine_translate(taffine, -self->refX, -self->refY); - art_affine_multiply(affine, taffine, affine); + _rsvg_affine_multiply(affine, taffine, affine); if (self->orientAuto) rotation = orient * 180. / M_PI; else rotation = self->orient; - art_affine_rotate(taffine, rotation); + _rsvg_affine_rotate(taffine, rotation); - art_affine_multiply(affine, affine, taffine); + _rsvg_affine_multiply(affine, affine, taffine); - art_affine_translate(taffine, x, y); + _rsvg_affine_translate(taffine, x, y); - art_affine_multiply(affine, affine, taffine); + _rsvg_affine_multiply(affine, affine, taffine); /*don't inherit anything from the current context*/ rsvg_state_finalize(state); diff --git a/rsvg-paint-server.c b/rsvg-paint-server.c index a16178c5..79905863 100644 --- a/rsvg-paint-server.c +++ b/rsvg-paint-server.c @@ -33,7 +33,6 @@ #include <glib/gmem.h> #include <glib/gmessages.h> #include <glib/gstrfuncs.h> -#include <libart_lgpl/art_affine.h> #include <libart_lgpl/art_render_mask.h> #include <string.h> #include <math.h> @@ -214,13 +213,13 @@ rsvg_paint_server_lin_grad_render (RsvgPaintServer *self, ArtRender *ar, affine[3] = ctx->y1 - ctx->y0; affine[4] = ctx->x0; affine[5] = ctx->y0; - art_affine_multiply(affine, affine, ctx->affine); + _rsvg_affine_multiply(affine, affine, ctx->affine); } else { for (i = 0; i < 6; i++) affine[i] = ctx->affine[i]; } - art_affine_multiply(affine, rlg->affine, affine); + _rsvg_affine_multiply(affine, rlg->affine, affine); /* in case I am hit by a bus, here is how the following code works: @@ -340,13 +339,13 @@ rsvg_paint_server_rad_grad_render (RsvgPaintServer *self, ArtRender *ar, affine[3] = ctx->y1 - ctx->y0; affine[4] = ctx->x0; affine[5] = ctx->y0; - art_affine_multiply(affine, affine, ctx->affine); + _rsvg_affine_multiply(affine, affine, ctx->affine); } else { for (i = 0; i < 6; i++) affine[i] = ctx->affine[i]; } - art_affine_multiply(affine, rrg->affine, affine); + _rsvg_affine_multiply(affine, rrg->affine, affine); agr = z->agr; if (agr == NULL) @@ -365,11 +364,11 @@ rsvg_paint_server_rad_grad_render (RsvgPaintServer *self, ArtRender *ar, z->agr = agr; } - art_affine_scale (aff1, rrg->r, rrg->r); - art_affine_translate (aff2, rrg->cx, rrg->cy); - art_affine_multiply (aff1, aff1, aff2); - art_affine_multiply (aff1, aff1, affine); - art_affine_invert (agr->affine, aff1); + _rsvg_affine_scale (aff1, rrg->r, rrg->r); + _rsvg_affine_translate (aff2, rrg->cx, rrg->cy); + _rsvg_affine_multiply (aff1, aff1, aff2); + _rsvg_affine_multiply (aff1, aff1, affine); + _rsvg_affine_invert (agr->affine, aff1); /* todo: libart doesn't support spreads on radial gradients */ @@ -504,7 +503,7 @@ render_image_pattern (ArtRender *render, guchar * pixels, gdouble x, gdouble y, for (i = 0; i < 6; i++) image_source->affine[i] = affine[i]; - art_affine_invert(image_source->invaffine, affine); + _rsvg_affine_invert(image_source->invaffine, affine); image_source->init = ART_FALSE; @@ -544,7 +543,7 @@ rsvg_paint_server_pattern_render (RsvgPaintServer *self, ArtRender *ar, affine[3] = ctx->y1 - ctx->y0; affine[4] = ctx->x0; affine[5] = ctx->y0; - art_affine_multiply(affine, affine, ctx->affine); + _rsvg_affine_multiply(affine, affine, ctx->affine); } else { for (i = 0; i < 6; i++) affine[i] = ctx->affine[i]; @@ -570,7 +569,7 @@ rsvg_paint_server_pattern_render (RsvgPaintServer *self, ArtRender *ar, caffine[3] = h / pattern->vbh; caffine[4] = x; caffine[5] = y; - art_affine_multiply(caffine, caffine, affine); + _rsvg_affine_multiply(caffine, caffine, affine); } else if (pattern->obj_cbbox) { caffine[0] = ctx->x1 - ctx->x0; @@ -579,14 +578,14 @@ rsvg_paint_server_pattern_render (RsvgPaintServer *self, ArtRender *ar, caffine[3] = ctx->y1 - ctx->y0; caffine[4] = ctx->x0; caffine[5] = ctx->y0; - art_affine_multiply(caffine, caffine, ctx->affine); + _rsvg_affine_multiply(caffine, caffine, ctx->affine); } else { for (i = 0; i < 6; i++) caffine[i] = ctx->affine[i]; } - art_affine_multiply(affine, affine, pattern->affine); - art_affine_multiply(caffine, caffine, pattern->affine); + _rsvg_affine_multiply(affine, affine, pattern->affine); + _rsvg_affine_multiply(caffine, caffine, pattern->affine); /*check if everything is going to be within the boundaries of the rendering surface*/ maxx = maxy = minx = miny = xoffset = yoffset = 0; diff --git a/rsvg-private.h b/rsvg-private.h index 1b14bcdd..5fc83231 100644 --- a/rsvg-private.h +++ b/rsvg-private.h @@ -229,6 +229,54 @@ void rsvg_add_clipping_rect (RsvgDrawingCtx *ctx, double x, double y, double w, double h); +void +_rsvg_affine_invert (double dst_affine[6], const double src_affine[6]); + +/* flip the matrix, FALSE, FALSE is a simple copy operation, and + TRUE, TRUE equals a rotation by 180 degrees */ +void +_rsvg_affine_flip (double dst_affine[6], const double src_affine[6], + int horz, int vert); + +void +_rsvg_affine_multiply (double dst[6], + const double src1[6], const double src2[6]); + +/* set up the identity matrix */ +void +_rsvg_affine_identity (double dst[6]); + +/* set up a scaling matrix */ +void +_rsvg_affine_scale (double dst[6], double sx, double sy); + +/* set up a rotation matrix; theta is given in degrees */ +void +_rsvg_affine_rotate (double dst[6], double theta); + +/* set up a shearing matrix; theta is given in degrees */ +void +_rsvg_affine_shear (double dst[6], double theta); + +/* set up a translation matrix */ +void +_rsvg_affine_translate (double dst[6], double tx, double ty); + + +/* find the affine's "expansion factor", i.e. the scale amount */ +double +_rsvg_affine_expansion (const double src[6]); + +/* Determine whether the affine transformation is rectilinear, + i.e. whether a rectangle aligned to the grid is transformed into + another rectangle aligned to the grid. */ +int +_rsvg_affine_rectilinear (const double src[6]); + +/* Determine whether two affine transformations are equal within grid allignment */ +int +_rsvg_affine_equal (double matrix1[6], double matrix2[6]); + G_END_DECLS #endif diff --git a/rsvg-shapes.c b/rsvg-shapes.c index 4938cfab..0fbd2788 100644 --- a/rsvg-shapes.c +++ b/rsvg-shapes.c @@ -35,8 +35,6 @@ #include "rsvg-css.h" #include "rsvg-defs.h" -#include <libart_lgpl/art_affine.h> - /* 4/3 * (1-cos 45)/sin 45 = 4/3 * sqrt(2) - 1 */ #define RSVG_ARC_MAGIC ((double) 0.5522847498) diff --git a/rsvg-structure.c b/rsvg-structure.c index b3290de1..51fe8b44 100644 --- a/rsvg-structure.c +++ b/rsvg-structure.c @@ -30,8 +30,6 @@ #include "rsvg-image.h" #include "rsvg-css.h" -#include <libart_lgpl/art_affine.h> - void rsvg_defs_drawable_draw (RsvgDefsDrawable * self, RsvgDrawingCtx *ctx, int dominate) @@ -178,8 +176,8 @@ rsvg_defs_drawable_use_resolve(RsvgDefsDrawableUse * self, RsvgDrawingCtx *ctx, case RSVG_DEF_PATH: { - art_affine_translate(affine, x, y); - art_affine_multiply(affine_out, affine, affine_out); + _rsvg_affine_translate(affine, x, y); + _rsvg_affine_multiply(affine_out, affine, affine_out); return (RsvgDefsDrawable *)parent; } case RSVG_DEF_SYMBOL: @@ -194,19 +192,19 @@ rsvg_defs_drawable_use_resolve(RsvgDefsDrawableUse * self, RsvgDrawingCtx *ctx, (symbol->preserve_aspect_ratio, symbol->width, symbol->height, &width, &height, &x, &y); - art_affine_translate(affine, x, y); - art_affine_multiply(affine_out, affine, affine_out); + _rsvg_affine_translate(affine, x, y); + _rsvg_affine_multiply(affine_out, affine, affine_out); - art_affine_scale(affine, width / symbol->width, + _rsvg_affine_scale(affine, width / symbol->width, height / symbol->height); - art_affine_multiply(affine_out, affine, affine_out); - art_affine_translate(affine, -symbol->x, + _rsvg_affine_multiply(affine_out, affine, affine_out); + _rsvg_affine_translate(affine, -symbol->x, -symbol->y); - art_affine_multiply(affine_out, affine, affine_out); + _rsvg_affine_multiply(affine_out, affine, affine_out); } else { - art_affine_translate(affine, x, y); - art_affine_multiply(affine_out, affine, affine_out); + _rsvg_affine_translate(affine, x, y); + _rsvg_affine_multiply(affine_out, affine, affine_out); } return drawable; @@ -338,7 +336,7 @@ rsvg_start_sub_svg (RsvgHandle *ctx, RsvgPropertyBag *atts) affine[5] = y - vbox_y * height / vbox_h; for (i = 0; i < 6; i++) state.personal_affine[i] = affine[i]; - art_affine_multiply(state.affine, affine, + _rsvg_affine_multiply(state.affine, affine, state.affine); ctx->width = vbox_w; ctx->height = vbox_h; @@ -353,7 +351,7 @@ rsvg_start_sub_svg (RsvgHandle *ctx, RsvgPropertyBag *atts) affine[5] = y; for (i = 0; i < 6; i++) state.personal_affine[i] = affine[i]; - art_affine_multiply(state.affine, affine, + _rsvg_affine_multiply(state.affine, affine, state.affine); } diff --git a/rsvg-styles.c b/rsvg-styles.c index efe47dfd..ca36cfca 100644 --- a/rsvg-styles.c +++ b/rsvg-styles.c @@ -34,27 +34,10 @@ #include "rsvg-mask.h" #include "rsvg-marker.h" -#include <libart_lgpl/art_affine.h> #include <libart_lgpl/art_svp_ops.h> #define RSVG_DEFAULT_FONT "Times New Roman" -/* -static guint32 -rsvg_state_current_color (RsvgState * cur_state, RsvgState * parent_state) -{ - if (cur_state) - { - if (cur_state->has_current_color) - return cur_state->current_color; - else if (parent_state) - return parent_state->current_color; - } - - return 0; -} -*/ - gdouble rsvg_viewport_percentage (gdouble width, gdouble height) { @@ -72,8 +55,8 @@ rsvg_state_init (RsvgState *state) { memset (state, 0, sizeof (RsvgState)); - art_affine_identity (state->affine); - art_affine_identity (state->personal_affine); + _rsvg_affine_identity (state->affine); + _rsvg_affine_identity (state->personal_affine); state->mask = NULL; state->opacity = 0xff; state->adobe_blend = 0; @@ -1071,7 +1054,7 @@ rsvg_parse_transform (double dst[6], const char *src) guint key_len; double tmp_affine[6]; - art_affine_identity (dst); + _rsvg_affine_identity (dst); idx = 0; while (src[idx]) @@ -1141,7 +1124,7 @@ rsvg_parse_transform (double dst[6], const char *src) { if (n_args != 6) return FALSE; - art_affine_multiply (dst, args, dst); + _rsvg_affine_multiply (dst, args, dst); } else if (!strcmp (keyword, "translate")) { @@ -1149,8 +1132,8 @@ rsvg_parse_transform (double dst[6], const char *src) args[1] = 0; else if (n_args != 2) return FALSE; - art_affine_translate (tmp_affine, args[0], args[1]); - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_translate (tmp_affine, args[0], args[1]); + _rsvg_affine_multiply (dst, tmp_affine, dst); } else if (!strcmp (keyword, "scale")) { @@ -1158,23 +1141,23 @@ rsvg_parse_transform (double dst[6], const char *src) args[1] = args[0]; else if (n_args != 2) return FALSE; - art_affine_scale (tmp_affine, args[0], args[1]); - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_scale (tmp_affine, args[0], args[1]); + _rsvg_affine_multiply (dst, tmp_affine, dst); } else if (!strcmp (keyword, "rotate")) { if (n_args == 1) { - art_affine_rotate (tmp_affine, args[0]); - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_rotate (tmp_affine, args[0]); + _rsvg_affine_multiply (dst, tmp_affine, dst); } else if (n_args == 3) { - art_affine_translate (tmp_affine, args[1], args[2]); - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_translate (tmp_affine, args[1], args[2]); + _rsvg_affine_multiply (dst, tmp_affine, dst); - art_affine_rotate (tmp_affine, args[0]); - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_rotate (tmp_affine, args[0]); + _rsvg_affine_multiply (dst, tmp_affine, dst); - art_affine_translate (tmp_affine, -args[1], -args[2]); - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_translate (tmp_affine, -args[1], -args[2]); + _rsvg_affine_multiply (dst, tmp_affine, dst); } else return FALSE; } @@ -1182,18 +1165,18 @@ rsvg_parse_transform (double dst[6], const char *src) { if (n_args != 1) return FALSE; - art_affine_shear (tmp_affine, args[0]); - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_shear (tmp_affine, args[0]); + _rsvg_affine_multiply (dst, tmp_affine, dst); } else if (!strcmp (keyword, "skewY")) { if (n_args != 1) return FALSE; - art_affine_shear (tmp_affine, args[0]); + _rsvg_affine_shear (tmp_affine, args[0]); /* transpose the affine, given that we know [1] is zero */ tmp_affine[1] = tmp_affine[2]; tmp_affine[2] = 0; - art_affine_multiply (dst, tmp_affine, dst); + _rsvg_affine_multiply (dst, tmp_affine, dst); } else return FALSE; /* unknown keyword */ @@ -1216,8 +1199,8 @@ rsvg_parse_transform_attr (RsvgHandle *ctx, RsvgState *state, const char *str) if (rsvg_parse_transform (affine, str)) { - art_affine_multiply (state->personal_affine, affine, state->personal_affine); - art_affine_multiply (state->affine, affine, state->affine); + _rsvg_affine_multiply (state->personal_affine, affine, state->personal_affine); + _rsvg_affine_multiply (state->affine, affine, state->affine); } } @@ -1477,7 +1460,7 @@ rsvg_state_reinherit_top(RsvgDrawingCtx * ctx, RsvgState * state, int dominate) if (parent) { rsvg_state_dominate(rsvg_state_current(ctx), rsvg_state_parent(ctx)); - art_affine_multiply (rsvg_state_current(ctx)->affine, rsvg_state_current(ctx)->affine, + _rsvg_affine_multiply (rsvg_state_current(ctx)->affine, rsvg_state_current(ctx)->affine, rsvg_state_parent(ctx)->affine); } } @@ -1490,7 +1473,7 @@ rsvg_state_reinherit_top(RsvgDrawingCtx * ctx, RsvgState * state, int dominate) if (parent) { rsvg_state_reinherit(rsvg_state_current(ctx), rsvg_state_parent(ctx)); - art_affine_multiply (rsvg_state_current(ctx)->affine, rsvg_state_current(ctx)->affine, + _rsvg_affine_multiply (rsvg_state_current(ctx)->affine, rsvg_state_current(ctx)->affine, rsvg_state_parent(ctx)->affine); } } diff --git a/rsvg-text.c b/rsvg-text.c index c1512298..5d485373 100644 --- a/rsvg-text.c +++ b/rsvg-text.c @@ -30,8 +30,6 @@ #include "rsvg-text.h" #include "rsvg-css.h" -#include <libart_lgpl/art_affine.h> - #include "rsvg-shapes.h" #include <ft2build.h> @@ -47,8 +47,6 @@ #include <string.h> #include <stdarg.h> -#include <libart_lgpl/art_affine.h> - #include "rsvg-bpath-util.h" #include "rsvg-path.h" #include "rsvg-paint-server.h" @@ -178,16 +176,16 @@ rsvg_start_svg (RsvgHandle *ctx, RsvgPropertyBag *atts) /* Scale size of target pixbuf */ - art_affine_identity (state.affine); + _rsvg_affine_identity (state.affine); if (has_vbox && (vbox_x != 0. || vbox_y != 0.)) { - art_affine_translate (affine, - vbox_x, - vbox_y); - art_affine_multiply (state.affine, state.affine, affine); + _rsvg_affine_translate (affine, - vbox_x, - vbox_y); + _rsvg_affine_multiply (state.affine, state.affine, affine); } - art_affine_scale (affine, x_zoom, y_zoom); - art_affine_multiply (state.affine, state.affine, affine); + _rsvg_affine_scale (affine, x_zoom, y_zoom); + _rsvg_affine_multiply (state.affine, state.affine, affine); if (new_width <= 0 || new_height <= 0) { @@ -480,7 +478,7 @@ rsvg_start_linear_gradient (RsvgHandle *ctx, RsvgPropertyBag *atts) for (i = 0; i < 6; i++) grad->affine[i] = affine[i]; else - art_affine_identity(grad->affine); + _rsvg_affine_identity(grad->affine); if (got_color) { @@ -650,7 +648,7 @@ rsvg_start_radial_gradient (RsvgHandle *ctx, RsvgPropertyBag *atts, const char * for (i = 0; i < 6; i++) grad->affine[i] = affine[i]; else - art_affine_identity(grad->affine); + _rsvg_affine_identity(grad->affine); if (got_color) { @@ -784,7 +782,7 @@ rsvg_start_pattern (RsvgHandle *ctx, RsvgPropertyBag *atts) for (i = 0; i < 6; i++) pattern->affine[i] = affine[i]; else - art_affine_identity(pattern->affine); + _rsvg_affine_identity(pattern->affine); if (got_aspect_ratio) pattern->preserve_aspect_ratio = aspect_ratio; @@ -1707,7 +1705,8 @@ rsvg_new_drawing_ctx(RsvgHandle * handle) return draw; } -/** rsvg_set_default_dpi_x_y +/** + * rsvg_set_default_dpi_x_y * @dpi_x: Dots Per Inch (aka Pixels Per Inch) * @dpi_y: Dots Per Inch (aka Pixels Per Inch) * |