1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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>
33 namespace com::sun::star::beans
{ struct PropertyValue
; }
34 namespace com::sun::star::uno
{ template <class E
> class Sequence
; }
38 class FilterConfigCache
;
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
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,
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
134 GraphicMetadata aMetadata
;
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;
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
232 GraphicFilter( bool bUseConfig
= true );
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
);
242 OUString
GetImportFormatMediaType( sal_uInt16 nFormat
);
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
,
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
,
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
,
276 sal_uInt16
* pDeterminedFormat
);
278 ErrCode
ImportGraphic( Graphic
& rGraphic
, std::u16string_view rPath
,
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
,
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
);
340 OUString aFilterPath
;
341 FilterConfigCache
* pConfig
;
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
;
354 #endif // INCLUDED_VCL_GRAPHICFILTER_HXX
356 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */