]> Dogcows Code - chaz/openbox/blobdiff - render/image.c
Merge branch 'backport' into work
[chaz/openbox] / render / image.c
index f6d70ee9a4ee9db62840a3b994340cee680aaebb..79f47fe280829c6ad3a5d07f6f9846e38885f922 100644 (file)
@@ -75,9 +75,9 @@ static void AddPicture(RrImage *self, RrImagePic ***list, gint *len,
 
 #ifdef DEBUG
     g_debug("Adding %s picture to the cache:\n    "
-            "Image 0x%x, w %d h %d Hash %u",
+            "Image 0x%lx, w %d h %d Hash %u",
             (*list == self->original ? "ORIGINAL" : "RESIZED"),
-            (guint)self, pic->width, pic->height, RrImagePicHash(pic));
+            (gulong)self, pic->width, pic->height, RrImagePicHash(pic));
 #endif
 }
 
@@ -90,9 +90,9 @@ static void RemovePicture(RrImage *self, RrImagePic ***list,
 
 #ifdef DEBUG
     g_debug("Removing %s picture from the cache:\n    "
-            "Image 0x%x, w %d h %d Hash %u",
+            "Image 0x%lx, w %d h %d Hash %u",
             (*list == self->original ? "ORIGINAL" : "RESIZED"),
-            (guint)self, (*list)[i]->width, (*list)[i]->height,
+            (gulong)self, (*list)[i]->width, (*list)[i]->height,
             RrImagePicHash((*list)[i]));
 #endif
 
@@ -124,6 +124,12 @@ static RrImagePic* ResizeImage(RrPixel32 *src,
     gulong ratioX, ratioY;
     gulong aspectW, aspectH;
 
+    /* XXX should these variables be ensured to not be zero in the callers? */
+    srcW = srcW ? srcW : 1;
+    srcH = srcH ? srcH : 1;
+    dstW = dstW ? dstW : 1;
+    dstH = dstH ? dstH : 1;
+
     /* keep the aspect ratio */
     aspectW = dstW;
     aspectH = (gint)(dstW * ((gdouble)srcH / srcW));
@@ -131,11 +137,11 @@ static RrImagePic* ResizeImage(RrPixel32 *src,
         aspectH = dstH;
         aspectW = (gint)(dstH * ((gdouble)srcW / srcH));
     }
-    dstW = aspectW;
-    dstH = aspectH;
+    dstW = aspectW ? aspectW : 1;
+    dstH = aspectH ? aspectH : 1;
 
     if (srcW == dstW && srcH == dstH)
-        return NULL; /* no scaling needed ! */
+        return NULL; /* no scaling needed! */
 
     dststart = dst = g_new(RrPixel32, dstW * dstH);
 
@@ -215,7 +221,7 @@ static RrImagePic* ResizeImage(RrPixel32 *src,
     return pic;
 }
 
-/*! This drawns an RGBA picture into the target, within the rectangle specified
+/*! This draws an RGBA picture into the target, within the rectangle specified
   by the area parameter.  If the area's size differs from the source's then it
   will be centered within the rectangle */
 void DrawRGBA(RrPixel32 *target, gint target_w, gint target_h,
@@ -294,6 +300,7 @@ void RrImageDrawRGBA(RrPixel32 *target, RrTextureRGBA *rgba,
             DrawRGBA(target, target_w, target_h,
                      scaled->data, scaled->width, scaled->height,
                      rgba->alpha, area);
+            RrImagePicFree(scaled);
     }
     else
         DrawRGBA(target, target_w, target_h,
@@ -324,7 +331,7 @@ void RrImageUnref(RrImage *self)
     if (self && --self->ref == 0) {
 #ifdef DEBUG
         g_debug("Refcount to 0, removing ALL pictures from the cache:\n    "
-                "Image 0x%x", (guint)self);
+                "Image 0x%lx", (gulong)self);
 #endif
         while (self->n_original > 0)
             RemovePicture(self, &self->original, 0, &self->n_original);
@@ -347,7 +354,7 @@ void RrImageAddPicture(RrImage *self, RrPixel32 *data, gint w, gint h)
         if (self->original[i]->width == w && self->original[i]->height == h) {
 #ifdef DEBUG
             g_debug("Found duplicate ORIGINAL image:\n    "
-                    "Image 0x%x, w %d h %d", (guint)self, w, h);
+                    "Image 0x%lx, w %d h %d", (gulong)self, w, h);
 #endif
             return;
         }
@@ -398,11 +405,13 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
     pic = NULL;
     free_pic = FALSE;
 
-    /* is there an original of this size? (only w or h has to be right cuz
-       we maintain aspect ratios) */
+    /* is there an original of this size? (only the larger of
+       w or h has to be right cuz we maintain aspect ratios) */
     for (i = 0; i < self->n_original; ++i)
-        if (self->original[i]->width == area->width ||
-            self->original[i]->height == area->height)
+        if ((self->original[i]->width >= self->original[i]->height &&
+             self->original[i]->width == area->width) ||
+            (self->original[i]->width <= self->original[i]->height &&
+             self->original[i]->height == area->height))
         {
             pic = self->original[i];
             break;
@@ -410,8 +419,10 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
 
     /* is there a resize of this size? */
     for (i = 0; i < self->n_resized; ++i)
-        if (self->resized[i]->width == area->width ||
-            self->resized[i]->height == area->height)
+        if ((self->resized[i]->width >= self->resized[i]->height &&
+             self->resized[i]->width == area->width) ||
+            (self->resized[i]->width <= self->resized[i]->height &&
+             self->resized[i]->height == area->height))
         {
             gint j;
             RrImagePic *saved;
This page took 0.023501 seconds and 4 git commands to generate.