include/vcl/filter/ImportOutput.hxx | 26 ++++ include/vcl/filter/PngImageReader.hxx | 9 - vcl/inc/filter/DxfReader.hxx | 7 - vcl/inc/filter/PbmReader.hxx | 7 - vcl/inc/filter/PcdReader.hxx | 9 + vcl/inc/filter/XpmReader.hxx | 6 - vcl/qa/cppunit/XpmFilterTest.cxx | 22 ++- vcl/qa/cppunit/graphicfilter/filters-dxf-test.cxx | 6 - vcl/qa/cppunit/graphicfilter/filters-pcd-test.cxx | 6 - vcl/qa/cppunit/graphicfilter/filters-ppm-test.cxx | 6 - vcl/qa/cppunit/png/PngFilterTest.cxx | 29 ++-- vcl/source/filter/graphicfilter.cxx | 128 +++++++++++++++------- vcl/source/filter/idxf/idxf.cxx | 15 +- vcl/source/filter/igif/gifread.cxx | 36 ++++-- vcl/source/filter/igif/gifread.hxx | 3 vcl/source/filter/ipbm/ipbm.cxx | 14 +- vcl/source/filter/ipcd/ipcd.cxx | 12 +- vcl/source/filter/ixbm/xbmread.cxx | 5 vcl/source/filter/ixbm/xbmread.hxx | 5 vcl/source/filter/ixpm/xpmread.cxx | 5 vcl/source/filter/jpeg/JpegReader.cxx | 4 vcl/source/filter/jpeg/JpegReader.hxx | 4 vcl/source/filter/jpeg/jpeg.cxx | 4 vcl/source/filter/jpeg/jpeg.hxx | 4 vcl/source/filter/png/PngImageReader.cxx | 43 +++---- vcl/source/filter/png/png.hxx | 7 - vcl/workben/commonfuzzer.hxx | 1 vcl/workben/dxffuzzer.cxx | 4 vcl/workben/fftester.cxx | 28 ++-- vcl/workben/giffuzzer.cxx | 4 vcl/workben/jpgfuzzer.cxx | 4 vcl/workben/pcdfuzzer.cxx | 4 vcl/workben/ppmfuzzer.cxx | 4 vcl/workben/xbmfuzzer.cxx | 4 vcl/workben/xpmfuzzer.cxx | 4 35 files changed, 298 insertions(+), 181 deletions(-)
New commits: commit db34b11d7ccedc5c895fc89e74e8c78551d03ec0 Author: Tomaž Vajngerl <[email protected]> AuthorDate: Mon Apr 21 14:22:19 2025 +0900 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Tue Apr 22 03:10:18 2025 +0200 vcl: convert PCD to use ImportOutput Change-Id: I00df142c13bd5c7c191c14c3a951156688b6918b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184398 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <[email protected]> diff --git a/vcl/inc/filter/PcdReader.hxx b/vcl/inc/filter/PcdReader.hxx index 216a14b89040..db7e330d9b3c 100644 --- a/vcl/inc/filter/PcdReader.hxx +++ b/vcl/inc/filter/PcdReader.hxx @@ -19,10 +19,13 @@ #pragma once -#include <vcl/graph.hxx> -#include <vcl/FilterConfigItem.hxx> +#include <vcl/dllapi.h> -VCL_DLLPUBLIC bool ImportPcdGraphic(SvStream& rStream, Graphic& rGraphic, +class SvStream; +class ImportOutput; +class FilterConfigItem; + +VCL_DLLPUBLIC bool ImportPcdGraphic(SvStream& rStream, ImportOutput& rImportOutput, FilterConfigItem* pFilterConfigItem); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/qa/cppunit/graphicfilter/filters-pcd-test.cxx b/vcl/qa/cppunit/graphicfilter/filters-pcd-test.cxx index bd100c8f2090..5aa55604207a 100644 --- a/vcl/qa/cppunit/graphicfilter/filters-pcd-test.cxx +++ b/vcl/qa/cppunit/graphicfilter/filters-pcd-test.cxx @@ -11,7 +11,7 @@ #include <test/bootstrapfixture.hxx> #include <vcl/FilterConfigItem.hxx> #include <tools/stream.hxx> -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <filter/PcdReader.hxx> using namespace css; @@ -44,8 +44,8 @@ bool PcdFilterTest::load(const OUString &, SfxFilterFlags, SotClipboardFormatId, unsigned int) { SvFileStream aFileStream(rURL, StreamMode::READ); - Graphic aGraphic; - return ImportPcdGraphic(aFileStream, aGraphic, nullptr); + ImportOutput aImportOutput; + return ImportPcdGraphic(aFileStream, aImportOutput, nullptr); } void PcdFilterTest::testCVEs() diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 28b342343b3c..50ab252fa5fd 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -1257,9 +1257,12 @@ ErrCode GraphicFilter::readPCD(SvStream & rStream, Graphic & rGraphic) OUString aFilterConfigPath( u"Office.Common/Filter/Graphic/Import/PCD"_ustr ); pFilterConfigItem = std::make_unique<FilterConfigItem>(aFilterConfigPath); } - - if (ImportPcdGraphic(rStream, rGraphic, pFilterConfigItem.get())) + ImportOutput aImportOutput; + if (ImportPcdGraphic(rStream, aImportOutput, pFilterConfigItem.get())) + { + rGraphic = Graphic(*aImportOutput.moBitmap); return ERRCODE_NONE; + } else return ERRCODE_GRFILTER_FILTERERROR; } diff --git a/vcl/source/filter/ipcd/ipcd.cxx b/vcl/source/filter/ipcd/ipcd.cxx index 1bb0db542eca..3589edbfb9d7 100644 --- a/vcl/source/filter/ipcd/ipcd.cxx +++ b/vcl/source/filter/ipcd/ipcd.cxx @@ -21,7 +21,7 @@ #include <string_view> -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/BitmapTools.hxx> #include <vcl/FilterConfigItem.hxx> #include <tools/stream.hxx> @@ -90,14 +90,14 @@ public: { } - bool ReadPCD( Graphic & rGraphic, FilterConfigItem* pConfigItem ); + bool ReadPCD(ImportOutput& rImportOutput, FilterConfigItem* pConfigItem); }; } //=================== Methods of PCDReader ============================== -bool PCDReader::ReadPCD( Graphic & rGraphic, FilterConfigItem* pConfigItem ) +bool PCDReader::ReadPCD(ImportOutput& rImportOutput, FilterConfigItem* pConfigItem) { bStatus = true; @@ -157,7 +157,7 @@ bool PCDReader::ReadPCD( Graphic & rGraphic, FilterConfigItem* pConfigItem ) ReadImage(); - rGraphic = vcl::bitmap::CreateFromData(std::move(*mpBitmap)); + rImportOutput.moBitmap = vcl::bitmap::CreateFromData(std::move(*mpBitmap)); } return bStatus; } @@ -343,10 +343,10 @@ void PCDReader::ReadImage() //================== GraphicImport - the exported Function ================ -bool ImportPcdGraphic(SvStream & rStream, Graphic & rGraphic, FilterConfigItem* pConfigItem) +bool ImportPcdGraphic(SvStream& rStream, ImportOutput& rImportOutput, FilterConfigItem* pConfigItem) { PCDReader aPCDReader(rStream); - return aPCDReader.ReadPCD(rGraphic, pConfigItem); + return aPCDReader.ReadPCD(rImportOutput, pConfigItem); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/workben/fftester.cxx b/vcl/workben/fftester.cxx index ad6a596719c6..7a42a51fbcbe 100644 --- a/vcl/workben/fftester.cxx +++ b/vcl/workben/fftester.cxx @@ -184,9 +184,9 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) } else if (strcmp(argv[2], "pcd") == 0) { - Graphic aGraphic; + ImportOutput aImportOutput; SvFileStream aFileStream(out, StreamMode::READ); - ret = static_cast<int>(ImportPcdGraphic(aFileStream, aGraphic, nullptr)); + ret = static_cast<int>(ImportPcdGraphic(aFileStream, aImportOutput, nullptr)); } else if (strcmp(argv[2], "dxf") == 0) { diff --git a/vcl/workben/pcdfuzzer.cxx b/vcl/workben/pcdfuzzer.cxx index 86df131da1cc..bd14f80f2b62 100644 --- a/vcl/workben/pcdfuzzer.cxx +++ b/vcl/workben/pcdfuzzer.cxx @@ -49,8 +49,8 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); - Graphic aGraphic; - (void)ImportPcdGraphic(aStream, aGraphic, nullptr); + ImportOutput aImportOutput; + (void)ImportPcdGraphic(aStream, aImportOutput, nullptr); return 0; } commit 437ae7ea1aeb5e8555460c385d2da57252fe9e31 Author: Tomaž Vajngerl <[email protected]> AuthorDate: Mon Apr 21 14:07:47 2025 +0900 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Tue Apr 22 03:10:10 2025 +0200 vcl: convert PPM/PBM and DXF to use ImportOutput Change-Id: Iceca7fe247de8fe20b42303432b37adf8f684829 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184397 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <[email protected]> diff --git a/include/vcl/filter/ImportOutput.hxx b/include/vcl/filter/ImportOutput.hxx index 2e4f28a704c3..107ae17b9a55 100644 --- a/include/vcl/filter/ImportOutput.hxx +++ b/include/vcl/filter/ImportOutput.hxx @@ -12,6 +12,7 @@ #include <vcl/dllapi.h> #include <vcl/bitmapex.hxx> #include <vcl/animate/Animation.hxx> +#include <vcl/gdimtf.hxx> class VCL_DLLPUBLIC ImportOutput { @@ -19,6 +20,7 @@ public: bool mbIsAnimated = false; std::optional<BitmapEx> moBitmap; std::optional<Animation> moAnimation; + std::optional<GDIMetaFile> moGDIMetaFile; }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/filter/DxfReader.hxx b/vcl/inc/filter/DxfReader.hxx index f1e89bf4b115..87315f8b0f20 100644 --- a/vcl/inc/filter/DxfReader.hxx +++ b/vcl/inc/filter/DxfReader.hxx @@ -19,8 +19,11 @@ #pragma once -#include <vcl/graph.hxx> +#include <vcl/dllapi.h> -VCL_DLLPUBLIC bool ImportDxfGraphic(SvStream& rStream, Graphic& rGraphic); +class SvStream; +class ImportOutput; + +VCL_DLLPUBLIC bool ImportDxfGraphic(SvStream& rStream, ImportOutput& rImportOutput); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/filter/PbmReader.hxx b/vcl/inc/filter/PbmReader.hxx index 5fe4d8a295ef..ee0d469f5b9d 100644 --- a/vcl/inc/filter/PbmReader.hxx +++ b/vcl/inc/filter/PbmReader.hxx @@ -19,8 +19,11 @@ #pragma once -#include <vcl/graph.hxx> +#include <vcl/dllapi.h> -VCL_DLLPUBLIC bool ImportPbmGraphic(SvStream& rStream, Graphic& rGraphic); +class SvStream; +class ImportOutput; + +VCL_DLLPUBLIC bool ImportPbmGraphic(SvStream& rStream, ImportOutput& rImportOutput); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/qa/cppunit/graphicfilter/filters-dxf-test.cxx b/vcl/qa/cppunit/graphicfilter/filters-dxf-test.cxx index 7a133500826a..7cccf1f41294 100644 --- a/vcl/qa/cppunit/graphicfilter/filters-dxf-test.cxx +++ b/vcl/qa/cppunit/graphicfilter/filters-dxf-test.cxx @@ -11,7 +11,7 @@ #include <test/bootstrapfixture.hxx> #include <vcl/FilterConfigItem.hxx> #include <tools/stream.hxx> -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <filter/DxfReader.hxx> using namespace css; @@ -44,8 +44,8 @@ bool DxfFilterTest::load(const OUString &, SfxFilterFlags, SotClipboardFormatId, unsigned int) { SvFileStream aFileStream(rURL, StreamMode::READ); - Graphic aGraphic; - return ImportDxfGraphic(aFileStream, aGraphic); + ImportOutput aImportOutput; + return ImportDxfGraphic(aFileStream, aImportOutput); } void DxfFilterTest::testCVEs() diff --git a/vcl/qa/cppunit/graphicfilter/filters-ppm-test.cxx b/vcl/qa/cppunit/graphicfilter/filters-ppm-test.cxx index c9c93a687d93..1d5c3751049f 100644 --- a/vcl/qa/cppunit/graphicfilter/filters-ppm-test.cxx +++ b/vcl/qa/cppunit/graphicfilter/filters-ppm-test.cxx @@ -11,7 +11,7 @@ #include <test/bootstrapfixture.hxx> #include <vcl/FilterConfigItem.hxx> #include <tools/stream.hxx> -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <filter/PbmReader.hxx> using namespace ::com::sun::star; @@ -44,8 +44,8 @@ bool PpmFilterTest::load(const OUString &, SfxFilterFlags, SotClipboardFormatId, unsigned int) { SvFileStream aFileStream(rURL, StreamMode::READ); - Graphic aGraphic; - return ImportPbmGraphic(aFileStream, aGraphic); + ImportOutput aImportOutput; + return ImportPbmGraphic(aFileStream, aImportOutput); } void PpmFilterTest::testCVEs() diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index 8fcd60f6b16d..28b342343b3c 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -1264,18 +1264,26 @@ ErrCode GraphicFilter::readPCD(SvStream & rStream, Graphic & rGraphic) return ERRCODE_GRFILTER_FILTERERROR; } -ErrCode GraphicFilter::readPBM(SvStream & rStream, Graphic & rGraphic) +ErrCode GraphicFilter::readPBM(SvStream& rStream, Graphic& rGraphic) { - if (ImportPbmGraphic(rStream, rGraphic)) + ImportOutput aImportOutput; + if (ImportPbmGraphic(rStream, aImportOutput)) + { + rGraphic = Graphic(*aImportOutput.moBitmap); return ERRCODE_NONE; + } else return ERRCODE_GRFILTER_FILTERERROR; } -ErrCode GraphicFilter::readDXF(SvStream & rStream, Graphic & rGraphic) +ErrCode GraphicFilter::readDXF(SvStream& rStream, Graphic& rGraphic) { - if (ImportDxfGraphic(rStream, rGraphic)) + ImportOutput aImportOutput; + if (ImportDxfGraphic(rStream, aImportOutput)) + { + rGraphic = Graphic(*aImportOutput.moGDIMetaFile); return ERRCODE_NONE; + } else return ERRCODE_GRFILTER_FILTERERROR; } diff --git a/vcl/source/filter/idxf/idxf.cxx b/vcl/source/filter/idxf/idxf.cxx index 26d42b10cbe4..6a0cb4ff2ecb 100644 --- a/vcl/source/filter/idxf/idxf.cxx +++ b/vcl/source/filter/idxf/idxf.cxx @@ -19,23 +19,20 @@ #include <filter/DxfReader.hxx> -#include <vcl/gdimtf.hxx> -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include "dxf2mtf.hxx" -//================== GraphicImport - the exported function ================ - -bool ImportDxfGraphic(SvStream & rStream, Graphic & rGraphic) +bool ImportDxfGraphic(SvStream& rStream, ImportOutput& rImportOutput) { DXFRepresentation aDXF; DXF2GDIMetaFile aConverter; - GDIMetaFile aMTF; + GDIMetaFile aGDIMetaFile; - if ( !aDXF.Read( rStream ) ) + if (!aDXF.Read(rStream)) return false; - if ( !aConverter.Convert( aDXF, aMTF, 60, 100 ) ) + if (!aConverter.Convert(aDXF, aGDIMetaFile, 60, 100)) return false; - rGraphic = Graphic(aMTF); + rImportOutput.moGDIMetaFile = aGDIMetaFile; return true; } diff --git a/vcl/source/filter/ipbm/ipbm.cxx b/vcl/source/filter/ipbm/ipbm.cxx index 37736a48f36f..9c42e4300117 100644 --- a/vcl/source/filter/ipbm/ipbm.cxx +++ b/vcl/source/filter/ipbm/ipbm.cxx @@ -20,7 +20,7 @@ #include <sal/config.h> #include <o3tl/safeint.hxx> #include <vcl/FilterConfigItem.hxx> -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/BitmapTools.hxx> #include <tools/stream.hxx> #include <filter/PbmReader.hxx> @@ -49,7 +49,7 @@ private: public: explicit PBMReader(SvStream & rPBM); - bool ReadPBM(Graphic & rGraphic ); + bool ReadPBM(ImportOutput& rImportOutput); }; } @@ -69,7 +69,7 @@ PBMReader::PBMReader(SvStream & rPBM) { } -bool PBMReader::ReadPBM(Graphic & rGraphic ) +bool PBMReader::ReadPBM(ImportOutput& rImportOutput) { if ( mrPBM.GetError() ) return false; @@ -131,8 +131,8 @@ bool PBMReader::ReadPBM(Graphic & rGraphic ) // read bitmap data mbStatus = ImplReadBody(); - if ( mbStatus ) - rGraphic = vcl::bitmap::CreateFromData(std::move(*mpRawBmp)); + if (mbStatus) + rImportOutput.moBitmap = vcl::bitmap::CreateFromData(std::move(*mpRawBmp)); return mbStatus; } @@ -531,11 +531,11 @@ bool PBMReader::ImplReadBody() //================== GraphicImport - the exported function ================ -bool ImportPbmGraphic( SvStream & rStream, Graphic & rGraphic) +bool ImportPbmGraphic(SvStream& rStream, ImportOutput& rImportOutput) { PBMReader aPBMReader(rStream); - return aPBMReader.ReadPBM(rGraphic ); + return aPBMReader.ReadPBM(rImportOutput); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/workben/dxffuzzer.cxx b/vcl/workben/dxffuzzer.cxx index 7fce6dc81403..23cd3c0096d3 100644 --- a/vcl/workben/dxffuzzer.cxx +++ b/vcl/workben/dxffuzzer.cxx @@ -62,8 +62,8 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); - Graphic aGraphic; - (void)ImportDxfGraphic(aStream, aGraphic); + ImportOutput aImportOutput; + (void)ImportDxfGraphic(aStream, aImportOutput); return 0; } diff --git a/vcl/workben/fftester.cxx b/vcl/workben/fftester.cxx index b012579d7646..ad6a596719c6 100644 --- a/vcl/workben/fftester.cxx +++ b/vcl/workben/fftester.cxx @@ -190,9 +190,9 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) } else if (strcmp(argv[2], "dxf") == 0) { - Graphic aGraphic; + ImportOutput aImportOutput; SvFileStream aFileStream(out, StreamMode::READ); - ret = static_cast<int>(ImportDxfGraphic(aFileStream, aGraphic)); + ret = static_cast<int>(ImportDxfGraphic(aFileStream, aImportOutput)); } else if (strcmp(argv[2], "met") == 0) { @@ -202,9 +202,9 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) } else if ((strcmp(argv[2], "pbm") == 0) || strcmp(argv[2], "ppm") == 0) { - Graphic aGraphic; + ImportOutput aImportOutput; SvFileStream aFileStream(out, StreamMode::READ); - ret = static_cast<int>(ImportPbmGraphic(aFileStream, aGraphic)); + ret = static_cast<int>(ImportPbmGraphic(aFileStream, aImportOutput)); } else if (strcmp(argv[2], "psd") == 0) { diff --git a/vcl/workben/ppmfuzzer.cxx b/vcl/workben/ppmfuzzer.cxx index 9595fa3aa747..2ece1d4a249e 100644 --- a/vcl/workben/ppmfuzzer.cxx +++ b/vcl/workben/ppmfuzzer.cxx @@ -49,8 +49,8 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); - Graphic aGraphic; - (void)ImportPbmGraphic(aStream, aGraphic); + ImportOutput aImportOutput; + (void)ImportPbmGraphic(aStream, aImportOutput); return 0; } commit 70162a33fde729998e4d9c7558f3634352738772 Author: Tomaž Vajngerl <[email protected]> AuthorDate: Tue Apr 15 14:17:21 2025 +0900 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Tue Apr 22 03:10:03 2025 +0200 vcl: Introduce ImportOutput to return BitmapEx or Animation Instead of returning Graphic, which is fully memory managed and registers into Memorymanager, instead return ImportOutput which returns the bitmap as BitmapEx and animation as Animation objects. The reason is that we don't want to add into a memory managed Graphic after import, as that might not be the intended use and can just cause trashing of Graphic. For example this happens when we want to import inside (Imp)Graphic itself, where we need to create a new (Imp)Graphic temporarily for no reason when swapping in, and then assign it to the existing (Imp)Graphic. This converts PNG, JPG, GIF, XPM, XBM filters to use ImportOutput. Change-Id: I862ef4125987436798314baaca95b6228f5d1a10 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/184396 Reviewed-by: Tomaž Vajngerl <[email protected]> Tested-by: Jenkins diff --git a/include/vcl/filter/ImportOutput.hxx b/include/vcl/filter/ImportOutput.hxx new file mode 100644 index 000000000000..2e4f28a704c3 --- /dev/null +++ b/include/vcl/filter/ImportOutput.hxx @@ -0,0 +1,24 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <vcl/dllapi.h> +#include <vcl/bitmapex.hxx> +#include <vcl/animate/Animation.hxx> + +class VCL_DLLPUBLIC ImportOutput +{ +public: + bool mbIsAnimated = false; + std::optional<BitmapEx> moBitmap; + std::optional<Animation> moAnimation; +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/filter/PngImageReader.hxx b/include/vcl/filter/PngImageReader.hxx index 86306ad746f4..32f494dde692 100644 --- a/include/vcl/filter/PngImageReader.hxx +++ b/include/vcl/filter/PngImageReader.hxx @@ -8,13 +8,13 @@ * */ -#ifndef INCLUDED_VCL_FILTER_PNGIMAGEREADER_HXX -#define INCLUDED_VCL_FILTER_PNGIMAGEREADER_HXX +#pragma once #include <sal/config.h> #include <vcl/dllapi.h> #include <vcl/BinaryDataContainer.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <com/sun/star/uno/Reference.hxx> @@ -40,7 +40,6 @@ namespace com::sun::star::task class XStatusIndicator; } -class Graphic; class BitmapEx; class SvStream; @@ -57,7 +56,7 @@ public: // Returns true if image was successfully read without errors. // A usable bitmap may be returned even if there were errors (e.g. incomplete image). bool read(BitmapEx& rBitmap); - bool read(Graphic& rGraphic); + bool read(ImportOutput& rImportOutput); // Returns a bitmap without indicating if there were errors. BitmapEx read(); @@ -70,6 +69,4 @@ public: } // namespace vcl -#endif - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/filter/XpmReader.hxx b/vcl/inc/filter/XpmReader.hxx index 9d2cf94c98e3..0d4f0b7a9110 100644 --- a/vcl/inc/filter/XpmReader.hxx +++ b/vcl/inc/filter/XpmReader.hxx @@ -19,11 +19,11 @@ #pragma once -#include <tools/stream.hxx> #include <vcl/dllapi.h> -class Graphic; +class SvStream; +class ImportOutput; -VCL_DLLPUBLIC bool ImportXPM(SvStream& rStream, Graphic& rGraphic); +VCL_DLLPUBLIC bool ImportXPM(SvStream& rStream, ImportOutput& rImportOutput); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/qa/cppunit/XpmFilterTest.cxx b/vcl/qa/cppunit/XpmFilterTest.cxx index 43f221d0dae0..273dda165248 100644 --- a/vcl/qa/cppunit/XpmFilterTest.cxx +++ b/vcl/qa/cppunit/XpmFilterTest.cxx @@ -10,6 +10,7 @@ #include <test/bootstrapfixture.hxx> #include <vcl/bitmapex.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <tools/stream.hxx> #include <filter/XpmReader.hxx> #include <unotools/tempfile.hxx> @@ -31,9 +32,10 @@ public: CPPUNIT_TEST_FIXTURE(XpmFilterTest, testXPM_8bit) { SvFileStream aFileStream(getFullUrl(u"XPM_8.xpm"), StreamMode::READ); - Graphic aGraphic; - CPPUNIT_ASSERT(ImportXPM(aFileStream, aGraphic)); - auto aBitmap = aGraphic.GetBitmapEx(); + ImportOutput aImportOutput; + CPPUNIT_ASSERT(ImportXPM(aFileStream, aImportOutput)); + CPPUNIT_ASSERT(aImportOutput.moBitmap); + auto& aBitmap = *aImportOutput.moBitmap; CPPUNIT_ASSERT_EQUAL(tools::Long(4), aBitmap.GetSizePixel().Width()); CPPUNIT_ASSERT_EQUAL(tools::Long(4), aBitmap.GetSizePixel().Height()); CPPUNIT_ASSERT_EQUAL(vcl::PixelFormat::N8_BPP, aBitmap.getPixelFormat()); @@ -46,9 +48,10 @@ CPPUNIT_TEST_FIXTURE(XpmFilterTest, testXPM_8bit) CPPUNIT_TEST_FIXTURE(XpmFilterTest, testXPM_4bit) { SvFileStream aFileStream(getFullUrl(u"XPM_4.xpm"), StreamMode::READ); - Graphic aGraphic; - CPPUNIT_ASSERT(ImportXPM(aFileStream, aGraphic)); - auto aBitmap = aGraphic.GetBitmapEx(); + ImportOutput aImportOutput; + CPPUNIT_ASSERT(ImportXPM(aFileStream, aImportOutput)); + CPPUNIT_ASSERT(aImportOutput.moBitmap); + auto& aBitmap = *aImportOutput.moBitmap; CPPUNIT_ASSERT_EQUAL(tools::Long(4), aBitmap.GetSizePixel().Width()); CPPUNIT_ASSERT_EQUAL(tools::Long(4), aBitmap.GetSizePixel().Height()); CPPUNIT_ASSERT_EQUAL(vcl::PixelFormat::N8_BPP, aBitmap.getPixelFormat()); @@ -61,9 +64,10 @@ CPPUNIT_TEST_FIXTURE(XpmFilterTest, testXPM_4bit) CPPUNIT_TEST_FIXTURE(XpmFilterTest, testXPM_1bit) { SvFileStream aFileStream(getFullUrl(u"XPM_1.xpm"), StreamMode::READ); - Graphic aGraphic; - CPPUNIT_ASSERT(ImportXPM(aFileStream, aGraphic)); - auto aBitmap = aGraphic.GetBitmapEx(); + ImportOutput aImportOutput; + CPPUNIT_ASSERT(ImportXPM(aFileStream, aImportOutput)); + CPPUNIT_ASSERT(aImportOutput.moBitmap); + auto& aBitmap = *aImportOutput.moBitmap; CPPUNIT_ASSERT_EQUAL(tools::Long(10), aBitmap.GetSizePixel().Width()); CPPUNIT_ASSERT_EQUAL(tools::Long(10), aBitmap.GetSizePixel().Height()); CPPUNIT_ASSERT_EQUAL(vcl::PixelFormat::N8_BPP, aBitmap.getPixelFormat()); diff --git a/vcl/qa/cppunit/png/PngFilterTest.cxx b/vcl/qa/cppunit/png/PngFilterTest.cxx index 8d979d393c91..2f2cf258089b 100644 --- a/vcl/qa/cppunit/png/PngFilterTest.cxx +++ b/vcl/qa/cppunit/png/PngFilterTest.cxx @@ -375,14 +375,16 @@ void PngFilterTest::testApng() { SvFileStream aFileStream(getFullUrl(u"apng_simple.apng"), StreamMode::READ); vcl::PngImageReader aPngReader(aFileStream); - Graphic aGraphic; - bool bSuccess = aPngReader.read(aGraphic); + ImportOutput aImportOutput; + bool bSuccess = aPngReader.read(aImportOutput); CPPUNIT_ASSERT(bSuccess); - CPPUNIT_ASSERT(aGraphic.IsAnimated()); - CPPUNIT_ASSERT_EQUAL(size_t(2), aGraphic.GetAnimation().GetAnimationFrames().size()); + CPPUNIT_ASSERT(aImportOutput.mbIsAnimated); + CPPUNIT_ASSERT(aImportOutput.moAnimation); + Animation& rAnimation = *aImportOutput.moAnimation; + CPPUNIT_ASSERT_EQUAL(size_t(2), rAnimation.GetAnimationFrames().size()); - AnimationFrame aFrame1 = *aGraphic.GetAnimation().GetAnimationFrames()[0]; - AnimationFrame aFrame2 = *aGraphic.GetAnimation().GetAnimationFrames()[1]; + AnimationFrame aFrame1 = *rAnimation.GetAnimationFrames()[0]; + AnimationFrame aFrame2 = *rAnimation.GetAnimationFrames()[1]; CPPUNIT_ASSERT_EQUAL(COL_WHITE, aFrame1.maBitmapEx.GetPixelColor(0, 0)); CPPUNIT_ASSERT_EQUAL(Color(0x72d1c8), aFrame1.maBitmapEx.GetPixelColor(2, 2)); @@ -390,20 +392,23 @@ void PngFilterTest::testApng() // Roundtrip the APNG SvMemoryStream aOutStream; + Graphic aGraphic(rAnimation); vcl::PngImageWriter aPngWriter(aOutStream); bSuccess = aPngWriter.write(aGraphic); CPPUNIT_ASSERT(bSuccess); aOutStream.Seek(STREAM_SEEK_TO_BEGIN); vcl::PngImageReader aPngReader2(aOutStream); - Graphic aGraphic2; - bSuccess = aPngReader2.read(aGraphic2); + ImportOutput aImportOutput2; + bSuccess = aPngReader2.read(aImportOutput2); CPPUNIT_ASSERT(bSuccess); - CPPUNIT_ASSERT(aGraphic2.IsAnimated()); - CPPUNIT_ASSERT_EQUAL(size_t(2), aGraphic2.GetAnimation().GetAnimationFrames().size()); + CPPUNIT_ASSERT(aImportOutput2.mbIsAnimated); + CPPUNIT_ASSERT(aImportOutput2.moAnimation); + Animation& rAnimation2 = *aImportOutput2.moAnimation; + CPPUNIT_ASSERT_EQUAL(size_t(2), rAnimation2.GetAnimationFrames().size()); - AnimationFrame aFrame1Roundtripped = *aGraphic2.GetAnimation().GetAnimationFrames()[0]; - AnimationFrame aFrame2Roundtripped = *aGraphic2.GetAnimation().GetAnimationFrames()[1]; + AnimationFrame aFrame1Roundtripped = *rAnimation2.GetAnimationFrames()[0]; + AnimationFrame aFrame2Roundtripped = *rAnimation2.GetAnimationFrames()[1]; CPPUNIT_ASSERT_EQUAL(COL_WHITE, aFrame1Roundtripped.maBitmapEx.GetPixelColor(0, 0)); CPPUNIT_ASSERT_EQUAL(Color(0x72d1c8), aFrame1Roundtripped.maBitmapEx.GetPixelColor(2, 2)); diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index b72faf93da2f..8fcd60f6b16d 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -473,7 +473,7 @@ struct GraphicImportContext /// Pixel data is read from this stream. std::unique_ptr<SvStream> m_pStream; /// The Graphic the import filter gets. - std::shared_ptr<Graphic> m_pGraphic; + std::shared_ptr<ImportOutput> m_pImportOutput; /// Write pixel data using this access. std::unique_ptr<BitmapScopedWriteAccess> m_pAccess; std::unique_ptr<BitmapScopedWriteAccess> m_pAlphaAccess; @@ -517,12 +517,12 @@ void GraphicImportTask::doImport(GraphicImportContext& rContext) { if(rContext.m_eLinkType == GfxLinkType::NativeJpg) { - if (!ImportJPEG(*rContext.m_pStream, *rContext.m_pGraphic, rContext.m_nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, rContext.m_pAccess.get())) + if (!ImportJPEG(*rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, rContext.m_pAccess.get())) rContext.m_nStatus = ERRCODE_GRFILTER_FILTERERROR; } else if(rContext.m_eLinkType == GfxLinkType::NativePng) { - if (!vcl::ImportPNG(*rContext.m_pStream, *rContext.m_pGraphic, + if (!vcl::ImportPNG(*rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, rContext.m_pAccess.get(), rContext.m_pAlphaAccess.get())) { @@ -547,7 +547,7 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra if (pStream) { rContext.m_pStream = std::move(pStream); - rContext.m_pGraphic = std::make_shared<Graphic>(); + rContext.m_pImportOutput = std::make_shared<ImportOutput>(); rContext.m_nStatus = ERRCODE_NONE; // Detect the format. @@ -567,9 +567,9 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra rContext.m_eLinkType = GfxLinkType::NativeJpg; rContext.m_nImportFlags = GraphicFilterImportFlags::SetLogsizeForJpeg; - if (ImportJPEG( *rContext.m_pStream, *rContext.m_pGraphic, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr)) + if (ImportJPEG( *rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr)) { - Bitmap& rBitmap = const_cast<Bitmap&>(rContext.m_pGraphic->GetBitmapExRef().GetBitmap()); + Bitmap& rBitmap = const_cast<Bitmap&>(rContext.m_pImportOutput->moBitmap->GetBitmap()); rContext.m_pAccess = std::make_unique<BitmapScopedWriteAccess>(rBitmap); rContext.m_pStream->Seek(rContext.m_nStreamBegin); if (bThreads) @@ -583,10 +583,9 @@ 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_pGraphic, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr, nullptr)) + if (vcl::ImportPNG( *rContext.m_pStream, *rContext.m_pImportOutput, rContext.m_nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr, nullptr)) { - const BitmapEx& rBitmapEx = rContext.m_pGraphic->GetBitmapExRef(); + 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()) @@ -624,7 +623,17 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra rContext.m_pAccess.reset(); rContext.m_pAlphaAccess.reset(); if (!rContext.mAlphaMask.IsEmpty()) // Need to move the AlphaMask back to the BitmapEx. - *rContext.m_pGraphic = BitmapEx( rContext.m_pGraphic->GetBitmapExRef().GetBitmap(), rContext.mAlphaMask ); + { + BitmapEx aBitmapEx(rContext.m_pImportOutput->moBitmap->GetBitmap(), rContext.mAlphaMask); + rContext.m_pImportOutput->moBitmap = aBitmapEx; + } + + std::shared_ptr<Graphic> pGraphic; + + if (rContext.m_nStatus == ERRCODE_NONE && rContext.m_pImportOutput && rContext.m_pImportOutput->moBitmap) + { + pGraphic = std::make_shared<Graphic>(*rContext.m_pImportOutput->moBitmap); + } if (rContext.m_nStatus == ERRCODE_NONE && rContext.m_eLinkType != GfxLinkType::NONE) { @@ -647,13 +656,11 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra } if (rContext.m_nStatus == ERRCODE_NONE) - rContext.m_pGraphic->SetGfxLink(std::make_shared<GfxLink>(aGraphicContent, rContext.m_eLinkType)); + pGraphic->SetGfxLink(std::make_shared<GfxLink>(aGraphicContent, rContext.m_eLinkType)); } - if (rContext.m_nStatus != ERRCODE_NONE) - rContext.m_pGraphic = nullptr; - - rGraphics.push_back(rContext.m_pGraphic); + if (rContext.m_nStatus == ERRCODE_NONE) + rGraphics.push_back(pGraphic); } } @@ -895,10 +902,15 @@ Graphic GraphicFilter::ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 size return aGraphic; } -ErrCode GraphicFilter::readGIF(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType) +ErrCode GraphicFilter::readGIF(SvStream & rStream, Graphic& rGraphic, GfxLinkType & rLinkType) { - if (ImportGIF(rStream, rGraphic)) + ImportOutput aImportOutput; + if (ImportGIF(rStream, aImportOutput)) { + if (aImportOutput.mbIsAnimated) + rGraphic = *aImportOutput.moAnimation; + else + rGraphic = *aImportOutput.moBitmap; rLinkType = GfxLinkType::NativeGif; return ERRCODE_NONE; } @@ -906,28 +918,36 @@ ErrCode GraphicFilter::readGIF(SvStream & rStream, Graphic & rGraphic, GfxLinkTy return ERRCODE_GRFILTER_FILTERERROR; } -ErrCode GraphicFilter::readPNG(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType, BinaryDataContainer& rpGraphicContent) +ErrCode GraphicFilter::readPNG(SvStream & rStream, Graphic& rGraphic, GfxLinkType & rLinkType, BinaryDataContainer& rpGraphicContent) { ErrCode aReturnCode = ERRCODE_NONE; + ImportOutput aImportOutput; // check if this PNG contains a GIF chunk! if (auto aMSGifChunk = vcl::PngImageReader::getMicrosoftGifChunk(rStream); !aMSGifChunk.isEmpty()) { std::shared_ptr<SvStream> pIStrm(aMSGifChunk.getAsStream()); - ImportGIF(*pIStrm, rGraphic); + + if (ImportGIF(*pIStrm, aImportOutput)) + { + if (aImportOutput.mbIsAnimated) + rGraphic = *aImportOutput.moAnimation; + else + rGraphic = *aImportOutput.moBitmap; + } rLinkType = GfxLinkType::NativeGif; rpGraphicContent = std::move(aMSGifChunk); return aReturnCode; } // PNG has no GIF chunk - Graphic aGraphic; vcl::PngImageReader aPNGReader(rStream); - aPNGReader.read(aGraphic); - if (!aGraphic.GetBitmapEx().IsEmpty()) + aPNGReader.read(aImportOutput); + + if (aImportOutput.moBitmap && !aImportOutput.moBitmap->IsEmpty()) { - rGraphic = std::move(aGraphic); + rGraphic = Graphic(*aImportOutput.moBitmap); rLinkType = GfxLinkType::NativePng; } else @@ -948,17 +968,32 @@ ErrCode GraphicFilter::readJPEG(SvStream & rStream, Graphic & rGraphic, GfxLinkT } sal_uInt64 nPosition = rStream.Tell(); - if (!ImportJPEG(rStream, rGraphic, nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr)) + ImportOutput aImportOutput; + if (!ImportJPEG(rStream, aImportOutput, nImportFlags | GraphicFilterImportFlags::OnlyCreateBitmap, nullptr)) + { aReturnCode = ERRCODE_GRFILTER_FILTERERROR; + } else { - Bitmap& rBitmap = const_cast<Bitmap&>(rGraphic.GetBitmapExRef().GetBitmap()); + Bitmap& rBitmap = const_cast<Bitmap&>(aImportOutput.moBitmap->GetBitmap()); BitmapScopedWriteAccess pWriteAccess(rBitmap); rStream.Seek(nPosition); - if (!ImportJPEG(rStream, rGraphic, nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, &pWriteAccess)) + if (!ImportJPEG(rStream, aImportOutput, nImportFlags | GraphicFilterImportFlags::UseExistingBitmap, &pWriteAccess)) + { aReturnCode = ERRCODE_GRFILTER_FILTERERROR; + } else - rLinkType = GfxLinkType::NativeJpg; + { + if (aImportOutput.moBitmap) + { + rGraphic = Graphic(*aImportOutput.moBitmap); + rLinkType = GfxLinkType::NativeJpg; + } + else + { + aReturnCode = ERRCODE_GRFILTER_FILTERERROR; + } + } } return aReturnCode; @@ -1028,18 +1063,26 @@ ErrCode GraphicFilter::readSVG(SvStream & rStream, Graphic & rGraphic, GfxLinkTy return aReturnCode; } -ErrCode GraphicFilter::readXBM(SvStream & rStream, Graphic & rGraphic) +ErrCode GraphicFilter::readXBM(SvStream& rStream, Graphic& rGraphic) { - if (ImportXBM(rStream, rGraphic)) + ImportOutput aImportOutput; + if (ImportXBM(rStream, aImportOutput)) + { + rGraphic = Graphic(*aImportOutput.moBitmap); return ERRCODE_NONE; + } else return ERRCODE_GRFILTER_FILTERERROR; } -ErrCode GraphicFilter::readXPM(SvStream & rStream, Graphic & rGraphic) +ErrCode GraphicFilter::readXPM(SvStream& rStream, Graphic& rGraphic) { - if (ImportXPM(rStream, rGraphic)) + ImportOutput aImportOutput; + if (ImportXPM(rStream, aImportOutput)) + { + rGraphic = Graphic(*aImportOutput.moBitmap); return ERRCODE_NONE; + } else return ERRCODE_GRFILTER_FILTERERROR; } diff --git a/vcl/source/filter/igif/gifread.cxx b/vcl/source/filter/igif/gifread.cxx index a402faab1871..50ac039b3d22 100644 --- a/vcl/source/filter/igif/gifread.cxx +++ b/vcl/source/filter/igif/gifread.cxx @@ -109,7 +109,7 @@ class GIFReader public: - ReadState ReadGIF( Graphic& rGraphic ); + ReadState ReadGIF(ImportOutput& rImportOutput); bool ReadIsAnimated(); void GetLogicSize(Size& rLogicSize); @@ -902,7 +902,7 @@ void GIFReader::GetLogicSize(Size& rLogicSize) rLogicSize.setHeight(nLogHeight100); } -ReadState GIFReader::ReadGIF(Graphic& rGraphic) +ReadState GIFReader::ReadGIF(ImportOutput& rImportOutput) { bStatus = true; @@ -916,18 +916,35 @@ ReadState GIFReader::ReadGIF(Graphic& rGraphic) else if (eActAction == END_READING) eReadState = GIFREAD_OK; + Size aPrefSize; + if (nLogWidth100 && nLogHeight100) + { + aPrefSize = Size(nLogWidth100, nLogHeight100); + } + if (aAnimation.Count() == 1) { - rGraphic = aAnimation.Get(0).maBitmapEx; + rImportOutput.mbIsAnimated = false; + rImportOutput.moBitmap = aAnimation.Get(0).maBitmapEx; - if( nLogWidth100 && nLogHeight100 ) + if (aPrefSize.Width() && aPrefSize.Height()) { - rGraphic.SetPrefSize( Size( nLogWidth100, nLogHeight100 ) ); - rGraphic.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + rImportOutput.moBitmap->SetPrefSize(aPrefSize); + rImportOutput.moBitmap->SetPrefMapMode(MapMode(MapUnit::Map100thMM)); } } else - rGraphic = aAnimation; + { + rImportOutput.mbIsAnimated = true; + rImportOutput.moAnimation = aAnimation; + + if (aPrefSize.Width() && aPrefSize.Height()) + { + BitmapEx& rBitmap = const_cast<BitmapEx&>(rImportOutput.moAnimation->GetBitmapEx()); + rBitmap.SetPrefSize(aPrefSize); + rBitmap.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + } + } return eReadState; } @@ -945,7 +962,7 @@ bool IsGIFAnimated(SvStream& rStream, Size& rLogicSize) return bResult; } -VCL_DLLPUBLIC bool ImportGIF(SvStream & rStream, Graphic& rGraphic) +VCL_DLLPUBLIC bool ImportGIF(SvStream & rStream, ImportOutput& rInportOutput) { bool bReturn = false; GIFReader aGIFReader(rStream); @@ -953,13 +970,12 @@ VCL_DLLPUBLIC bool ImportGIF(SvStream & rStream, Graphic& rGraphic) SvStreamEndian nOldFormat = rStream.GetEndian(); rStream.SetEndian(SvStreamEndian::LITTLE); - ReadState eReadState = aGIFReader.ReadGIF(rGraphic); + ReadState eReadState = aGIFReader.ReadGIF(rInportOutput); if (eReadState == GIFREAD_OK) bReturn = true; rStream.SetEndian(nOldFormat); - return bReturn; } diff --git a/vcl/source/filter/igif/gifread.hxx b/vcl/source/filter/igif/gifread.hxx index 642921fd0afd..0d5aed6fbd2b 100644 --- a/vcl/source/filter/igif/gifread.hxx +++ b/vcl/source/filter/igif/gifread.hxx @@ -20,8 +20,9 @@ #pragma once #include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> -VCL_DLLPUBLIC bool ImportGIF(SvStream& rStream, Graphic& rGraphic); +VCL_DLLPUBLIC bool ImportGIF(SvStream& rStream, ImportOutput& rImportOutput); bool IsGIFAnimated(SvStream& rStream, Size& rLogicSize); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/filter/ixbm/xbmread.cxx b/vcl/source/filter/ixbm/xbmread.cxx index 2a701e4ce025..10d3c35e4832 100644 --- a/vcl/source/filter/ixbm/xbmread.cxx +++ b/vcl/source/filter/ixbm/xbmread.cxx @@ -23,6 +23,7 @@ #include <o3tl/string_view.hxx> #include <rtl/character.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/BitmapWriteAccess.hxx> #include "xbmread.hxx" @@ -345,14 +346,14 @@ ReadState XBMReader::ReadXBM(BitmapEx& rBitmapEx) return eReadState; } -VCL_DLLPUBLIC bool ImportXBM(SvStream& rStmeam, Graphic& rGraphic) +VCL_DLLPUBLIC bool ImportXBM(SvStream& rStmeam, ImportOutput& rImportOutput) { XBMReader aXBMReader(rStmeam); BitmapEx aBitmapEx; ReadState eReadState = aXBMReader.ReadXBM(aBitmapEx); if (eReadState == XBMREAD_ERROR) return false; - rGraphic = Graphic(aBitmapEx); + rImportOutput.moBitmap = aBitmapEx; return true; } diff --git a/vcl/source/filter/ixbm/xbmread.hxx b/vcl/source/filter/ixbm/xbmread.hxx index ce8d3d159d56..b1f45d9972a3 100644 --- a/vcl/source/filter/ixbm/xbmread.hxx +++ b/vcl/source/filter/ixbm/xbmread.hxx @@ -19,8 +19,9 @@ #pragma once -#include <vcl/graph.hxx> +class SvStream; +class ImportOutput; -VCL_DLLPUBLIC bool ImportXBM(SvStream& rStream, Graphic& rGraphic); +VCL_DLLPUBLIC bool ImportXBM(SvStream& rStream, ImportOutput& rImportOutput); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/filter/ixpm/xpmread.cxx b/vcl/source/filter/ixpm/xpmread.cxx index 6c9d226a3f32..fabc024f9878 100644 --- a/vcl/source/filter/ixpm/xpmread.cxx +++ b/vcl/source/filter/ixpm/xpmread.cxx @@ -22,6 +22,7 @@ #include <vcl/graph.hxx> #include <tools/stream.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/BitmapWriteAccess.hxx> #include "rgbtable.hxx" @@ -634,7 +635,7 @@ bool XPMReader::ImplGetString() } -VCL_DLLPUBLIC bool ImportXPM(SvStream& rStream, Graphic& rGraphic) +VCL_DLLPUBLIC bool ImportXPM(SvStream& rStream, ImportOutput& rImportOutput) { XPMReader aXPMReader(rStream); @@ -643,7 +644,7 @@ VCL_DLLPUBLIC bool ImportXPM(SvStream& rStream, Graphic& rGraphic) if (eReadState == XPMREAD_ERROR) return false; - rGraphic = Graphic(aBitmapEx); + rImportOutput.moBitmap = aBitmapEx; return true; } diff --git a/vcl/source/filter/jpeg/JpegReader.cxx b/vcl/source/filter/jpeg/JpegReader.cxx index 81f1a1688cdd..094d7f2cbc10 100644 --- a/vcl/source/filter/jpeg/JpegReader.cxx +++ b/vcl/source/filter/jpeg/JpegReader.cxx @@ -234,7 +234,7 @@ bool JPEGReader::CreateBitmap(JPEGCreateBitmapParam const & rParam) return true; } -ReadState JPEGReader::Read(Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) +ReadState JPEGReader::Read(ImportOutput& rImportOutput, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) { bool bRet = false; @@ -248,7 +248,7 @@ ReadState JPEGReader::Read(Graphic& rGraphic, GraphicFilterImportFlags nImportFl if (bUseExistingBitmap || !mpBitmap->IsEmpty()) { if (!bUseExistingBitmap) - rGraphic = BitmapEx(*mpBitmap); + rImportOutput.moBitmap = BitmapEx(*mpBitmap); bRet = true; } diff --git a/vcl/source/filter/jpeg/JpegReader.hxx b/vcl/source/filter/jpeg/JpegReader.hxx index 58d8f8315054..716c0a5cb772 100644 --- a/vcl/source/filter/jpeg/JpegReader.hxx +++ b/vcl/source/filter/jpeg/JpegReader.hxx @@ -19,7 +19,7 @@ #pragma once -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/bitmap.hxx> #include <vcl/BitmapWriteAccess.hxx> @@ -53,7 +53,7 @@ class JPEGReader public: JPEGReader( SvStream& rStream, GraphicFilterImportFlags nImportFlags ); - ReadState Read(Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess); + ReadState Read(ImportOutput& rImportOutput, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess); bool CreateBitmap(JPEGCreateBitmapParam const & param); diff --git a/vcl/source/filter/jpeg/jpeg.cxx b/vcl/source/filter/jpeg/jpeg.cxx index 956a1e413def..8701198d7cdc 100644 --- a/vcl/source/filter/jpeg/jpeg.cxx +++ b/vcl/source/filter/jpeg/jpeg.cxx @@ -23,11 +23,11 @@ #include <vcl/graphicfilter.hxx> -VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) +VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, ImportOutput& rImportOutput, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ) { JPEGReader aJPEGReader(rInputStream, nImportFlags); - ReadState eReadState = aJPEGReader.Read(rGraphic, nImportFlags, ppAccess); + ReadState eReadState = aJPEGReader.Read(rImportOutput, nImportFlags, ppAccess); if (eReadState == JPEGREAD_ERROR) return false; diff --git a/vcl/source/filter/jpeg/jpeg.hxx b/vcl/source/filter/jpeg/jpeg.hxx index f3991dd999ce..a9ffb97a34eb 100644 --- a/vcl/source/filter/jpeg/jpeg.hxx +++ b/vcl/source/filter/jpeg/jpeg.hxx @@ -19,13 +19,13 @@ #pragma once -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/graphicfilter.hxx> #include <vcl/BitmapWriteAccess.hxx> #include <com/sun/star/uno/Sequence.h> -VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ); +VCL_DLLPUBLIC bool ImportJPEG( SvStream& rInputStream, ImportOutput& rImportOutput, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* ppAccess ); bool ExportJPEG(SvStream& rOutputStream, const Graphic& rGraphic, diff --git a/vcl/source/filter/png/PngImageReader.cxx b/vcl/source/filter/png/PngImageReader.cxx index d52a13be4779..595a3a0b0c67 100644 --- a/vcl/source/filter/png/PngImageReader.cxx +++ b/vcl/source/filter/png/PngImageReader.cxx @@ -326,7 +326,7 @@ bool fcTLbeforeIDAT(SvStream& rStream) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wclobbered" #endif -bool reader(SvStream& rStream, Graphic& rGraphic, +bool reader(SvStream& rStream, ImportOutput& rImportOutput, GraphicFilterImportFlags nImportFlags = GraphicFilterImportFlags::NONE, BitmapScopedWriteAccess* pAccess = nullptr, BitmapScopedWriteAccess* pAlphaAccess = nullptr) @@ -385,7 +385,7 @@ bool reader(SvStream& rStream, Graphic& rGraphic, aBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); aBitmapEx.SetPrefSize(prefSize); } - rGraphic = aBitmapEx; + rImportOutput.moBitmap = aBitmapEx; } return false; } @@ -503,7 +503,7 @@ bool reader(SvStream& rStream, Graphic& rGraphic, aBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); aBitmapEx.SetPrefSize(prefSize); } - rGraphic = aBitmapEx; + rImportOutput.moBitmap = aBitmapEx; return true; } @@ -744,12 +744,12 @@ bool reader(SvStream& rStream, Graphic& rGraphic, aFrameStream.WriteUInt32(PNG_IEND_SIZE); aFrameStream.WriteUInt32(PNG_IEND_SIGNATURE); aFrameStream.WriteUInt32(PNG_IEND_CRC); - Graphic aFrameGraphic; + ImportOutput aFrameImportOutput; aFrameStream.Seek(0); - bool bSuccess = reader(aFrameStream, aFrameGraphic); + bool bSuccess = reader(aFrameStream, aFrameImportOutput); if (!bSuccess) return false; - BitmapEx aFrameBitmapEx = aFrameGraphic.GetBitmapEx(); + BitmapEx aFrameBitmapEx = *aFrameImportOutput.moBitmap; Point aStartPoint(aFctlChunk->x_offset, aFctlChunk->y_offset); Size aSize(aFctlChunk->width, aFctlChunk->height); AnimationFrame aAnimationFrame( @@ -757,12 +757,13 @@ bool reader(SvStream& rStream, Graphic& rGraphic, NumDenToTime(aFctlChunk->delay_num, aFctlChunk->delay_den), aDisposal, aBlend); aAnimation.Insert(aAnimationFrame); } - rGraphic = aAnimation; + rImportOutput.mbIsAnimated = true; + rImportOutput.moAnimation = aAnimation; return true; } else { - rGraphic = aBitmapEx; + rImportOutput.moBitmap = aBitmapEx; } return true; @@ -836,19 +837,20 @@ PngImageReader::PngImageReader(SvStream& rStream) bool PngImageReader::read(BitmapEx& rBitmapEx) { - Graphic aGraphic; - bool bRet = reader(mrStream, aGraphic); - rBitmapEx = aGraphic.GetBitmapEx(); + ImportOutput aImportOutput; + bool bRet = reader(mrStream, aImportOutput); + if (bRet) + rBitmapEx = *aImportOutput.moBitmap; return bRet; } -bool PngImageReader::read(Graphic& rGraphic) { return reader(mrStream, rGraphic); } +bool PngImageReader::read(ImportOutput& rImportOutput) { return reader(mrStream, rImportOutput); } BitmapEx PngImageReader::read() { - Graphic aGraphic; - read(aGraphic); - return aGraphic.GetBitmapEx(); + ImportOutput aImportOutput; + read(aImportOutput); + return *aImportOutput.moBitmap; } BinaryDataContainer PngImageReader::getMicrosoftGifChunk(SvStream& rStream) @@ -862,15 +864,16 @@ BinaryDataContainer PngImageReader::getMicrosoftGifChunk(SvStream& rStream) return chunk; } -bool ImportPNG(SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, - BitmapScopedWriteAccess* pAccess, BitmapScopedWriteAccess* pAlphaAccess) +bool ImportPNG(SvStream& rInputStream, ImportOutput& rImportOutput, + GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* pAccess, + BitmapScopedWriteAccess* pAlphaAccess) { // Creating empty bitmaps should be practically a no-op, and thus thread-safe. - Graphic aGraphic; - if (reader(rInputStream, aGraphic, nImportFlags, pAccess, pAlphaAccess)) + ImportOutput aImportOutput; + if (reader(rInputStream, aImportOutput, nImportFlags, pAccess, pAlphaAccess)) { if (!(nImportFlags & GraphicFilterImportFlags::UseExistingBitmap)) - rGraphic = std::move(aGraphic); + rImportOutput = std::move(aImportOutput); return true; } return false; diff --git a/vcl/source/filter/png/png.hxx b/vcl/source/filter/png/png.hxx index 01d5cf9f4a8b..f3cd874f07ad 100644 --- a/vcl/source/filter/png/png.hxx +++ b/vcl/source/filter/png/png.hxx @@ -19,14 +19,15 @@ #pragma once -#include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/graphicfilter.hxx> #include <vcl/BitmapWriteAccess.hxx> namespace vcl { -bool ImportPNG(SvStream& rInputStream, Graphic& rGraphic, GraphicFilterImportFlags nImportFlags, - BitmapScopedWriteAccess* pAccess, BitmapScopedWriteAccess* pAlphaAccess); +bool ImportPNG(SvStream& rInputStream, ImportOutput& rImportOutput, + GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess* pAccess, + BitmapScopedWriteAccess* pAlphaAccess); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/workben/commonfuzzer.hxx b/vcl/workben/commonfuzzer.hxx index 72939cb6656d..7fd9827d8f02 100644 --- a/vcl/workben/commonfuzzer.hxx +++ b/vcl/workben/commonfuzzer.hxx @@ -21,6 +21,7 @@ #include <osl/file.hxx> #include <osl/process.h> #include <vcl/graph.hxx> +#include <vcl/filter/ImportOutput.hxx> #include <vcl/print.hxx> #include <vcl/svapp.hxx> #include <vcl/wmf.hxx> diff --git a/vcl/workben/fftester.cxx b/vcl/workben/fftester.cxx index 75d511b1278f..b012579d7646 100644 --- a/vcl/workben/fftester.cxx +++ b/vcl/workben/fftester.cxx @@ -148,27 +148,27 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) } else if (strcmp(argv[2], "jpg") == 0) { - Graphic aGraphic; + ImportOutput aImportOutput; SvFileStream aFileStream(out, StreamMode::READ); - ret = static_cast<int>(ImportJPEG(aFileStream, aGraphic, GraphicFilterImportFlags::NONE, nullptr)); + ret = static_cast<int>(ImportJPEG(aFileStream, aImportOutput, GraphicFilterImportFlags::NONE, nullptr)); } else if (strcmp(argv[2], "gif") == 0) { + ImportOutput aImportOutput; SvFileStream aFileStream(out, StreamMode::READ); - Graphic aGraphic; - ret = static_cast<int>(ImportGIF(aFileStream, aGraphic)); + ret = static_cast<int>(ImportGIF(aFileStream, aImportOutput)); } else if (strcmp(argv[2], "xbm") == 0) { - Graphic aGraphic; + ImportOutput aImportOutput; SvFileStream aFileStream(out, StreamMode::READ); - ret = static_cast<int>(ImportXBM(aFileStream, aGraphic)); + ret = static_cast<int>(ImportXBM(aFileStream, aImportOutput)); } else if (strcmp(argv[2], "xpm") == 0) { - Graphic aGraphic; + ImportOutput aImportOutput; SvFileStream aFileStream(out, StreamMode::READ); - ret = static_cast<int>(ImportXPM(aFileStream, aGraphic)); + ret = static_cast<int>(ImportXPM(aFileStream, aImportOutput)); } else if (strcmp(argv[2], "png") == 0) { diff --git a/vcl/workben/giffuzzer.cxx b/vcl/workben/giffuzzer.cxx index 7a2b9a9f051a..6e884da9a1ba 100644 --- a/vcl/workben/giffuzzer.cxx +++ b/vcl/workben/giffuzzer.cxx @@ -48,8 +48,8 @@ extern "C" void* lo_get_custom_widget_func(const char*) extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); - Graphic aGraphic; - (void)ImportGIF(aStream, aGraphic); + ImportOutput aImportOutput; + (void)ImportGIF(aStream, aImportOutput); return 0; } diff --git a/vcl/workben/jpgfuzzer.cxx b/vcl/workben/jpgfuzzer.cxx index 5850deec5882..c95a2ab8f883 100644 --- a/vcl/workben/jpgfuzzer.cxx +++ b/vcl/workben/jpgfuzzer.cxx @@ -48,8 +48,8 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); - Graphic aGraphic; - (void)ImportJPEG(aStream, aGraphic, GraphicFilterImportFlags::NONE, nullptr); + ImportOutput aImportOutput; + (void)ImportJPEG(aStream, aImportOutput, GraphicFilterImportFlags::NONE, nullptr); return 0; } diff --git a/vcl/workben/xbmfuzzer.cxx b/vcl/workben/xbmfuzzer.cxx index bb261f60a93f..0c7117ef29f6 100644 --- a/vcl/workben/xbmfuzzer.cxx +++ b/vcl/workben/xbmfuzzer.cxx @@ -48,8 +48,8 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); - Graphic aGraphic; - (void)ImportXBM(aStream, aGraphic); + ImportOutput aImportOutput; + (void)ImportXBM(aStream, aImportOutput); return 0; } diff --git a/vcl/workben/xpmfuzzer.cxx b/vcl/workben/xpmfuzzer.cxx index bd9413fb522f..61a05e52c9f9 100644 --- a/vcl/workben/xpmfuzzer.cxx +++ b/vcl/workben/xpmfuzzer.cxx @@ -48,8 +48,8 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { SvMemoryStream aStream(const_cast<uint8_t*>(data), size, StreamMode::READ); - Graphic aGraphic; - (void)ImportXPM(aStream, aGraphic); + ImportOutput aImportOutput; + (void)ImportXPM(aStream, aImportOutput); return 0; }
