summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-06-11 15:15:54 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-06-11 15:19:37 +0200
commit78ca44cccaa2a6fbc1f3362e086ddc2b65dbd0a8 (patch)
tree245bb78bc26f4789174d7f052999e38b4244fa14 /src
parent79be9fb792a9cf1c516a737e8a00b8d07bb2f020 (diff)
Fix Fl_Wayland_Window_Driver::shape_bitmap_(Fl_Image*).
Diffstat (limited to 'src')
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index 9fcf504e2..a9cf2f69b 100644
--- a/src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ b/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;