FLTK logo

[master] c651667 - New member Fl_Cairo_Graphics_Driver::bitmap_to_pattern() to avoid code duplication.

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] c651667 - New member Fl_Cairo_Graphics_Driver::bitmap_to_pattern() to avoid code duplication. "ManoloFLTK" Jun 12, 2022  
 
commit c6516673ee4bc43d779b1852faf970caf5d3ddca
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Sun Jun 12 09:04:22 2022 +0200
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Sun Jun 12 09:04:22 2022 +0200

    New member Fl_Cairo_Graphics_Driver::bitmap_to_pattern() to avoid code duplication.

 src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H     |  2 +
 src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx   | 51 +++++++++++++++---------
 src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 28 +++----------
 3 files changed, 40 insertions(+), 41 deletions(-)

diff --git src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
index d5f7f56..dfe6753 100644
--- src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
+++ src/drivers/Cairo/Fl_Cairo_Graphics_Driver.H
@@ -154,6 +154,8 @@ public:
   void cache(Fl_RGB_Image *rgb);
   void uncache(Fl_RGB_Image *img, fl_uintptr_t &id_, fl_uintptr_t &mask_);
   void draw_bitmap(Fl_Bitmap *bm,int XP, int YP, int WP, int HP, int cx, int cy);
+  static cairo_pattern_t *bitmap_to_pattern(Fl_Bitmap *bm, bool complement,
+                                            cairo_surface_t **p_surface);
   void cache(Fl_Bitmap *img);
   virtual void delete_bitmask(fl_uintptr_t bm);
   void cache(Fl_Pixmap *pxm);
diff --git src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
index 2e9b580..89b2622 100644
--- src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
+++ src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
@@ -858,31 +858,44 @@ void Fl_Cairo_Graphics_Driver::draw_bitmap(Fl_Bitmap *bm,int XP, int YP, int WP,
 }
 
 
-void Fl_Cairo_Graphics_Driver::cache(Fl_Bitmap *bm) {
+cairo_pattern_t *Fl_Cairo_Graphics_Driver::bitmap_to_pattern(Fl_Bitmap *bm,
+                                    bool complement, cairo_surface_t **p_surface) {
   int stride = cairo_format_stride_for_width(CAIRO_FORMAT_A1, bm->data_w());
+  int w_bitmap = ((bm->data_w() + 7) / 8);
   uchar *BGRA = new uchar[stride * bm->data_h()];
   memset(BGRA, 0, stride * bm->data_h());
-    uchar  *r, p;
-    unsigned *q;
-    for (int j = 0; j < bm->data_h(); j++) {
-      r = (uchar*)bm->array + j * ((bm->data_w() + 7)/8);
-      q = (unsigned*)(BGRA + j * stride);
-      unsigned k = 0, mask32 = 1;
-      p = *r;
-      for (int i = 0; i < bm->data_w(); i++) {
-        if (p&1) (*q) |= mask32;
-        k++;
-        if (k % 8 != 0) p >>= 1; else p = *(++r);
-        if (k % 32 != 0) mask32 <<= 1; else {q++; mask32 = 1;}
+  for (int j = 0; j < bm->data_h(); j++) {
+    uchar *r = (uchar*)bm->array + j * w_bitmap;
+    unsigned *q = (unsigned*)(BGRA + j * stride);
+    unsigned k = 0, mask32 = 1;
+    uchar p = *r;
+    if (complement) p = ~p;
+    for (int i = 0; i < bm->data_w(); i++) {
+      if (p&1) (*q) |= mask32;
+      k++;
+      if (k % 8 != 0) p >>= 1;
+      else {
+        p = *(++r);
+        if (complement) p = ~p;
       }
+      if (k % 32 != 0) mask32 <<= 1; else {q++; mask32 = 1;}
     }
-  cairo_surface_t *surf = cairo_image_surface_create_for_data(BGRA, CAIRO_FORMAT_A1, bm->data_w(), bm->data_h(), stride);
-  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;
   }
+  cairo_surface_t *surf = cairo_image_surface_create_for_data(BGRA, CAIRO_FORMAT_A1, bm->data_w(), bm->data_h(), stride);
+  cairo_pattern_t *pattern =  cairo_pattern_create_for_surface(surf);
+  if (p_surface) *p_surface = surf;
+  else cairo_surface_destroy(surf);
+  return pattern;
+}
+
+
+void Fl_Cairo_Graphics_Driver::cache(Fl_Bitmap *bm) {
+  cairo_surface_t *surf;
+  cairo_pattern_t *pattern = Fl_Cairo_Graphics_Driver::bitmap_to_pattern(bm, false, &surf);
+  uchar *BGRA = cairo_image_surface_get_data(surf);
+  (void)cairo_surface_set_user_data(surf, &data_key_for_surface, BGRA, dealloc_surface_data);
+  cairo_surface_destroy(surf);
+  *Fl_Graphics_Driver::id(bm) = (fl_uintptr_t)pattern;
 }
 
 
diff --git src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index a9cf2f6..dae93b1 100644
--- src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -193,32 +193,16 @@ const Fl_Image* Fl_Wayland_Window_Driver::shape() {
   return shape_data_ ? shape_data_->shape_ : NULL;
 }
 
+
 void Fl_Wayland_Window_Driver::shape_bitmap_(Fl_Image* b) {
-  Fl_Bitmap *bm = (Fl_Bitmap*)b;
-  int i, j, w = bm->data_w(), h = bm->data_h(), w_bitmap = ((w + 7) / 8);
-  int bytesperrow = cairo_format_stride_for_width(CAIRO_FORMAT_A1, w);
-  uchar* bits = new uchar[h * bytesperrow];
-  // transform complement of bitmap image into CAIRO_FORMAT_A1 buffer
-  for (int j = 0; j < h; j++) {
-    uchar *r = (uchar*)bm->array + j * w_bitmap;
-    unsigned *q = (unsigned*)(bits + j * bytesperrow);
-    unsigned k = 0, mask32 = 1;
-    uchar p = ~*r;
-    for (int i = 0; i < w; i++) {
-      if (p&1) (*q) |= mask32;
-      k++;
-      if (k % 8 != 0) p >>= 1; else p = ~*(++r);
-      if (k % 32 != 0) mask32 <<= 1; else {q++; mask32 = 1;}
-    }
-  }
-  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_->mask_pattern_ = Fl_Cairo_Graphics_Driver::bitmap_to_pattern(
+                                (Fl_Bitmap*)b, true, NULL);
   shape_data_->shape_ = b;
-  shape_data_->lw_ = w;
-  shape_data_->lh_ = h;
+  shape_data_->lw_ = b->data_w();
+  shape_data_->lh_ = b->data_h();
 }
 
+
 void Fl_Wayland_Window_Driver::shape_alpha_(Fl_Image* img, int offset) {
   int i, j, d = img->d(), w = img->data_w(), h = img->data_h();
   int bytesperrow = cairo_format_stride_for_width(CAIRO_FORMAT_A1, w);
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'.