diff options
| author | Matthias Melcher <github@matthiasm.com> | 2024-08-31 23:20:27 +0200 |
|---|---|---|
| committer | Matthias Melcher <github@matthiasm.com> | 2024-08-31 23:20:27 +0200 |
| commit | 634ce805e5de4663fc9efdb288ed5b726af96005 (patch) | |
| tree | 830fb8c7e754827e0bfe482a5aba410709d4a385 /src/drivers/Cairo | |
| parent | d51046cdeaf1dceac91e70fe6be358502280a431 (diff) | |
Fixing set_font and image overflow for Cairo.
Diffstat (limited to 'src/drivers/Cairo')
| -rw-r--r-- | src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H | 1 | ||||
| -rw-r--r-- | src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx | 11 |
2 files changed, 10 insertions, 2 deletions
diff --git a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H index ffbb0308b..f0679d457 100644 --- a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H +++ b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H @@ -49,6 +49,7 @@ protected: cairo_t *cairo_; PangoContext *pango_context_; PangoLayout *pango_layout_; + static Fl_Font font_count_; public: Fl_Cairo_Graphics_Driver(); ~Fl_Cairo_Graphics_Driver() FL_OVERRIDE; diff --git a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx index 4a6d9e687..e60643c10 100644 --- a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx +++ b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx @@ -64,6 +64,9 @@ static Fl_Fontdesc built_in_table[] = { FL_EXPORT Fl_Fontdesc *fl_fonts = built_in_table; +// Number of fonts found by Fl::set_fonts(char*) beyond FL_FREE_FONT +// -1 denotes "not yet initialised" +Fl_Font Fl_Cairo_Graphics_Driver::font_count_ = -1; // duplicated from Fl_PostScript.cxx struct callback_data { @@ -799,7 +802,7 @@ void Fl_Cairo_Graphics_Driver::draw_cached_pattern_(Fl_Image *img, cairo_pattern cairo_save(cairo_); bool need_extend = (cache_w != Ws || cache_h != Hs || (W >= 2 && H >= 2)); if (need_extend || cx || cy || W < img->w() || H < img->h()) { // clip when necessary - cairo_rectangle(cairo_, X - 0.5, Y - 0.5, W + 0.5, H + 0.5); + cairo_rectangle(cairo_, X - 0.5, Y - 0.5, W, H); cairo_clip(cairo_); } // remove any scaling and the current "0.5" translation useful for lines but bad for images @@ -811,7 +814,7 @@ void Fl_Cairo_Graphics_Driver::draw_cached_pattern_(Fl_Image *img, cairo_pattern bool condition = Fl_RGB_Image::scaling_algorithm() == FL_RGB_SCALING_BILINEAR && (fabs(Ws/float(cache_w) - 1) > 0.02 || fabs(Hs/float(cache_h) - 1) > 0.02); cairo_pattern_set_filter(pat, condition ? CAIRO_FILTER_GOOD : CAIRO_FILTER_FAST); - cairo_pattern_set_extend(pat, CAIRO_EXTEND_PAD); + cairo_pattern_set_extend(pat, CAIRO_EXTEND_NONE); } cairo_matrix_init_scale(&matrix, double(cache_w)/Ws, double(cache_h)/Hs); cairo_matrix_translate(&matrix, -Xs , -Ys ); @@ -1103,6 +1106,9 @@ static int font_sort(Fl_Fontdesc *fa, Fl_Fontdesc *fb) { Fl_Font Fl_Cairo_Graphics_Driver::set_fonts(const char* /*pattern_name*/) { + // Return immideatly if the fonts were already counted + if (font_count_ != -1) + return FL_FREE_FONT + font_count_; fl_open_display(); int n_families, count = 0; PangoFontFamily **families; @@ -1147,6 +1153,7 @@ Fl_Font Fl_Cairo_Graphics_Driver::set_fonts(const char* /*pattern_name*/) } // Sort the list into alphabetic order qsort(fl_fonts + FL_FREE_FONT, count, sizeof(Fl_Fontdesc), (sort_f_type)font_sort); + font_count_ = count; return FL_FREE_FONT + count; } |
