2 * gdk-pixbuf.c: Resource management.
5 * Miguel de Icaza (miguel@gnu.org)
6 * Mark Crichton (crichton@gimp.org)
11 #include <libart_lgpl/art_misc.h>
12 #include <libart_lgpl/art_rgb_affine.h>
13 #include <libart_lgpl/art_alphagamma.h>
14 #include "gdk-pixbuf.h"
18 gdk_pixbuf_destroy (GdkPixBuf *pixbuf)
20 art_pixbuf_free (pixbuf->art_pixbuf);
25 gdk_pixbuf_ref (GdkPixBuf *pixbuf)
27 g_return_if_fail (pixbuf != NULL);
33 gdk_pixbuf_unref (GdkPixBuf *pixbuf)
35 g_return_if_fail (pixbuf != NULL);
36 g_return_if_fail (pixbuf->ref_count == 0);
39 if (pixbuf->ref_count)
40 gdk_pixbuf_destroy (pixbuf);
44 gdk_pixbuf_scale (GdkPixBuf *pixbuf, gint w, gint h)
50 ArtAlphaGamma *alphagamma;
51 ArtPixBuf *art_pixbuf = NULL;
55 affine[1] = affine[2] = affine[4] = affine[5] = 0;
58 affine[0] = w / (double)(pixbuf->art_pixbuf->width);
59 affine[3] = h / (double)(pixbuf->art_pixbuf->height);
61 /* rowstride = w * pixbuf->art_pixbuf->n_channels; */
64 pixels = art_alloc (h * rowstride);
65 art_rgb_pixbuf_affine( pixels, 0, 0, w, h, rowstride,
67 affine, ART_FILTER_NEAREST, alphagamma);
69 if (pixbuf->art_pixbuf->has_alpha)
71 art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, rowstride);
73 art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, rowstride);
75 art_pixbuf_free (pixbuf->art_pixbuf);
76 pixbuf->art_pixbuf = art_pixbuf;
82 gdk_pixbuf_rotate (GdkPixBuf *pixbuf, gdouble angle)
88 double rot[6], trans[6], affine[6];
89 ArtAlphaGamma *alphagamma = NULL;
90 ArtPixBuf *art_pixbuf = NULL;
92 w = pixbuf->art_pixbuf->width;
93 h = pixbuf->art_pixbuf->height;
95 rad = (M_PI * angle / 180.0);
103 trans[0] = trans[3] = 1;
104 trans[1] = trans[2] = 0;
105 trans[4] = (double)w / 2.0;
108 art_affine_multiply(affine, rot, trans);
110 g_print("Affine: %e %e %e %e %e %e\n", affine[0], affine[1], affine[2],
111 affine[3], affine[4], affine[5]);
113 /* rowstride = w * pixbuf->art_pixbuf->n_channels; */
116 pixels = art_alloc (h * rowstride);
117 art_rgb_pixbuf_affine (pixels, 0, 0, w, h, rowstride,
119 affine, ART_FILTER_NEAREST, alphagamma);
120 if (pixbuf->art_pixbuf->has_alpha)
122 art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, rowstride);
124 art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, rowstride);
126 art_pixbuf_free (pixbuf->art_pixbuf);
127 pixbuf->art_pixbuf = art_pixbuf;