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_SRC_FPDFAPI_FPDF_RENDER_RENDER_INT_H_
8 #define CORE_SRC_FPDFAPI_FPDF_RENDER_RENDER_INT_H_
9 
10 #include "../../../include/fpdfapi/fpdf_pageobj.h"
11 
12 class CPDF_QuickStretcher;
13 #define TYPE3_MAX_BLUES		16
14 class CPDF_Type3Glyphs
15 {
16 public:
CPDF_Type3Glyphs()17     CPDF_Type3Glyphs()
18     {
19         m_GlyphMap.InitHashTable(253);
20         m_TopBlueCount = m_BottomBlueCount = 0;
21     }
22     ~CPDF_Type3Glyphs();
23     CFX_MapPtrToPtr			m_GlyphMap;
24     void					AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line);
25 
26     int						m_TopBlue[TYPE3_MAX_BLUES], m_BottomBlue[TYPE3_MAX_BLUES];
27     int						m_TopBlueCount, m_BottomBlueCount;
28 };
29 class CFX_GlyphBitmap;
30 class CPDF_Type3Cache
31 {
32 public:
CPDF_Type3Cache(CPDF_Type3Font * pFont)33     CPDF_Type3Cache(CPDF_Type3Font* pFont)
34     {
35         m_pFont = pFont;
36     }
37     ~CPDF_Type3Cache();
38     CFX_GlyphBitmap*		LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
39 protected:
40     CFX_GlyphBitmap*		RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
41     CPDF_Type3Font*			m_pFont;
42     CFX_MapByteStringToPtr	m_SizeMap;
43 };
44 class CPDF_TransferFunc
45 {
46 public:
47     CPDF_Document*	m_pPDFDoc;
48     FX_BYTE			m_Samples[256 * 3];
49     FX_BOOL			m_bIdentity;
50 
51     CFX_DIBSource*	TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc);
52     FX_COLORREF		TranslateColor(FX_COLORREF src);
53 };
54 typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap;
55 typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap;
56 class CPDF_DocRenderData
57 {
58 public:
59     CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL);
60     ~CPDF_DocRenderData();
61     FX_BOOL				Initialize();
62     CPDF_Type3Cache*	GetCachedType3(CPDF_Type3Font* pFont);
63     CPDF_TransferFunc*	GetTransferFunc(CPDF_Object* pObj);
GetFontCache()64     CFX_FontCache*		GetFontCache()
65     {
66         return m_pFontCache;
67     }
68     void				Clear(FX_BOOL bRelease = FALSE);
69     void				ReleaseCachedType3(CPDF_Type3Font* pFont);
70     void				ReleaseTransferFunc(CPDF_Object* pObj);
71 private:
72     CPDF_Document*		m_pPDFDoc;
73     CFX_FontCache*		m_pFontCache;
74     CPDF_Type3CacheMap	m_Type3FaceMap;
75     CPDF_TransferFuncMap	m_TransferFuncMap;
76 };
77 struct _PDF_RenderItem {
78 public:
79     CPDF_PageObjects*			m_pObjectList;
80     CFX_AffineMatrix			m_Matrix;
81 };
82 typedef CFX_ArrayTemplate<_PDF_RenderItem>	CPDF_RenderLayer;
83 class IPDF_ObjectRenderer
84 {
85 public:
86     static IPDF_ObjectRenderer* Create(int type);
~IPDF_ObjectRenderer()87     virtual ~IPDF_ObjectRenderer() {}
88     virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL) = 0;
89     virtual FX_BOOL Continue(IFX_Pause* pPause) = 0;
90     FX_BOOL		m_Result;
91 };
92 class CPDF_RenderStatus
93 {
94 public:
95     CPDF_RenderStatus();
96     ~CPDF_RenderStatus();
97     FX_BOOL			Initialize(class CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pDeviceMatrix,
98                                const CPDF_PageObject* pStopObj, const CPDF_RenderStatus* pParentStatus,
99                                const CPDF_GraphicStates* pInitialStates, const CPDF_RenderOptions* pOptions,
100                                int transparency, FX_BOOL bDropObjects, CPDF_Dictionary* pFormResource = NULL,
101                                FX_BOOL bStdCS = FALSE,	CPDF_Type3Char* pType3Char = NULL, FX_ARGB fill_color = 0,
102                                FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
103     void			RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device);
104     void			RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
105     FX_BOOL			ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause);
106     CPDF_RenderOptions	m_Options;
107     CPDF_Dictionary*    m_pFormResource;
108     CPDF_Dictionary*    m_pPageResource;
109     CFX_PtrArray		m_Type3FontCache;
GetContext()110     CPDF_RenderContext* GetContext()
111     {
112         return m_pContext;
113     }
114 protected:
115     friend class	CPDF_ImageRenderer;
116     friend class	CPDF_RenderContext;
117     void			ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
118     void			DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
119     FX_BOOL			ProcessTransparency(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
120     void			ProcessObjectNoClip(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
121     void			DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
122     FX_BOOL         DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
123     FX_BOOL			ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device);
124     void			ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke);
125     void			DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke);
126     void			DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
127     void			DrawShadingPattern(CPDF_ShadingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
128     FX_BOOL			SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
129     FX_BOOL			ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device);
130     FX_BOOL			OutputBitmapAlpha(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
131     FX_BOOL			OutputImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
132     FX_BOOL			OutputDIBSource(const CFX_DIBSource* pOutputBitmap, FX_ARGB fill_argb, int bitmap_alpha,
133                                     const CFX_AffineMatrix* pImage2Device, CPDF_ImageCache* pImageCache, FX_DWORD flags);
134     void			CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
135                                       int bitmap_alpha, int blend_mode, int bIsolated);
136     FX_BOOL			ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device);
137     FX_BOOL			ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device);
138     void			DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix, FX_RECT& clip_rect,
139                                 int alpha, FX_BOOL bAlphaMode);
140     FX_BOOL			ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device);
141     FX_BOOL			ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath);
142     void			DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
143                                             CPDF_Font* pFont, FX_FLOAT font_size,
144                                             const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke);
145     FX_BOOL			ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device);
146     CFX_DIBitmap*	GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
147                                 FX_BOOL bBackAlphaRequired);
148     CFX_DIBitmap*	LoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix);
149     void			Init(CPDF_RenderContext* pParent);
150     static class CPDF_Type3Cache*	GetCachedType3(CPDF_Type3Font* pFont);
151     static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, FX_BOOL bStroke);
152     CPDF_TransferFunc*	GetTransferFunc(CPDF_Object* pObject) const;
153     FX_ARGB			GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3 = FALSE) const;
154     FX_ARGB			GetStrokeArgb(const CPDF_PageObject* pObj) const;
155     CPDF_RenderContext*		m_pContext;
156     FX_BOOL					m_bStopped;
157     void			DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
158     FX_BOOL			GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const;
159     void			GetScaledMatrix(CFX_Matrix &matrix) const;
160 
161 protected:
162     static const int kRenderMaxRecursionDepth = 64;
163     static int s_CurrentRecursionDepth;
164 
165     CFX_RenderDevice*		m_pDevice;
166     CFX_AffineMatrix		m_DeviceMatrix;
167     CPDF_ClipPath			m_LastClipPath;
168     const CPDF_PageObject*	m_pCurObj;
169     const CPDF_PageObject*	m_pStopObj;
170     CPDF_GraphicStates		m_InitialStates;
171     int						m_HalftoneLimit;
172     IPDF_ObjectRenderer*	m_pObjectRenderer;
173     FX_BOOL					m_bPrint;
174     int						m_Transparency;
175     int						m_DitherBits;
176     FX_BOOL					m_bDropObjects;
177     FX_BOOL					m_bStdCS;
178     FX_DWORD                m_GroupFamily;
179     FX_BOOL                 m_bLoadMask;
180     CPDF_Type3Char *        m_pType3Char;
181     FX_ARGB					m_T3FillColor;
182     int                     m_curBlend;
183 };
184 class CPDF_ImageLoader
185 {
186 public:
CPDF_ImageLoader()187     CPDF_ImageLoader()
188     {
189         m_pBitmap = NULL;
190         m_pMask = NULL;
191         m_MatteColor = 0;
192         m_bCached = FALSE;
193         m_nDownsampleWidth = 0;
194         m_nDownsampleHeight = 0;
195     }
196 
197     FX_BOOL					Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL);
198 
199     FX_BOOL					StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
200     FX_BOOL					Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause);
201     ~CPDF_ImageLoader();
202     CFX_DIBSource*			m_pBitmap;
203     CFX_DIBSource*			m_pMask;
204     FX_DWORD				m_MatteColor;
205     FX_BOOL					m_bCached;
206 protected:
207     FX_INT32                m_nDownsampleWidth;
208     FX_INT32                m_nDownsampleHeight;
209 };
210 class CPDF_ProgressiveImageLoaderHandle
211 {
212 public:
213     CPDF_ProgressiveImageLoaderHandle();
214     ~CPDF_ProgressiveImageLoaderHandle();
215 
216     FX_BOOL			Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
217     FX_BOOL			Continue(IFX_Pause* pPause);
218 protected:
219     CPDF_ImageLoader*	m_pImageLoader;
220     CPDF_PageRenderCache* m_pCache;
221     CPDF_ImageObject* m_pImage;
222     FX_INT32            m_nDownsampleWidth;
223     FX_INT32            m_nDownsampleHeight;
224 };
225 class CFX_ImageTransformer;
226 class CPDF_ImageRenderer : public IPDF_ObjectRenderer
227 {
228 public:
229     CPDF_ImageRenderer();
230     ~CPDF_ImageRenderer();
231     FX_BOOL		Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
232     FX_BOOL		Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
233                       int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
234     FX_BOOL		Continue(IFX_Pause* pPause);
235 protected:
236     CPDF_RenderStatus*	m_pRenderStatus;
237     CPDF_ImageObject*	m_pImageObject;
238     int					m_Status;
239     const CFX_AffineMatrix* m_pObj2Device;
240     CFX_AffineMatrix	m_ImageMatrix;
241     CPDF_ImageLoader	m_Loader;
242     const CFX_DIBSource*		m_pDIBSource;
243     CFX_DIBitmap*		m_pClone;
244     int					m_BitmapAlpha;
245     FX_BOOL				m_bPatternColor;
246     CPDF_Pattern*		m_pPattern;
247     FX_ARGB				m_FillArgb;
248     FX_DWORD			m_Flags;
249     CPDF_QuickStretcher*	m_pQuickStretcher;
250     CFX_ImageTransformer*	m_pTransformer;
251     CPDF_ImageRenderer*	m_pRenderer2;
252     FX_LPVOID			m_DeviceHandle;
253     FX_LPVOID           m_LoadHandle;
254     FX_BOOL				m_bStdCS;
255     int					m_BlendType;
256     FX_BOOL				StartBitmapAlpha();
257     FX_BOOL				StartDIBSource();
258     FX_BOOL				StartRenderDIBSource();
259     FX_BOOL				StartLoadDIBSource();
260     FX_BOOL				DrawMaskedImage();
261     FX_BOOL				DrawPatternImage(const CFX_Matrix* pObj2Device);
262 };
263 class CPDF_ScaledRenderBuffer
264 {
265 public:
266     CPDF_ScaledRenderBuffer();
267     ~CPDF_ScaledRenderBuffer();
268     FX_BOOL				Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
269                                    const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions = NULL, int max_dpi = 0);
GetDevice()270     CFX_RenderDevice*	GetDevice()
271     {
272         return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;
273     }
GetMatrix()274     CFX_AffineMatrix*	GetMatrix()
275     {
276         return &m_Matrix;
277     }
278     void				OutputToDevice();
279 private:
280     CFX_RenderDevice*	m_pDevice;
281     CPDF_RenderContext*	m_pContext;
282     FX_RECT				m_Rect;
283     const CPDF_PageObject* m_pObject;
284     CFX_FxgeDevice*	m_pBitmapDevice;
285     CFX_AffineMatrix	m_Matrix;
286 };
287 class ICodec_ScanlineDecoder;
288 class CPDF_QuickStretcher
289 {
290 public:
291     CPDF_QuickStretcher();
292     ~CPDF_QuickStretcher();
293     FX_BOOL		Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox);
294     FX_BOOL		Continue(IFX_Pause* pPause);
295     CFX_DIBitmap*	m_pBitmap;
296     int			m_ResultLeft, m_ResultTop, m_ClipLeft, m_ClipTop;
297     int			m_DestWidth, m_DestHeight, m_ResultWidth, m_ResultHeight;
298     int			m_Bpp, m_SrcWidth, m_SrcHeight;
299     FX_BOOL		m_bFlipX, m_bFlipY;
300     CPDF_ColorSpace*	m_pCS;
301     ICodec_ScanlineDecoder*	m_pDecoder;
302     CPDF_StreamAcc m_StreamAcc;
303     int			m_LineIndex;
304 };
305 class CPDF_DeviceBuffer
306 {
307 public:
308     CPDF_DeviceBuffer();
309     ~CPDF_DeviceBuffer();
310     FX_BOOL				Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
311                                    const CPDF_PageObject* pObj, int max_dpi = 0);
312     void				OutputToDevice();
GetBitmap()313     CFX_DIBitmap*		GetBitmap() const
314     {
315         return m_pBitmap;
316     }
GetMatrix()317     const CFX_AffineMatrix*	GetMatrix() const
318     {
319         return &m_Matrix;
320     }
321 private:
322     CFX_RenderDevice*	m_pDevice;
323     CPDF_RenderContext*	m_pContext;
324     FX_RECT				m_Rect;
325     const CPDF_PageObject* m_pObject;
326     CFX_DIBitmap*		m_pBitmap;
327     CFX_AffineMatrix	m_Matrix;
328 };
329 class CPDF_ImageCache
330 {
331 public:
332     CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);
333     ~CPDF_ImageCache();
334     void				ClearImageData();
335     void				Reset(const CFX_DIBitmap* pBitmap);
336     FX_BOOL				GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
337                                         FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,
338                                         CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
EstimateSize()339     FX_DWORD			EstimateSize() const
340     {
341         return m_dwCacheSize;
342     }
GetTimeCount()343     FX_DWORD			GetTimeCount() const
344     {
345         return m_dwTimeCount;
346     }
GetStream()347     CPDF_Stream*		GetStream() const
348     {
349         return m_pStream;
350     }
SetTimeCount(FX_DWORD dwTimeCount)351     void				SetTimeCount(FX_DWORD dwTimeCount)
352     {
353         m_dwTimeCount = dwTimeCount;
354     }
355     int					m_dwTimeCount;
356 public:
357     int					StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
358             FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,
359             FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
360     int					Continue(IFX_Pause* pPause);
361     int 				ContinueGetCachedBitmap();
362     CFX_DIBSource*		DetachBitmap();
363     CFX_DIBSource*		DetachMask();
364     CFX_DIBSource*		m_pCurBitmap;
365     CFX_DIBSource*		m_pCurMask;
366     FX_DWORD			m_MatteColor;
367     CPDF_RenderStatus*  m_pRenderStatus;
368 protected:
369     CPDF_Document*		m_pDocument;
370     CPDF_Stream*		m_pStream;
371     CFX_DIBSource*		m_pCachedBitmap;
372     CFX_DIBSource*		m_pCachedMask;
373     FX_DWORD			m_dwCacheSize;
374     void	CalcSize();
375 };
376 typedef struct {
377     FX_FLOAT			m_DecodeMin;
378     FX_FLOAT			m_DecodeStep;
379     int					m_ColorKeyMin;
380     int					m_ColorKeyMax;
381 } DIB_COMP_DATA;
382 class CPDF_DIBSource : public CFX_DIBSource
383 {
384 public:
385     CPDF_DIBSource();
386     virtual ~CPDF_DIBSource();
387     FX_BOOL				Load(CPDF_Document* pDoc, const CPDF_Stream* pStream,
388                              CPDF_DIBSource** ppMask, FX_DWORD* pMatteColor,
389                              CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
390                              FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
391     virtual FX_BOOL		SkipToScanline(int line, IFX_Pause* pPause) const;
392     virtual	FX_LPBYTE	GetBuffer() const;
393     virtual FX_LPCBYTE	GetScanline(int line) const;
394     virtual void		DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
395                                            int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
396     virtual void		SetDownSampleSize(int dest_width, int dest_height) const;
397     CFX_DIBitmap*		GetBitmap() const;
398     void				ReleaseBitmap(CFX_DIBitmap*) const;
399     void				ClearImageData();
400 public:
401     int					StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
402                                            CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
403                                            FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
404     int					ContinueLoadDIBSource(IFX_Pause* pPause);
405     int					StratLoadMask();
406     int					StartLoadMaskDIB();
407     int					ContinueLoadMaskDIB(IFX_Pause* pPause);
408     int					ContinueToLoadMask();
409     CPDF_DIBSource*		DetachMask();
410     CPDF_DIBSource*		m_pMask;
411     FX_DWORD			m_MatteColor;
412     FX_LPVOID			m_pJbig2Context;
413     CPDF_StreamAcc*		m_pGlobalStream;
414     FX_BOOL				m_bStdCS;
415     int					m_Status;
416     CPDF_Object*		m_pMaskStream;
417     FX_BOOL				m_bHasMask;
418 protected:
419     FX_BOOL				LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);
420     DIB_COMP_DATA*      GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, FX_BOOL& bColorKey);
421     CPDF_DIBSource*		LoadMask(FX_DWORD& MatteColor);
422     CPDF_DIBSource*		LoadMaskDIB(CPDF_Stream* pMask);
423     void				LoadJpxBitmap();
424     void				LoadPalette();
425     int					CreateDecoder();
426     void				TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;
427     void                ValidateDictParam();
428     CPDF_Document*		m_pDocument;
429     const CPDF_Stream*	m_pStream;
430     CPDF_StreamAcc*		m_pStreamAcc;
431     const CPDF_Dictionary*	m_pDict;
432     CPDF_ColorSpace*	m_pColorSpace;
433     FX_DWORD			m_Family;
434     FX_DWORD			m_bpc;
435     FX_DWORD			m_bpc_orig;
436     FX_DWORD			m_nComponents;
437     FX_DWORD			m_GroupFamily;
438     FX_BOOL				m_bLoadMask;
439     FX_BOOL				m_bDefaultDecode;
440     FX_BOOL				m_bImageMask;
441     FX_BOOL				m_bDoBpcCheck;
442     FX_BOOL				m_bColorKey;
443     DIB_COMP_DATA*		m_pCompData;
444     FX_LPBYTE			m_pLineBuf;
445     FX_LPBYTE			m_pMaskedLine;
446     CFX_DIBitmap*		m_pCachedBitmap;
447     ICodec_ScanlineDecoder*	m_pDecoder;
448 };
449 #define FPDF_HUGE_IMAGE_SIZE	60000000
450 class CPDF_DIBTransferFunc : public CFX_FilteredDIB
451 {
452 public:
453     CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc);
454     virtual FXDIB_Format	GetDestFormat();
GetDestPalette()455     virtual FX_ARGB*		GetDestPalette()
456     {
457         return NULL;
458     }
459     virtual void			TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const;
460     virtual void			TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const;
461     FX_LPCBYTE				m_RampR;
462     FX_LPCBYTE				m_RampG;
463     FX_LPCBYTE				m_RampB;
464 };
465 struct _CPDF_UniqueKeyGen {
466     void		Generate(int count, ...);
467     FX_CHAR		m_Key[128];
468     int			m_KeyLen;
469 };
470 
471 #endif  // CORE_SRC_FPDFAPI_FPDF_RENDER_RENDER_INT_H_
472