[lasem] feTurbulence: fix frequency calculation
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] feTurbulence: fix frequency calculation
- Date: Sat, 15 Aug 2015 21:11:13 +0000 (UTC)
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]