FLTK logo

[master] 78ca44c - Fix Fl_Wayland_Window_Driver::shape_bitmap_(Fl_Image*).

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] 78ca44c - Fix Fl_Wayland_Window_Driver::shape_bitmap_(Fl_Image*). "ManoloFLTK" Jun 11, 2022  
 
commit 78ca44cccaa2a6fbc1f3362e086ddc2b65dbd0a8
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Sat Jun 11 15:15:54 2022 +0200
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Sat Jun 11 15:19:37 2022 +0200

    Fix Fl_Wayland_Window_Driver::shape_bitmap_(Fl_Image*).

 src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index 9fcf504..a9cf2f6 100644
--- src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -193,16 +193,22 @@ 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) { // needs testing
-  // complement the bits of the Fl_Bitmap and control its stride too
-  int i, j, w = b->w(), h = b->h();
+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];
-  const uchar *q = ((Fl_Bitmap*)b)->array;
-  for (i = 0; i < h; i++) {
-    uchar *p = bits + i * bytesperrow;
-    for (j = 0; j < w; j++) {
-      *p++ = ~*q++;
+  // 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);
@@ -214,7 +220,7 @@ void Fl_Wayland_Window_Driver::shape_bitmap_(Fl_Image* b) { // needs testing
 }
 
 void Fl_Wayland_Window_Driver::shape_alpha_(Fl_Image* img, int offset) {
-  int i, j, d = img->d(), w = img->w(), h = img->h();
+  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);
   unsigned u;
   uchar byte, onebit;
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'.