From 2f3549653a3ac20cfb7416b0ba6731a213c25b6e Mon Sep 17 00:00:00 2001 From: natureh Date: Tue, 23 Aug 2011 23:22:17 +0200 Subject: [PATCH] Second and last part of issue 898 bugfix : Thumbnails aren't updated when toggling "Info" on/off This patch also solve the skewed thumbnails bug Credits: Oduis / Hombre --- rtengine/rtthumbnail.cc | 13 ++++++++----- rtengine/rtthumbnail.h | 2 +- rtgui/thumbbrowserentrybase.cc | 6 ++++-- rtgui/thumbnail.cc | 10 ++++++++-- rtgui/thumbnail.h | 7 ++++--- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 30b629fb8..07cb7a0b8 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -780,14 +780,17 @@ IImage8* Thumbnail::processImage (const procparams::ProcParams& params, int rhei return readyImg; } -int Thumbnail::getImageWidth (const procparams::ProcParams& params, int rheight) { +int Thumbnail::getImageWidth (const procparams::ProcParams& params, int rheight, float &ratio) { if (thumbImg==NULL) return 0; // Can happen if thumb is just building and GUI comes in with resize wishes int rwidth; - if (params.coarse.rotate==90 || params.coarse.rotate==270) - rwidth = thumbImg->height * rheight / thumbImg->width; - else - rwidth = thumbImg->width * rheight / thumbImg->height; + if (params.coarse.rotate==90 || params.coarse.rotate==270) { + ratio = (float)(thumbImg->height) / (float)(thumbImg->width); + } + else { + ratio = (float)(thumbImg->width) / (float)(thumbImg->height); + } + rwidth = (int)(ratio * (float)rheight); return rwidth; } diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h index aa59f685e..ac189f42e 100644 --- a/rtengine/rtthumbnail.h +++ b/rtengine/rtthumbnail.h @@ -72,7 +72,7 @@ namespace rtengine { IImage8* processImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale); IImage8* quickProcessImage (const procparams::ProcParams& pparams, int rheight, TypeInterpolation interp, double& scale); - int getImageWidth (const procparams::ProcParams& pparams, int rheight); + int getImageWidth (const procparams::ProcParams& pparams, int rheight, float &ratio); void getDimensions (int& w, int& h, double& scaleFac); static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate); diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index ccd82235b..24aa96025 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -91,7 +91,7 @@ void ThumbBrowserEntryBase::updateBackBuffer () { } // draw preview frame - backBuffer->draw_rectangle (gc_, false, (exp_width-prew)/2, upperMargin+bsHeight, prew+1, preh+1); + //backBuffer->draw_rectangle (gc_, false, (exp_width-prew)/2, upperMargin+bsHeight, prew+1, preh+1); // draw thumbnail image if (preview) { prex = borderWidth + (exp_width-prew)/2; @@ -296,7 +296,9 @@ void ThumbBrowserEntryBase::resize (int h) { delete [] preview; preview = NULL; refreshThumbnailImage (); - } // causes skewed thumb sometimes: else updateBackBuffer(); + } + else + updateBackBuffer(); drawable = true; } diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 79666d1ad..ccfec3ae8 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -85,6 +85,7 @@ void Thumbnail::_generateThumbnailImage () { lastImg = NULL; tw = -1; th = options.maxThumbnailHeight; + imgRatio = -1.; // generate thumbnail image Glib::ustring ext = getExtension (fname); @@ -388,8 +389,13 @@ void Thumbnail::getThumbnailSize (int &w, int &h) { #endif w=0; - if (!initial_ && tpp) w = tpp->getImageWidth (getProcParams(), h); // this might return 0 if image was just building - if (w==0) w = tw * h / th; + if (!initial_ && tpp) w = tpp->getImageWidth (getProcParams(), h, imgRatio); // this might return 0 if image was just building + if (w==0) { + if (imgRatio > 0.) + w = (int)(imgRatio * (float)h); + else + w = tw * h / th; + } } void Thumbnail::getFinalSize (const rtengine::procparams::ProcParams& pparams, int& w, int& h) { diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h index a8fb75bb1..44ebb44bc 100644 --- a/rtgui/thumbnail.h +++ b/rtgui/thumbnail.h @@ -41,9 +41,10 @@ class Thumbnail { // if the thumbnail is in processed mode, this class holds its data: rtengine::Thumbnail* tpp; - int tw, th; // dimensions of timgdata (it stores tpp->width and tpp->height in processed mode for simplicity) -// double scale; // portion of the sizes of the processed thumbnail image and the full scale image - + int tw, th; // dimensions of timgdata (it stores tpp->width and tpp->height in processed mode for simplicity) + float imgRatio; // hack to avoid rounding error +// double scale; // portion of the sizes of the processed thumbnail image and the full scale image + rtengine::procparams::ProcParams pparams; bool pparamsValid; bool pparamsSet;