vcl/source/filter/jpeg/JpegReader.cxx | 78 ++-------------------------------- vcl/source/filter/jpeg/JpegReader.hxx | 14 +----- vcl/source/filter/jpeg/jpeg.cxx | 26 ++--------- vcl/source/filter/jpeg/jpeg.h | 2 vcl/source/filter/jpeg/jpegc.cxx | 10 ++-- 5 files changed, 21 insertions(+), 109 deletions(-)
New commits: commit 315960e7bb7acd3bdd5fe570de06624120e32f18 Author: Tomaž Vajngerl <[email protected]> AuthorDate: Sun Mar 24 20:26:07 2024 +0900 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Thu Jun 27 03:03:10 2024 +0200 vcl: remove partial JPEG image loading Change-Id: Ibacf2c0eac963cdaf233f2af3f2277bc2b79c590 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165213 Reviewed-by: Tomaž Vajngerl <[email protected]> Tested-by: Jenkins diff --git a/vcl/source/filter/jpeg/JpegReader.cxx b/vcl/source/filter/jpeg/JpegReader.cxx index 186105603904..7e4b3dc25f63 100644 --- a/vcl/source/filter/jpeg/JpegReader.cxx +++ b/vcl/source/filter/jpeg/JpegReader.cxx @@ -172,7 +172,6 @@ void jpeg_svstream_src (j_decompress_ptr cinfo, void* input) JPEGReader::JPEGReader( SvStream& rStream, GraphicFilterImportFlags nImportFlags ) : mrStream ( rStream ), mnLastPos ( rStream.Tell() ), - mnLastLines ( 0 ), mbSetLogSize ( nImportFlags & GraphicFilterImportFlags::SetLogsizeForJpeg ) { maUpperName = "SVIJPEG"; @@ -180,7 +179,6 @@ JPEGReader::JPEGReader( SvStream& rStream, GraphicFilterImportFlags nImportFlags if (!(nImportFlags & GraphicFilterImportFlags::UseExistingBitmap)) { mpBitmap.emplace(); - mpIncompleteAlpha.emplace(); } } @@ -242,90 +240,26 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam const & rParam) return true; } -Graphic JPEGReader::CreateIntermediateGraphic(tools::Long nLines) +ReadState JPEGReader::Read(Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) { - Graphic aGraphic; - const Size aSizePixel(mpBitmap->GetSizePixel()); - - if (!mnLastLines) - { - mpIncompleteAlpha.emplace(aSizePixel); - mpIncompleteAlpha->Erase(255); - } - - if (nLines && (nLines < aSizePixel.Height())) - { - const tools::Long nNewLines = nLines - mnLastLines; - - if (nNewLines > 0) - { - { - BitmapScopedWriteAccess pAccess(*mpIncompleteAlpha); - pAccess->SetFillColor(COL_ALPHA_OPAQUE); - pAccess->FillRect(tools::Rectangle(Point(0, mnLastLines), Size(pAccess->Width(), nNewLines))); - } - - aGraphic = BitmapEx(*mpBitmap, *mpIncompleteAlpha); - } - else - { - aGraphic = BitmapEx(*mpBitmap); - } - } - else - { - aGraphic = BitmapEx(*mpBitmap); - } - - mnLastLines = nLines; - - return aGraphic; -} - -ReadState JPEGReader::Read( Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) -{ - ReadState eReadState; - bool bRet = false; + bool bRet = false; // seek back to the original position mrStream.Seek( mnLastPos ); // read the (partial) image - tools::Long nLines; - ReadJPEG( this, &mrStream, &nLines, nImportFlags, ppAccess ); + ReadJPEG(this, &mrStream, nImportFlags, ppAccess); auto bUseExistingBitmap = static_cast<bool>(nImportFlags & GraphicFilterImportFlags::UseExistingBitmap); if (bUseExistingBitmap || !mpBitmap->IsEmpty()) { - if( mrStream.GetError() == ERRCODE_IO_PENDING ) - { - rGraphic = CreateIntermediateGraphic(nLines); - } - else - { - if (!bUseExistingBitmap) - rGraphic = BitmapEx(*mpBitmap); - } + if (!bUseExistingBitmap) + rGraphic = BitmapEx(*mpBitmap); bRet = true; } - else if( mrStream.GetError() == ERRCODE_IO_PENDING ) - { - bRet = true; - } - - // Set status ( Pending has priority ) - if (mrStream.GetError() == ERRCODE_IO_PENDING) - { - eReadState = JPEGREAD_NEED_MORE; - mrStream.ResetError(); - } - else - { - eReadState = bRet ? JPEGREAD_OK : JPEGREAD_ERROR; - } - return eReadState; + return bRet ? JPEGREAD_OK : JPEGREAD_ERROR; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/filter/jpeg/JpegReader.hxx b/vcl/source/filter/jpeg/JpegReader.hxx index 6282cb4ed069..0e541c75916f 100644 --- a/vcl/source/filter/jpeg/JpegReader.hxx +++ b/vcl/source/filter/jpeg/JpegReader.hxx @@ -30,8 +30,7 @@ enum class GraphicFilterImportFlags; enum ReadState { JPEGREAD_OK, - JPEGREAD_ERROR, - JPEGREAD_NEED_MORE + JPEGREAD_ERROR }; struct JPEGCreateBitmapParam @@ -47,15 +46,10 @@ struct JPEGCreateBitmapParam class JPEGReader : public GraphicReader { - SvStream& mrStream; + SvStream& mrStream; std::optional<Bitmap> mpBitmap; - std::optional<AlphaMask> mpIncompleteAlpha; - - tools::Long mnLastPos; - tools::Long mnLastLines; - bool mbSetLogSize; - - Graphic CreateIntermediateGraphic(tools::Long nLines); + tools::Long mnLastPos; + bool mbSetLogSize; public: JPEGReader( SvStream& rStream, GraphicFilterImportFlags nImportFlags ); diff --git a/vcl/source/filter/jpeg/jpeg.cxx b/vcl/source/filter/jpeg/jpeg.cxx index e7158b858b68..956a1e413def 100644 --- a/vcl/source/filter/jpeg/jpeg.cxx +++ b/vcl/source/filter/jpeg/jpeg.cxx @@ -25,29 +25,13 @@ VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) { - bool bReturn = true; + JPEGReader aJPEGReader(rInputStream, nImportFlags); - std::shared_ptr<GraphicReader> pContext = rGraphic.GetReaderContext(); - rGraphic.SetReaderContext(nullptr); - JPEGReader* pJPEGReader = dynamic_cast<JPEGReader*>( pContext.get() ); - if (!pJPEGReader) - { - pContext = std::make_shared<JPEGReader>( rInputStream, nImportFlags ); - pJPEGReader = static_cast<JPEGReader*>( pContext.get() ); - } + ReadState eReadState = aJPEGReader.Read(rGraphic, nImportFlags, ppAccess); - ReadState eReadState = pJPEGReader->Read( rGraphic, nImportFlags, ppAccess ); - - if( eReadState == JPEGREAD_ERROR ) - { - bReturn = false; - } - else if( eReadState == JPEGREAD_NEED_MORE ) - { - rGraphic.SetReaderContext( pContext ); - } - - return bReturn; + if (eReadState == JPEGREAD_ERROR) + return false; + return true; } bool ExportJPEG(SvStream& rOutputStream, const Graphic& rGraphic, diff --git a/vcl/source/filter/jpeg/jpeg.h b/vcl/source/filter/jpeg/jpeg.h index 0ab27fb2fb9c..495204524121 100644 --- a/vcl/source/filter/jpeg/jpeg.h +++ b/vcl/source/filter/jpeg/jpeg.h @@ -45,7 +45,7 @@ bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream, tools::Long nQualityPercent, tools::Long aChromaSubsampling, css::uno::Reference<css::task::XStatusIndicator> const & status); -void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, tools::Long* pLines, +void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ); diff --git a/vcl/source/filter/jpeg/jpegc.cxx b/vcl/source/filter/jpeg/jpegc.cxx index 5b50bd3d394e..bac3079df04c 100644 --- a/vcl/source/filter/jpeg/jpegc.cxx +++ b/vcl/source/filter/jpeg/jpegc.cxx @@ -184,7 +184,7 @@ void progress_monitor(j_common_ptr cinfo) } -static void ReadJPEG(JpegStuff& rContext, JPEGReader* pJPEGReader, void* pInputStream, tools::Long* pLines, +static void ReadJPEG(JpegStuff& rContext, JPEGReader* pJPEGReader, void* pInputStream, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess) { @@ -311,9 +311,9 @@ static void ReadJPEG(JpegStuff& rContext, JPEGReader* pJPEGReader, void* pInputS } // tdf#138950 allow up to one short read (no_data_available_failures <= 1) to not trigger cancelling import - for (*pLines = 0; *pLines < nHeight && source->no_data_available_failures <= 1; (*pLines)++) + for (tools::Long nLine = 0; nLine < nHeight && source->no_data_available_failures <= 1; nLine++) { - size_t yIndex = *pLines; + size_t yIndex = nLine; sal_uInt8* p = (rContext.cinfo.out_color_space == JCS_CMYK) ? rContext.pCYMKBuffer.data() : rContext.pScanLineBuffer.data(); jpeg_read_scanlines(&rContext.cinfo, reinterpret_cast<JSAMPARRAY>(&p), 1); @@ -362,12 +362,12 @@ static void ReadJPEG(JpegStuff& rContext, JPEGReader* pJPEGReader, void* pInputS } } -void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, tools::Long* pLines, +void ReadJPEG( JPEGReader* pJPEGReader, void* pInputStream, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) { JpegStuff aContext; - ReadJPEG(aContext, pJPEGReader, pInputStream, pLines, nImportFlags, ppAccess); + ReadJPEG(aContext, pJPEGReader, pInputStream, nImportFlags, ppAccess); } bool WriteJPEG( JPEGWriter* pJPEGWriter, void* pOutputStream,
