From e4709b837dbc0670f61ae18f34fef3cacae8aafa Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Mon, 10 Oct 2022 11:31:02 +0200 Subject: Fl_Cairo_Graphics_Driver: fix Fl_Bitmap drawing whatever the endianness. --- src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx | 41 ++++++++++++++++++-------- 1 file changed, 29 insertions(+), 12 deletions(-) (limited to 'src/drivers/Cairo/Fl_Cairo_Graphics_Driver.cxx') 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; -- cgit v1.2.3