FLTK logo

[master] af91083 - Fl_Cairo_Graphics_Driver: simpler code with early calls to cairo_surface_destroy().

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] af91083 - Fl_Cairo_Graphics_Driver: simpler code with early calls to cairo_surface_destroy(). "ManoloFLTK" May 05, 2022  
 
commit af91083a7fd15100ef04b66b521c321249143580
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Thu May 5 11:34:10 2022 +0200
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Thu May 5 11:34:10 2022 +0200

    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

 src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx     | 30 ++++++++--------------
 src/drivers/PostScript/Fl_PostScript.cxx           |  3 +--
 src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx |  3 +--
 src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx   |  8 +++---
 4 files changed, 16 insertions(+), 28 deletions(-)

diff --git src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
index e74a987..8292906 100644
--- src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
+++ 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 src/drivers/PostScript/Fl_PostScript.cxx src/drivers/PostScript/Fl_PostScript.cxx
index 6e233ef..918dbcd 100644
--- src/drivers/PostScript/Fl_PostScript.cxx
+++ 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 src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
index 99d702d..ffc86bd 100644
--- src/drivers/Wayland/Fl_Wayland_Graphics_Driver.cxx
+++ 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 src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index cf589bd..0f07082 100644
--- src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ 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;
     }
   }
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.