include/vcl/filter/ImportOutput.hxx | 4 - vcl/source/filter/graphicfilter.cxx | 32 +------- vcl/source/filter/igif/gifread.cxx | 2 vcl/source/filter/ixbm/xbmread.cxx | 12 +-- vcl/source/filter/ixpm/xpmread.cxx | 14 +-- vcl/source/filter/jpeg/JpegReader.cxx | 2 vcl/source/filter/png/PngImageReader.cxx | 117 +++++++++---------------------- vcl/source/filter/png/png.hxx | 3 8 files changed, 60 insertions(+), 126 deletions(-)
New commits: commit 6354829686a11f0bbcd86fba5eced9d15b76d2c4 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Fri Aug 1 09:33:35 2025 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Aug 11 18:57:18 2025 +0200 BitmapEx->Bitmap in ImportOutput now that Bitmap can handle transparency. Change-Id: I646c2255bc2c3a1ed08bb8ba6b933178182b53a8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188752 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/vcl/filter/ImportOutput.hxx b/include/vcl/filter/ImportOutput.hxx index 107ae17b9a55..56bbf4ea4b31 100644 --- a/include/vcl/filter/ImportOutput.hxx +++ b/include/vcl/filter/ImportOutput.hxx @@ -10,7 +10,7 @@ #pragma once #include <vcl/dllapi.h> -#include <vcl/bitmapex.hxx> +#include <vcl/bitmap.hxx> #include <vcl/animate/Animation.hxx> #include <vcl/gdimtf.hxx> @@ -18,7 +18,7 @@ class VCL_DLLPUBLIC ImportOutput { public: bool mbIsAnimated = false; - std::optional<BitmapEx> moBitmap; + std::optional<Bitmap> moBitmap; std::optional<Animation> moAnimation; std::optional<GDIMetaFile> moGDIMetaFile; }; diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 222890883c7c..2a410899485a 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -570,7 +570,7 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra if (ImportJPEG( *rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr)) { - Bitmap& rBitmap = const_cast<Bitmap&>(rContext.m_pImportOutput->moBitmap->GetBitmap()); + Bitmap& rBitmap = *rContext.m_pImportOutput->moBitmap; rContext.m_pAccess = std::make_unique<BitmapScopedWriteAccess>(rBitmap); rContext.m_pStream->Seek(rContext.m_nStreamBegin); if (bThreads) @@ -586,8 +586,7 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra rContext.m_eLinkType = GfxLinkType::NativePng; if (vcl::ImportPNG( *rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr)) { - const BitmapEx& rBitmapEx = *rContext.m_pImportOutput->moBitmap; - Bitmap& rBitmap = const_cast<Bitmap&>(rBitmapEx.GetBitmap()); + Bitmap& rBitmap = *rContext.m_pImportOutput->moBitmap; rContext.m_pAccess = std::make_unique<BitmapScopedWriteAccess>(rBitmap); rContext.m_pStream->Seek(rContext.m_nStreamBegin); if (bThreads) @@ -957,7 +956,7 @@ ErrCode GraphicFilter::readJPEG(SvStream & rStream, Graphic & rGraphic, GfxLinkT } else { - Bitmap& rBitmap = const_cast<Bitmap&>(aImportOutput.moBitmap->GetBitmap()); + Bitmap& rBitmap = *aImportOutput.moBitmap; BitmapScopedWriteAccess pWriteAccess(rBitmap); rStream.Seek(nPosition); if (!ImportJPEG(rStream, aImportOutput, nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, &pWriteAccess)) diff --git a/vcl/source/filter/igif/gifread.cxx b/vcl/source/filter/igif/gifread.cxx index 563064641e44..98dd1a531928 100644 --- a/vcl/source/filter/igif/gifread.cxx +++ b/vcl/source/filter/igif/gifread.cxx @@ -925,7 +925,7 @@ ReadState GIFReader::ReadGIF(ImportOutput& rImportOutput) if (aAnimation.Count() == 1) { rImportOutput.mbIsAnimated = false; - rImportOutput.moBitmap = aAnimation.Get(0).maBitmapEx; + rImportOutput.moBitmap = Bitmap(aAnimation.Get(0).maBitmapEx); if (aPrefSize.Width() && aPrefSize.Height()) { diff --git a/vcl/source/filter/ixbm/xbmread.cxx b/vcl/source/filter/ixbm/xbmread.cxx index 10d3c35e4832..2f0e2417de3c 100644 --- a/vcl/source/filter/ixbm/xbmread.cxx +++ b/vcl/source/filter/ixbm/xbmread.cxx @@ -65,7 +65,7 @@ public: explicit XBMReader(SvStream& rStream); - ReadState ReadXBM(BitmapEx& rBitmapEx); + ReadState ReadXBM(Bitmap& rBitmap); }; } @@ -261,7 +261,7 @@ void XBMReader::ParseData( SvStream* pInStm, const OString& aLastLine, XBMFormat } } -ReadState XBMReader::ReadXBM(BitmapEx& rBitmapEx) +ReadState XBMReader::ReadXBM(Bitmap& rBitmap) { if (!mrStream.good()) return XBMREAD_ERROR; @@ -339,7 +339,7 @@ ReadState XBMReader::ReadXBM(BitmapEx& rBitmapEx) mpWriteAccess.reset(); aBlackBmp.Erase( COL_BLACK ); - rBitmapEx = BitmapEx(aBlackBmp, maBitmap); + rBitmap = Bitmap(BitmapEx(aBlackBmp, maBitmap)); eReadState = XBMREAD_OK; } @@ -349,11 +349,11 @@ ReadState XBMReader::ReadXBM(BitmapEx& rBitmapEx) VCL_DLLPUBLIC bool ImportXBM(SvStream& rStmeam, ImportOutput& rImportOutput) { XBMReader aXBMReader(rStmeam); - BitmapEx aBitmapEx; - ReadState eReadState = aXBMReader.ReadXBM(aBitmapEx); + Bitmap aBitmap; + ReadState eReadState = aXBMReader.ReadXBM(aBitmap); if (eReadState == XBMREAD_ERROR) return false; - rImportOutput.moBitmap = aBitmapEx; + rImportOutput.moBitmap = aBitmap; return true; } diff --git a/vcl/source/filter/ixpm/xpmread.cxx b/vcl/source/filter/ixpm/xpmread.cxx index fabc024f9878..b1a2e19a5ac7 100644 --- a/vcl/source/filter/ixpm/xpmread.cxx +++ b/vcl/source/filter/ixpm/xpmread.cxx @@ -111,7 +111,7 @@ private: public: explicit XPMReader(SvStream& rStream); - ReadState ReadXPM(BitmapEx& rBitmapEx); + ReadState ReadXPM(Bitmap& rBitmap); }; } @@ -122,7 +122,7 @@ XPMReader::XPMReader(SvStream& rStream) { } -ReadState XPMReader::ReadXPM(BitmapEx& rBitmapEx) +ReadState XPMReader::ReadXPM(Bitmap& rBitmap) { if (!mrStream.good()) return XPMREAD_ERROR; @@ -226,11 +226,11 @@ ReadState XPMReader::ReadXPM(BitmapEx& rBitmapEx) if (mpMaskWriterAccess) { mpMaskWriterAccess.reset(); - rBitmapEx = BitmapEx(maBitmap, maMaskBitmap); + rBitmap = Bitmap(BitmapEx(maBitmap, maMaskBitmap)); } else { - rBitmapEx = BitmapEx(maBitmap); + rBitmap = maBitmap; } eReadState = XPMREAD_OK; } @@ -639,12 +639,12 @@ VCL_DLLPUBLIC bool ImportXPM(SvStream& rStream, ImportOutput& rImportOutput) { XPMReader aXPMReader(rStream); - BitmapEx aBitmapEx; - ReadState eReadState = aXPMReader.ReadXPM(aBitmapEx); + Bitmap aBitmap; + ReadState eReadState = aXPMReader.ReadXPM(aBitmap); if (eReadState == XPMREAD_ERROR) return false; - rImportOutput.moBitmap = aBitmapEx; + rImportOutput.moBitmap = aBitmap; return true; } diff --git a/vcl/source/filter/jpeg/JpegReader.cxx b/vcl/source/filter/jpeg/JpegReader.cxx index 094d7f2cbc10..28cdbbfffff4 100644 --- a/vcl/source/filter/jpeg/JpegReader.cxx +++ b/vcl/source/filter/jpeg/JpegReader.cxx @@ -248,7 +248,7 @@ ReadState JPEGReader::Read(ImportOutput& rImportOutput, GraphicFilterImportFlags if (bUseExistingBitmap || !mpBitmap->IsEmpty()) { if (!bUseExistingBitmap) - rImportOutput.moBitmap = BitmapEx(*mpBitmap); + rImportOutput.moBitmap = *mpBitmap; bRet = true; } diff --git a/vcl/source/filter/png/PngImageReader.cxx b/vcl/source/filter/png/PngImageReader.cxx index 994962eb145b..2c688ecaa181 100644 --- a/vcl/source/filter/png/PngImageReader.cxx +++ b/vcl/source/filter/png/PngImageReader.cxx @@ -690,11 +690,11 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, bool bSuccess = reader(aFrameStream, aFrameImportOutput); if (!bSuccess) return false; - BitmapEx aFrameBitmapEx = *aFrameImportOutput.moBitmap; + Bitmap aFrameBitmap = *aFrameImportOutput.moBitmap; Point aStartPoint(aFctlChunk->x_offset, aFctlChunk->y_offset); Size aSize(aFctlChunk->width, aFctlChunk->height); AnimationFrame aAnimationFrame( - aFrameBitmapEx, aStartPoint, aSize, + BitmapEx(aFrameBitmap), aStartPoint, aSize, NumDenToTime(aFctlChunk->delay_num, aFctlChunk->delay_den), aDisposal, aBlend); aAnimation.Insert(aAnimationFrame); } @@ -775,7 +775,7 @@ bool PngImageReader::read(Bitmap& rBitmap) ImportOutput aImportOutput; bool bRet = reader(mrStream, aImportOutput); if (bRet) - rBitmap = Bitmap(*aImportOutput.moBitmap); + rBitmap = *aImportOutput.moBitmap; return bRet; } @@ -787,7 +787,7 @@ Bitmap PngImageReader::read() if (read(aImportOutput)) { if (!aImportOutput.mbIsAnimated) - return Bitmap(*aImportOutput.moBitmap); + return *aImportOutput.moBitmap; else return Bitmap(aImportOutput.moAnimation->GetBitmapEx()); } commit 4997d1f244eecb8ba328c2793ca0fd29a0ca4237 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Mon Aug 11 16:26:56 2025 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Aug 11 18:57:08 2025 +0200 BitmapEx->Bitmap in PngImageReader Now that Bitmap can handle transparency Change-Id: I6cc7058261b8f33a7efcebe2a74030346311dd42 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189249 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 100ef71b26c0..222890883c7c 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -478,9 +478,6 @@ struct GraphicImportContext std::shared_ptr<ImportOutput> m_pImportOutput; /// Write pixel data using this access. std::unique_ptr<BitmapScopedWriteAccess> m_pAccess; - std::unique_ptr<BitmapScopedWriteAccess> m_pAlphaAccess; - // Need to have an AlphaMask instance to keep its lifetime. - AlphaMask mAlphaMask; /// Signals if import finished correctly. ErrCode m_nStatus = ERRCODE_GRFILTER_FILTERERROR; /// Original graphic format. @@ -526,7 +523,7 @@ void GraphicImportTask::doImport(GraphicImportContext& rContext) { vcl::ImportPNG(*rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, - rContext.m_pAccess.get(), rContext.m_pAlphaAccess.get()); + rContext.m_pAccess.get()); if (!rContext.m_pImportOutput->moBitmap || rContext.m_pImportOutput->moBitmap->IsEmpty()) { @@ -587,23 +584,11 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra else if (aFilterName.equalsIgnoreAsciiCase(IMP_PNG)) { rContext.m_eLinkType = GfxLinkType::NativePng; - if (vcl::ImportPNG( *rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr, nullptr)) + if (vcl::ImportPNG( *rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr)) { const BitmapEx& rBitmapEx = *rContext.m_pImportOutput->moBitmap; Bitmap& rBitmap = const_cast<Bitmap&>(rBitmapEx.GetBitmap()); rContext.m_pAccess = std::make_unique<BitmapScopedWriteAccess>(rBitmap); - if(rBitmapEx.IsAlpha()) - { - // The separate alpha bitmap causes a number of complications. Not only - // we need to have an extra bitmap access for it, but we also need - // to keep an AlphaMask instance in the context. This is because - // BitmapEx internally keeps Bitmap and not AlphaMask (because the Bitmap - // may be also a mask, not alpha). So BitmapEx::GetAlpha() returns - // a temporary, and direct access to the Bitmap wouldn't work - // with AlphaScopedBitmapAccess. *sigh* - rContext.mAlphaMask = rBitmapEx.GetAlphaMask(); - rContext.m_pAlphaAccess = std::make_unique<BitmapScopedWriteAccess>(rContext.mAlphaMask); - } rContext.m_pStream->Seek(rContext.m_nStreamBegin); if (bThreads) rSharedPool.pushTask(std::make_unique<GraphicImportTask>(pTag, rContext)); @@ -625,12 +610,6 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra for (auto& rContext : aContexts) { rContext.m_pAccess.reset(); - rContext.m_pAlphaAccess.reset(); - if (!rContext.mAlphaMask.IsEmpty()) // Need to move the AlphaMask back to the BitmapEx. - { - BitmapEx aBitmapEx(rContext.m_pImportOutput->moBitmap->GetBitmap(), rContext.mAlphaMask); - rContext.m_pImportOutput->moBitmap = aBitmapEx; - } std::shared_ptr<Graphic> pGraphic; diff --git a/vcl/source/filter/png/PngImageReader.cxx b/vcl/source/filter/png/PngImageReader.cxx index 4c88b0dbaf23..994962eb145b 100644 --- a/vcl/source/filter/png/PngImageReader.cxx +++ b/vcl/source/filter/png/PngImageReader.cxx @@ -332,8 +332,7 @@ bool fcTLbeforeIDAT(SvStream& rStream) bool reader(SvStream& rStream, ImportOutput& rImportOutput, GraphicFilterImportFlags nImportFlags = GraphicFilterImportFlags::NONE, - BitmapScopedWriteAccess* pAccess = nullptr, - BitmapScopedWriteAccess* pAlphaAccess = nullptr) + BitmapScopedWriteAccess* pAccess = nullptr) { if (!isPng(rStream)) return false; @@ -359,12 +358,9 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, // All variables holding resources need to be declared here in order to be // properly cleaned up in case of an error, otherwise libpng's longjmp() // jumps over the destructor calls. - BitmapEx aBitmapEx; Bitmap aBitmap; - AlphaMask aBitmapAlpha; Size prefSize; BitmapScopedWriteAccess pWriteAccessInstance; - BitmapScopedWriteAccess pWriteAccessAlphaInstance; const bool bFuzzing = comphelper::IsFuzzing(); const bool bOnlyCreateBitmap = static_cast<bool>(nImportFlags & GraphicFilterImportFlags::OnlyCreateBitmap); @@ -462,9 +458,7 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, aBitmap = Bitmap(Size(width, height), vcl::PixelFormat::N24_BPP); break; case PNG_COLOR_TYPE_RGBA: - aBitmap = Bitmap(Size(width, height), vcl::PixelFormat::N24_BPP); - aBitmapAlpha = AlphaMask(Size(width, height), nullptr); - aBitmapAlpha.Erase(0); // opaque + aBitmap = Bitmap(Size(width, height), vcl::PixelFormat::N32_BPP); break; case PNG_COLOR_TYPE_GRAY: aBitmap = Bitmap(Size(width, height), vcl::PixelFormat::N8_BPP, @@ -476,28 +470,18 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, if (bOnlyCreateBitmap) { - if (!aBitmapAlpha.IsEmpty()) - aBitmapEx = BitmapEx(aBitmap, aBitmapAlpha); - else - aBitmapEx = BitmapEx(aBitmap); if (!prefSize.IsEmpty()) { - aBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); - aBitmapEx.SetPrefSize(prefSize); + aBitmap.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + aBitmap.SetPrefSize(prefSize); } - rImportOutput.moBitmap = aBitmapEx; + rImportOutput.moBitmap = aBitmap; return true; } pWriteAccessInstance = aBitmap; if (!pWriteAccessInstance) return false; - if (!aBitmapAlpha.IsEmpty()) - { - pWriteAccessAlphaInstance = aBitmapAlpha; - if (!pWriteAccessAlphaInstance) - return false; - } } } catch (const std::runtime_error& ex) @@ -505,13 +489,10 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, std::cerr << "libpng error: " << ex.what() << std::endl; pWriteAccessInstance.reset(); - pWriteAccessAlphaInstance.reset(); return false; } BitmapScopedWriteAccess& pWriteAccess = pAccess ? *pAccess : pWriteAccessInstance; - BitmapScopedWriteAccess& pWriteAccessAlpha - = pAlphaAccess ? *pAlphaAccess : pWriteAccessAlphaInstance; try { @@ -533,9 +514,6 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, else if (colorType == PNG_COLOR_TYPE_RGB_ALPHA) { size_t aRowSizeBytes = png_get_rowbytes(pPng, pInfo); - ScanlineFormat eFormat = pWriteAccess->GetScanlineFormat(); - if (eFormat == ScanlineFormat::N24BitTcBgr) - png_set_bgr(pPng); if (nNumberOfPasses == 1) { @@ -544,17 +522,12 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, for (png_uint_32 y = 0; y < height; y++) { Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pWriteAccessAlpha->GetScanline(y); png_bytep pRow = aRow.data(); png_read_row(pPng, pRow, nullptr); - size_t iAlpha = 0; - size_t iColor = 0; for (size_t i = 0; i < aRowSizeBytes; i += 4) { - pScanline[iColor++] = pRow[i + 0]; - pScanline[iColor++] = pRow[i + 1]; - pScanline[iColor++] = pRow[i + 2]; - pScanAlpha[iAlpha++] = pRow[i + 3]; + Color aCol(ColorAlpha, pRow[i + 3], pRow[i + 0], pRow[i + 1], pRow[i + 2]); + pWriteAccess->SetPixelOnData(pScanline, i / 4, aCol); } } } @@ -567,19 +540,18 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, { for (png_uint_32 y = 0; y < height; y++) { - Scanline pScanline = pWriteAccess->GetScanline(y); - Scanline pScanAlpha = pWriteAccessAlpha->GetScanline(y); png_bytep pRow = aRows[y].data(); png_read_row(pPng, pRow, nullptr); - size_t iAlpha = 0; - size_t iColor = 0; - for (size_t i = 0; i < aRowSizeBytes; i += 4) - { - pScanline[iColor++] = pRow[i + 0]; - pScanline[iColor++] = pRow[i + 1]; - pScanline[iColor++] = pRow[i + 2]; - pScanAlpha[iAlpha++] = pRow[i + 3]; - } + } + } + for (png_uint_32 y = 0; y < height; y++) + { + Scanline pScanline = pWriteAccess->GetScanline(y); + png_bytep pRow = aRows[y].data(); + for (size_t i = 0; i < aRowSizeBytes; i += 4) + { + Color aCol(ColorAlpha, pRow[i + 3], pRow[i + 0], pRow[i + 1], pRow[i + 2]); + pWriteAccess->SetPixelOnData(pScanline, i / 4, aCol); } } } @@ -595,30 +567,26 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, } } } + else + assert(false); } catch (const std::runtime_error& ex) { std::cerr << "libpng error: " << ex.what() << std::endl; pWriteAccessInstance.reset(); - pWriteAccessAlphaInstance.reset(); if (!bUseExistingBitmap) { // Set the bitmap if it contains something, even on failure. This allows // reading images that are only partially broken. pWriteAccessInstance.reset(); - pWriteAccessAlphaInstance.reset(); - if (!aBitmap.IsEmpty() && !aBitmapAlpha.IsEmpty()) - aBitmapEx = BitmapEx(aBitmap, aBitmapAlpha); - else if (!aBitmap.IsEmpty()) - aBitmapEx = BitmapEx(aBitmap); - if (!aBitmapEx.IsEmpty() && !prefSize.IsEmpty()) + if (!aBitmap.IsEmpty() && !prefSize.IsEmpty()) { - aBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); - aBitmapEx.SetPrefSize(prefSize); + aBitmap.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + aBitmap.SetPrefSize(prefSize); } - rImportOutput.moBitmap = aBitmapEx; + rImportOutput.moBitmap = aBitmap; } return false; } @@ -634,17 +602,12 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, if (!bUseExistingBitmap) { pWriteAccessInstance.reset(); - pWriteAccessAlphaInstance.reset(); - if (!aBitmap.IsEmpty() && !aBitmapAlpha.IsEmpty()) - aBitmapEx = BitmapEx(aBitmap, aBitmapAlpha); - else if (!aBitmap.IsEmpty()) - aBitmapEx = BitmapEx(aBitmap); - if (!aBitmapEx.IsEmpty() && !prefSize.IsEmpty()) + if (!aBitmap.IsEmpty() && !prefSize.IsEmpty()) { - aBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); - aBitmapEx.SetPrefSize(prefSize); + aBitmap.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + aBitmap.SetPrefSize(prefSize); } - rImportOutput.moBitmap = aBitmapEx; + rImportOutput.moBitmap = aBitmap; } // Return true in this case, as we read the bitmap return true; @@ -653,15 +616,10 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, if (!bUseExistingBitmap) { pWriteAccess.reset(); - pWriteAccessAlpha.reset(); - if (!aBitmapAlpha.IsEmpty()) - aBitmapEx = BitmapEx(aBitmap, aBitmapAlpha); - else - aBitmapEx = BitmapEx(aBitmap); if (!prefSize.IsEmpty()) { - aBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); - aBitmapEx.SetPrefSize(prefSize); + aBitmap.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + aBitmap.SetPrefSize(prefSize); } } @@ -691,7 +649,7 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, if (aDisposal == Disposal::Previous) aDisposal = Disposal::Back; AnimationFrame aAnimationFrame( - aBitmapEx, aFirstPoint, aCanvasSize, + BitmapEx(aBitmap), aFirstPoint, aCanvasSize, NumDenToTime(aFctlChunk->delay_num, aFctlChunk->delay_den), aDisposal, aBlend); aAnimation.Insert(aAnimationFrame); } @@ -746,7 +704,7 @@ bool reader(SvStream& rStream, ImportOutput& rImportOutput, } else { - rImportOutput.moBitmap = aBitmapEx; + rImportOutput.moBitmap = aBitmap; } return true; @@ -848,12 +806,11 @@ BinaryDataContainer PngImageReader::getMicrosoftGifChunk(SvStream& rStream) } bool ImportPNG(SvStream& rInputStream, ImportOutput& rImportOutput, - GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* pAccess, - BitmapScopedWriteAccess* pAlphaAccess) + GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* pAccess) { // Creating empty bitmaps should be practically a no-op, and thus thread-safe. ImportOutput aImportOutput; - if (reader(rInputStream, aImportOutput, nImportFlags, pAccess, pAlphaAccess)) + if (reader(rInputStream, aImportOutput, nImportFlags, pAccess)) { if (!(nImportFlags & GraphicFilterImportFlags::UseExistingBitmap)) rImportOutput = std::move(aImportOutput); diff --git a/vcl/source/filter/png/png.hxx b/vcl/source/filter/png/png.hxx index f3cd874f07ad..8c9e7dea4bc6 100644 --- a/vcl/source/filter/png/png.hxx +++ b/vcl/source/filter/png/png.hxx @@ -26,8 +26,7 @@ namespace vcl { bool ImportPNG(SvStream& rInputStream, ImportOutput& rImportOutput, - GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* pAccess, - BitmapScopedWriteAccess* pAlphaAccess); + GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* pAccess); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */