From: Dana Jansens Date: Wed, 13 Feb 2008 03:29:23 +0000 (-0500) Subject: when resizing images, pick a source image with the same aspect ratio if possible X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=35b36fc3771452cf980cb0a59aa05f3e2aa2aa67;p=chaz%2Fopenbox when resizing images, pick a source image with the same aspect ratio if possible --- diff --git a/render/image.c b/render/image.c index d22ef9e3..8ce3a57c 100644 --- a/render/image.c +++ b/render/image.c @@ -346,7 +346,7 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img, gint target_w, gint target_h, RrRect *area) { - gint i, min_diff, min_i; + gint i, min_diff, min_i, min_aspect_diff, min_aspect_i; RrImage *self; RrImagePic *pic; @@ -386,24 +386,43 @@ void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img, } if (!pic) { + gdouble aspect; + /* find an original with a close size */ - min_diff = -1; - min_i = 0; + min_diff = min_aspect_diff = -1; + min_i = min_aspect_i = 0; + aspect = ((gdouble)area->width) / area->height; for (i = 0; i < self->n_original; ++i) { gint diff; gint wdiff, hdiff; + gdouble myasp; /* our size difference metric.. */ wdiff = self->original[i]->width - area->width; hdiff = self->original[i]->height - area->height; diff = (wdiff * wdiff) + (hdiff * hdiff); + /* find the smallest difference */ if (min_diff < 0 || diff < min_diff) { min_diff = diff; min_i = i; } + /* and also find the smallest difference with the same aspect + ratio (and prefer this one) */ + myasp = ((gdouble)self->original[i]->width) / + self->original[i]->height; + if (ABS(aspect - myasp) < 0.0000001 && + (min_aspect_diff < 0 || diff < min_aspect_diff)) + { + min_aspect_diff = diff; + min_aspect_i = i; + } } + /* use the aspect ratio correct source if there is one */ + if (min_aspect_i >= 0) + min_i = min_aspect_i; + /* resize the original to the given area */ pic = ResizeImage(self->original[min_i]->data, self->original[min_i]->width,