diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-05-05 11:34:10 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-05-05 11:34:10 +0200 |
| commit | af91083a7fd15100ef04b66b521c321249143580 (patch) | |
| tree | ee0f287a2febf1afc79037983f3959010983de03 | |
| parent | e02ee7d5f11b31024e1fe91cf980a90641b1a2c4 (diff) | |
Fl_Cairo_Graphics_Driver: simpler code with early calls to cairo_surface_destroy().
Add also replacement for pango_font_metrics_get_height() which requires Pango 1.44
| -rw-r--r-- | src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx | 30 | ||||
| -rw-r--r-- | src/drivers/PostScript/Fl_PostScript.cxx | 3 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx | 3 | ||||
| -rw-r--r-- | src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 8 |
4 files changed, 16 insertions, 28 deletions
diff --git a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx index e74a987c0..829290676 100644 --- a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx +++ b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx @@ -90,9 +90,7 @@ void Fl_Cairo_Graphics_Driver::set_cairo(cairo_t *cr, float s) { if (dummy_cairo_) { g_object_unref(pango_layout_); pango_layout_ = NULL; - cairo_surface_t *surf = cairo_get_target(dummy_cairo_); cairo_destroy(dummy_cairo_); - cairo_surface_destroy(surf); dummy_cairo_ = NULL; } cairo_ = cr; @@ -804,6 +802,7 @@ void Fl_Cairo_Graphics_Driver::cache(Fl_RGB_Image *rgb) { if (cairo_surface_status(surf) != CAIRO_STATUS_SUCCESS) return; (void)cairo_surface_set_user_data(surf, &data_key_for_surface, BGRA, dealloc_surface_data); cairo_pattern_t *pat = cairo_pattern_create_for_surface(surf); + cairo_surface_destroy(surf); *Fl_Graphics_Driver::id(rgb) = (fl_uintptr_t)pat; } @@ -811,10 +810,7 @@ void Fl_Cairo_Graphics_Driver::cache(Fl_RGB_Image *rgb) { void Fl_Cairo_Graphics_Driver::uncache(Fl_RGB_Image *img, fl_uintptr_t &id_, fl_uintptr_t &mask_) { cairo_pattern_t *pat = (cairo_pattern_t*)id_; if (pat) { - cairo_surface_t *surf; - cairo_pattern_get_surface(pat, &surf); cairo_pattern_destroy(pat); - cairo_surface_destroy(surf); id_ = 0; } } @@ -860,6 +856,7 @@ void Fl_Cairo_Graphics_Driver::cache(Fl_Bitmap *bm) { if (cairo_surface_status(surf) == CAIRO_STATUS_SUCCESS) { (void)cairo_surface_set_user_data(surf, &data_key_for_surface, BGRA, dealloc_surface_data); cairo_pattern_t *pat = cairo_pattern_create_for_surface(surf); + cairo_surface_destroy(surf); *Fl_Graphics_Driver::id(bm) = (fl_uintptr_t)pat; } } @@ -894,24 +891,12 @@ void Fl_Cairo_Graphics_Driver::cache(Fl_Pixmap *pxm) { void Fl_Cairo_Graphics_Driver::uncache_pixmap(fl_uintptr_t p) { - cairo_pattern_t *pat = (cairo_pattern_t*)p; - if (pat) { - cairo_surface_t *surf; - cairo_pattern_get_surface(pat, &surf); - cairo_pattern_destroy(pat); - cairo_surface_destroy(surf); - } + if (p) cairo_pattern_destroy((cairo_pattern_t*)p); } void Fl_Cairo_Graphics_Driver::delete_bitmask(fl_uintptr_t bm) { - cairo_pattern_t *pat = (cairo_pattern_t*)bm; - if (pat) { - cairo_surface_t *surf; - cairo_pattern_get_surface(pat, &surf); - cairo_pattern_destroy(pat); - cairo_surface_destroy(surf); - } + if (bm) cairo_pattern_destroy((cairo_pattern_t*)bm); } @@ -1063,7 +1048,11 @@ Fl_Cairo_Font_Descriptor::Fl_Cairo_Font_Descriptor(const char* name, Fl_Fontsize PangoFontMetrics *metrics = pango_fontset_get_metrics(fontset); ascent = pango_font_metrics_get_ascent(metrics)/PANGO_SCALE; descent = pango_font_metrics_get_descent(metrics)/PANGO_SCALE; - line_height = ceil(pango_font_metrics_get_height(metrics)/double(PANGO_SCALE)); +#if PANGO_VERSION_CHECK(1,44,0) + line_height = ceil(pango_font_metrics_get_height(metrics)/double(PANGO_SCALE)); // 1.44 +#else + line_height = int(size * 1.3 + 0.5); // TO IMPROVE +#endif q_width = pango_font_metrics_get_approximate_char_width(metrics)/PANGO_SCALE; pango_font_metrics_unref(metrics); g_object_unref(fontset); @@ -1100,6 +1089,7 @@ void Fl_Cairo_Graphics_Driver::font(Fl_Font fnum, Fl_Fontsize s) { if (!cairo_) { cairo_surface_t *surf = cairo_image_surface_create(Fl_Cairo_Graphics_Driver::cairo_format, 100, 100); cairo_ = cairo_create(surf); + cairo_surface_destroy(surf); } pango_layout_ = pango_cairo_create_layout(cairo_); // 1.10 pango_layout_cairo_ = cairo_; diff --git a/src/drivers/PostScript/Fl_PostScript.cxx b/src/drivers/PostScript/Fl_PostScript.cxx index 6e233ef97..918dbcd6c 100644 --- a/src/drivers/PostScript/Fl_PostScript.cxx +++ b/src/drivers/PostScript/Fl_PostScript.cxx @@ -1458,6 +1458,7 @@ static int init_cairo_postscript(FILE* output, cairo_t* &cairo_, if (cairo_surface_status(cs) != CAIRO_STATUS_SUCCESS) return 1; cairo_ps_surface_restrict_to_level(cs, CAIRO_PS_LEVEL_2); cairo_ = cairo_create(cs); + cairo_surface_destroy(cs); driver->Fl_Cairo_Graphics_Driver::font(0, 0); // to create the PangoLayout return 0; } @@ -1667,7 +1668,6 @@ void Fl_PostScript_File_Device::end_job (void) fputs("\n", ps->output); // creates an stdio error } cairo_destroy(ps->cr()); - cairo_surface_destroy(s); if (!error) error = fflush(ps->output); #else if (ps->nPages) { // for eps nPages is 0 so it is fine .... @@ -1734,7 +1734,6 @@ int Fl_EPS_File_Surface::close() { cairo_surface_finish(s); cairo_status_t status = cairo_surface_status(s); cairo_destroy(ps->cr()); - cairo_surface_destroy(s); fflush(ps->output); error = ferror(ps->output); if (status != CAIRO_STATUS_SUCCESS) error = status; diff --git a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx index 99d702d50..ffc86bd03 100644 --- a/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx @@ -110,6 +110,7 @@ void Fl_Wayland_Graphics_Driver::cairo_init(struct fl_wld_buffer *buffer, int wi Fl::fatal("Cairo error during cairo_create() %s\n", cairo_status_to_string(err)); return; } + cairo_surface_destroy(surf); cairo_set_source_rgba(buffer->cairo_, 1.0, 1.0, 1.0, 0.); cairo_paint(buffer->cairo_); cairo_set_source_rgba(buffer->cairo_, .0, .0, .0, 1.0); // Black default color @@ -123,9 +124,7 @@ void Fl_Wayland_Graphics_Driver::buffer_release(struct wld_window *window) wl_buffer_destroy(window->buffer->wl_buffer); delete[] window->buffer->draw_buffer; window->buffer->draw_buffer = NULL; - cairo_surface_t *surf = cairo_get_target(window->buffer->cairo_); cairo_destroy(window->buffer->cairo_); - cairo_surface_destroy(surf); free(window->buffer); window->buffer = NULL; } diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx index cf589bd57..0f07082c5 100644 --- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx +++ b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx @@ -91,9 +91,8 @@ Fl_Wayland_Window_Driver::~Fl_Wayland_Window_Driver() if (shape_data_) { cairo_surface_t *surface; cairo_pattern_get_surface(shape_data_->mask_pattern_, &surface); - cairo_pattern_destroy(shape_data_->mask_pattern_); uchar *data = cairo_image_surface_get_data(surface); - cairo_surface_destroy(surface); + cairo_pattern_destroy(shape_data_->mask_pattern_); delete[] data; delete shape_data_; } @@ -206,6 +205,7 @@ void Fl_Wayland_Window_Driver::shape_bitmap_(Fl_Image* b) { // needs testing } cairo_surface_t *mask_surf = cairo_image_surface_create_for_data(bits, CAIRO_FORMAT_A1, w, h, bytesperrow); shape_data_->mask_pattern_ = cairo_pattern_create_for_surface(mask_surf); + cairo_surface_destroy(mask_surf); shape_data_->shape_ = b; shape_data_->lw_ = w; shape_data_->lh_ = h; @@ -244,6 +244,7 @@ void Fl_Wayland_Window_Driver::shape_alpha_(Fl_Image* img, int offset) { } cairo_surface_t *mask_surf = cairo_image_surface_create_for_data(bits, CAIRO_FORMAT_A1, w, h, bytesperrow); shape_data_->mask_pattern_ = cairo_pattern_create_for_surface(mask_surf); + cairo_surface_destroy(mask_surf); shape_data_->shape_ = img; shape_data_->lw_ = w; shape_data_->lh_ = h; @@ -254,9 +255,8 @@ void Fl_Wayland_Window_Driver::shape(const Fl_Image* img) { if (shape_data_->mask_pattern_) { cairo_surface_t *surface; cairo_pattern_get_surface(shape_data_->mask_pattern_, &surface); - cairo_pattern_destroy(shape_data_->mask_pattern_); uchar *data = cairo_image_surface_get_data(surface); - cairo_surface_destroy(surface); + cairo_pattern_destroy(shape_data_->mask_pattern_); delete[] data; } } |
