Skip to content

Commit

Permalink
Improve fl_overlay_rect() when GUI is scaled.
Browse files Browse the repository at this point in the history
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12901 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
  • Loading branch information
Manolo Gouy authored and Manolo Gouy committed May 6, 2018
1 parent e692983 commit aab1b72
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 64 deletions.
3 changes: 0 additions & 3 deletions FL/Fl_Graphics_Driver.H
Expand Up @@ -425,9 +425,6 @@ public:
virtual const char *font_name(int num) {return NULL;}
/** Support for Fl::set_font() */
virtual void font_name(int num, const char *name) {}
/** Support function for fl_overlay_rect() and scaled GUI.
Defaut implementation may be enough */
virtual bool overlay_rect_unscaled();
/** Support function for fl_overlay_rect() and scaled GUI.
Defaut implementation may be enough */
virtual void overlay_rect(int x, int y, int w , int h) { loop(x, y, x+w-1, y, x+w-1, y+h-1, x, y+h-1); }
Expand Down
5 changes: 0 additions & 5 deletions src/Fl_Graphics_Driver.cxx
Expand Up @@ -192,11 +192,6 @@ unsigned Fl_Graphics_Driver::font_desc_size() {
return (unsigned)sizeof(Fl_Fontdesc);
}

bool Fl_Graphics_Driver::overlay_rect_unscaled()
{
return (scale() == int(scale()));
}

/** Converts \p width and \p height from FLTK units to drawing units.
The conversion performed consists in multiplying \p width and \p height by
scale() and in slightly modifying that to help support tiled images. */
Expand Down
3 changes: 0 additions & 3 deletions src/drivers/Android/Fl_Android_Graphics_Driver.H
Expand Up @@ -272,9 +272,6 @@ public:
virtual const char *font_name(int num) override;
/** Support for Fl::set_font() */
virtual void font_name(int num, const char *name) override;
/** Support function for fl_overlay_rect() and scaled GUI.
Defaut implementation may be enough */
// super: virtual bool overlay_rect_unscaled();
/** Support function for fl_overlay_rect() and scaled GUI.
Defaut implementation may be enough */
// super: virtual void overlay_rect(int x, int y, int w , int h) { loop(x, y, x+w-1, y, x+w-1, y+h-1, x, y+h-1); }
Expand Down
1 change: 0 additions & 1 deletion src/drivers/Quartz/Fl_Quartz_Graphics_Driver.H
Expand Up @@ -190,7 +190,6 @@ protected:
#else
void descriptor_init(const char* name, Fl_Fontsize Size, Fl_Quartz_Font_Descriptor *d);
#endif
virtual bool overlay_rect_unscaled() {return false; }
virtual void overlay_rect(int x, int y, int w , int h);
};

Expand Down
77 changes: 25 additions & 52 deletions src/fl_overlay.cxx
Expand Up @@ -35,8 +35,6 @@ static int px,py,pw,ph;

#ifndef USE_XOR
#include <stdlib.h>
static uchar *bgN = 0L, *bgS = 0L, *bgE = 0L, *bgW = 0L;

