diff options
author | Carlos Eduardo Rodrigues Diógenes <carlosd@src.gnome.org> | 2007-01-29 15:45:21 +0000 |
---|---|---|
committer | Carlos Eduardo Rodrigues Diógenes <carlosd@src.gnome.org> | 2007-01-29 15:45:21 +0000 |
commit | 899887a5120a9b36dc927c6ac2412c1e813c5102 (patch) | |
tree | 79dc6700402abfbace045a1e11d3f9fc6c52bf39 | |
parent | 8bf77023d169995aa91c02a2e05bff91e5aa69a8 (diff) |
bug #342170 - scaled pixbuf not recalculated after a {x,y} factor change resolved
svn path=/branches/gnome-2-16/; revision=445
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | magnifier/zoom-region.c | 79 |
2 files changed, 50 insertions, 36 deletions
@@ -1,3 +1,10 @@ +2006-11-25 Carlos Eduardo Rodrigues Diogenes <cerdiogenes@yahoo.com.br> + + * magnifier/zoom-region.c: make the scaled pixbuf be recalculated when + the magnification factor is changed throw the PropertyBag. This also + make the code to recalculate the scaled pixbuf be shared between the + setMagFactor and the PropertyBag interfaces. + 2006-11-11 Carlos Eduardo Rodrigues Diógenes <cerdigoenes@yahoo.com.br> * magnifier/magnifier-main.c: bug #372731: Tampering with the DISPLAY diff --git a/magnifier/zoom-region.c b/magnifier/zoom-region.c index b578ec6..bf09329 100644 --- a/magnifier/zoom-region.c +++ b/magnifier/zoom-region.c @@ -655,6 +655,40 @@ zoom_region_rect_from_bounds (ZoomRegion *zoom_region, /** ************** **/ +static CORBA_boolean +zoom_region_update_scale (ZoomRegion *zoom_region, gdouble x, gdouble y) +{ + gdouble x_old = zoom_region->xscale; + gdouble y_old = zoom_region->yscale; + + zoom_region->xscale = x; + zoom_region->yscale = y; + + if (zoom_region->priv->scaled_pixbuf) + g_object_unref (zoom_region->priv->scaled_pixbuf); + zoom_region->priv->scaled_pixbuf = + gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, (zoom_region->priv->source_area.x2 - zoom_region->priv->source_area.x1) * zoom_region->xscale + 1, (zoom_region->priv->source_area.y2 - zoom_region->priv->source_area.y1) * zoom_region->yscale + 1); + + if (zoom_region->priv->pixmap) + g_object_unref (zoom_region->priv->pixmap); + + if (zoom_region_create_pixmap (zoom_region) == + ZOOM_REGION_ERROR_TOO_BIG) { + zoom_region->xscale = x_old; + zoom_region->yscale = y_old; + zoom_region_create_pixmap (zoom_region); + g_object_unref (zoom_region->priv->scaled_pixbuf); + + /* only create a scaled image big enough for the target + * display, for now */ + zoom_region->priv->scaled_pixbuf = gdk_pixbuf_new ( + GDK_COLORSPACE_RGB, FALSE, 8, (zoom_region->priv->source_area.x2 - zoom_region->priv->source_area.x1) * zoom_region->xscale + 1, (zoom_region->priv->source_area.y2 - zoom_region->priv->source_area.y1) * zoom_region->yscale + 1); + + return CORBA_FALSE; + } + return CORBA_TRUE; +} + static void zoom_region_queue_update (ZoomRegion *zoom_region, const GdkRectangle update_rect) @@ -2355,11 +2389,15 @@ zoom_region_set_property (BonoboPropertyBag *bag, zoom_region_update_current (zoom_region); break; case ZOOM_REGION_XSCALE_PROP: - zoom_region->xscale = BONOBO_ARG_GET_FLOAT (arg); + (void) zoom_region_update_scale (zoom_region, + BONOBO_ARG_GET_FLOAT (arg), + zoom_region->yscale); zoom_region_update_current (zoom_region); break; case ZOOM_REGION_YSCALE_PROP: - zoom_region->yscale = BONOBO_ARG_GET_FLOAT (arg); + (void) zoom_region_update_scale (zoom_region, + zoom_region->xscale, + BONOBO_ARG_GET_FLOAT (arg)); zoom_region_update_current (zoom_region); break; case ZOOM_REGION_BORDERSIZE_PROP: @@ -2701,8 +2739,6 @@ impl_zoom_region_set_mag_factor (PortableServer_Servant servant, g_assert (zoom_region->alive); #endif CORBA_any *any; - double xs_old = zoom_region->xscale; - double ys_old = zoom_region->yscale; CORBA_boolean retval = CORBA_TRUE; /* TODO: assert that parent is magnifier object */ @@ -2718,38 +2754,9 @@ impl_zoom_region_set_mag_factor (PortableServer_Servant servant, else retval = CORBA_FALSE; - zoom_region->xscale = mag_factor_x; - zoom_region->yscale = mag_factor_y; - - if (zoom_region->priv->scaled_pixbuf) - g_object_unref (zoom_region->priv->scaled_pixbuf); - - zoom_region->priv->scaled_pixbuf = gdk_pixbuf_new ( - GDK_COLORSPACE_RGB, FALSE, 8, - (zoom_region->priv->source_area.x2 - - zoom_region->priv->source_area.x1) * zoom_region->xscale + 1, - (zoom_region->priv->source_area.y2 - - zoom_region->priv->source_area.y1) * zoom_region->yscale + 1); - - if (zoom_region->priv->pixmap) { - g_object_unref (zoom_region->priv->pixmap); - zoom_region->priv->pixmap = NULL; - } - if (zoom_region_create_pixmap (zoom_region) == ZOOM_REGION_ERROR_TOO_BIG) { - zoom_region->xscale = xs_old; - zoom_region->yscale = ys_old; - zoom_region_create_pixmap (zoom_region); - g_object_unref (zoom_region->priv->scaled_pixbuf); - - /* only create a scaled image big enough for the target display, for now */ - zoom_region->priv->scaled_pixbuf = gdk_pixbuf_new ( - GDK_COLORSPACE_RGB, FALSE, 8, - (zoom_region->priv->source_area.x2 - - zoom_region->priv->source_area.x1) * zoom_region->xscale + 1, - (zoom_region->priv->source_area.y2 - - zoom_region->priv->source_area.y1) * zoom_region->yscale + 1); - retval = CORBA_FALSE; - } + retval = zoom_region_update_scale (zoom_region, + mag_factor_x, mag_factor_y); + zoom_region_update_current (zoom_region); zoom_region_sync (zoom_region); |