1e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar// Copyright 2014 PDFium Authors. All rights reserved. 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 30b60bb04b966030fd1dfdffe68099da8f280ade0Pavlin Radoslavov// found in the LICENSE file. 40b60bb04b966030fd1dfdffe68099da8f280ade0Pavlin Radoslavov 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef CORE_SRC_FPDFAPI_FPDF_RENDER_RENDER_INT_H_ 8e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar#define CORE_SRC_FPDFAPI_FPDF_RENDER_RENDER_INT_H_ 9e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <map> 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <memory> 129891f32471b5c01cf58e4d7dadb04cb3024a9a88Zach Johnson 139891f32471b5c01cf58e4d7dadb04cb3024a9a88Zach Johnson#include "core/include/fpdfapi/fpdf_pageobj.h" 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "core/include/fpdfapi/fpdf_render.h" 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellarclass CFX_GlyphBitmap; 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass CFX_ImageTransformer; 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass CPDF_ImageCacheEntry; 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass CPDF_ImageLoaderHandle; 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass ICodec_ScanlineDecoder; 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define TYPE3_MAX_BLUES 16 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass CPDF_Type3Glyphs { 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 26e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar CPDF_Type3Glyphs() : m_TopBlueCount(0), m_BottomBlueCount(0) {} 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~CPDF_Type3Glyphs(); 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void AdjustBlue(FX_FLOAT top, 29e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar FX_FLOAT bottom, 3079ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton int& top_line, 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int& bottom_line); 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::map<FX_DWORD, CFX_GlyphBitmap*> m_GlyphMap; 348a6a89faa942aed4f176b0c98402d01c8bdd6aa6Sharvil Nanavati int m_TopBlue[TYPE3_MAX_BLUES]; 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int m_BottomBlue[TYPE3_MAX_BLUES]; 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int m_TopBlueCount; 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int m_BottomBlueCount; 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectclass CPDF_Type3Cache { 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project public: 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project explicit CPDF_Type3Cache(CPDF_Type3Font* pFont) : m_pFont(pFont) {} 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~CPDF_Type3Cache(); 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CFX_GlyphBitmap* LoadGlyph(FX_DWORD charcode, 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const CFX_Matrix* pMatrix, 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FX_FLOAT retinaScaleX = 1.0f, 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FX_FLOAT retinaScaleY = 1.0f); 48b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 49e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar protected: 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CFX_GlyphBitmap* RenderGlyph(CPDF_Type3Glyphs* pSize, 51ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta FX_DWORD charcode, 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const CFX_Matrix* pMatrix, 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FX_FLOAT retinaScaleX = 1.0f, 540b60bb04b966030fd1dfdffe68099da8f280ade0Pavlin Radoslavov FX_FLOAT retinaScaleY = 1.0f); 557c6f8f332c42199748082edfa4aaf5ee45a373d7Alain Vongsouvanh CPDF_Type3Font* const m_pFont; 5689f5e411d9ef31436741288a2267e46dd744e273Andre Eisenbach std::map<CFX_ByteString, CPDF_Type3Glyphs*> m_SizeMap; 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellarclass CPDF_TransferFunc { 60e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar public: 61e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar explicit CPDF_TransferFunc(CPDF_Document* pDoc); 626b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 636b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta FX_COLORREF TranslateColor(FX_COLORREF src) const; 64aa11644f763b1d33123b3f71d1a6c3977e7d69cfMarie Janssen CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc, 656b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta FX_BOOL bAutoDropSrc); 66e064f0846d382180a7955b7e45fcb73fa13ff992Ajay Panicker 67e064f0846d382180a7955b7e45fcb73fa13ff992Ajay Panicker CPDF_Document* const m_pPDFDoc; 68e01b1126c734fa9f0decc94eaebf06d10501d624Chris Manton FX_BOOL m_bIdentity; 69e01b1126c734fa9f0decc94eaebf06d10501d624Chris Manton uint8_t m_Samples[256 * 3]; 707c6f8f332c42199748082edfa4aaf5ee45a373d7Alain Vongsouvanh}; 710ef6b347b8cf1a9e83e6b680a0ee025da24f00b6Zach Johnson 720ef6b347b8cf1a9e83e6b680a0ee025da24f00b6Zach Johnsonclass CPDF_DocRenderData { 730ef6b347b8cf1a9e83e6b680a0ee025da24f00b6Zach Johnson public: 74e11cc0b0f9c5b21ecdf3d574333d100ce918a3a0Andre Eisenbach CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL); 7579ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton ~CPDF_DocRenderData(); 76e11cc0b0f9c5b21ecdf3d574333d100ce918a3a0Andre Eisenbach CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont); 77e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObj); 78aa11644f763b1d33123b3f71d1a6c3977e7d69cfMarie Janssen CFX_FontCache* GetFontCache() { return m_pFontCache; } 79e11cc0b0f9c5b21ecdf3d574333d100ce918a3a0Andre Eisenbach void Clear(FX_BOOL bRelease = FALSE); 80e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar void ReleaseCachedType3(CPDF_Type3Font* pFont); 818a6a89faa942aed4f176b0c98402d01c8bdd6aa6Sharvil Nanavati void ReleaseTransferFunc(CPDF_Object* pObj); 820ef6b347b8cf1a9e83e6b680a0ee025da24f00b6Zach Johnson 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project private: 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project using CPDF_Type3CacheMap = 85273789bb86ef99f5ce022bb64c601ea4ea6f8bb3Colin Cross std::map<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache>*>; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project using CPDF_TransferFuncMap = 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project std::map<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc>*>; 8874626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov 8974626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov CPDF_Document* m_pPDFDoc; 9074626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov CFX_FontCache* m_pFontCache; 9174626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov CPDF_Type3CacheMap m_Type3FaceMap; 9274626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov CPDF_TransferFuncMap m_TransferFuncMap; 9374626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov}; 9474626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavovstruct _PDF_RenderItem { 9574626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov public: 9674626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov CPDF_PageObjects* m_pObjectList; 9774626115db17478a12d1d39bcefd5af500fadfdaPavlin Radoslavov CFX_Matrix m_Matrix; 98e01b1126c734fa9f0decc94eaebf06d10501d624Chris Manton}; 99e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar 100e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellartypedef CFX_ArrayTemplate<_PDF_RenderItem> CPDF_RenderLayer; 101e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellar 102e93ac125b887651e835fe59f4d1f9b3c5baa844cIan McKellarclass IPDF_ObjectRenderer { 103462cd3fee6523f73e11490a670ce808fbda1ed39Chris Manton public: 1040b60bb04b966030fd1dfdffe68099da8f280ade0Pavlin Radoslavov static IPDF_ObjectRenderer* Create(int type); 1050b60bb04b966030fd1dfdffe68099da8f280ade0Pavlin Radoslavov virtual ~IPDF_ObjectRenderer() {} 1060b60bb04b966030fd1dfdffe68099da8f280ade0Pavlin Radoslavov virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, 107e406c16a52c115eca09c77a7f848432c07a50c53Bernhard Rosenkränzer const CPDF_PageObject* pObj, 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const CFX_Matrix* pObj2Device, 109 FX_BOOL bStdCS, 110 int blendType = FXDIB_BLEND_NORMAL) = 0; 111 virtual FX_BOOL Continue(IFX_Pause* pPause) = 0; 112 FX_BOOL m_Result; 113}; 114 115class CPDF_RenderStatus { 116 public: 117 CPDF_RenderStatus(); 118 ~CPDF_RenderStatus(); 119 FX_BOOL Initialize(class CPDF_RenderContext* pContext, 120 CFX_RenderDevice* pDevice, 121 const CFX_Matrix* pDeviceMatrix, 122 const CPDF_PageObject* pStopObj, 123 const CPDF_RenderStatus* pParentStatus, 124 const CPDF_GraphicStates* pInitialStates, 125 const CPDF_RenderOptions* pOptions, 126 int transparency, 127 FX_BOOL bDropObjects, 128 CPDF_Dictionary* pFormResource = NULL, 129 FX_BOOL bStdCS = FALSE, 130 CPDF_Type3Char* pType3Char = NULL, 131 FX_ARGB fill_color = 0, 132 FX_DWORD GroupFamily = 0, 133 FX_BOOL bLoadMask = FALSE); 134 void RenderObjectList(const CPDF_PageObjects* pObjs, 135 const CFX_Matrix* pObj2Device); 136 void RenderSingleObject(const CPDF_PageObject* pObj, 137 const CFX_Matrix* pObj2Device); 138 FX_BOOL ContinueSingleObject(const CPDF_PageObject* pObj, 139 const CFX_Matrix* pObj2Device, 140 IFX_Pause* pPause); 141 CPDF_RenderContext* GetContext() { return m_pContext; } 142 143 CPDF_RenderOptions m_Options; 144 CPDF_Dictionary* m_pFormResource; 145 CPDF_Dictionary* m_pPageResource; 146 CFX_ArrayTemplate<CPDF_Type3Font*> m_Type3FontCache; 147 148 protected: 149 friend class CPDF_ImageRenderer; 150 friend class CPDF_RenderContext; 151 void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_Matrix* pObj2Device); 152 void DrawClipPath(CPDF_ClipPath ClipPath, const CFX_Matrix* pObj2Device); 153 FX_BOOL ProcessTransparency(const CPDF_PageObject* PageObj, 154 const CFX_Matrix* pObj2Device); 155 void ProcessObjectNoClip(const CPDF_PageObject* PageObj, 156 const CFX_Matrix* pObj2Device); 157 void DrawObjWithBackground(const CPDF_PageObject* pObj, 158 const CFX_Matrix* pObj2Device); 159 FX_BOOL DrawObjWithBlend(const CPDF_PageObject* pObj, 160 const CFX_Matrix* pObj2Device); 161 FX_BOOL ProcessPath(CPDF_PathObject* pPathObj, const CFX_Matrix* pObj2Device); 162 void ProcessPathPattern(CPDF_PathObject* pPathObj, 163 const CFX_Matrix* pObj2Device, 164 int& filltype, 165 FX_BOOL& bStroke); 166 void DrawPathWithPattern(CPDF_PathObject* pPathObj, 167 const CFX_Matrix* pObj2Device, 168 CPDF_Color* pColor, 169 FX_BOOL bStroke); 170 void DrawTilingPattern(CPDF_TilingPattern* pPattern, 171 CPDF_PageObject* pPageObj, 172 const CFX_Matrix* pObj2Device, 173 FX_BOOL bStroke); 174 void DrawShadingPattern(CPDF_ShadingPattern* pPattern, 175 CPDF_PageObject* pPageObj, 176 const CFX_Matrix* pObj2Device, 177 FX_BOOL bStroke); 178 FX_BOOL SelectClipPath(CPDF_PathObject* pPathObj, 179 const CFX_Matrix* pObj2Device, 180 FX_BOOL bStroke); 181 FX_BOOL ProcessImage(CPDF_ImageObject* pImageObj, 182 const CFX_Matrix* pObj2Device); 183 FX_BOOL OutputBitmapAlpha(CPDF_ImageObject* pImageObj, 184 const CFX_Matrix* pImage2Device); 185 FX_BOOL OutputImage(CPDF_ImageObject* pImageObj, 186 const CFX_Matrix* pImage2Device); 187 FX_BOOL OutputDIBSource(const CFX_DIBSource* pOutputBitmap, 188 FX_ARGB fill_argb, 189 int bitmap_alpha, 190 const CFX_Matrix* pImage2Device, 191 CPDF_ImageCacheEntry* pImageCache, 192 FX_DWORD flags); 193 void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, 194 int left, 195 int top, 196 FX_ARGB mask_argb, 197 int bitmap_alpha, 198 int blend_mode, 199 int bIsolated); 200 FX_BOOL ProcessShading(CPDF_ShadingObject* pShadingObj, 201 const CFX_Matrix* pObj2Device); 202 void DrawShading(CPDF_ShadingPattern* pPattern, 203 CFX_Matrix* pMatrix, 204 FX_RECT& clip_rect, 205 int alpha, 206 FX_BOOL bAlphaMode); 207 FX_BOOL ProcessType3Text(const CPDF_TextObject* textobj, 208 const CFX_Matrix* pObj2Device); 209 FX_BOOL ProcessText(const CPDF_TextObject* textobj, 210 const CFX_Matrix* pObj2Device, 211 CFX_PathData* pClippingPath); 212 void DrawTextPathWithPattern(const CPDF_TextObject* textobj, 213 const CFX_Matrix* pObj2Device, 214 CPDF_Font* pFont, 215 FX_FLOAT font_size, 216 const CFX_Matrix* pTextMatrix, 217 FX_BOOL bFill, 218 FX_BOOL bStroke); 219 FX_BOOL ProcessForm(CPDF_FormObject* pFormObj, const CFX_Matrix* pObj2Device); 220 CFX_DIBitmap* GetBackdrop(const CPDF_PageObject* pObj, 221 const FX_RECT& rect, 222 int& left, 223 int& top, 224 FX_BOOL bBackAlphaRequired); 225 CFX_DIBitmap* LoadSMask(CPDF_Dictionary* pSMaskDict, 226 FX_RECT* pClipRect, 227 const CFX_Matrix* pMatrix); 228 void Init(CPDF_RenderContext* pParent); 229 static class CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont); 230 static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, 231 FX_BOOL bStroke); 232 CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObject) const; 233 FX_ARGB GetFillArgb(const CPDF_PageObject* pObj, 234 FX_BOOL bType3 = FALSE) const; 235 FX_ARGB GetStrokeArgb(const CPDF_PageObject* pObj) const; 236 CPDF_RenderContext* m_pContext; 237 FX_BOOL m_bStopped; 238 void DitherObjectArea(const CPDF_PageObject* pObj, 239 const CFX_Matrix* pObj2Device); 240 FX_BOOL GetObjectClippedRect(const CPDF_PageObject* pObj, 241 const CFX_Matrix* pObj2Device, 242 FX_BOOL bLogical, 243 FX_RECT& rect) const; 244 void GetScaledMatrix(CFX_Matrix& matrix) const; 245 246 protected: 247 static const int kRenderMaxRecursionDepth = 64; 248 static int s_CurrentRecursionDepth; 249 250 CFX_RenderDevice* m_pDevice; 251 CFX_Matrix m_DeviceMatrix; 252 CPDF_ClipPath m_LastClipPath; 253 const CPDF_PageObject* m_pCurObj; 254 const CPDF_PageObject* m_pStopObj; 255 CPDF_GraphicStates m_InitialStates; 256 int m_HalftoneLimit; 257 std::unique_ptr<IPDF_ObjectRenderer> m_pObjectRenderer; 258 FX_BOOL m_bPrint; 259 int m_Transparency; 260 int m_DitherBits; 261 FX_BOOL m_bDropObjects; 262 FX_BOOL m_bStdCS; 263 FX_DWORD m_GroupFamily; 264 FX_BOOL m_bLoadMask; 265 CPDF_Type3Char* m_pType3Char; 266 FX_ARGB m_T3FillColor; 267 int m_curBlend; 268}; 269class CPDF_ImageLoader { 270 public: 271 CPDF_ImageLoader() 272 : m_pBitmap(nullptr), 273 m_pMask(nullptr), 274 m_MatteColor(0), 275 m_bCached(FALSE), 276 m_nDownsampleWidth(0), 277 m_nDownsampleHeight(0) {} 278 ~CPDF_ImageLoader(); 279 280 FX_BOOL Start(const CPDF_ImageObject* pImage, 281 CPDF_PageRenderCache* pCache, 282 CPDF_ImageLoaderHandle*& LoadHandle, 283 FX_BOOL bStdCS = FALSE, 284 FX_DWORD GroupFamily = 0, 285 FX_BOOL bLoadMask = FALSE, 286 CPDF_RenderStatus* pRenderStatus = NULL, 287 int32_t nDownsampleWidth = 0, 288 int32_t nDownsampleHeight = 0); 289 FX_BOOL Continue(CPDF_ImageLoaderHandle* LoadHandle, IFX_Pause* pPause); 290 291 CFX_DIBSource* m_pBitmap; 292 CFX_DIBSource* m_pMask; 293 FX_DWORD m_MatteColor; 294 FX_BOOL m_bCached; 295 296 protected: 297 int32_t m_nDownsampleWidth; 298 int32_t m_nDownsampleHeight; 299}; 300class CPDF_ImageLoaderHandle { 301 public: 302 CPDF_ImageLoaderHandle(); 303 ~CPDF_ImageLoaderHandle(); 304 305 FX_BOOL Start(CPDF_ImageLoader* pImageLoader, 306 const CPDF_ImageObject* pImage, 307 CPDF_PageRenderCache* pCache, 308 FX_BOOL bStdCS = FALSE, 309 FX_DWORD GroupFamily = 0, 310 FX_BOOL bLoadMask = FALSE, 311 CPDF_RenderStatus* pRenderStatus = NULL, 312 int32_t nDownsampleWidth = 0, 313 int32_t nDownsampleHeight = 0); 314 FX_BOOL Continue(IFX_Pause* pPause); 315 316 protected: 317 CPDF_ImageLoader* m_pImageLoader; 318 CPDF_PageRenderCache* m_pCache; 319 CPDF_ImageObject* m_pImage; 320 int32_t m_nDownsampleWidth; 321 int32_t m_nDownsampleHeight; 322}; 323 324class CPDF_ImageRenderer : public IPDF_ObjectRenderer { 325 public: 326 CPDF_ImageRenderer(); 327 ~CPDF_ImageRenderer() override; 328 329 // IPDF_ObjectRenderer 330 FX_BOOL Start(CPDF_RenderStatus* pStatus, 331 const CPDF_PageObject* pObj, 332 const CFX_Matrix* pObj2Device, 333 FX_BOOL bStdCS, 334 int blendType = FXDIB_BLEND_NORMAL) override; 335 FX_BOOL Continue(IFX_Pause* pPause) override; 336 337 FX_BOOL Start(CPDF_RenderStatus* pStatus, 338 const CFX_DIBSource* pDIBSource, 339 FX_ARGB bitmap_argb, 340 int bitmap_alpha, 341 const CFX_Matrix* pImage2Device, 342 FX_DWORD flags, 343 FX_BOOL bStdCS, 344 int blendType = FXDIB_BLEND_NORMAL); 345 346 protected: 347 CPDF_RenderStatus* m_pRenderStatus; 348 CPDF_ImageObject* m_pImageObject; 349 int m_Status; 350 const CFX_Matrix* m_pObj2Device; 351 CFX_Matrix m_ImageMatrix; 352 CPDF_ImageLoader m_Loader; 353 const CFX_DIBSource* m_pDIBSource; 354 CFX_DIBitmap* m_pClone; 355 int m_BitmapAlpha; 356 FX_BOOL m_bPatternColor; 357 CPDF_Pattern* m_pPattern; 358 FX_ARGB m_FillArgb; 359 FX_DWORD m_Flags; 360 CFX_ImageTransformer* m_pTransformer; 361 void* m_DeviceHandle; 362 CPDF_ImageLoaderHandle* m_LoadHandle; 363 FX_BOOL m_bStdCS; 364 int m_BlendType; 365 FX_BOOL StartBitmapAlpha(); 366 FX_BOOL StartDIBSource(); 367 FX_BOOL StartRenderDIBSource(); 368 FX_BOOL StartLoadDIBSource(); 369 FX_BOOL DrawMaskedImage(); 370 FX_BOOL DrawPatternImage(const CFX_Matrix* pObj2Device); 371}; 372 373class CPDF_ScaledRenderBuffer { 374 public: 375 CPDF_ScaledRenderBuffer(); 376 ~CPDF_ScaledRenderBuffer(); 377 378 FX_BOOL Initialize(CPDF_RenderContext* pContext, 379 CFX_RenderDevice* pDevice, 380 const FX_RECT& pRect, 381 const CPDF_PageObject* pObj, 382 const CPDF_RenderOptions* pOptions = NULL, 383 int max_dpi = 0); 384 CFX_RenderDevice* GetDevice() { 385 return m_pBitmapDevice ? m_pBitmapDevice.get() : m_pDevice; 386 } 387 CFX_Matrix* GetMatrix() { return &m_Matrix; } 388 void OutputToDevice(); 389 390 private: 391 CFX_RenderDevice* m_pDevice; 392 CPDF_RenderContext* m_pContext; 393 FX_RECT m_Rect; 394 const CPDF_PageObject* m_pObject; 395 std::unique_ptr<CFX_FxgeDevice> m_pBitmapDevice; 396 CFX_Matrix m_Matrix; 397}; 398 399class CPDF_DeviceBuffer { 400 public: 401 CPDF_DeviceBuffer(); 402 ~CPDF_DeviceBuffer(); 403 FX_BOOL Initialize(CPDF_RenderContext* pContext, 404 CFX_RenderDevice* pDevice, 405 FX_RECT* pRect, 406 const CPDF_PageObject* pObj, 407 int max_dpi = 0); 408 void OutputToDevice(); 409 CFX_DIBitmap* GetBitmap() const { return m_pBitmap.get(); } 410 const CFX_Matrix* GetMatrix() const { return &m_Matrix; } 411 412 private: 413 CFX_RenderDevice* m_pDevice; 414 CPDF_RenderContext* m_pContext; 415 FX_RECT m_Rect; 416 const CPDF_PageObject* m_pObject; 417 std::unique_ptr<CFX_DIBitmap> m_pBitmap; 418 CFX_Matrix m_Matrix; 419}; 420 421class CPDF_ImageCacheEntry { 422 public: 423 CPDF_ImageCacheEntry(CPDF_Document* pDoc, CPDF_Stream* pStream); 424 ~CPDF_ImageCacheEntry(); 425 void ClearImageData(); 426 void Reset(const CFX_DIBitmap* pBitmap); 427 FX_BOOL GetCachedBitmap(CFX_DIBSource*& pBitmap, 428 CFX_DIBSource*& pMask, 429 FX_DWORD& MatteColor, 430 CPDF_Dictionary* pPageResources, 431 FX_BOOL bStdCS = FALSE, 432 FX_DWORD GroupFamily = 0, 433 FX_BOOL bLoadMask = FALSE, 434 CPDF_RenderStatus* pRenderStatus = NULL, 435 int32_t downsampleWidth = 0, 436 int32_t downsampleHeight = 0); 437 FX_DWORD EstimateSize() const { return m_dwCacheSize; } 438 FX_DWORD GetTimeCount() const { return m_dwTimeCount; } 439 CPDF_Stream* GetStream() const { return m_pStream; } 440 void SetTimeCount(FX_DWORD dwTimeCount) { m_dwTimeCount = dwTimeCount; } 441 int m_dwTimeCount; 442 443 public: 444 int StartGetCachedBitmap(CPDF_Dictionary* pFormResources, 445 CPDF_Dictionary* pPageResources, 446 FX_BOOL bStdCS = FALSE, 447 FX_DWORD GroupFamily = 0, 448 FX_BOOL bLoadMask = FALSE, 449 CPDF_RenderStatus* pRenderStatus = NULL, 450 int32_t downsampleWidth = 0, 451 int32_t downsampleHeight = 0); 452 int Continue(IFX_Pause* pPause); 453 CFX_DIBSource* DetachBitmap(); 454 CFX_DIBSource* DetachMask(); 455 CFX_DIBSource* m_pCurBitmap; 456 CFX_DIBSource* m_pCurMask; 457 FX_DWORD m_MatteColor; 458 CPDF_RenderStatus* m_pRenderStatus; 459 460 protected: 461 void ContinueGetCachedBitmap(); 462 463 CPDF_Document* m_pDocument; 464 CPDF_Stream* m_pStream; 465 CFX_DIBSource* m_pCachedBitmap; 466 CFX_DIBSource* m_pCachedMask; 467 FX_DWORD m_dwCacheSize; 468 void CalcSize(); 469}; 470typedef struct { 471 FX_FLOAT m_DecodeMin; 472 FX_FLOAT m_DecodeStep; 473 int m_ColorKeyMin; 474 int m_ColorKeyMax; 475} DIB_COMP_DATA; 476 477class CPDF_DIBSource : public CFX_DIBSource { 478 public: 479 CPDF_DIBSource(); 480 ~CPDF_DIBSource() override; 481 482 FX_BOOL Load(CPDF_Document* pDoc, 483 const CPDF_Stream* pStream, 484 CPDF_DIBSource** ppMask, 485 FX_DWORD* pMatteColor, 486 CPDF_Dictionary* pFormResources, 487 CPDF_Dictionary* pPageResources, 488 FX_BOOL bStdCS = FALSE, 489 FX_DWORD GroupFamily = 0, 490 FX_BOOL bLoadMask = FALSE); 491 492 // CFX_DIBSource 493 FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const override; 494 uint8_t* GetBuffer() const override; 495 const uint8_t* GetScanline(int line) const override; 496 void DownSampleScanline(int line, 497 uint8_t* dest_scan, 498 int dest_bpp, 499 int dest_width, 500 FX_BOOL bFlipX, 501 int clip_left, 502 int clip_width) const override; 503 void SetDownSampleSize(int dest_width, int dest_height) const override; 504 505 CFX_DIBitmap* GetBitmap() const; 506 void ReleaseBitmap(CFX_DIBitmap*) const; 507 void ClearImageData(); 508 509 int StartLoadDIBSource(CPDF_Document* pDoc, 510 const CPDF_Stream* pStream, 511 FX_BOOL bHasMask, 512 CPDF_Dictionary* pFormResources, 513 CPDF_Dictionary* pPageResources, 514 FX_BOOL bStdCS = FALSE, 515 FX_DWORD GroupFamily = 0, 516 FX_BOOL bLoadMask = FALSE); 517 int ContinueLoadDIBSource(IFX_Pause* pPause); 518 int StratLoadMask(); 519 int StartLoadMaskDIB(); 520 int ContinueLoadMaskDIB(IFX_Pause* pPause); 521 int ContinueToLoadMask(); 522 CPDF_DIBSource* DetachMask(); 523 CPDF_DIBSource* m_pMask; 524 FX_DWORD m_MatteColor; 525 void* m_pJbig2Context; 526 CPDF_StreamAcc* m_pGlobalStream; 527 FX_BOOL m_bStdCS; 528 int m_Status; 529 CPDF_Stream* m_pMaskStream; 530 FX_BOOL m_bHasMask; 531 532 private: 533 bool LoadColorInfo(const CPDF_Dictionary* pFormResources, 534 const CPDF_Dictionary* pPageResources); 535 DIB_COMP_DATA* GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, 536 FX_BOOL& bColorKey); 537 CPDF_DIBSource* LoadMask(FX_DWORD& MatteColor); 538 CPDF_DIBSource* LoadMaskDIB(CPDF_Stream* pMask); 539 void LoadJpxBitmap(); 540 void LoadPalette(); 541 int CreateDecoder(); 542 void TranslateScanline24bpp(uint8_t* dest_scan, 543 const uint8_t* src_scan) const; 544 void ValidateDictParam(); 545 void DownSampleScanline1Bit(int orig_Bpp, 546 int dest_Bpp, 547 FX_DWORD src_width, 548 const uint8_t* pSrcLine, 549 uint8_t* dest_scan, 550 int dest_width, 551 FX_BOOL bFlipX, 552 int clip_left, 553 int clip_width) const; 554 void DownSampleScanline8Bit(int orig_Bpp, 555 int dest_Bpp, 556 FX_DWORD src_width, 557 const uint8_t* pSrcLine, 558 uint8_t* dest_scan, 559 int dest_width, 560 FX_BOOL bFlipX, 561 int clip_left, 562 int clip_width) const; 563 void DownSampleScanline32Bit(int orig_Bpp, 564 int dest_Bpp, 565 FX_DWORD src_width, 566 const uint8_t* pSrcLine, 567 uint8_t* dest_scan, 568 int dest_width, 569 FX_BOOL bFlipX, 570 int clip_left, 571 int clip_width) const; 572 FX_BOOL TransMask() const; 573 574 CPDF_Document* m_pDocument; 575 const CPDF_Stream* m_pStream; 576 CPDF_StreamAcc* m_pStreamAcc; 577 const CPDF_Dictionary* m_pDict; 578 CPDF_ColorSpace* m_pColorSpace; 579 FX_DWORD m_Family; 580 FX_DWORD m_bpc; 581 FX_DWORD m_bpc_orig; 582 FX_DWORD m_nComponents; 583 FX_DWORD m_GroupFamily; 584 FX_BOOL m_bLoadMask; 585 FX_BOOL m_bDefaultDecode; 586 FX_BOOL m_bImageMask; 587 FX_BOOL m_bDoBpcCheck; 588 FX_BOOL m_bColorKey; 589 DIB_COMP_DATA* m_pCompData; 590 uint8_t* m_pLineBuf; 591 uint8_t* m_pMaskedLine; 592 std::unique_ptr<CFX_DIBitmap> m_pCachedBitmap; 593 ICodec_ScanlineDecoder* m_pDecoder; 594}; 595 596#define FPDF_HUGE_IMAGE_SIZE 60000000 597class CPDF_DIBTransferFunc : public CFX_FilteredDIB { 598 public: 599 CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc); 600 ~CPDF_DIBTransferFunc() override; 601 602 // CFX_FilteredDIB 603 FXDIB_Format GetDestFormat() override; 604 FX_ARGB* GetDestPalette() override { return NULL; } 605 void TranslateScanline(uint8_t* dest_buf, 606 const uint8_t* src_buf) const override; 607 void TranslateDownSamples(uint8_t* dest_buf, 608 const uint8_t* src_buf, 609 int pixels, 610 int Bpp) const override; 611 612 const uint8_t* m_RampR; 613 const uint8_t* m_RampG; 614 const uint8_t* m_RampB; 615}; 616 617struct _CPDF_UniqueKeyGen { 618 void Generate(int count, ...); 619 FX_CHAR m_Key[128]; 620 int m_KeyLen; 621}; 622 623#endif // CORE_SRC_FPDFAPI_FPDF_RENDER_RENDER_INT_H_ 624