[lasem] feTurbulence: fix frequency calculation



commit 7babfeb51f72080e5e033a2dd4d6f071e828fadf
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sat Aug 15 23:10:41 2015 +0200

    feTurbulence: fix frequency calculation

 src/lsmsvgfiltersurface.c |   10 +++++++---
 src/lsmsvgfiltersurface.h |    3 ++-
 src/lsmsvgview.c          |    6 +++++-
 tests/filter.c            |    7 ++++++-
 4 files changed, 20 insertions(+), 6 deletions(-)
---
diff --git a/src/lsmsvgfiltersurface.c b/src/lsmsvgfiltersurface.c
index 4eb45f2..ce183af 100644
--- a/src/lsmsvgfiltersurface.c
+++ b/src/lsmsvgfiltersurface.c
@@ -1292,7 +1292,8 @@ void
 lsm_svg_filter_surface_turbulence (LsmSvgFilterSurface *output,
                                   double base_frequency_x, double base_frequency_y,
                                   int n_octaves, double seed,
-                                  LsmSvgStitchTiles stitch_tiles, LsmSvgTurbulenceType type)
+                                  LsmSvgStitchTiles stitch_tiles, LsmSvgTurbulenceType type,
+                                  const cairo_matrix_t *transform)
 {
        LsmSvgTurbulence turbulence;
        cairo_t *cairo;
@@ -1303,6 +1304,11 @@ lsm_svg_filter_surface_turbulence (LsmSvgFilterSurface *output,
        cairo_matrix_t affine;
 
        g_return_if_fail (output != NULL);
+       g_return_if_fail (transform != NULL);
+
+       affine = *transform;
+       if (cairo_matrix_invert (&affine) != CAIRO_STATUS_SUCCESS)
+               return;
 
        width = cairo_image_surface_get_width (output->surface);
        height = cairo_image_surface_get_height (output->surface);
@@ -1320,8 +1326,6 @@ lsm_svg_filter_surface_turbulence (LsmSvgFilterSurface *output,
        y1 = CLAMP (output->subregion.y, 0, height);
        y2 = CLAMP (output->subregion.y + output->subregion.height, 0, height);
 
-       cairo_matrix_init_identity (&affine);
-
        turbulence.base_frequency_x = base_frequency_x;
        turbulence.base_frequency_y = base_frequency_y;
        turbulence.n_octaves = n_octaves;
diff --git a/src/lsmsvgfiltersurface.h b/src/lsmsvgfiltersurface.h
index d807e30..7bdc05c 100644
--- a/src/lsmsvgfiltersurface.h
+++ b/src/lsmsvgfiltersurface.h
@@ -78,7 +78,8 @@ void                  lsm_svg_filter_surface_specular_lighting(LsmSvgFilterSurface 
*output_sur
 void                   lsm_svg_filter_surface_turbulence       (LsmSvgFilterSurface *output_surface,
                                                                 double base_frequency_x, double 
base_frequency_y,
                                                                 int n_octaves, double seed,
-                                                                LsmSvgStitchTiles stitch_tiles, 
LsmSvgTurbulenceType type);
+                                                                LsmSvgStitchTiles stitch_tiles, 
LsmSvgTurbulenceType type,
+                                                                const cairo_matrix_t *transform);
 
 G_END_DECLS
 
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 8c3426f..34dc4dc 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -2311,6 +2311,7 @@ lsm_svg_view_apply_turbulence (LsmSvgView *view, const char *output, const LsmBo
        LsmSvgFilterSurface *output_surface;
        LsmSvgFilterSurface *input_surface;
        LsmBox subregion_px;
+       cairo_matrix_t transform;
 
        g_return_if_fail (LSM_IS_SVG_VIEW (view));
 
@@ -2323,7 +2324,10 @@ lsm_svg_view_apply_turbulence (LsmSvgView *view, const char *output, const LsmBo
                        subregion_px.width, subregion_px.height,
                        subregion_px.x, subregion_px.y);
 
-       lsm_svg_filter_surface_turbulence (output_surface, base_frequency_x, base_frequency_y, n_octaves, 
seed, stitch_tiles, type);
+       cairo_get_matrix (view->dom_view.cairo, &transform);
+
+       lsm_svg_filter_surface_turbulence (output_surface, base_frequency_x, base_frequency_y, n_octaves, 
seed, stitch_tiles, type,
+                                          &transform);
 }
 
 void
diff --git a/tests/filter.c b/tests/filter.c
index ef0888d..ee25073 100644
--- a/tests/filter.c
+++ b/tests/filter.c
@@ -47,6 +47,10 @@ similar (void)
 static void
 operations (LsmSvgFilterSurface *input_1, LsmSvgFilterSurface *input_2, LsmSvgFilterSurface *output)
 {
+       cairo_matrix_t transform;
+
+       cairo_matrix_init_identity (&transform);
+
        lsm_svg_filter_surface_alpha (input_1, output);
        lsm_svg_filter_surface_blend (input_1, input_2, output, LSM_SVG_BLENDING_MODE_XOR);
        lsm_svg_filter_surface_blur (input_1, output, 0.0, 0.0);
@@ -63,7 +67,8 @@ operations (LsmSvgFilterSurface *input_1, LsmSvgFilterSurface *input_2, LsmSvgFi
        lsm_svg_filter_surface_convolve_matrix (input_1, output, 0, 0, 0, NULL, 1.0, 0.0, 0, 0, 
LSM_SVG_EDGE_MODE_NONE, TRUE);
        lsm_svg_filter_surface_morphology (input_1, output, LSM_SVG_MORPHOLOGY_OPERATOR_ERODE, 1, 1);
        lsm_svg_filter_surface_morphology (input_1, output, LSM_SVG_MORPHOLOGY_OPERATOR_DILATE, 1, 1);
-       lsm_svg_filter_surface_turbulence (output, 10.0, 10.0, 2, 1.0, LSM_SVG_STITCH_TILES_STITCH, 
LSM_SVG_TURBULENCE_TYPE_FRACTAL_NOISE);
+       lsm_svg_filter_surface_turbulence (output, 10.0, 10.0, 2, 1.0, LSM_SVG_STITCH_TILES_STITCH, 
LSM_SVG_TURBULENCE_TYPE_FRACTAL_NOISE,
+                                          &transform);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]