Avoid potential negative array index access to cached text.
[LibreOffice.git] / include / vcl / graphicfilter.hxx
blobfd6c205bd49191d10c870e4c7d3e307eec96e473
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_VCL_GRAPHICFILTER_HXX
21 #define INCLUDED_VCL_GRAPHICFILTER_HXX
23 #include <tools/gen.hxx>
24 #include <vcl/dllapi.h>
25 #include <vcl/graph.hxx>
26 #include <comphelper/errcode.hxx>
27 #include <o3tl/typed_flags_set.hxx>
28 #include <vcl/BinaryDataContainer.hxx>
29 #include <vcl/graphic/GraphicMetadata.hxx>
31 #include <memory>
33 namespace com::sun::star::beans { struct PropertyValue; }
34 namespace com::sun::star::uno { template <class E> class Sequence; }
36 class INetURLObject;
38 class FilterConfigCache;
39 class SvStream;
40 struct WmfExternal;
41 struct ConvertData;
43 #define ERRCODE_GRFILTER_OPENERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 1)
44 #define ERRCODE_GRFILTER_IOERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 2)
45 #define ERRCODE_GRFILTER_FORMATERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 3)
46 #define ERRCODE_GRFILTER_VERSIONERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 4)
47 #define ERRCODE_GRFILTER_FILTERERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 5)
48 #define ERRCODE_GRFILTER_TOOBIG ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 7)
50 #define GRFILTER_OUTHINT_GREY 1
52 #define GRFILTER_FORMAT_NOTFOUND (sal_uInt16(0xFFFF))
53 #define GRFILTER_FORMAT_DONTKNOW (sal_uInt16(0xFFFF))
55 enum class GraphicFilterImportFlags
57 NONE = 0x000,
58 SetLogsizeForJpeg = 0x001,
59 DontSetLogsizeForJpeg = 0x002,
60 /// Only create a bitmap, do not read pixel data.
61 OnlyCreateBitmap = 0x020,
62 /// Read pixel data into an existing bitmap.
63 UseExistingBitmap = 0x040,
65 namespace o3tl
67 template<> struct typed_flags<GraphicFilterImportFlags> : is_typed_flags<GraphicFilterImportFlags, 0x0063> {};
70 #define IMP_BMP "SVBMP"
71 #define IMP_MOV "SVMOV"
72 #define IMP_SVMETAFILE "SVMETAFILE"
73 #define IMP_WMF "SVWMF"
74 #define IMP_WMZ "SVWMZ"
75 #define IMP_EMF "SVEMF"
76 #define IMP_EMZ "SVEMZ"
77 #define IMP_GIF "SVIGIF"
78 #define IMP_PNG "SVIPNG"
79 #define IMP_JPEG "SVIJPEG"
80 #define IMP_XBM "SVIXBM"
81 #define IMP_XPM "SVIXPM"
82 #define IMP_SVG "SVISVG"
83 #define IMP_SVGZ "SVISVGZ"
84 #define IMP_PDF "SVIPDF"
85 #define IMP_TIFF "SVTIFF"
86 #define IMP_TGA "SVTGA"
87 #define IMP_PICT "SVPICT"
88 #define IMP_MET "SVMET"
89 #define IMP_RAS "SVRAS"
90 #define IMP_PCX "SVPCX"
91 #define IMP_EPS "SVIEPS"
92 #define IMP_PSD "SVPSD"
93 #define IMP_PCD "SVPCD"
94 #define IMP_PBM "SVPBM"
95 #define IMP_DXF "SVDXF"
96 #define IMP_WEBP "SVIWEBP"
98 #define EXP_BMP "SVBMP"
99 #define EXP_SVMETAFILE "SVMETAFILE"
100 #define EXP_WMF "SVWMF"
101 #define EXP_WMZ "SVWMZ"
102 #define EXP_EMF "SVEMF"
103 #define EXP_EMZ "SVEMZ"
104 #define EXP_JPEG "SVEJPEG"
105 #define EXP_SVG "SVESVG"
106 #define EXP_SVGZ "SVESVGZ"
107 #define EXP_PDF "SVEPDF"
108 #define EXP_PNG "SVEPNG"
109 #define EXP_APNG "SVEAPNG"
110 #define EXP_TIFF "SVTIFF"
111 #define EXP_EPS "SVEEPS"
112 #define EXP_GIF "SVEGIF"
113 #define EXP_WEBP "SVEWEBP"
116 inline constexpr OUString BMP_SHORTNAME = u"BMP"_ustr;
117 inline constexpr OUString GIF_SHORTNAME = u"GIF"_ustr;
118 inline constexpr OUString JPG_SHORTNAME = u"JPG"_ustr;
119 inline constexpr OUString MET_SHORTNAME = u"MET"_ustr;
120 inline constexpr OUString PCT_SHORTNAME = u"PCT"_ustr;
121 inline constexpr OUString PNG_SHORTNAME = u"PNG"_ustr;
122 inline constexpr OUString SVM_SHORTNAME = u"SVM"_ustr;
123 inline constexpr OUString TIF_SHORTNAME = u"TIF"_ustr;
124 inline constexpr OUString WMF_SHORTNAME = u"WMF"_ustr;
125 inline constexpr OUString EMF_SHORTNAME = u"EMF"_ustr;
126 inline constexpr OUString SVG_SHORTNAME = u"SVG"_ustr;
127 inline constexpr OUString PDF_SHORTNAME = u"PDF"_ustr;
128 inline constexpr OUString WEBP_SHORTNAME = u"WEBP"_ustr;
130 class VCL_DLLPUBLIC GraphicDescriptor final
132 SvStream* pFileStm;
133 OUString aPathExt;
134 GraphicMetadata aMetadata;
135 bool bOwnStream;
137 void ImpConstruct();
139 bool ImpDetectBMP( SvStream& rStm, bool bExtendedInfo );
140 bool ImpDetectGIF( SvStream& rStm, bool bExtendedInfo );
141 bool ImpDetectJPG( SvStream& rStm, bool bExtendedInfo );
142 bool ImpDetectPCD( SvStream& rStm, bool bExtendedInfo );
143 bool ImpDetectPCX( SvStream& rStm );
144 bool ImpDetectPNG( SvStream& rStm, bool bExtendedInfo );
145 bool ImpDetectTIF( SvStream& rStm, bool bExtendedInfo );
146 bool ImpDetectXBM( SvStream& rStm, bool bExtendedInfo );
147 bool ImpDetectXPM( SvStream& rStm, bool bExtendedInfo );
148 bool ImpDetectPBM( SvStream& rStm, bool bExtendedInfo );
149 bool ImpDetectPGM( SvStream& rStm, bool bExtendedInfo );
150 bool ImpDetectPPM( SvStream& rStm, bool bExtendedInfo );
151 bool ImpDetectRAS( SvStream& rStm, bool bExtendedInfo );
152 bool ImpDetectTGA( SvStream& rStm, bool bExtendedInfo );
153 bool ImpDetectPSD( SvStream& rStm, bool bExtendedInfo );
154 bool ImpDetectEPS( SvStream& rStm, bool bExtendedInfo );
155 bool ImpDetectWEBP( SvStream& rStm, bool bExtendedInfo );
156 bool ImpDetectDXF( SvStream& rStm, bool bExtendedInfo );
157 bool ImpDetectMET( SvStream& rStm, bool bExtendedInfo );
158 bool ImpDetectPCT( SvStream& rStm, bool bExtendedInfo );
159 bool ImpDetectSVM( SvStream& rStm, bool bExtendedInfo );
160 bool ImpDetectWMF( SvStream& rStm, bool bExtendedInfo );
161 bool ImpDetectEMF( SvStream& rStm, bool bExtendedInfo );
162 bool ImpDetectSVG( SvStream& rStm, bool bExtendedInfo );
163 GraphicDescriptor( const GraphicDescriptor& ) = delete;
164 GraphicDescriptor& operator=( const GraphicDescriptor& ) = delete;
166 public:
168 /** Ctor to set a filename
170 Detect() must be called to identify the file
171 If the file has no unique header (Mtf's), the format
172 is determined from the extension */
173 GraphicDescriptor( const INetURLObject& rPath );
175 /** Ctor using a stream
177 Detect() must be called to identify the file
178 As some formats (Mtf's) do not have a unique header, it makes sense
179 to supply the file name (incl. ext.), so that the format can be
180 derived from the extension */
181 GraphicDescriptor( SvStream& rInStream, const OUString* pPath );
183 ~GraphicDescriptor();
185 /** starts the detection
187 if bExtendedInfo == true the file header is used to derive
188 as many properties as possible (size, color, etc.) */
189 bool Detect( bool bExtendedInfo = false );
191 /** @return the file format, GraphicFileFormat::NOT if no format was recognized */
192 GraphicFileFormat GetFileFormat() const { return aMetadata.mnFormat; }
194 /** @return graphic size in pixels or 0 size */
195 const Size& GetSizePixel() const { return aMetadata.maPixSize; }
197 /** @return the logical graphic size in 1/100mm or 0 size */
198 const Size& GetSize_100TH_MM() const { return aMetadata.maLogSize; }
201 * Returns the logic size, according to the map mode available via GetPreferredMapMode(). Prefer
202 * this size over GetSize_100TH_MM().
204 const std::optional<Size>& GetPreferredLogSize() const { return aMetadata.maPreferredLogSize; }
207 * If available, this returns the map mode the graphic prefers, which may be other than pixel or
208 * 100th mm. Prefer this map mode over just assuming MapUnit::Map100thMM.
210 const std::optional<MapMode>& GetPreferredMapMode() const { return aMetadata.maPreferredMapMode; }
212 /** @return bits/pixel or 0 **/
213 sal_uInt16 GetBitsPerPixel() const { return aMetadata.mnBitsPerPixel; }
215 /** @return number of color channels */
216 sal_uInt8 GetNumberOfImageComponents() const { return aMetadata.mnNumberOfImageComponents; }
218 /** @return whether image supports transparency */
219 bool IsTransparent() const { return aMetadata.mbIsTransparent; }
221 /** @return whether image supports alpha values for translucent colours */
222 bool IsAlpha() const { return aMetadata.mbIsAlpha; }
224 /** @return filter number that is needed by the GraphFilter to read this format */
225 static OUString GetImportFormatShortName( GraphicFileFormat nFormat );
228 /** Class to import and export graphic formats. */
229 class VCL_DLLPUBLIC GraphicFilter
231 public:
232 GraphicFilter( bool bUseConfig = true );
233 ~GraphicFilter();
235 sal_uInt16 GetImportFormatCount() const;
236 sal_uInt16 GetImportFormatNumber( std::u16string_view rFormatName );
237 sal_uInt16 GetImportFormatNumberForShortName( std::u16string_view rShortName );
238 sal_uInt16 GetImportFormatNumberForTypeName( std::u16string_view rType );
239 OUString GetImportFormatName( sal_uInt16 nFormat );
240 OUString GetImportFormatTypeName( sal_uInt16 nFormat );
241 #ifdef _WIN32
242 OUString GetImportFormatMediaType( sal_uInt16 nFormat );
243 #endif
244 OUString GetImportFormatShortName( sal_uInt16 nFormat );
245 OUString GetImportWildcard( sal_uInt16 nFormat, sal_Int32 nEntry );
247 sal_uInt16 GetExportFormatCount() const;
248 sal_uInt16 GetExportFormatNumber( std::u16string_view rFormatName );
249 sal_uInt16 GetExportFormatNumberForMediaType( std::u16string_view rShortName );
250 sal_uInt16 GetExportFormatNumberForShortName( std::u16string_view rShortName );
251 OUString GetExportInternalFilterName( sal_uInt16 nFormat );
252 sal_uInt16 GetExportFormatNumberForTypeName( std::u16string_view rType );
253 OUString GetExportFormatName( sal_uInt16 nFormat );
254 OUString GetExportFormatMediaType( sal_uInt16 nFormat );
255 OUString GetExportFormatShortName( sal_uInt16 nFormat );
256 OUString GetExportWildcard( sal_uInt16 nFormat );
257 bool IsExportPixelFormat( sal_uInt16 nFormat );
259 ErrCode ExportGraphic( const Graphic& rGraphic, const INetURLObject& rPath,
260 sal_uInt16 nFormat,
261 const css::uno::Sequence< css::beans::PropertyValue >* pFilterData = nullptr );
262 ErrCode ExportGraphic( const Graphic& rGraphic, std::u16string_view rPath,
263 SvStream& rOStm, sal_uInt16 nFormat,
264 const css::uno::Sequence< css::beans::PropertyValue >* pFilterData = nullptr );
266 ErrCode CanImportGraphic( const INetURLObject& rPath,
267 sal_uInt16 nFormat,
268 sal_uInt16 * pDeterminedFormat);
270 ErrCode ImportGraphic( Graphic& rGraphic, const INetURLObject& rPath,
271 sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW,
272 sal_uInt16 * pDeterminedFormat = nullptr, GraphicFilterImportFlags nImportFlags = GraphicFilterImportFlags::NONE );
274 ErrCode CanImportGraphic( std::u16string_view rPath, SvStream& rStream,
275 sal_uInt16 nFormat,
276 sal_uInt16 * pDeterminedFormat);
278 ErrCode ImportGraphic( Graphic& rGraphic, std::u16string_view rPath,
279 SvStream& rStream,
280 sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW,
281 sal_uInt16 * pDeterminedFormat = nullptr, GraphicFilterImportFlags nImportFlags = GraphicFilterImportFlags::NONE );
283 /// Imports multiple graphics.
285 /// The resulting graphic is added to rGraphics on success, nullptr is added on failure.
286 void ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGraphics, std::vector< std::unique_ptr<SvStream> > vStreams);
289 Tries to ensure all Graphic objects are available (Graphic::isAvailable()). Only an optimization, may
290 not process all items.
292 void MakeGraphicsAvailableThreaded(std::vector< Graphic* >& rGraphics);
294 // Setting sizeLimit limits how much will be read from the stream.
295 Graphic ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit = 0, const Size* pSizeHint = nullptr);
297 const ErrCode& GetLastError() const { return *mxErrorEx;}
298 void ResetLastError();
300 Link<ConvertData&,bool> GetFilterCallback() const;
301 static GraphicFilter& GetGraphicFilter();
302 static ErrCode LoadGraphic( const OUString& rPath, const OUString& rFilter,
303 Graphic& rGraphic,
304 GraphicFilter* pFilter = nullptr,
305 sal_uInt16* pDeterminedFormat = nullptr );
307 ErrCode compressAsPNG(const Graphic& rGraphic, SvStream& rOutputStream);
309 static ErrCode readGIF(SvStream& rStream, Graphic& rGraphic, GfxLinkType& rLinkType);
310 static ErrCode readPNG(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType,
311 BinaryDataContainer & rpGraphicContent);
312 static ErrCode readJPEG(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType,
313 GraphicFilterImportFlags nImportFlags);
314 static ErrCode readSVG(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType,
315 BinaryDataContainer & rpGraphicContent);
316 static ErrCode readXBM(SvStream & rStream, Graphic & rGraphic);
317 static ErrCode readXPM(SvStream & rStream, Graphic & rGraphic);
319 static ErrCode readWMF_EMF(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType, VectorGraphicDataType eType);
320 static ErrCode readWMF(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
321 static ErrCode readEMF(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
323 static ErrCode readPDF(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
324 static ErrCode readTIFF(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
325 static ErrCode readWithTypeSerializer(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType, std::u16string_view aFilterName);
326 static ErrCode readBMP(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
327 static ErrCode readTGA(SvStream & rStream, Graphic & rGraphic);
328 static ErrCode readPICT(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
329 static ErrCode readMET(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
330 static ErrCode readRAS(SvStream & rStream, Graphic & rGraphic);
331 static ErrCode readPCX(SvStream & rStream, Graphic & rGraphic);
332 static ErrCode readEPS(SvStream & rStream, Graphic & rGraphic);
333 static ErrCode readPSD(SvStream & rStream, Graphic & rGraphic);
334 static ErrCode readPCD(SvStream & rStream, Graphic & rGraphic);
335 static ErrCode readPBM(SvStream & rStream, Graphic & rGraphic);
336 static ErrCode readDXF(SvStream & rStream, Graphic & rGraphic);
337 static ErrCode readWEBP(SvStream & rStream, Graphic & rGraphic, GfxLinkType & rLinkType);
339 private:
340 OUString aFilterPath;
341 FilterConfigCache* pConfig;
343 void ImplInit();
344 ErrCode ImplSetError( ErrCode nError, const SvStream* pStm = nullptr );
345 ErrCode ImpTestOrFindFormat( std::u16string_view rPath, SvStream& rStream, sal_uInt16& rFormat );
347 DECL_DLLPRIVATE_LINK( FilterCallback, ConvertData&, bool );
349 /** Information about errors during the GraphicFilter operation. */
350 std::optional<ErrCode> mxErrorEx;
351 bool bUseConfig;
354 #endif // INCLUDED_VCL_GRAPHICFILTER_HXX
356 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */