From e9ed2c18a7de02f9e73212b56a9d134ab3aed372 Mon Sep 17 00:00:00 2001 From: Larry Ewing Date: Sat, 17 Jul 1999 20:03:34 +0000 Subject: [PATCH] reverted the expose everything changes, I'm not sure why these went in. 1999-07-16 Larry Ewing * src/testpixbuf.c (expose_func): reverted the expose everything changes, I'm not sure why these went in. (config_func): bring this up to date with the new pixbuf_scale semantics. * src/gdk-pixbuf-io.c: added a couple of warnings to the module loading code so that poeple can diagnose problems better. * src/gdk-pixbuf.c (gdk_pixbux_scale): fix the borkedness, also it no longer allocates a new pixbuf, which make things nicer for the rest of the code. Unfortunately there is still a problem with scaling rgba images. --- demos/testpixbuf.c | 71 ++++++++++++++++++++------------------ gdk-pixbuf/ChangeLog | 15 ++++++++ gdk-pixbuf/gdk-pixbuf-io.c | 12 +++++-- gdk-pixbuf/gdk-pixbuf.c | 54 ++++++++++++++--------------- 4 files changed, 87 insertions(+), 65 deletions(-) diff --git a/demos/testpixbuf.c b/demos/testpixbuf.c index 5f70302f9f..e81d4607c1 100644 --- a/demos/testpixbuf.c +++ b/demos/testpixbuf.c @@ -45,29 +45,34 @@ quit_func (GtkWidget *widget, gpointer dummy) expose_func (GtkWidget *drawing_area, GdkEventExpose *event, gpointer data) { - GdkPixBuf *pixbuf; + GdkPixBuf *pixbuf; + gint x1, y1, x2, y2; - pixbuf = (GdkPixBuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf"); + pixbuf = (GdkPixBuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf"); - if (pixbuf->art_pixbuf->has_alpha){ - gdk_draw_rgb_32_image (drawing_area->window, - drawing_area->style->black_gc, - 0, 0, - pixbuf->art_pixbuf->width, - pixbuf->art_pixbuf->height, - GDK_RGB_DITHER_NORMAL, - pixbuf->art_pixbuf->pixels, - pixbuf->art_pixbuf->rowstride); - } else { - gdk_draw_rgb_image (drawing_area->window, - drawing_area->style->white_gc, - 0, 0, - pixbuf->art_pixbuf->width, - pixbuf->art_pixbuf->height, - GDK_RGB_DITHER_NORMAL, - pixbuf->art_pixbuf->pixels, - pixbuf->art_pixbuf->rowstride); - } + if (pixbuf->art_pixbuf->has_alpha){ + gdk_draw_rgb_32_image (drawing_area->window, + drawing_area->style->black_gc, + event->area.x, event->area.y, + event->area.width, + event->area.height, + GDK_RGB_DITHER_MAX, + pixbuf->art_pixbuf->pixels + + (event->area.y * pixbuf->art_pixbuf->rowstride) + + (event->area.x * pixbuf->art_pixbuf->n_channels), + pixbuf->art_pixbuf->rowstride); + }else{ + gdk_draw_rgb_image (drawing_area->window, + drawing_area->style->white_gc, + event->area.x, event->area.y, + event->area.width, + event->area.height, + GDK_RGB_DITHER_NORMAL, + pixbuf->art_pixbuf->pixels + + (event->area.y * pixbuf->art_pixbuf->rowstride) + + (event->area.x * pixbuf->art_pixbuf->n_channels), + pixbuf->art_pixbuf->rowstride); + } } config_func (GtkWidget *drawing_area, GdkEventConfigure *event, gpointer data) @@ -79,11 +84,9 @@ config_func (GtkWidget *drawing_area, GdkEventConfigure *event, gpointer data) g_print("X:%d Y:%d\n", event->width, event->height); if (((event->width) != (pixbuf->art_pixbuf->width)) || - ((event->height) != (pixbuf->art_pixbuf->height))) { - spb = gdk_pixbuf_scale(pixbuf, event->width, event->height); - gdk_pixbuf_free (pixbuf); - gtk_object_set_data (GTK_OBJECT(drawing_area), "pixbuf", spb); - } + ((event->height) != (pixbuf->art_pixbuf->height))) + gdk_pixbuf_scale(pixbuf, event->width, event->height); + } void @@ -155,14 +158,14 @@ main (int argc, char **argv) gtk_widget_set_default_visual (gdk_rgb_get_visual ()); i = 1; - for (i = 1; i < argc; i++) { - if (argv[i]) { - pixbuf = gdk_pixbuf_load_image (argv[i]); - - if (pixbuf) { - new_testrgb_window (pixbuf); - found_valid = TRUE; - } + for (i = 1; i < argc; i++) + { + pixbuf = gdk_pixbuf_load_image (argv[i]); + + if (pixbuf) + { + new_testrgb_window (pixbuf); + found_valid = TRUE; } } diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 62ac792eec..84a01ba01a 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,18 @@ +1999-07-16 Larry Ewing + + * src/testpixbuf.c (expose_func): reverted the expose everything + changes, I'm not sure why these went in. + (config_func): bring this up to date with the new pixbuf_scale + semantics. + + * src/gdk-pixbuf-io.c: added a couple of warnings to the module + loading code so that poeple can diagnose problems better. + + * src/gdk-pixbuf.c (gdk_pixbux_scale): fix the borkedness, also it + no longer allocates a new pixbuf, which make things nicer for the + rest of the code. Unfortunately there is still a problem with + scaling rgba images. + 1999-07-16 Mark Crichton * src/testpixbuf.c (config_func): ConfigureEvent handler. This diff --git a/gdk-pixbuf/gdk-pixbuf-io.c b/gdk-pixbuf/gdk-pixbuf-io.c index 257a454f12..53da897cba 100644 --- a/gdk-pixbuf/gdk-pixbuf-io.c +++ b/gdk-pixbuf/gdk-pixbuf-io.c @@ -148,9 +148,11 @@ image_handler_load (int idx) g_free (module_name); module = g_module_open (path, G_MODULE_BIND_LAZY); - if (!module) + if (!module) { + g_warning ("Unable to load module: %s", path); return; - + } + file_formats [idx].module = module; if (g_module_symbol (module, "image_load", &load_sym)) @@ -196,6 +198,12 @@ gdk_pixbuf_load_image (const char *file) } fclose (f); + g_warning ("Unable to find handler for file: %s", file); return NULL; } +/* + * Local variables: + * c-basic-offset: 8 + * End: + */ diff --git a/gdk-pixbuf/gdk-pixbuf.c b/gdk-pixbuf/gdk-pixbuf.c index 79eb80430b..0068c163d6 100644 --- a/gdk-pixbuf/gdk-pixbuf.c +++ b/gdk-pixbuf/gdk-pixbuf.c @@ -51,42 +51,38 @@ gdk_pixbuf_scale (GdkPixBuf *pixbuf, gint w, gint h) { GdkPixBuf *spb; art_u8 *pixels; + gint rowstride; double affine[6]; ArtAlphaGamma *alphagamma; + ArtPixBuf *art_pixbuf = NULL; alphagamma = NULL; affine[1] = affine[2] = affine[4] = affine[5] = 0; - affine[0] = w / (pixbuf->art_pixbuf->width); - affine[3] = h / (pixbuf->art_pixbuf->height); + + affine[0] = w / (double)(pixbuf->art_pixbuf->width); + affine[3] = h / (double)(pixbuf->art_pixbuf->height); - spb = g_new (GdkPixBuf, 1); + // rowstride = w * pixbuf->art_pixbuf->n_channels; + rowstride = w * 3; - if (pixbuf->art_pixbuf->has_alpha) { - /* Following code is WRONG....of course, the code for this - * transform isn't in libart yet. - */ -#if 0 - pixels = art_alloc (h * w * 4); - art_rgb_affine( pixels, 0, 0, w, h, (w * 4), - pixbuf->art_pixbuf->pixels, - pixbuf->art_pixbuf->width, - pixbuf->art_pixbuf->height, - pixbuf->art_pixbuf->rowstride, - affine, ART_FILTER_NEAREST, alphagamma); - spb->art_pixbuf = art_pixbuf_new_rgba(pixels, w, h, (w * 4)); -#endif - } else { - pixels = art_alloc (h * w * 3); - art_rgb_affine( pixels, 0, 0, w, h, (w * 3), - pixbuf->art_pixbuf->pixels, - pixbuf->art_pixbuf->width, - pixbuf->art_pixbuf->height, - pixbuf->art_pixbuf->rowstride, - affine, ART_FILTER_NEAREST, alphagamma); - spb->art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, (w * 3)); - spb->ref_count = 0; - spb->unref_func = NULL; - } + pixels = art_alloc (h * rowstride); + art_rgb_pixbuf_affine( pixels, 0, 0, w, h, rowstride, + pixbuf->art_pixbuf, + affine, ART_FILTER_NEAREST, alphagamma); + + if (pixbuf->art_pixbuf->has_alpha) + // should be rgba + art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, rowstride); + else + art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, rowstride); + + art_pixbuf_free (pixbuf->art_pixbuf); + pixbuf->art_pixbuf = art_pixbuf; + + return pixbuf; } + + +