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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #ifndef _FPDF_PAGEOBJ_H_
8 #include "../../../include/fpdfapi/fpdf_pageobj.h"
10 class CPDF_QuickStretcher;
11 #define TYPE3_MAX_BLUES 16
12 class CPDF_Type3Glyphs : public CFX_Object
17 m_GlyphMap.InitHashTable(253);
18 m_TopBlueCount = m_BottomBlueCount = 0;
21 CFX_MapPtrToPtr m_GlyphMap;
22 void AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line);
24 int m_TopBlue[TYPE3_MAX_BLUES], m_BottomBlue[TYPE3_MAX_BLUES];
25 int m_TopBlueCount, m_BottomBlueCount;
27 class CFX_GlyphBitmap;
28 class CPDF_Type3Cache : public CFX_Object
31 CPDF_Type3Cache(CPDF_Type3Font* pFont)
36 CFX_GlyphBitmap* LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
38 CFX_GlyphBitmap* RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
39 CPDF_Type3Font* m_pFont;
40 CFX_MapByteStringToPtr m_SizeMap;
42 class CPDF_TransferFunc : public CFX_Object
45 CPDF_Document* m_pPDFDoc;
46 FX_BYTE m_Samples[256 * 3];
49 CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc);
50 FX_COLORREF TranslateColor(FX_COLORREF src);
52 typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap;
53 typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap;
54 class CPDF_DocRenderData : public CFX_Object
57 CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL);
58 ~CPDF_DocRenderData();
60 CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
61 CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObj);
62 CFX_FontCache* GetFontCache()
66 void Clear(FX_BOOL bRelease = FALSE);
67 void ReleaseCachedType3(CPDF_Type3Font* pFont);
68 void ReleaseTransferFunc(CPDF_Object* pObj);
70 CPDF_Document* m_pPDFDoc;
71 CFX_FontCache* m_pFontCache;
72 CPDF_Type3CacheMap m_Type3FaceMap;
73 CPDF_TransferFuncMap m_TransferFuncMap;
75 struct _PDF_RenderItem {
77 CPDF_PageObjects* m_pObjectList;
78 CFX_AffineMatrix m_Matrix;
80 typedef CFX_ArrayTemplate<_PDF_RenderItem> CPDF_RenderLayer;
81 class IPDF_ObjectRenderer : public CFX_Object
84 static IPDF_ObjectRenderer* Create(int type);
85 virtual ~IPDF_ObjectRenderer() {}
86 virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL) = 0;
87 virtual FX_BOOL Continue(IFX_Pause* pPause) = 0;
90 class CPDF_RenderStatus : public CFX_Object
95 FX_BOOL Initialize(int level, class CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pDeviceMatrix,
96 const CPDF_PageObject* pStopObj, const CPDF_RenderStatus* pParentStatus,
97 const CPDF_GraphicStates* pInitialStates, const CPDF_RenderOptions* pOptions,
98 int transparency, FX_BOOL bDropObjects, CPDF_Dictionary* pFormResource = NULL,
99 FX_BOOL bStdCS = FALSE, CPDF_Type3Char* pType3Char = NULL, FX_ARGB fill_color = 0,
100 FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
101 void RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device);
102 void RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
103 FX_BOOL ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause);
104 CPDF_RenderOptions m_Options;
105 CPDF_Dictionary* m_pFormResource;
106 CPDF_Dictionary* m_pPageResource;
107 CFX_PtrArray m_Type3FontCache;
108 CPDF_RenderContext* GetContext()
113 friend class CPDF_ImageRenderer;
114 friend class CPDF_RenderContext;
115 void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
116 void DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
117 FX_BOOL ProcessTransparency(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
118 void ProcessObjectNoClip(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
119 void DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
120 FX_BOOL DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
121 FX_BOOL ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device);
122 void ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke);
123 void DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke);
124 void DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
125 void DrawShadingPattern(CPDF_ShadingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
126 FX_BOOL SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
127 FX_BOOL ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device);
128 FX_BOOL OutputBitmapAlpha(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
129 FX_BOOL OutputImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
130 FX_BOOL OutputDIBSource(const CFX_DIBSource* pOutputBitmap, FX_ARGB fill_argb, int bitmap_alpha,
131 const CFX_AffineMatrix* pImage2Device, CPDF_ImageCache* pImageCache, FX_DWORD flags);
132 void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
133 int bitmap_alpha, int blend_mode, int bIsolated);
134 FX_BOOL ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device);
135 FX_BOOL ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device);
136 void DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix, FX_RECT& clip_rect,
137 int alpha, FX_BOOL bAlphaMode);
138 FX_BOOL ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device);
139 FX_BOOL ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath);
140 void DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
141 CPDF_Font* pFont, FX_FLOAT font_size,
142 const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke);
143 FX_BOOL ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device);
144 CFX_DIBitmap* GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
145 FX_BOOL bBackAlphaRequired);
146 CFX_DIBitmap* LoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix);
147 void Init(CPDF_RenderContext* pParent);
148 static class CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
149 static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, FX_BOOL bStroke);
150 CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObject) const;
151 FX_ARGB GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3 = FALSE) const;
152 FX_ARGB GetStrokeArgb(const CPDF_PageObject* pObj) const;
153 CPDF_RenderContext* m_pContext;
155 void DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
156 FX_BOOL GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const;
157 void GetScaledMatrix(CFX_Matrix &matrix) const;
160 CFX_RenderDevice* m_pDevice;
161 CFX_AffineMatrix m_DeviceMatrix;
162 CPDF_ClipPath m_LastClipPath;
163 const CPDF_PageObject* m_pCurObj;
164 const CPDF_PageObject* m_pStopObj;
165 CPDF_GraphicStates m_InitialStates;
167 IPDF_ObjectRenderer* m_pObjectRenderer;
171 FX_BOOL m_bDropObjects;
173 FX_DWORD m_GroupFamily;
175 CPDF_Type3Char * m_pType3Char;
176 FX_ARGB m_T3FillColor;
179 class CPDF_ImageLoader : public CFX_Object
188 m_nDownsampleWidth = 0;
189 m_nDownsampleHeight = 0;
192 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);
194 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);
195 FX_BOOL Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause);
197 CFX_DIBSource* m_pBitmap;
198 CFX_DIBSource* m_pMask;
199 FX_DWORD m_MatteColor;
202 FX_INT32 m_nDownsampleWidth;
203 FX_INT32 m_nDownsampleHeight;
205 class CPDF_ProgressiveImageLoaderHandle : public CFX_Object
208 CPDF_ProgressiveImageLoaderHandle();
209 ~CPDF_ProgressiveImageLoaderHandle();
211 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);
212 FX_BOOL Continue(IFX_Pause* pPause);
214 CPDF_ImageLoader* m_pImageLoader;
215 CPDF_PageRenderCache* m_pCache;
216 CPDF_ImageObject* m_pImage;
217 FX_INT32 m_nDownsampleWidth;
218 FX_INT32 m_nDownsampleHeight;
220 class CFX_ImageTransformer;
221 class CPDF_ImageRenderer : public IPDF_ObjectRenderer
224 CPDF_ImageRenderer();
225 ~CPDF_ImageRenderer();
226 FX_BOOL Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
227 FX_BOOL Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
228 int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
229 FX_BOOL Continue(IFX_Pause* pPause);
231 CPDF_RenderStatus* m_pRenderStatus;
232 CPDF_ImageObject* m_pImageObject;
234 const CFX_AffineMatrix* m_pObj2Device;
235 CFX_AffineMatrix m_ImageMatrix;
236 CPDF_ImageLoader m_Loader;
237 const CFX_DIBSource* m_pDIBSource;
238 CFX_DIBitmap* m_pClone;
240 FX_BOOL m_bPatternColor;
241 CPDF_Pattern* m_pPattern;
244 CPDF_QuickStretcher* m_pQuickStretcher;
245 CFX_ImageTransformer* m_pTransformer;
246 CPDF_ImageRenderer* m_pRenderer2;
247 FX_LPVOID m_DeviceHandle;
248 FX_LPVOID m_LoadHandle;
251 FX_BOOL StartBitmapAlpha();
252 FX_BOOL StartDIBSource();
253 FX_BOOL StartRenderDIBSource();
254 FX_BOOL StartLoadDIBSource();
255 FX_BOOL DrawMaskedImage();
256 FX_BOOL DrawPatternImage(const CFX_Matrix* pObj2Device);
258 class CPDF_ScaledRenderBuffer : public CFX_Object
261 CPDF_ScaledRenderBuffer();
262 ~CPDF_ScaledRenderBuffer();
263 FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
264 const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions = NULL, int max_dpi = 0);
265 CFX_RenderDevice* GetDevice()
267 return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;
269 CFX_AffineMatrix* GetMatrix()
273 void OutputToDevice();
275 CFX_RenderDevice* m_pDevice;
276 CPDF_RenderContext* m_pContext;
278 const CPDF_PageObject* m_pObject;
279 CFX_FxgeDevice* m_pBitmapDevice;
280 CFX_AffineMatrix m_Matrix;
282 class ICodec_ScanlineDecoder;
283 class CPDF_QuickStretcher : public CFX_Object
286 CPDF_QuickStretcher();
287 ~CPDF_QuickStretcher();
288 FX_BOOL Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox);
289 FX_BOOL Continue(IFX_Pause* pPause);
290 CFX_DIBitmap* m_pBitmap;
291 int m_ResultLeft, m_ResultTop, m_ClipLeft, m_ClipTop;
292 int m_DestWidth, m_DestHeight, m_ResultWidth, m_ResultHeight;
293 int m_Bpp, m_SrcWidth, m_SrcHeight;
294 FX_BOOL m_bFlipX, m_bFlipY;
295 CPDF_ColorSpace* m_pCS;
296 ICodec_ScanlineDecoder* m_pDecoder;
297 CPDF_StreamAcc m_StreamAcc;
300 class CPDF_DeviceBuffer : public CFX_Object
304 ~CPDF_DeviceBuffer();
305 FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
306 const CPDF_PageObject* pObj, int max_dpi = 0);
307 void OutputToDevice();
308 CFX_DIBitmap* GetBitmap() const
312 const CFX_AffineMatrix* GetMatrix() const
317 CFX_RenderDevice* m_pDevice;
318 CPDF_RenderContext* m_pContext;
320 const CPDF_PageObject* m_pObject;
321 CFX_DIBitmap* m_pBitmap;
322 CFX_AffineMatrix m_Matrix;
324 class CPDF_ImageCache : public CFX_Object
327 CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);
329 void ClearImageData();
330 void Reset(const CFX_DIBitmap* pBitmap);
331 FX_BOOL GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
332 FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,
333 CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
334 FX_DWORD EstimateSize() const
336 return m_dwCacheSize;
338 FX_DWORD GetTimeCount() const
340 return m_dwTimeCount;
342 CPDF_Stream* GetStream() const
346 void SetTimeCount(FX_DWORD dwTimeCount)
348 m_dwTimeCount = dwTimeCount;
352 int StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
353 FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,
354 FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
355 int Continue(IFX_Pause* pPause);
356 int ContinueGetCachedBitmap();
357 CFX_DIBSource* DetachBitmap();
358 CFX_DIBSource* DetachMask();
359 CFX_DIBSource* m_pCurBitmap;
360 CFX_DIBSource* m_pCurMask;
361 FX_DWORD m_MatteColor;
362 CPDF_RenderStatus* m_pRenderStatus;
364 CPDF_Document* m_pDocument;
365 CPDF_Stream* m_pStream;
366 CFX_DIBSource* m_pCachedBitmap;
367 CFX_DIBSource* m_pCachedMask;
368 FX_DWORD m_dwCacheSize;
372 FX_FLOAT m_DecodeMin;
373 FX_FLOAT m_DecodeStep;
377 class CPDF_DIBSource : public CFX_DIBSource
381 virtual ~CPDF_DIBSource();
382 FX_BOOL Load(CPDF_Document* pDoc, const CPDF_Stream* pStream,
383 CPDF_DIBSource** ppMask, FX_DWORD* pMatteColor,
384 CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
385 FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
386 virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const;
387 virtual FX_LPBYTE GetBuffer() const;
388 virtual FX_LPCBYTE GetScanline(int line) const;
389 virtual void DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
390 int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
391 virtual void SetDownSampleSize(int dest_width, int dest_height) const;
392 CFX_DIBitmap* GetBitmap() const;
393 void ReleaseBitmap(CFX_DIBitmap*) const;
394 void ClearImageData();
396 int StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
397 CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
398 FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
399 int ContinueLoadDIBSource(IFX_Pause* pPause);
401 int StartLoadMaskDIB();
402 int ContinueLoadMaskDIB(IFX_Pause* pPause);
403 int ContinueToLoadMask();
404 CPDF_DIBSource* DetachMask();
405 CPDF_DIBSource* m_pMask;
406 FX_DWORD m_MatteColor;
407 FX_LPVOID m_pJbig2Context;
408 CPDF_StreamAcc* m_pGlobalStream;
411 CPDF_Object* m_pMaskStream;
414 FX_BOOL LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);
415 DIB_COMP_DATA* GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, FX_BOOL& bColorKey);
416 CPDF_DIBSource* LoadMask(FX_DWORD& MatteColor);
417 CPDF_DIBSource* LoadMaskDIB(CPDF_Stream* pMask);
418 void LoadJpxBitmap();
419 void LoadJbig2Bitmap();
421 FX_BOOL CreateDecoder();
422 void TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;
423 void ValidateDictParam();
424 CPDF_Document* m_pDocument;
425 const CPDF_Stream* m_pStream;
426 CPDF_StreamAcc* m_pStreamAcc;
427 const CPDF_Dictionary* m_pDict;
428 CPDF_ColorSpace* m_pColorSpace;
429 FX_DWORD m_Family, m_bpc, m_bpc_orig, m_nComponents, m_GroupFamily;
431 FX_BOOL m_bDefaultDecode, m_bImageMask, m_bColorKey;
432 DIB_COMP_DATA* m_pCompData;
433 FX_LPBYTE m_pLineBuf;
434 FX_LPBYTE m_pMaskedLine;
435 CFX_DIBitmap* m_pCachedBitmap;
436 ICodec_ScanlineDecoder* m_pDecoder;
438 #ifdef _FPDFAPI_MINI_
439 #define FPDF_HUGE_IMAGE_SIZE 3000000
441 #define FPDF_HUGE_IMAGE_SIZE 60000000
443 class CPDF_DIBTransferFunc : public CFX_FilteredDIB
446 CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc);
447 virtual FXDIB_Format GetDestFormat();
448 virtual FX_ARGB* GetDestPalette()
452 virtual void TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const;
453 virtual void TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const;
458 struct _CPDF_UniqueKeyGen {
459 void Generate(int count, ...);