summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-10-10 11:31:02 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-10-10 11:31:02 +0200
commite4709b837dbc0670f61ae18f34fef3cacae8aafa (patch)
treeb0acc246598ec2b6bc3d764248503362033ffe22 /src
parent7fa677f93ea91fe06323d62ccb7bbbdd17f544f3 (diff)
Fl_Cairo_Graphics_Driver: fix Fl_Bitmap drawing whatever the endianness.
Diffstat (limited to 'src')
-rw-r--r--src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
index 238d99f9b..7ac9cee0e 100644
--- a/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
+++ b/src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx
@@ -898,24 +898,41 @@ cairo_pattern_t *Fl_Cairo_Graphics_Driver::bitmap_to_pattern(Fl_Bitmap *bm,
uchar *BGRA = new uchar[stride * bm->data_h()];
memset(BGRA, 0, stride * bm->data_h());
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;
+ uchar *r = (uchar *)bm->array + j * w_bitmap;
+ uint32_t *q = (uint32_t *)(BGRA + j * stride);
+ int k = 0;
+ uint32_t mask32;
+ uchar p;
for (int i = 0; i < bm->data_w(); i++) {
- if (p&1) (*q) |= mask32;
+ if (k == 0) {
+#if WORDS_BIGENDIAN
+ mask32 = (uint32_t)(1 << 31);
+#else
+ mask32 = 1;
+#endif
+ }
+ if ((k & 7) == 0) { // (k & 7) == (k % 8)
+ p = *r++;
+ if (complement)
+ p = ~p;
+ }
+ if (p & 1)
+ (*q) |= mask32;
k++;
- if (k % 8 != 0) p >>= 1;
- else {
- p = *(++r);
- if (complement) p = ~p;
+ p >>= 1;
+#if WORDS_BIGENDIAN
+ mask32 >>= 1;
+#else
+ mask32 <<= 1;
+#endif
+ if (k == 32) {
+ k = 0;
+ q++;
}
- 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);
- cairo_pattern_t *pattern = cairo_pattern_create_for_surface(surf);
+ cairo_pattern_t *pattern = cairo_pattern_create_for_surface(surf);
if (p_surface) *p_surface = surf;
else cairo_surface_destroy(surf);
return pattern;