Fix converting wxImage with alpha channel and mask to wxBitmap (wxGTK2)

Since f7247086c2 ("Fix storing wxBitmap data in GdkPixbuf", 2019-09-18),
919a4ec702 ("Fix drawing wxBitmap with mask", 2019-09-18) and other
commits (see #18498, #18508) RGBA wxBitmaps with masks are drawn properly
under wxGTK2 so if source wxImage has both alpha channel and a mask
the target wxBitmap also should have both components.
This commit is contained in:
Artur Wieczorek
2021-04-08 00:03:10 +02:00
parent c97bec76b8
commit 5e8bb6f2e7
2 changed files with 21 additions and 2 deletions

View File

@@ -756,6 +756,27 @@ bool wxBitmap::CreateFromImageAsPixbuf(const wxImage& image)
}
}
if ( image.HasMask() )
{
const size_t out_size = size_t((width + 7) / 8) * unsigned(height);
wxByte* out = new wxByte[out_size];
memset(out, 0xff, out_size);
const wxByte r_mask = image.GetMaskRed();
const wxByte g_mask = image.GetMaskGreen();
const wxByte b_mask = image.GetMaskBlue();
const wxByte* in = image.GetData();
unsigned bit_index = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++, in += 3, bit_index++)
if (in[0] == r_mask && in[1] == g_mask && in[2] == b_mask)
out[bit_index >> 3] ^= 1 << (bit_index & 7);
bit_index = (bit_index + 7) & ~7u;
}
SetMask(new wxMask(gdk_bitmap_create_from_data(wxGetTopLevelGDK(), reinterpret_cast<char*>(out), width, height)));
delete[] out;
}
return true;
}
#endif

View File

@@ -557,7 +557,6 @@ TEST_CASE("BitmapTestCase::FromImage", "[bitmap][image][convertfrom]")
}
}
#if !defined(__WXGTK20__) || defined(__WXGTK3__)
SECTION("RGBA image with mask")
{
wxImage img(2, 2);
@@ -619,7 +618,6 @@ TEST_CASE("BitmapTestCase::FromImage", "[bitmap][image][convertfrom]")
rowStartMask.OffsetY(dataMask, 1);
}
}
#endif // !defined(__WXGTK20__) || defined(__WXGTK3__)
}
TEST_CASE("BitmapTestCase::OverlappingBlit", "[bitmap][blit]")