From 5e204525de4f55fb16bf27756e0b1d4f7b08d3d9 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 12 Feb 2008 22:29:23 -0500 Subject: [PATCH] when resizing images, pick a source image with the same aspect ratio if possible --- render/image.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/render/image.c b/render/image.c index d22ef9e..8ce3a57 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, -- 1.9.1