summaryrefslogtreecommitdiff
path: root/gdk-pixbuf/gdk-pixbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk-pixbuf/gdk-pixbuf.c')
-rw-r--r--gdk-pixbuf/gdk-pixbuf.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/gdk-pixbuf/gdk-pixbuf.c b/gdk-pixbuf/gdk-pixbuf.c
index dc23940f2..a9f9a50a3 100644
--- a/gdk-pixbuf/gdk-pixbuf.c
+++ b/gdk-pixbuf/gdk-pixbuf.c
@@ -21,9 +21,27 @@ void
gdk_pixbuf_destroy (GdkPixBuf *pixbuf)
{
art_pixbuf_free (pixbuf->art_pixbuf);
+ pixbuf->art_pixbuf = NULL;
g_free (pixbuf);
}
+GdkPixBuf *
+gdk_pixbuf_new (ArtPixBuf *art_pixbuf,
+ GdkPixBufUnrefFunc *unref_fn)
+{
+ GdkPixBuf *pixbuf;
+
+ if (!art_pixbuf)
+ return NULL;
+
+ pixbuf = g_new (GdkPixBuf, 1);
+ pixbuf->ref_count = 1;
+ pixbuf->unref_fn = unref_fn;
+ pixbuf->art_pixbuf = art_pixbuf;
+
+ return pixbuf;
+}
+
void
gdk_pixbuf_ref (GdkPixBuf *pixbuf)
{
@@ -46,19 +64,19 @@ gdk_pixbuf_unref (GdkPixBuf *pixbuf)
}
GdkPixBuf *
-gdk_pixbuf_scale (GdkPixBuf *pixbuf, gint w, gint h)
+gdk_pixbuf_scale (const GdkPixBuf *pixbuf, gint w, gint h)
{
art_u8 *pixels;
gint rowstride;
double affine[6];
ArtAlphaGamma *alphagamma;
ArtPixBuf *art_pixbuf = NULL;
+ GdkPixBuf *copy = NULL;
alphagamma = NULL;
affine[1] = affine[2] = affine[4] = affine[5] = 0;
-
affine[0] = w / (double)(pixbuf->art_pixbuf->width);
affine[3] = h / (double)(pixbuf->art_pixbuf->height);
@@ -71,15 +89,29 @@ gdk_pixbuf_scale (GdkPixBuf *pixbuf, gint w, gint h)
affine, ART_FILTER_NEAREST, alphagamma);
if (pixbuf->art_pixbuf->has_alpha)
- /* should be rgba */
- art_pixbuf = art_pixbuf_new_rgb(pixels, w, h, rowstride);
+ /* 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 = art_pixbuf_new_rgb(pixels, w, h, rowstride);
+
+ copy = gdk_pixbuf_new (art_pixbuf, NULL);
+
+ if (!copy)
+ art_free (pixels);
+
+ return copy;
+}
+
+GdkPixBuf *
+gdk_pixbuf_duplicate (const GdkPixBuf *pixbuf)
+{
+ GdkPixBuf *copy = g_new (GdkPixBuf, 1);
- art_pixbuf_free (pixbuf->art_pixbuf);
- pixbuf->art_pixbuf = art_pixbuf;
+ copy->ref_count = 1;
+ copy->unref_fn = pixbuf->unref_fn;
+ copy->art_pixbuf = art_pixbuf_duplicate (pixbuf->art_pixbuf);
- return pixbuf;
+ return copy;
}
GdkPixBuf *