Improve Fl_Graphics_Driver::cache_size() when GUI is scaled.

The change lets this function enlarge the size only when strictly necessary
for image tiling.
This commit is contained in:
ManoloFLTK 2020-12-02 14:39:37 +01:00
parent 4171cbe0be
commit d1c7caec3b
3 changed files with 11 additions and 10 deletions

View File

@ -203,14 +203,15 @@ unsigned Fl_Graphics_Driver::font_desc_size() {
scale() and in slightly modifying that to help support tiled images. */
void Fl_Graphics_Driver::cache_size(Fl_Image *img, int &width, int &height)
{
if ( int(scale()) == scale() ) {
width = width * scale();
height = height * scale();
} else {
width = (width+1) * scale();
height = (height+1) * scale();
}
img->cache_size_(width, height);
// Image tiling may require to convert the floating value of width * scale() or
// height * scale() to a larger integer value to avoid undrawn space between adjacent images.
float s = scale(), fs = width * s;
width = (fs - int(fs) < 0.001 ? int(fs) :
int((width+1) * s));
fs = height * s;
height = (fs - int(fs) < 0.001 ? int(fs) :
int((height+1) * s));
if (img) img->cache_size_(width, height);
}
/** Draws an Fl_Pixmap object using this graphics driver.

View File

@ -503,7 +503,7 @@ Fl_WinAPI_Screen_Driver::read_win_rectangle(
int ws, hs;
if (int(s) == s) { ws = w * s; hs = h * s;}
else {
ws = (w+1)*s; // matches what Fl_Graphics_Driver::cache_size() does
ws = (w+1)*s; // approximates what Fl_Graphics_Driver::cache_size() does
hs = (h+1)*s;
if (ws < 1) ws = 1;
if (hs < 1) hs = 1;

View File

@ -800,7 +800,7 @@ Fl_RGB_Image *Fl_X11_Screen_Driver::read_win_rectangle(int X, int Y, int w, int
sh = screens[ns].height;
}
if (win && !allow_outside && int(s) != s) {
ws = (w+1) * s; // matches what Fl_Graphics_Driver::cache_size() does
ws = (w+1) * s; // approximates what Fl_Graphics_Driver::cache_size() does
hs = (h+1) * s;
if (Xs + ws >= int(win->w()*s)) ws = win->w()*s - Xs -1;
if (Ys + hs >= int(win->h()*s)) hs = win->h()*s - Ys -1;