• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 _FPDF_RENDER_
8 #define _FPDF_RENDER_
9 #ifndef _FPDF_PAGE_
10 #include "fpdf_page.h"
11 #endif
12 #ifndef _FX_GE_H_
13 #include "../fxge/fx_ge.h"
14 #endif
15 class CPDF_RenderContext;
16 class CPDF_RenderOptions;
17 class CPDF_ImageCache;
18 class IPDF_OCContext;
19 class CPDF_QuickStretcher;
20 class CFX_PathData;
21 class CFX_GraphStateData;
22 class CFX_RenderDevice;
23 class CPDF_TextObject;
24 class CPDF_PathObject;
25 class CPDF_ImageObject;
26 class CPDF_ShadingObject;
27 class CPDF_FormObject;
28 class IPDF_OCContext
29 {
30 public:
31 
~IPDF_OCContext()32     virtual ~IPDF_OCContext() {}
33 
34     virtual FX_BOOL	CheckOCGVisible(const CPDF_Dictionary* pOCG) = 0;
35 
36     FX_BOOL CheckObjectVisible(const CPDF_PageObject* pObj);
37 };
38 #define RENDER_COLOR_NORMAL		0
39 #define RENDER_COLOR_GRAY		1
40 #define RENDER_COLOR_TWOCOLOR	2
41 #define RENDER_COLOR_ALPHA		3
42 #define RENDER_CLEARTYPE			0x00000001
43 #define RENDER_PRINTGRAPHICTEXT		0x00000002
44 #define RENDER_FORCE_DOWNSAMPLE		0x00000004
45 #define RENDER_PRINTPREVIEW			0x00000008
46 #define RENDER_BGR_STRIPE			0x00000010
47 #define RENDER_NO_NATIVETEXT		0x00000020
48 #define RENDER_FORCE_HALFTONE		0x00000040
49 #define RENDER_RECT_AA				0x00000080
50 #define RENDER_FILL_FULLCOVER		0x00000100
51 #define RENDER_PRINTIMAGETEXT       0x00000200
52 #define RENDER_OVERPRINT            0x00000400
53 #define RENDER_THINLINE             0x00000800
54 #define RENDER_NOTEXTSMOOTH			0x10000000
55 #define RENDER_NOPATHSMOOTH			0x20000000
56 #define RENDER_NOIMAGESMOOTH		0x40000000
57 #define RENDER_LIMITEDIMAGECACHE	0x80000000
58 class CPDF_RenderOptions : public CFX_Object
59 {
60 public:
61 
62     CPDF_RenderOptions();
63 
64     int				m_ColorMode;
65 
66     FX_COLORREF		m_BackColor;
67 
68     FX_COLORREF		m_ForeColor;
69 
70     FX_DWORD		m_Flags;
71 
72     int				m_Interpolation;
73 
74     FX_DWORD		m_AddFlags;
75 
76     IPDF_OCContext*	m_pOCContext;
77 
78     FX_DWORD		m_dwLimitCacheSize;
79 
80     int				m_HalftoneLimit;
81 
82     FX_ARGB			TranslateColor(FX_ARGB argb) const;
83 };
84 class CPDF_RenderContext : public CFX_Object
85 {
86 public:
87 
88     CPDF_RenderContext();
89 
90     void			Create(CPDF_Page* pPage, FX_BOOL bFirstLayer = TRUE);
91 
92     void			Create(CPDF_Document* pDoc = NULL, CPDF_PageRenderCache* pPageCache = NULL,
93                            CPDF_Dictionary* pPageResources = NULL, FX_BOOL bFirstLayer = TRUE);
94 
95     ~CPDF_RenderContext();
96 
97     void			Clear();
98 
99     void			AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device);
100 
101     void			SetBackground(class IPDF_BackgroundDraw* pBackground);
102 
103     void			Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions = NULL,
104                            const CFX_AffineMatrix* pFinalMatrix = NULL);
105 
106     void			DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,
107                                    const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions);
108 
109     void			GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,
110                                   const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix);
111 
GetPageCache()112     CPDF_PageRenderCache*	GetPageCache() const
113     {
114         return m_pPageCache;
115     }
116 
117 
118 
119     CPDF_Document*			m_pDocument;
120 
121     CPDF_Dictionary*		m_pPageResources;
122 
123     CPDF_PageRenderCache*	m_pPageCache;
124 
125 protected:
126 
127     CFX_ArrayTemplate<struct _PDF_RenderItem>	m_ContentList;
128 
129     IPDF_BackgroundDraw*	m_pBackgroundDraw;
130 
131     FX_BOOL					m_bFirstLayer;
132 
133     void			Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,
134                            const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pFinalMatrix);
135     friend class CPDF_RenderStatus;
136     friend class CPDF_ProgressiveRenderer;
137 };
138 class IPDF_BackgroundDraw
139 {
140 public:
141 
142     virtual	void	OnDrawBackground(
143         CFX_RenderDevice* pBitmapDevice,
144         const CFX_AffineMatrix* pOriginal2Bitmap
145     ) = 0;
146 };
147 class CPDF_ProgressiveRenderer : public CFX_Object
148 {
149 public:
150 
151     CPDF_ProgressiveRenderer();
152 
153     ~CPDF_ProgressiveRenderer();
154 
155     typedef enum {
156         Ready,
157         ToBeContinued,
158         Done,
159         Failed
160     } RenderStatus;
161 
GetStatus()162     RenderStatus		GetStatus()
163     {
164         return m_Status;
165     }
166 
167 
168 
169     void				Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
170                               const CPDF_RenderOptions* pOptions, class IFX_Pause* pPause, FX_BOOL bDropObjects = FALSE);
171 
172     void				Continue(class IFX_Pause* pPause);
173 
174 
175     int					EstimateProgress();
176 
177     void				Clear();
178 protected:
179 
180     RenderStatus		m_Status;
181 
182     CPDF_RenderContext*	m_pContext;
183 
184     CFX_RenderDevice*	m_pDevice;
185 
186     const CPDF_RenderOptions*	m_pOptions;
187 
188     FX_BOOL				m_bDropObjects;
189 
190     class CPDF_RenderStatus*	m_pRenderer;
191 
192     CFX_FloatRect		m_ClipRect;
193 
194     FX_DWORD			m_LayerIndex;
195 
196     FX_DWORD			m_ObjectIndex;
197 
198     FX_POSITION			m_ObjectPos;
199 
200     FX_POSITION			m_PrevLastPos;
201 
202     void				RenderStep();
203 };
204 class CPDF_TextRenderer : public CFX_Object
205 {
206 public:
207 
208     static void		DrawTextString(CFX_RenderDevice* pDevice, int left, int top,
209                                    CPDF_Font* pFont,
210                                    int height,
211                                    const CFX_ByteString& str,
212                                    FX_ARGB argb);
213 
214     static void		DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y,
215                                    CPDF_Font* pFont,
216                                    FX_FLOAT font_size,
217                                    const CFX_AffineMatrix* matrix,
218                                    const CFX_ByteString& str,
219                                    FX_ARGB fill_argb,
220                                    FX_ARGB stroke_argb = 0,
221                                    const CFX_GraphStateData* pGraphState = NULL,
222                                    const CPDF_RenderOptions* pOptions = NULL
223                                );
224 
225     static FX_BOOL	DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
226                                  CPDF_Font* pFont, FX_FLOAT font_size,
227                                  const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,
228                                  const CFX_GraphStateData* pGraphState,
229                                  FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag = 0);
230 
231     static FX_BOOL	DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
232                                    CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
233                                    FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions);
234 
235     static FX_BOOL	DrawType3Text(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
236                                   CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
237                                   FX_ARGB fill_argb);
238 };
239 class IPDF_PageImageCache
240 {
241 public:
242 
243     static IPDF_PageImageCache* Create();
244 
~IPDF_PageImageCache()245     virtual ~IPDF_PageImageCache() {}
246 
247     virtual void		OutputPage(CFX_RenderDevice* pDevice, CPDF_Page* pPage,
248                                    int pos_x, int pos_y, int size_x, int size_y, int rotate) = 0;
249 
250     virtual void		SetCacheLimit(FX_DWORD limit) = 0;
251 };
252 class CPDF_PageRenderCache : public CFX_Object
253 {
254 public:
CPDF_PageRenderCache(CPDF_Page * pPage)255     CPDF_PageRenderCache(CPDF_Page* pPage)
256     {
257         m_pPage = pPage;
258         m_nTimeCount = 0;
259         m_nCacheSize = 0;
260         m_pCurImageCache = NULL;
261         m_bCurFindCache = FALSE;
262         m_pCurImageCaches = NULL;
263     }
~CPDF_PageRenderCache()264     ~CPDF_PageRenderCache()
265     {
266         ClearAll();
267     }
268     void				ClearAll();
269     void				ClearImageData();
270 
271     FX_DWORD			EstimateSize();
272     void				CacheOptimization(FX_INT32 dwLimitCacheSize);
273     FX_DWORD			GetCachedSize(CPDF_Stream* pStream) const;
GetTimeCount()274     FX_DWORD			GetTimeCount() const
275     {
276         return m_nTimeCount;
277     }
SetTimeCount(FX_DWORD dwTimeCount)278     void				SetTimeCount(FX_DWORD dwTimeCount)
279     {
280         m_nTimeCount = dwTimeCount;
281     }
282 
283     void				GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,
284                                         FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,
285                                         CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
286 
287     void				ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap);
288     void				ClearImageCache(CPDF_Stream* pStream);
GetPage()289     CPDF_Page*			GetPage()
290     {
291         return m_pPage;
292     }
293     CFX_MapPtrToPtr		m_ImageCaches;
294 public:
295     FX_BOOL				StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,
296             FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL,
297             FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
298 
299     FX_BOOL				Continue(IFX_Pause* pPause);
300     CPDF_ImageCache*	m_pCurImageCache;
301     CFX_PtrArray*       m_pCurImageCaches;
302 protected:
303     friend class		CPDF_Page;
304     CPDF_Page*			m_pPage;
305 
306     FX_DWORD			m_nTimeCount;
307     FX_DWORD			m_nCacheSize;
308     FX_BOOL				m_bCurFindCache;
309 };
310 class CPDF_RenderConfig : public CFX_Object
311 {
312 public:
313     CPDF_RenderConfig();
314     ~CPDF_RenderConfig();
315     int					m_HalftoneLimit;
316     int					m_RenderStepLimit;
317 };
318 #endif
319