#include <FL/Fl_Screen_Driver.H>
#include <FL/Fl_RGB_Image.H>
static Fl_RGB_Image *s_bgN = 0, *s_bgS = 0, *s_bgE = 0, *s_bgW = 0;
Expand Down Expand Up @@ -65,54 +63,37 @@ static void draw_current_rect() {
# error unsupported platform
# endif
#else
bool unscaled = fl_graphics_driver->overlay_rect_unscaled();
if (unscaled) {
if (bgN) { free(bgN); bgN = 0L; }
if (bgS) { free(bgS); bgS = 0L; }
if (bgE) { free(bgE); bgE = 0L; }
if (bgW) { free(bgW); bgW = 0L; }
} else {
if (s_bgN) { delete s_bgN; s_bgN = 0; }
if (s_bgS) { delete s_bgS; s_bgS = 0; }
if (s_bgE) { delete s_bgE; s_bgE = 0; }
if (s_bgW) { delete s_bgW; s_bgW = 0; }
}
if (s_bgN) { delete s_bgN; s_bgN = 0; }
if (s_bgS) { delete s_bgS; s_bgS = 0; }
if (s_bgE) { delete s_bgE; s_bgE = 0; }
if (s_bgW) { delete s_bgW; s_bgW = 0; }
if (pw>0 && ph>0) {
if (unscaled) {
bgE = fl_read_image(0L, px+pw-1, py, 1, ph);
bgW = fl_read_image(0L, px, py, 1, ph);
bgS = fl_read_image(0L, px, py+ph-1, pw, 1);
bgN = fl_read_image(0L, px, py, pw, 1);
} else {
s_bgE = Fl::screen_driver()->read_win_rectangle( px+pw-1, py, 1, ph);
if(s_bgE && s_bgE->w() && s_bgE->h()) {
s_bgE->scale(1, ph,0,1);
}
s_bgW = Fl::screen_driver()->read_win_rectangle( px, py, 1, ph);
if(s_bgW && s_bgW->w() && s_bgW->h()) {
s_bgW->scale(1, ph,0,1);
}
s_bgS = Fl::screen_driver()->read_win_rectangle( px, py+ph-1, pw, 1);
if(s_bgS && s_bgS->w() && s_bgS->h()) {
s_bgS->scale(pw, 1,0,1);
}
s_bgN = Fl::screen_driver()->read_win_rectangle( px, py, pw, 1);
if(s_bgN && s_bgN->w() && s_bgN->h()) {
s_bgN->scale(pw, 1,0,1);
}
s_bgE = Fl::screen_driver()->read_win_rectangle( px+pw-1, py, 1, ph);
if(s_bgE && s_bgE->w() && s_bgE->h()) {
s_bgE->scale(1, ph,0,1);
}
s_bgW = Fl::screen_driver()->read_win_rectangle( px, py, 1, ph);
if(s_bgW && s_bgW->w() && s_bgW->h()) {
s_bgW->scale(1, ph,0,1);
}
s_bgS = Fl::screen_driver()->read_win_rectangle( px, py+ph-1, pw, 1);
if(s_bgS && s_bgS->w() && s_bgS->h()) {
s_bgS->scale(pw, 1,0,1);
}
s_bgN = Fl::screen_driver()->read_win_rectangle( px, py, pw, 1);
if(s_bgN && s_bgN->w() && s_bgN->h()) {
s_bgN->scale(pw, 1,0,1);
}
bgx = px; bgy = py;
bgw = pw; bgh = ph;
}
fl_color(FL_WHITE);
fl_line_style(FL_SOLID);
if (unscaled) fl_rect(px, py, pw, ph);
else fl_graphics_driver->overlay_rect(px, py, pw, ph);
fl_graphics_driver->overlay_rect(px, py, pw, ph);

fl_color(FL_BLACK);
fl_line_style(FL_DOT);
if (unscaled) fl_rect(px, py, pw, ph);
else fl_graphics_driver->overlay_rect(px, py, pw, ph);
fl_graphics_driver->overlay_rect(px, py, pw, ph);
fl_line_style(FL_SOLID);
#endif // USE_XOR
}
Expand All @@ -125,18 +106,10 @@ static void erase_current_rect() {
draw_current_rect();
# endif
#else
bool unscaled = fl_graphics_driver->overlay_rect_unscaled();
if (unscaled) {
if (bgN) fl_draw_image(bgN, bgx, bgy, bgw, 1);
if (bgS) fl_draw_image(bgS, bgx, bgy+bgh-1, bgw, 1);
if (bgW) fl_draw_image(bgW, bgx, bgy, 1, bgh);
if (bgE) fl_draw_image(bgE, bgx+bgw-1, bgy, 1, bgh);
} else {
if (s_bgN) s_bgN->draw(bgx, bgy);
if (s_bgS) s_bgS->draw(bgx, (bgy+bgh-1));
if (s_bgW) s_bgW->draw(bgx, bgy);
if (s_bgE) s_bgE->draw((bgx+bgw-1), bgy);
}
if (s_bgN) s_bgN->draw(bgx, bgy);
if (s_bgS) s_bgS->draw(bgx, (bgy+bgh-1));
if (s_bgW) s_bgW->draw(bgx, bgy);
if (s_bgE) s_bgE->draw((bgx+bgw-1), bgy);
#endif
}

Expand Down

0 comments on commit aab1b72

Please sign in to comment.