Added scaling of pixmaps. Currently doesn't work, however, since I'm

Added scaling of pixmaps.  Currently doesn't work, however, since I'm guessing
how art_rgb_affine really works.

Mark
This commit is contained in:
Mark Crichton 1999-07-16 20:35:21 +00:00
parent 1922a3ed01
commit 96ba724fc5
4 changed files with 121 additions and 55 deletions

View File

@ -1,3 +1,4 @@
/* GTK - The GIMP Toolkit /* GTK - The GIMP Toolkit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
* *
@ -44,34 +45,47 @@ quit_func (GtkWidget *widget, gpointer dummy)
expose_func (GtkWidget *drawing_area, GdkEventExpose *event, gpointer data) expose_func (GtkWidget *drawing_area, GdkEventExpose *event, gpointer data)
{ {
GdkPixBuf *pixbuf = (GdkPixBuf *)data; GdkPixBuf *pixbuf;
gint x1, y1, x2, y2;
if (pixbuf->art_pixbuf->has_alpha){ pixbuf = (GdkPixBuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf");
gdk_draw_rgb_32_image (drawing_area->window,
drawing_area->style->black_gc, if (pixbuf->art_pixbuf->has_alpha){
event->area.x, event->area.y, gdk_draw_rgb_32_image (drawing_area->window,
event->area.width, drawing_area->style->black_gc,
event->area.height, 0, 0,
GDK_RGB_DITHER_MAX, pixbuf->art_pixbuf->width,
pixbuf->art_pixbuf->pixels pixbuf->art_pixbuf->height,
+ (event->area.y * pixbuf->art_pixbuf->rowstride) GDK_RGB_DITHER_NORMAL,
+ (event->area.x * pixbuf->art_pixbuf->n_channels), pixbuf->art_pixbuf->pixels,
pixbuf->art_pixbuf->rowstride); pixbuf->art_pixbuf->rowstride);
}else{ } else {
gdk_draw_rgb_image (drawing_area->window, gdk_draw_rgb_image (drawing_area->window,
drawing_area->style->white_gc, drawing_area->style->white_gc,
event->area.x, event->area.y, 0, 0,
event->area.width, pixbuf->art_pixbuf->width,
event->area.height, pixbuf->art_pixbuf->height,
GDK_RGB_DITHER_NORMAL, GDK_RGB_DITHER_NORMAL,
pixbuf->art_pixbuf->pixels pixbuf->art_pixbuf->pixels,
+ (event->area.y * pixbuf->art_pixbuf->rowstride) 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)
{
GdkPixBuf *pixbuf, *spb;
pixbuf = (GdkPixBuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf");
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);
}
}
void void
new_testrgb_window (GdkPixBuf *pixbuf) new_testrgb_window (GdkPixBuf *pixbuf)
{ {
@ -88,7 +102,7 @@ new_testrgb_window (GdkPixBuf *pixbuf)
"GtkObject::user_data", NULL, "GtkObject::user_data", NULL,
"GtkWindow::type", GTK_WINDOW_TOPLEVEL, "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
"GtkWindow::title", "testrgb", "GtkWindow::title", "testrgb",
"GtkWindow::allow_shrink", FALSE, "GtkWindow::allow_shrink", TRUE,
NULL); NULL);
gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_signal_connect (GTK_OBJECT (window), "destroy",
(GtkSignalFunc) quit_func, NULL); (GtkSignalFunc) quit_func, NULL);
@ -97,11 +111,15 @@ new_testrgb_window (GdkPixBuf *pixbuf)
drawing_area = gtk_drawing_area_new (); drawing_area = gtk_drawing_area_new ();
gtk_widget_set_usize (drawing_area, w, h); gtk_drawing_area_size (GTK_DRAWING_AREA(drawing_area), w, h);
gtk_box_pack_start (GTK_BOX (vbox), drawing_area, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT(drawing_area), "expose_event", gtk_signal_connect (GTK_OBJECT(drawing_area), "expose_event",
GTK_SIGNAL_FUNC (expose_func), pixbuf); GTK_SIGNAL_FUNC(expose_func), NULL);
gtk_signal_connect (GTK_OBJECT(drawing_area), "configure_event",
GTK_SIGNAL_FUNC (config_func), NULL);
gtk_object_set_data (GTK_OBJECT(drawing_area), "pixbuf", pixbuf);
gtk_widget_show (drawing_area); gtk_widget_show (drawing_area);
@ -137,14 +155,11 @@ main (int argc, char **argv)
gtk_widget_set_default_visual (gdk_rgb_get_visual ()); gtk_widget_set_default_visual (gdk_rgb_get_visual ());
i = 1; i = 1;
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++) {
{ if (argv[i]) {
if (argv[i])
{
pixbuf = gdk_pixbuf_load_image (argv[i]); pixbuf = gdk_pixbuf_load_image (argv[i]);
if (pixbuf) if (pixbuf) {
{
new_testrgb_window (pixbuf); new_testrgb_window (pixbuf);
found_valid = TRUE; found_valid = TRUE;
} }

View File

@ -1,3 +1,13 @@
1999-07-16 Mark Crichton <crichton@gimp.org>
* src/testpixbuf.c (config_func): ConfigureEvent handler. This
calls gdk_pixbuf_scale. However, something is not working.
N.B.: current pixmap is now stored in user_data with a key of
"pixmap"
* src/gdk-pixbuf.c (gdk_pixbuf_scale): Implemented scaling function.
Something is still borked, however.
1999-07-15 Larry Ewing <lewing@gimp.org> 1999-07-15 Larry Ewing <lewing@gimp.org>
* src/io-jpeg.c (image_load): add raph@gimp.org's fix to the jpeg * src/io-jpeg.c (image_load): add raph@gimp.org's fix to the jpeg
@ -11,11 +21,11 @@
* src/testpixbuf.c (expose_func): added an almost proper expose * src/testpixbuf.c (expose_func): added an almost proper expose
handler for testpixbuf handler for testpixbuf
1999-07-13 <crichton@gimp.org> 1999-07-13 Mark Crichton <crichton@gimp.org>
* configure.in: Fixed GIF check. Replaced " with ' * configure.in: Fixed GIF check. Replaced " with '
* src/gdk-pixbuf.c: More (minor) work on gdk_pixbuf_scale * src/gdk-pixbuf.c: More (minor) work on gdk_pixbuf_scale
1999-07-13 <crichton@gimp.org> 1999-07-13 Mark Crichton <crichton@gimp.org>
* configure.in: I am a bonehead. Added gif-lib check. * configure.in: I am a bonehead. Added gif-lib check.

View File

@ -6,6 +6,9 @@
*/ */
#include <config.h> #include <config.h>
#include <glib.h> #include <glib.h>
#include <libart_lgpl/art_misc.h>
#include <libart_lgpl/art_rgb_affine.h>
#include <libart_lgpl/art_alphagamma.h>
#include "gdk-pixbuf.h" #include "gdk-pixbuf.h"
@ -19,35 +22,70 @@ gdk_pixbuf_destroy (GdkPixBuf *pixbuf)
void void
gdk_pixbuf_ref (GdkPixBuf *pixbuf) gdk_pixbuf_ref (GdkPixBuf *pixbuf)
{ {
g_return_if_fail (pixbuf != NULL); g_return_if_fail (pixbuf != NULL);
pixbuf->ref_count++; pixbuf->ref_count++;
} }
void void
gdk_pixbuf_unref (GdkPixBuf *pixbuf) gdk_pixbuf_unref (GdkPixBuf *pixbuf)
{ {
g_return_if_fail (pixbuf != NULL); g_return_if_fail (pixbuf != NULL);
g_return_if_fail (pixbuf->ref_count == 0); g_return_if_fail (pixbuf->ref_count == 0);
pixbuf->ref_count--;
if (pixbuf->ref_count)
gdk_pixbuf_destroy (pixbuf);
}
pixbuf->ref_count--; void
if (pixbuf->ref_count) gdk_pixbuf_free (GdkPixBuf *pixbuf)
gdk_pixbuf_destroy (pixbuf); {
art_free(pixbuf->art_pixbuf->pixels);
art_pixbuf_free_shallow(pixbuf->art_pixbuf);
g_free(pixbuf);
} }
GdkPixBuf * GdkPixBuf *
gdk_pixbuf_scale (GdkPixBuf *pixbuf, gint w, gint h) gdk_pixbuf_scale (GdkPixBuf *pixbuf, gint w, gint h)
{ {
GdkPixBuf *spb; GdkPixBuf *spb;
art_u8 *pixels;
double affine[6]; double affine[6];
ArtAlphaGamma *alphagamma;
alphagamma = NULL;
affine[0] = affine[3] = 1;
affine[4] = affine[5] = 0;
affine[1] = w / (pixbuf->art_pixbuf->width);
affine[2] = h / (pixbuf->art_pixbuf->height);
spb = g_new (GdkPixBuf, 1);
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 {
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));
}
} }
/*
* Local variables:
* c-basic-offset: 4
* c-file-offsets: ((substatement-open . 0))
* End:
*/

View File

@ -14,6 +14,9 @@ GdkPixBuf *gdk_pixbuf_load_image (const char *file);
void gdk_pixbuf_save_image (const char *format_id, const char *file, ...); void gdk_pixbuf_save_image (const char *format_id, const char *file, ...);
void gdk_pixbuf_ref (GdkPixBuf *pixbuf); void gdk_pixbuf_ref (GdkPixBuf *pixbuf);
void gdk_pixbuf_unref (GdkPixBuf *pixbuf); void gdk_pixbuf_unref (GdkPixBuf *pixbuf);
GdkPixBuf gdk_pixbuf_duplicate (GdkPixBuf *pixbuf); GdkPixBuf *gdk_pixbuf_duplicate (GdkPixBuf *pixbuf);
GdkPixBuf *gdk_pixbuf_scale (GdkPixBuf *pixbuf, gint w, gint h);
void gdk_pixbuf_free (GdkPixBuf *pixbuf);
#endif /* _GDK_PIXBUF_H_ */ #endif /* _GDK_PIXBUF_H_ */