FLTK logo

[master] 536c32e - Fl_Cairo_Graphics_Driver: simpler way to construct the PangoLayout object.

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] 536c32e - Fl_Cairo_Graphics_Driver: simpler way to construct the PangoLayout object. "ManoloFLTK" Jul 18, 2022  
 
commit 536c32ee99362c592db0ac2850c90bdabfd68038
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Mon Jul 18 22:58:02 2022 +0200
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Mon Jul 18 22:58:02 2022 +0200

    Fl_Cairo_Graphics_Driver: simpler way to construct the PangoLayout object.

 src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H   |  7 +--
 src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx | 68 ++++++++++----------------
 src/drivers/PostScript/Fl_PostScript.cxx       | 13 +++--
 3 files changed, 40 insertions(+), 48 deletions(-)

diff --git src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
index 255027e..d898427 100644
--- src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
+++ src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
@@ -25,12 +25,13 @@
 #include <cairo/cairo.h>
 
 typedef struct _PangoLayout  PangoLayout;
+typedef struct _PangoContext PangoContext;
 typedef struct _PangoFontDescription PangoFontDescription;
 
 
 class Fl_Cairo_Font_Descriptor : public Fl_Font_Descriptor {
 public:
-  Fl_Cairo_Font_Descriptor(const char* fontname, Fl_Fontsize size);
+  Fl_Cairo_Font_Descriptor(const char* fontname, Fl_Fontsize size, PangoContext *context);
   FL_EXPORT ~Fl_Cairo_Font_Descriptor();
   PangoFontDescription *fontref;
   int **width; // array of arrays of character widths
@@ -42,12 +43,12 @@ class FL_EXPORT Fl_Cairo_Graphics_Driver : public Fl_Graphics_Driver {
 private:
   bool *needs_commit_tag_; // NULL or points to whether cairo surface was drawn to
   cairo_t *dummy_cairo_; // used to measure text width before showing a window
-  cairo_t *pango_layout_cairo_;
-  PangoLayout *pango_layout_;
   int linestyle_;
   int width_unscaled_(unsigned int c);
 protected:
   cairo_t *cairo_;
+  PangoContext *pango_context_;
+  PangoLayout *pango_layout_;
 public:
   Fl_Cairo_Graphics_Driver();
   virtual ~Fl_Cairo_Graphics_Driver();
diff --git src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
index dd86247..15e17e6 100644
--- src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
+++ src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
@@ -69,7 +69,7 @@ static void draw_image_cb(void *data, int x, int y, int w, uchar *buf) {
 Fl_Cairo_Graphics_Driver::Fl_Cairo_Graphics_Driver() : Fl_Graphics_Driver() {
   cairo_ = NULL;
   pango_layout_ = NULL;
-  pango_layout_cairo_ = NULL;
+  pango_context_ = NULL;
   dummy_cairo_ = NULL;
   linestyle_ = FL_SOLID;
   clip_ = NULL;
@@ -81,6 +81,7 @@ Fl_Cairo_Graphics_Driver::Fl_Cairo_Graphics_Driver() : Fl_Graphics_Driver() {
 
 Fl_Cairo_Graphics_Driver::~Fl_Cairo_Graphics_Driver() {
   if (pango_layout_) g_object_unref(pango_layout_);
+  if (pango_context_) g_object_unref(pango_context_);
 }
 
 const cairo_format_t Fl_Cairo_Graphics_Driver::cairo_format = CAIRO_FORMAT_ARGB32;
@@ -88,8 +89,6 @@ const cairo_format_t Fl_Cairo_Graphics_Driver::cairo_format = CAIRO_FORMAT_ARGB3
 
 void Fl_Cairo_Graphics_Driver::set_cairo(cairo_t *cr, float s) {
   if (dummy_cairo_) {
-    g_object_unref(pango_layout_);
-    pango_layout_ = NULL;
     cairo_destroy(dummy_cairo_);
     dummy_cairo_ = NULL;
  }
@@ -1070,22 +1069,20 @@ int Fl_Cairo_Graphics_Driver::get_font_sizes(Fl_Font fnum, int*& sizep) {
 }
 
 
-Fl_Cairo_Font_Descriptor::Fl_Cairo_Font_Descriptor(const char* name, Fl_Fontsize size) : Fl_Font_Descriptor(name, size) {
-  char string[70];
+Fl_Cairo_Font_Descriptor::Fl_Cairo_Font_Descriptor(const char* name, Fl_Fontsize size,
+                                                   PangoContext *context) :
+                                                      Fl_Font_Descriptor(name, size) {
+  char *string = new char[strlen(name) + 10];
   strcpy(string, name);
   // The factor of 0.75 below gives cairo-produced text the same size as
   // Xft-produced text for the same FLTK font size.
   sprintf(string + strlen(string), " %d", int(size * 0.75 + 0.5) );
   //A PangoFontDescription describes a font in an implementation-independent manner.
   fontref = pango_font_description_from_string(string);
+  delete[] string;
   width = NULL;
-  //A PangoFontMap represents the set of fonts available for a particular rendering system.
-  static PangoFontMap *def_font_map = pango_cairo_font_map_get_default(); // 1.10
-  //A PangoContext stores global information used to control the itemization process.
-  static PangoContext *pango_context = pango_font_map_create_context(def_font_map); // 1.22
-  static PangoLanguage *language = pango_language_get_default(); // 1.16
   //A PangoFontset represents a set of PangoFont to use when rendering text.
-  PangoFontset *fontset = pango_font_map_load_fontset(def_font_map, pango_context, fontref, language);
+  PangoFontset *fontset = pango_font_map_load_fontset(pango_cairo_font_map_get_default(), context, fontref, pango_language_get_default());
   PangoFontMetrics *metrics = pango_fontset_get_metrics(fontset);
   ascent = pango_font_metrics_get_ascent(metrics);
   descent = pango_font_metrics_get_descent(metrics);
@@ -1109,13 +1106,13 @@ Fl_Cairo_Font_Descriptor::~Fl_Cairo_Font_Descriptor() {
 }
 
 
-static Fl_Font_Descriptor* find(Fl_Font fnum, Fl_Fontsize size) {
+static Fl_Font_Descriptor* find(Fl_Font fnum, Fl_Fontsize size, PangoContext *context) {
   Fl_Fontdesc* s = fl_fonts+fnum;
   if (!s->name) s = fl_fonts; // use 0 if fnum undefined
   Fl_Font_Descriptor* f;
   for (f = s->first; f; f = f->next)
     if (f->size == size) return f;
-  f = new Fl_Cairo_Font_Descriptor(s->name, size);
+  f = new Fl_Cairo_Font_Descriptor(s->name, size, context);
   f->next = s->first;
   s->first = f;
   return f;
@@ -1123,45 +1120,34 @@ static Fl_Font_Descriptor* find(Fl_Font fnum, Fl_Fontsize size) {
 
 
 /* Implementation note :
- * The pango_layout_ object is created relatively to the unscaled cairo context (scale() == 1).
- * Therefore, the cairo context is unscaled before calling pango_cairo_create_layout(),
- * pango_cairo_show_layout(), and pango_cairo_update_layout().
- * This way, the pixel width of a drawn string equals the sum of the widths of its
+ * The pixel width of a drawn string equals the sum of the widths of its
  * characters, except when kerning occurs.
  */
 void Fl_Cairo_Graphics_Driver::font(Fl_Font fnum, Fl_Fontsize s) {
   if (!font_descriptor()) fl_open_display();
-  if (!pango_layout_) {
-    bool needs_dummy = (cairo_ == NULL);
-    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);
-    }
-    cairo_save(cairo_);
-    double f = scale(); cairo_scale(cairo_, 1/f, 1/f);
-    pango_layout_ = pango_cairo_create_layout(cairo_); // 1.10
-    cairo_restore(cairo_);
-    pango_layout_cairo_ = cairo_;
-    if (needs_dummy) {
-      dummy_cairo_ = cairo_;
-    }
-  } else if (pango_layout_cairo_ != cairo_) {
-    cairo_save(cairo_);
-    double f = scale(); cairo_scale(cairo_, 1/f, 1/f);
-    pango_cairo_update_layout(cairo_, pango_layout_);
-    cairo_restore(cairo_);
-    pango_layout_cairo_ = cairo_;
+  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);
+    dummy_cairo_ = cairo_;
   }
   if (s == 0) return;
-  if (font() == fnum && size() == s) return;
   if (fnum == -1) {
     Fl_Graphics_Driver::font(0, 0);
     return;
   }
   Fl_Graphics_Driver::font(fnum, s);
-  font_descriptor( find(fnum, int(s * scale() + 0.5)) );
-  pango_layout_set_font_description(pango_layout_, ((Fl_Cairo_Font_Descriptor*)font_descriptor())->fontref);
+  if (!pango_context_) {
+    //A PangoFontMap represents the set of fonts available for a particular rendering system.
+    PangoFontMap *def_font_map = pango_cairo_font_map_get_default(); // 1.10
+    //A PangoContext stores global information used to control the itemization process.
+    pango_context_ = pango_font_map_create_context(def_font_map); // 1.22
+    pango_layout_ = pango_layout_new(pango_context_);
+  }
+  font_descriptor( find(fnum, int(s * scale() + 0.5), pango_context_) );
+  //If no font description is set on the layout, the font description from the layoutâ??s context is used.
+  pango_context_set_font_description(pango_context_,
+                                  ((Fl_Cairo_Font_Descriptor*)font_descriptor())->fontref);
 }
 
 
diff --git src/drivers/PostScript/Fl_PostScript.cxx src/drivers/PostScript/Fl_PostScript.cxx
index 918dbcd..1d86a67 100644
--- src/drivers/PostScript/Fl_PostScript.cxx
+++ src/drivers/PostScript/Fl_PostScript.cxx
@@ -1506,18 +1506,23 @@ int Fl_PostScript_Graphics_Driver::start_eps(int width, int height) {
 
 void Fl_PostScript_Graphics_Driver::transformed_draw(const char* str, int n, double x, double y) {
   if (!n) return;
+  if (!pango_context_) {
+    PangoFontMap *def_font_map = pango_cairo_font_map_get_default(); // 1.10
+    pango_context_ = pango_font_map_create_context(def_font_map); // 1.22
+    pango_layout_ = pango_layout_new(pango_context_);
+  }
   PangoFontDescription *pfd = Fl_Graphics_Driver::default_driver().pango_font_description(font());
-  pango_layout_set_font_description(pango_layout(), pfd);
+  pango_layout_set_font_description(pango_layout_, pfd);
   int pwidth, pheight;
   cairo_save(cairo_);
-  pango_layout_set_text(pango_layout(), str, n);
-  pango_layout_get_size(pango_layout(), &pwidth, &pheight);
+  pango_layout_set_text(pango_layout_, str, n);
+  pango_layout_get_size(pango_layout_, &pwidth, &pheight);
   if (pwidth > 0) {
     double s = width(str, n);
     cairo_translate(cairo_, x, y - height() + descent());
     s = (s/pwidth) * PANGO_SCALE;
     cairo_scale(cairo_, s, s);
-    pango_cairo_show_layout(cairo_, pango_layout());
+    pango_cairo_show_layout(cairo_, pango_layout_);
   }
   cairo_restore(cairo_);
   check_status();
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'.