tdf#153162 Gif load transparency optimization
Converting a bitmap from transparency to alpha can be very slow.
fortunately it can be avoided.
Inverted the transparency colors (cTransIndex1, cNonTransIndex1)
that are used to create aBmp1 in GIFReader::FillImages.
It create the transparency bitmap inverted, so no need to invert it.
Change-Id: I14714fe4b8bbcd7849db57b2824a7077dda40f81
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165261
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
diff --git a/vcl/source/filter/igif/gifread.cxx b/vcl/source/filter/igif/gifread.cxx
index 8f56eda..cfb4e84 100644
--- a/vcl/source/filter/igif/gifread.cxx
+++ b/vcl/source/filter/igif/gifread.cxx
@@ -220,18 +220,22 @@ void GIFReader::CreateBitmaps(tools::Long nWidth, tools::Long nHeight, BitmapPal
if (bGCTransparent)
{
const Color aWhite(COL_WHITE);
const Color aBlack(COL_BLACK);
aBmp1 = Bitmap(aSize, vcl::PixelFormat::N8_BPP, &Bitmap::GetGreyPalette(256));
if (!aAnimation.Count())
aBmp1.Erase(aWhite);
aBmp1.Erase(aBlack);
pAcc1 = aBmp1;
if (pAcc1)
{
cTransIndex1 = static_cast<sal_uInt8>(pAcc1->GetBestPaletteIndex(aWhite));
cNonTransIndex1 = cTransIndex1 ? 0 : 1;
// We have to make an AlphaMask from it, that needs to be inverted from transparency.
// It is faster to invert it here.
// So Non-Transparent color should be 0xff , and Transparent should be 0.
cNonTransIndex1 = static_cast<sal_uInt8>(pAcc1->GetBestPaletteIndex(aWhite));
cTransIndex1 = static_cast<sal_uInt8>(pAcc1->GetBestPaletteIndex(aBlack));
}
else
{
@@ -671,7 +675,8 @@ void GIFReader::CreateNewBitmaps()
{
pAcc1.reset();
AlphaMask aAlphaMask(aBmp1);
aAlphaMask.Invert(); // convert from transparency to alpha
// No need to convert from transparency to alpha
// aBmp1 is already inverted
aAnimationFrame.maBitmapEx = BitmapEx( aBmp8, aAlphaMask );
}
else