diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-05-27 08:58:35 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-05-27 08:58:35 +0200 |
| commit | b78035624d5135f27b9742249652f124411f90a9 (patch) | |
| tree | 7de5fbf81dca378564efa1f69b467f4ec3e1f178 /src | |
| parent | 7fcd4b73d700d04b2bb6a758bd542c324a6e2aed (diff) | |
Fl_Cairo_Graphics_Driver: fix GUI rescaling.
The solution to avoid blurred graphics when the GUI is scaled is to turn off
cairo antialiasing when drawing horizontal and vertical lines and rectangles.
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx index 5a099024d..6ee54cb41 100644 --- a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx +++ b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx @@ -104,18 +104,19 @@ void Fl_Cairo_Graphics_Driver::set_cairo(cairo_t *cr, float s) { void Fl_Cairo_Graphics_Driver::rectf(int x, int y, int w, int h) { - cairo_matrix_t mat; - cairo_get_matrix(cairo_, &mat); - double s = 1 / mat.xx; - cairo_rectangle(cairo_, x - 0.5, y - 0.5, w + s, h + s); + cairo_rectangle(cairo_, x-0.5, y-0.5, w, h); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_fill(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } void Fl_Cairo_Graphics_Driver::rect(int x, int y, int w, int h) { cairo_rectangle(cairo_, x, y, w-1, h-1); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_stroke(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } @@ -140,7 +141,9 @@ void Fl_Cairo_Graphics_Driver::line(int x0, int y0, int x1, int y1, int x2, int void Fl_Cairo_Graphics_Driver::xyline(int x, int y, int x1) { cairo_move_to(cairo_, x, y); cairo_line_to(cairo_, x1, y); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_stroke(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } @@ -149,7 +152,9 @@ void Fl_Cairo_Graphics_Driver::xyline(int x, int y, int x1, int y2) { cairo_move_to(cairo_, x, y); cairo_line_to(cairo_, x1, y); cairo_line_to(cairo_, x1, y2); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_stroke(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } @@ -159,7 +164,9 @@ void Fl_Cairo_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) { cairo_line_to(cairo_, x1, y); cairo_line_to(cairo_, x1, y2); cairo_line_to(cairo_, x3, y2); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_stroke(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } @@ -167,7 +174,9 @@ void Fl_Cairo_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) { void Fl_Cairo_Graphics_Driver::yxline(int x, int y, int y1) { cairo_move_to(cairo_, x, y); cairo_line_to(cairo_, x, y1); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_stroke(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } @@ -176,7 +185,9 @@ void Fl_Cairo_Graphics_Driver::yxline(int x, int y, int y1, int x2) { cairo_move_to(cairo_, x, y); cairo_line_to(cairo_, x, y1); cairo_line_to(cairo_, x2, y1); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_stroke(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } @@ -186,7 +197,9 @@ void Fl_Cairo_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) { cairo_line_to(cairo_, x, y1); cairo_line_to(cairo_, x2, y1); cairo_line_to(cairo_, x2, y3); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_stroke(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); surface_needs_commit(); } @@ -211,6 +224,9 @@ void Fl_Cairo_Graphics_Driver::loop(int x0, int y0, int x1, int y1, int x2, int cairo_line_to(cairo_, x2, y2); cairo_line_to(cairo_, x3, y3); cairo_close_path(cairo_); + if ((y0==y1 && x1==x2 && y2==y3 && x3==x0) || (x0==x1 && y1==y2 && x2==x3 && y3==y0)) { + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); + } cairo_stroke(cairo_); cairo_restore(cairo_); surface_needs_commit(); @@ -236,6 +252,9 @@ void Fl_Cairo_Graphics_Driver::polygon(int x0, int y0, int x1, int y1, int x2, i cairo_line_to(cairo_, x2, y2); cairo_line_to(cairo_, x3, y3); cairo_close_path(cairo_); + if ((y0==y1 && x1==x2 && y2==y3 && x3==x0) || (x0==x1 && y1==y2 && x2==x3 && y3==y0)) { + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); + } cairo_fill(cairo_); cairo_restore(cairo_); surface_needs_commit(); @@ -502,13 +521,10 @@ void Fl_Cairo_Graphics_Driver::push_clip(int x, int y, int w, int h) { c->prev = clip_; clip_ = c; cairo_save(cairo_); - cairo_matrix_t mat; - cairo_get_matrix(cairo_, &mat); - double s = 1 / mat.xx; - double ss = (2 * s < 1 ? s : 1/2.); - cairo_rectangle(cairo_, clip_->x - 0.5 - ss, clip_->y - 0.5 - ss , - clip_->w + s + 2 * ss, clip_->h + s + 2 * ss); + cairo_rectangle(cairo_, clip_->x - 0.5 , clip_->y - 0.5 , clip_->w, clip_->h); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_NONE); cairo_clip(cairo_); + cairo_set_antialias(cairo_, CAIRO_ANTIALIAS_DEFAULT); check_status(); } |
