LibreOffice Module vcl (master)  1
graphicfilter.hxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
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/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
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 .
18  */
19 
20 #ifndef INCLUDED_VCL_GRAPHICFILTER_HXX
21 #define INCLUDED_VCL_GRAPHICFILTER_HXX
22 
23 #include <tools/gen.hxx>
24 #include <vcl/dllapi.h>
25 #include <vcl/graph.hxx>
26 #include <vcl/errcode.hxx>
27 #include <o3tl/typed_flags_set.hxx>
28 
29 #include <memory>
30 
31 namespace com { namespace sun { namespace star { namespace beans { struct PropertyValue; } } } }
32 namespace com { namespace sun { namespace star { namespace uno { template <class E> class Sequence; } } } }
33 
34 class INetURLObject;
35 
36 class FilterConfigCache;
37 class SvStream;
38 struct WmfExternal;
39 struct ConvertData;
40 
41 #define ERRCODE_GRFILTER_OPENERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 1)
42 #define ERRCODE_GRFILTER_IOERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 2)
43 #define ERRCODE_GRFILTER_FORMATERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 3)
44 #define ERRCODE_GRFILTER_VERSIONERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 4)
45 #define ERRCODE_GRFILTER_FILTERERROR ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 5)
46 #define ERRCODE_GRFILTER_TOOBIG ErrCode(ErrCodeArea::Vcl, ErrCodeClass::General, 7)
47 
48 #define GRFILTER_OUTHINT_GREY 1
49 
50 #define GRFILTER_FORMAT_NOTFOUND (sal_uInt16(0xFFFF))
51 #define GRFILTER_FORMAT_DONTKNOW (sal_uInt16(0xFFFF))
52 
54 {
55  NONE = 0x000,
56  SetLogsizeForJpeg = 0x001,
57  DontSetLogsizeForJpeg = 0x002,
58  ForPreview = 0x004,
60  OnlyCreateBitmap = 0x020,
62  UseExistingBitmap = 0x040,
63 };
64 namespace o3tl
65 {
66  template<> struct typed_flags<GraphicFilterImportFlags> : is_typed_flags<GraphicFilterImportFlags, 0x0067> {};
67 }
68 
69 #define IMP_BMP "SVBMP"
70 #define IMP_MOV "SVMOV"
71 #define IMP_SVMETAFILE "SVMETAFILE"
72 #define IMP_WMF "SVWMF"
73 #define IMP_EMF "SVEMF"
74 #define IMP_GIF "SVIGIF"
75 #define IMP_PNG "SVIPNG"
76 #define IMP_JPEG "SVIJPEG"
77 #define IMP_XBM "SVIXBM"
78 #define IMP_XPM "SVIXPM"
79 #define IMP_SVG "SVISVG"
80 #define IMP_PDF "SVIPDF"
81 #define EXP_BMP "SVBMP"
82 #define EXP_SVMETAFILE "SVMETAFILE"
83 #define EXP_WMF "SVWMF"
84 #define EXP_EMF "SVEMF"
85 #define EXP_JPEG "SVEJPEG"
86 #define EXP_SVG "SVESVG"
87 #define EXP_PDF "SVEPDF"
88 #define EXP_PNG "SVEPNG"
89 
90 #define BMP_SHORTNAME "BMP"
91 #define GIF_SHORTNAME "GIF"
92 #define JPG_SHORTNAME "JPG"
93 #define MET_SHORTNAME "MET"
94 #define PCT_SHORTNAME "PCT"
95 #define PNG_SHORTNAME "PNG"
96 #define SVM_SHORTNAME "SVM"
97 #define TIF_SHORTNAME "TIF"
98 #define WMF_SHORTNAME "WMF"
99 #define EMF_SHORTNAME "EMF"
100 #define SVG_SHORTNAME "SVG"
101 #define PDF_SHORTNAME "PDF"
102 
103 // Info class for all supported file formats
104 
106 {
107  NOT = 0x0000,
108  BMP = 0x0001,
109  GIF = 0x0002,
110  JPG = 0x0003,
111  PCD = 0x0004,
112  PCX = 0x0005,
113  PNG = 0x0006,
114  TIF = 0x0007,
115  XBM = 0x0008,
116  XPM = 0x0009,
117  PBM = 0x000a,
118  PGM = 0x000b,
119  PPM = 0x000c,
120  RAS = 0x000d,
121  TGA = 0x000e,
122  PSD = 0x000f,
123  EPS = 0x0010,
124  DXF = 0x00f1,
125  MET = 0x00f2,
126  PCT = 0x00f3,
127  // retired SGF = 0x00f4,
128  SVM = 0x00f5,
129  WMF = 0x00f6,
130  // retired SGV = 0x00f7,
131  EMF = 0x00f8,
132  SVG = 0x00f9
133 };
134 
135 
137 {
139 
140  OUString aPathExt;
143  sal_uInt16 nBitsPerPixel;
144  sal_uInt16 nPlanes;
146  bool const bOwnStream;
149  bool bIsAlpha;
150 
151  void ImpConstruct();
152 
153  bool ImpDetectBMP( SvStream& rStm, bool bExtendedInfo );
154  bool ImpDetectGIF( SvStream& rStm, bool bExtendedInfo );
155  bool ImpDetectJPG( SvStream& rStm, bool bExtendedInfo );
156  bool ImpDetectPCD( SvStream& rStm, bool bExtendedInfo );
157  bool ImpDetectPCX( SvStream& rStm );
158  bool ImpDetectPNG( SvStream& rStm, bool bExtendedInfo );
159  bool ImpDetectTIF( SvStream& rStm, bool bExtendedInfo );
160  bool ImpDetectXBM( SvStream& rStm, bool bExtendedInfo );
161  bool ImpDetectXPM( SvStream& rStm, bool bExtendedInfo );
162  bool ImpDetectPBM( SvStream& rStm, bool bExtendedInfo );
163  bool ImpDetectPGM( SvStream& rStm, bool bExtendedInfo );
164  bool ImpDetectPPM( SvStream& rStm, bool bExtendedInfo );
165  bool ImpDetectRAS( SvStream& rStm, bool bExtendedInfo );
166  bool ImpDetectTGA( SvStream& rStm, bool bExtendedInfo );
167  bool ImpDetectPSD( SvStream& rStm, bool bExtendedInfo );
168  bool ImpDetectEPS( SvStream& rStm, bool bExtendedInfo );
169  bool ImpDetectDXF( SvStream& rStm, bool bExtendedInfo );
170  bool ImpDetectMET( SvStream& rStm, bool bExtendedInfo );
171  bool ImpDetectPCT( SvStream& rStm, bool bExtendedInfo );
172  bool ImpDetectSVM( SvStream& rStm, bool bExtendedInfo );
173  bool ImpDetectWMF( SvStream& rStm, bool bExtendedInfo );
174  bool ImpDetectEMF( SvStream& rStm, bool bExtendedInfo );
175  bool ImpDetectSVG( SvStream& rStm, bool bExtendedInfo );
176  GraphicDescriptor( const GraphicDescriptor& ) = delete;
177  GraphicDescriptor& operator=( const GraphicDescriptor& ) = delete;
178 
179 public:
180 
186  GraphicDescriptor( const INetURLObject& rPath );
187 
194  GraphicDescriptor( SvStream& rInStream, const OUString* pPath );
195 
197 
202  bool Detect( bool bExtendedInfo = false );
203 
205  GraphicFileFormat GetFileFormat() const { return nFormat; }
206 
208  const Size& GetSizePixel() const { return aPixSize; }
209 
211  const Size& GetSize_100TH_MM() const { return aLogSize; }
212 
214  sal_uInt16 GetBitsPerPixel() const { return nBitsPerPixel; }
215 
217  sal_uInt8 GetNumberOfImageComponents() const { return mnNumberOfImageComponents; }
218 
220  bool IsTransparent() const { return bIsTransparent; }
221 
223  bool IsAlpha() const { return bIsAlpha; }
224 
226  static OUString GetImportFormatShortName( GraphicFileFormat nFormat );
227 };
228 
231 {
233 
234  FilterErrorEx() : nStreamError( ERRCODE_NONE ) {}
235 };
236 
239 {
240 public:
241  GraphicFilter( bool bUseConfig = true );
242  ~GraphicFilter();
243 
244  sal_uInt16 GetImportFormatCount() const;
245  sal_uInt16 GetImportFormatNumber( const OUString& rFormatName );
246  sal_uInt16 GetImportFormatNumberForShortName( const OUString& rShortName );
247  sal_uInt16 GetImportFormatNumberForTypeName( const OUString& rType );
248  OUString GetImportFormatName( sal_uInt16 nFormat );
249  OUString GetImportFormatTypeName( sal_uInt16 nFormat );
250 #ifdef _WIN32
251  OUString GetImportFormatMediaType( sal_uInt16 nFormat );
252 #endif
253  OUString GetImportFormatShortName( sal_uInt16 nFormat );
254  OUString GetImportWildcard( sal_uInt16 nFormat, sal_Int32 nEntry );
255 
256  sal_uInt16 GetExportFormatCount() const;
257  sal_uInt16 GetExportFormatNumber( const OUString& rFormatName );
258  sal_uInt16 GetExportFormatNumberForMediaType( const OUString& rShortName );
259  sal_uInt16 GetExportFormatNumberForShortName( const OUString& rShortName );
260  OUString GetExportInternalFilterName( sal_uInt16 nFormat );
261  sal_uInt16 GetExportFormatNumberForTypeName( const OUString& rType );
262  OUString GetExportFormatName( sal_uInt16 nFormat );
263  OUString GetExportFormatMediaType( sal_uInt16 nFormat );
264  OUString GetExportFormatShortName( sal_uInt16 nFormat );
265  OUString GetExportWildcard( sal_uInt16 nFormat );
266  bool IsExportPixelFormat( sal_uInt16 nFormat );
267 
268  ErrCode ExportGraphic( const Graphic& rGraphic, const INetURLObject& rPath,
269  sal_uInt16 nFormat,
270  const css::uno::Sequence< css::beans::PropertyValue >* pFilterData = nullptr );
271  ErrCode ExportGraphic( const Graphic& rGraphic, const OUString& rPath,
272  SvStream& rOStm, sal_uInt16 nFormat,
273  const css::uno::Sequence< css::beans::PropertyValue >* pFilterData = nullptr );
274 
275  ErrCode CanImportGraphic( const INetURLObject& rPath,
276  sal_uInt16 nFormat,
277  sal_uInt16 * pDeterminedFormat);
278 
279  ErrCode ImportGraphic( Graphic& rGraphic, const INetURLObject& rPath,
280  sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW,
281  sal_uInt16 * pDeterminedFormat = nullptr, GraphicFilterImportFlags nImportFlags = GraphicFilterImportFlags::NONE );
282 
283  ErrCode CanImportGraphic( const OUString& rPath, SvStream& rStream,
284  sal_uInt16 nFormat,
285  sal_uInt16 * pDeterminedFormat);
286 
287  ErrCode ImportGraphic( Graphic& rGraphic, const OUString& rPath,
288  SvStream& rStream,
289  sal_uInt16 nFormat = GRFILTER_FORMAT_DONTKNOW,
290  sal_uInt16 * pDeterminedFormat = nullptr, GraphicFilterImportFlags nImportFlags = GraphicFilterImportFlags::NONE,
291  WmfExternal const *pExtHeader = nullptr );
292 
296  void ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGraphics, std::vector< std::unique_ptr<SvStream> > vStreams);
297 
298  ErrCode ImportGraphic( Graphic& rGraphic, const OUString& rPath,
299  SvStream& rStream,
300  sal_uInt16 nFormat,
301  sal_uInt16 * pDeterminedFormat, GraphicFilterImportFlags nImportFlags,
302  const css::uno::Sequence< css::beans::PropertyValue >* pFilterData,
303  WmfExternal const *pExtHeader = nullptr );
304 
305  // Setting sizeLimit limits how much will be read from the stream.
306  Graphic ImportUnloadedGraphic(SvStream& rIStream, sal_uInt64 sizeLimit = 0, const Size* pSizeHint = nullptr);
307 
308  const FilterErrorEx& GetLastError() const { return *pErrorEx;}
309  void ResetLastError();
310 
311  Link<ConvertData&,bool> GetFilterCallback() const;
312  static GraphicFilter& GetGraphicFilter();
313  static ErrCode LoadGraphic( const OUString& rPath, const OUString& rFilter,
314  Graphic& rGraphic,
315  GraphicFilter* pFilter = nullptr,
316  sal_uInt16* pDeterminedFormat = nullptr );
317 
318  ErrCode compressAsPNG(const Graphic& rGraphic, SvStream& rOutputStream);
319 
320  void preload();
321 
322 private:
323  OUString aFilterPath;
325 
326  void ImplInit();
327  ErrCode ImplSetError( ErrCode nError, const SvStream* pStm = nullptr );
328  ErrCode ImpTestOrFindFormat( const OUString& rPath, SvStream& rStream, sal_uInt16& rFormat );
329 
330  DECL_LINK( FilterCallback, ConvertData&, bool );
331 
332  std::unique_ptr<FilterErrorEx> pErrorEx;
333  bool const bUseConfig;
334 };
335 
336 #endif // INCLUDED_VCL_GRAPHICFILTER_HXX
337 
338 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Only create a bitmap, do not read pixel data.
Read pixel data into an existing bitmap.
const FilterErrorEx & GetLastError() const
#define VCL_DLLPUBLIC
Definition: dllapi.h:29
sal_uInt16 GetBitsPerPixel() const
OUString aFilterPath
Class to import and export graphic formats.
Information about errors during the GraphicFilter operation.
bool IsAlpha() const
sal_uInt8 mnNumberOfImageComponents
const Size & GetSize_100TH_MM() const
ErrCode nStreamError
Cache to keep list of graphic filters + the filters themselves.
const Size & GetSizePixel() const
sal_uInt8 GetNumberOfImageComponents() const
std::unique_ptr< FilterErrorEx > pErrorEx
FilterConfigCache * pConfig
#define GRFILTER_FORMAT_DONTKNOW
bool const bUseConfig
GraphicFileFormat
WMF
#define ERRCODE_NONE
Definition: errcode.hxx:198
unsigned char sal_uInt8
GraphicFileFormat nFormat
bool IsTransparent() const
PNG
GraphicFileFormat GetFileFormat() const
GraphicFilterImportFlags
EMF
sal_uInt16 nBitsPerPixel