Some months ago I was testing FLTK 1.4.x's screen scaling support in Windows. It worked as expected, with FLTK_SCALING_FACTOR or Fl::screen_scale() affecting the whole program's scaling, without my needing to manually adjust coordinate and size values.
Is there a way for custom boxtype functions to "opt out" of scaling, but without breaking their X/Y/W/H values? If necessary I could manually multiply those by the screen_scale.
static void aero_button_up_frame(int x, int y, int w, int h, Fl_Color) {
// outer border
fl_color(activated_color(fl_rgb_color(0x70, 0x70, 0x70)));
fl_xyline(x+2, y, x+w-3);
fl_xyline(x+2, y+h-1, x+w-3);
fl_yxline(x, y+2, y+h-3);
fl_yxline(x+w-1, y+2, y+h-3);
// top inner borders
fl_color(activated_color(fl_rgb_color(0xFB, 0xFB, 0xFB)));
fl_xyline(x+2, y+1, x+w-3);
fl_yxline(x+1, y+2, y+h/2-1);
fl_yxline(x+w-2, y+2, y+h/2-1);
fl_point(x+2, y+2);
fl_point(x+w-3, y+2);
// bottom inner borders
fl_color(activated_color(fl_rgb_color(0xF2, 0xF2, 0xF2)));
fl_yxline(x+1, y+h/2, y+h-3);
fl_yxline(x+w-2, y+h/2, y+h-3);
fl_xyline(x+2, y+h-2, x+w-3);
fl_point(x+2, y+h-3);
fl_point(x+w-3, y+h-3);
// top corners
fl_color(activated_color(fl_rgb_color(0x90, 0x90, 0x90)));
fl_xyline(x, y+1, x+1, y);
fl_yxline(x+w-2, y, y+1, x+w-1);
// bottom corners
fl_color(activated_color(fl_rgb_color(0x88, 0x88, 0x88)));
fl_xyline(x, y+h-2, x+1, y+h-1);
fl_yxline(x+w-2, y+h-1, y+h-2, x+w-1);
}
static void metro_button_up_box(int x, int y, int w, int h, Fl_Color c) {
if (w >= h) {
vertical_gradient(x+1, y+1, x+w-2, y+h-2, activated_color(fl_rgb_color(0xF0, 0xF0, 0xF0)),
activated_color(fl_rgb_color(0xE5, 0xE5, 0xE5)));
}
else {
horizontal_gradient(x+1, y+1, x+w-2, y+h-2, activated_color(fl_rgb_color(0xF0, 0xF0, 0xF0)),
activated_color(fl_rgb_color(0xE5, 0xE5, 0xE5)));
}
metro_button_up_frame(x, y, w, h, c);
}
static void horizontal_gradient(int x1, int y1, int x2, int y2, Fl_Color c1, Fl_Color c2) {
int imax = x2 - x1;
int d = imax ? imax : 1;
if (Fl::draw_box_active()) {
for (int i = 0; i <= imax; i++) {
float w = 1.0f - (float)i / d;
fl_color(fl_color_average(c1, c2, w));
fl_yxline(x1+i, y1, y2);
}
}
else {
for (int i = 0; i <= imax; i++) {
float w = 1.0f - (float)i / d;
fl_color(fl_inactive(fl_color_average(c1, c2, w)));
fl_yxline(x1+i, y1, y2);
}
}
}