1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef CORE_FXCODEC_FX_CODEC_H_
8 #define CORE_FXCODEC_FX_CODEC_H_
9 
10 #include <map>
11 #include <memory>
12 #include <utility>
13 
14 #include "core/fxcodec/fx_codec_def.h"
15 #include "core/fxcrt/fx_coordinates.h"
16 #include "core/fxcrt/fx_safe_types.h"
17 #include "core/fxcrt/fx_string.h"
18 
19 #ifdef PDF_ENABLE_XFA
20 #ifdef PDF_ENABLE_XFA_BMP
21 #include "core/fxcodec/bmp/bmpmodule.h"
22 #endif  // PDF_ENABLE_XFA_BMP
23 
24 #ifdef PDF_ENABLE_XFA_GIF
25 #include "core/fxcodec/gif/gifmodule.h"
26 #endif  // PDF_ENABLE_XFA_GIF
27 
28 #ifdef PDF_ENABLE_XFA_PNG
29 #include "core/fxcodec/png/pngmodule.h"
30 #endif  // PDF_ENABLE_XFA_PNG
31 
32 #ifdef PDF_ENABLE_XFA_TIFF
33 #include "core/fxcodec/tiff/tiffmodule.h"
34 #endif  // PDF_ENABLE_XFA_TIFF
35 #endif  // PDF_ENABLE_XFA
36 
37 namespace fxcodec {
38 
39 #ifdef PDF_ENABLE_XFA
40 class CFX_DIBAttribute {
41  public:
42   CFX_DIBAttribute();
43   ~CFX_DIBAttribute();
44 
45   int32_t m_nXDPI = -1;
46   int32_t m_nYDPI = -1;
47   uint16_t m_wDPIUnit = 0;
48   std::map<uint32_t, void*> m_Exif;
49 };
50 #endif  // PDF_ENABLE_XFA
51 
52 class Jbig2Module;
53 class JpegModule;
54 class ProgressiveDecoder;
55 
56 class ModuleMgr {
57  public:
58   // Per-process singleton managed by callers.
59   static void Create();
60   static void Destroy();
61   static ModuleMgr* GetInstance();
62 
GetJpegModule()63   JpegModule* GetJpegModule() const { return m_pJpegModule.get(); }
GetJbig2Module()64   Jbig2Module* GetJbig2Module() const { return m_pJbig2Module.get(); }
65 
66 #ifdef PDF_ENABLE_XFA
67   std::unique_ptr<ProgressiveDecoder> CreateProgressiveDecoder();
68 
69 #ifdef PDF_ENABLE_XFA_BMP
GetBmpModule()70   BmpModule* GetBmpModule() const { return m_pBmpModule.get(); }
SetBmpModule(std::unique_ptr<BmpModule> module)71   void SetBmpModule(std::unique_ptr<BmpModule> module) {
72     m_pBmpModule = std::move(module);
73   }
74 #endif  // PDF_ENABLE_XFA_BMP
75 
76 #ifdef PDF_ENABLE_XFA_GIF
GetGifModule()77   GifModule* GetGifModule() const { return m_pGifModule.get(); }
SetGifModule(std::unique_ptr<GifModule> module)78   void SetGifModule(std::unique_ptr<GifModule> module) {
79     m_pGifModule = std::move(module);
80   }
81 #endif  // PDF_ENABLE_XFA_GIF
82 
83 #ifdef PDF_ENABLE_XFA_PNG
GetPngModule()84   PngModule* GetPngModule() const { return m_pPngModule.get(); }
SetPngModule(std::unique_ptr<PngModule> module)85   void SetPngModule(std::unique_ptr<PngModule> module) {
86     m_pPngModule = std::move(module);
87   }
88 #endif  // PDF_ENABLE_XFA_PNG
89 
90 #ifdef PDF_ENABLE_XFA_TIFF
GetTiffModule()91   TiffModule* GetTiffModule() const { return m_pTiffModule.get(); }
SetTiffModule(std::unique_ptr<TiffModule> module)92   void SetTiffModule(std::unique_ptr<TiffModule> module) {
93     m_pTiffModule = std::move(module);
94   }
95 #endif  // PDF_ENABLE_XFA_TIFF
96 #endif  // PDF_ENABLE_XFA
97 
98  private:
99   ModuleMgr();
100   ~ModuleMgr();
101 
102   std::unique_ptr<JpegModule> m_pJpegModule;
103   std::unique_ptr<Jbig2Module> m_pJbig2Module;
104 
105 #ifdef PDF_ENABLE_XFA
106 #ifdef PDF_ENABLE_XFA_BMP
107   std::unique_ptr<BmpModule> m_pBmpModule;
108 #endif  // PDF_ENABLE_XFA_BMP
109 
110 #ifdef PDF_ENABLE_XFA_GIF
111   std::unique_ptr<GifModule> m_pGifModule;
112 #endif  // PDF_ENABLE_XFA_GIF
113 
114 #ifdef PDF_ENABLE_XFA_PNG
115   std::unique_ptr<PngModule> m_pPngModule;
116 #endif  // PDF_ENABLE_XFA_PNG
117 
118 #ifdef PDF_ENABLE_XFA_TIFF
119   std::unique_ptr<TiffModule> m_pTiffModule;
120 #endif  // PDF_ENABLE_XFA_TIFF
121 #endif  // PDF_ENABLE_XFA
122 };
123 
124 void ReverseRGB(uint8_t* pDestBuf, const uint8_t* pSrcBuf, int pixels);
125 
126 FX_SAFE_UINT32 CalculatePitch8(uint32_t bpc, uint32_t components, int width);
127 FX_SAFE_UINT32 CalculatePitch32(int bpp, int width);
128 
129 }  // namespace fxcodec
130 
131 #ifdef PDF_ENABLE_XFA
132 using CFX_DIBAttribute = fxcodec::CFX_DIBAttribute;
133 #endif
134 
135 #endif  // CORE_FXCODEC_FX_CODEC_H_
136