OLD | NEW |
| (Empty) |
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_INCLUDE_FPDFAPI_FPDF_RENDER_H_ | |
8 #define CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_ | |
9 | |
10 #include <map> | |
11 #include <memory> | |
12 | |
13 #include "core/include/fpdfapi/fpdf_page.h" | |
14 #include "core/include/fxge/fx_ge.h" | |
15 | |
16 class CFX_GraphStateData; | |
17 class CFX_PathData; | |
18 class CFX_RenderDevice; | |
19 class CPDF_ImageCacheEntry; | |
20 class CPDF_RenderStatus; | |
21 class IFX_Pause; | |
22 | |
23 class IPDF_OCContext { | |
24 public: | |
25 virtual ~IPDF_OCContext() {} | |
26 | |
27 virtual FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCG) = 0; | |
28 | |
29 FX_BOOL CheckObjectVisible(const CPDF_PageObject* pObj); | |
30 }; | |
31 #define RENDER_COLOR_NORMAL 0 | |
32 #define RENDER_COLOR_GRAY 1 | |
33 #define RENDER_COLOR_TWOCOLOR 2 | |
34 #define RENDER_COLOR_ALPHA 3 | |
35 #define RENDER_CLEARTYPE 0x00000001 | |
36 #define RENDER_PRINTGRAPHICTEXT 0x00000002 | |
37 #define RENDER_FORCE_DOWNSAMPLE 0x00000004 | |
38 #define RENDER_PRINTPREVIEW 0x00000008 | |
39 #define RENDER_BGR_STRIPE 0x00000010 | |
40 #define RENDER_NO_NATIVETEXT 0x00000020 | |
41 #define RENDER_FORCE_HALFTONE 0x00000040 | |
42 #define RENDER_RECT_AA 0x00000080 | |
43 #define RENDER_FILL_FULLCOVER 0x00000100 | |
44 #define RENDER_PRINTIMAGETEXT 0x00000200 | |
45 #define RENDER_OVERPRINT 0x00000400 | |
46 #define RENDER_THINLINE 0x00000800 | |
47 #define RENDER_NOTEXTSMOOTH 0x10000000 | |
48 #define RENDER_NOPATHSMOOTH 0x20000000 | |
49 #define RENDER_NOIMAGESMOOTH 0x40000000 | |
50 #define RENDER_LIMITEDIMAGECACHE 0x80000000 | |
51 | |
52 class CPDF_RenderOptions { | |
53 public: | |
54 CPDF_RenderOptions(); | |
55 FX_ARGB TranslateColor(FX_ARGB argb) const; | |
56 | |
57 int m_ColorMode; | |
58 FX_COLORREF m_BackColor; | |
59 FX_COLORREF m_ForeColor; | |
60 FX_DWORD m_Flags; | |
61 int m_Interpolation; | |
62 FX_DWORD m_AddFlags; | |
63 IPDF_OCContext* m_pOCContext; | |
64 FX_DWORD m_dwLimitCacheSize; | |
65 int m_HalftoneLimit; | |
66 }; | |
67 | |
68 class CPDF_RenderContext { | |
69 public: | |
70 class Layer { | |
71 public: | |
72 CPDF_PageObjectHolder* m_pObjectHolder; | |
73 CFX_Matrix m_Matrix; | |
74 }; | |
75 | |
76 explicit CPDF_RenderContext(CPDF_Page* pPage); | |
77 CPDF_RenderContext(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache); | |
78 ~CPDF_RenderContext(); | |
79 | |
80 void AppendLayer(CPDF_PageObjectHolder* pObjectHolder, | |
81 const CFX_Matrix* pObject2Device); | |
82 | |
83 void Render(CFX_RenderDevice* pDevice, | |
84 const CPDF_RenderOptions* pOptions, | |
85 const CFX_Matrix* pFinalMatrix); | |
86 | |
87 void Render(CFX_RenderDevice* pDevice, | |
88 const CPDF_PageObject* pStopObj, | |
89 const CPDF_RenderOptions* pOptions, | |
90 const CFX_Matrix* pFinalMatrix); | |
91 | |
92 void GetBackground(CFX_DIBitmap* pBuffer, | |
93 const CPDF_PageObject* pObj, | |
94 const CPDF_RenderOptions* pOptions, | |
95 CFX_Matrix* pFinalMatrix); | |
96 | |
97 FX_DWORD CountLayers() const { return m_Layers.GetSize(); } | |
98 Layer* GetLayer(FX_DWORD index) { return m_Layers.GetDataPtr(index); } | |
99 | |
100 CPDF_Document* GetDocument() const { return m_pDocument; } | |
101 CPDF_Dictionary* GetPageResources() const { return m_pPageResources; } | |
102 CPDF_PageRenderCache* GetPageCache() const { return m_pPageCache; } | |
103 | |
104 protected: | |
105 CPDF_Document* const m_pDocument; | |
106 CPDF_Dictionary* m_pPageResources; | |
107 CPDF_PageRenderCache* m_pPageCache; | |
108 FX_BOOL m_bFirstLayer; | |
109 CFX_ArrayTemplate<Layer> m_Layers; | |
110 }; | |
111 | |
112 class CPDF_ProgressiveRenderer { | |
113 public: | |
114 // Must match FDF_RENDER_* definitions in public/fpdf_progressive.h, but | |
115 // cannot #include that header. fpdfsdk/fpdf_progressive.cpp has | |
116 // static_asserts to make sure the two sets of values match. | |
117 enum Status { | |
118 Ready, // FPDF_RENDER_READER | |
119 ToBeContinued, // FPDF_RENDER_TOBECOUNTINUED | |
120 Done, // FPDF_RENDER_DONE | |
121 Failed // FPDF_RENDER_FAILED | |
122 }; | |
123 | |
124 static int ToFPDFStatus(Status status) { return static_cast<int>(status); } | |
125 | |
126 CPDF_ProgressiveRenderer(CPDF_RenderContext* pContext, | |
127 CFX_RenderDevice* pDevice, | |
128 const CPDF_RenderOptions* pOptions); | |
129 ~CPDF_ProgressiveRenderer(); | |
130 | |
131 Status GetStatus() const { return m_Status; } | |
132 void Start(IFX_Pause* pPause); | |
133 void Continue(IFX_Pause* pPause); | |
134 | |
135 private: | |
136 void RenderStep(); | |
137 | |
138 // Maximum page objects to render before checking for pause. | |
139 static const int kStepLimit = 100; | |
140 | |
141 Status m_Status; | |
142 CPDF_RenderContext* const m_pContext; | |
143 CFX_RenderDevice* const m_pDevice; | |
144 const CPDF_RenderOptions* const m_pOptions; | |
145 std::unique_ptr<CPDF_RenderStatus> m_pRenderStatus; | |
146 CFX_FloatRect m_ClipRect; | |
147 FX_DWORD m_LayerIndex; | |
148 CPDF_RenderContext::Layer* m_pCurrentLayer; | |
149 CPDF_PageObjectList::iterator m_LastObjectRendered; | |
150 }; | |
151 | |
152 class CPDF_TextRenderer { | |
153 public: | |
154 static void DrawTextString(CFX_RenderDevice* pDevice, | |
155 int left, | |
156 int top, | |
157 CPDF_Font* pFont, | |
158 int height, | |
159 const CFX_ByteString& str, | |
160 FX_ARGB argb); | |
161 | |
162 static void DrawTextString(CFX_RenderDevice* pDevice, | |
163 FX_FLOAT origin_x, | |
164 FX_FLOAT origin_y, | |
165 CPDF_Font* pFont, | |
166 FX_FLOAT font_size, | |
167 const CFX_Matrix* matrix, | |
168 const CFX_ByteString& str, | |
169 FX_ARGB fill_argb, | |
170 FX_ARGB stroke_argb = 0, | |
171 const CFX_GraphStateData* pGraphState = NULL, | |
172 const CPDF_RenderOptions* pOptions = NULL); | |
173 | |
174 static FX_BOOL DrawTextPath(CFX_RenderDevice* pDevice, | |
175 int nChars, | |
176 FX_DWORD* pCharCodes, | |
177 FX_FLOAT* pCharPos, | |
178 CPDF_Font* pFont, | |
179 FX_FLOAT font_size, | |
180 const CFX_Matrix* pText2User, | |
181 const CFX_Matrix* pUser2Device, | |
182 const CFX_GraphStateData* pGraphState, | |
183 FX_ARGB fill_argb, | |
184 FX_ARGB stroke_argb, | |
185 CFX_PathData* pClippingPath, | |
186 int nFlag = 0); | |
187 | |
188 static FX_BOOL DrawNormalText(CFX_RenderDevice* pDevice, | |
189 int nChars, | |
190 FX_DWORD* pCharCodes, | |
191 FX_FLOAT* pCharPos, | |
192 CPDF_Font* pFont, | |
193 FX_FLOAT font_size, | |
194 const CFX_Matrix* pText2Device, | |
195 FX_ARGB fill_argb, | |
196 const CPDF_RenderOptions* pOptions); | |
197 | |
198 static FX_BOOL DrawType3Text(CFX_RenderDevice* pDevice, | |
199 int nChars, | |
200 FX_DWORD* pCharCodes, | |
201 FX_FLOAT* pCharPos, | |
202 CPDF_Font* pFont, | |
203 FX_FLOAT font_size, | |
204 const CFX_Matrix* pText2Device, | |
205 FX_ARGB fill_argb); | |
206 }; | |
207 class CPDF_PageRenderCache { | |
208 public: | |
209 explicit CPDF_PageRenderCache(CPDF_Page* pPage) | |
210 : m_pPage(pPage), | |
211 m_pCurImageCacheEntry(nullptr), | |
212 m_nTimeCount(0), | |
213 m_nCacheSize(0), | |
214 m_bCurFindCache(FALSE) {} | |
215 ~CPDF_PageRenderCache(); | |
216 void ClearImageData(); | |
217 | |
218 FX_DWORD EstimateSize(); | |
219 void CacheOptimization(int32_t dwLimitCacheSize); | |
220 FX_DWORD GetTimeCount() const { return m_nTimeCount; } | |
221 void SetTimeCount(FX_DWORD dwTimeCount) { m_nTimeCount = dwTimeCount; } | |
222 | |
223 void GetCachedBitmap(CPDF_Stream* pStream, | |
224 CFX_DIBSource*& pBitmap, | |
225 CFX_DIBSource*& pMask, | |
226 FX_DWORD& MatteColor, | |
227 FX_BOOL bStdCS = FALSE, | |
228 FX_DWORD GroupFamily = 0, | |
229 FX_BOOL bLoadMask = FALSE, | |
230 CPDF_RenderStatus* pRenderStatus = NULL, | |
231 int32_t downsampleWidth = 0, | |
232 int32_t downsampleHeight = 0); | |
233 | |
234 void ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap); | |
235 void ClearImageCacheEntry(CPDF_Stream* pStream); | |
236 CPDF_Page* GetPage() const { return m_pPage; } | |
237 CPDF_ImageCacheEntry* GetCurImageCacheEntry() const { | |
238 return m_pCurImageCacheEntry; | |
239 } | |
240 | |
241 FX_BOOL StartGetCachedBitmap(CPDF_Stream* pStream, | |
242 FX_BOOL bStdCS = FALSE, | |
243 FX_DWORD GroupFamily = 0, | |
244 FX_BOOL bLoadMask = FALSE, | |
245 CPDF_RenderStatus* pRenderStatus = NULL, | |
246 int32_t downsampleWidth = 0, | |
247 int32_t downsampleHeight = 0); | |
248 | |
249 FX_BOOL Continue(IFX_Pause* pPause); | |
250 | |
251 protected: | |
252 friend class CPDF_Page; | |
253 CPDF_Page* const m_pPage; | |
254 CPDF_ImageCacheEntry* m_pCurImageCacheEntry; | |
255 std::map<CPDF_Stream*, CPDF_ImageCacheEntry*> m_ImageCache; | |
256 FX_DWORD m_nTimeCount; | |
257 FX_DWORD m_nCacheSize; | |
258 FX_BOOL m_bCurFindCache; | |
259 }; | |
260 | |
261 FX_BOOL IsAvailableMatrix(const CFX_Matrix& matrix); | |
262 | |
263 #endif // CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_ | |
OLD | NEW |