From 5110c4743751145c4ae1934cd1d83bc6c55bb43f Mon Sep 17 00:00:00 2001 From: John Abd-El-Malek Date: Sat, 17 May 2014 22:33:34 -0700 Subject: Initial commit. --- core/include/fpdfapi/fpdf_render.h | 318 +++++++++++++++++++++++++++++++++++++ 1 file changed, 318 insertions(+) create mode 100644 core/include/fpdfapi/fpdf_render.h (limited to 'core/include/fpdfapi/fpdf_render.h') diff --git a/core/include/fpdfapi/fpdf_render.h b/core/include/fpdfapi/fpdf_render.h new file mode 100644 index 0000000000..22ba56fa66 --- /dev/null +++ b/core/include/fpdfapi/fpdf_render.h @@ -0,0 +1,318 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _FPDF_RENDER_ +#define _FPDF_RENDER_ +#ifndef _FPDF_PAGE_ +#include "fpdf_page.h" +#endif +#ifndef _FX_GE_H_ +#include "../fxge/fx_ge.h" +#endif +class CPDF_RenderContext; +class CPDF_RenderOptions; +class CPDF_ImageCache; +class IPDF_OCContext; +class CPDF_QuickStretcher; +class CFX_PathData; +class CFX_GraphStateData; +class CFX_RenderDevice; +class CPDF_TextObject; +class CPDF_PathObject; +class CPDF_ImageObject; +class CPDF_ShadingObject; +class CPDF_FormObject; +class IPDF_OCContext +{ +public: + + virtual ~IPDF_OCContext() {} + + virtual FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCG) = 0; + + FX_BOOL CheckObjectVisible(const CPDF_PageObject* pObj); +}; +#define RENDER_COLOR_NORMAL 0 +#define RENDER_COLOR_GRAY 1 +#define RENDER_COLOR_TWOCOLOR 2 +#define RENDER_COLOR_ALPHA 3 +#define RENDER_CLEARTYPE 0x00000001 +#define RENDER_PRINTGRAPHICTEXT 0x00000002 +#define RENDER_FORCE_DOWNSAMPLE 0x00000004 +#define RENDER_PRINTPREVIEW 0x00000008 +#define RENDER_BGR_STRIPE 0x00000010 +#define RENDER_NO_NATIVETEXT 0x00000020 +#define RENDER_FORCE_HALFTONE 0x00000040 +#define RENDER_RECT_AA 0x00000080 +#define RENDER_FILL_FULLCOVER 0x00000100 +#define RENDER_PRINTIMAGETEXT 0x00000200 +#define RENDER_OVERPRINT 0x00000400 +#define RENDER_THINLINE 0x00000800 +#define RENDER_NOTEXTSMOOTH 0x10000000 +#define RENDER_NOPATHSMOOTH 0x20000000 +#define RENDER_NOIMAGESMOOTH 0x40000000 +#define RENDER_LIMITEDIMAGECACHE 0x80000000 +class CPDF_RenderOptions : public CFX_Object +{ +public: + + CPDF_RenderOptions(); + + int m_ColorMode; + + FX_COLORREF m_BackColor; + + FX_COLORREF m_ForeColor; + + FX_DWORD m_Flags; + + int m_Interpolation; + + FX_DWORD m_AddFlags; + + IPDF_OCContext* m_pOCContext; + + FX_DWORD m_dwLimitCacheSize; + + int m_HalftoneLimit; + + FX_ARGB TranslateColor(FX_ARGB argb) const; +}; +class CPDF_RenderContext : public CFX_Object +{ +public: + + CPDF_RenderContext(); + + void Create(CPDF_Page* pPage, FX_BOOL bFirstLayer = TRUE); + + void Create(CPDF_Document* pDoc = NULL, CPDF_PageRenderCache* pPageCache = NULL, + CPDF_Dictionary* pPageResources = NULL, FX_BOOL bFirstLayer = TRUE); + + ~CPDF_RenderContext(); + + void Clear(); + + void AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device); + + void SetBackground(class IPDF_BackgroundDraw* pBackground); + + void Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions = NULL, + const CFX_AffineMatrix* pFinalMatrix = NULL); + + void DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs, + const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions); + + void GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj, + const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix); + + CPDF_PageRenderCache* GetPageCache() const + { + return m_pPageCache; + } + + + + CPDF_Document* m_pDocument; + + CPDF_Dictionary* m_pPageResources; + + CPDF_PageRenderCache* m_pPageCache; + +protected: + + CFX_ArrayTemplate m_ContentList; + + IPDF_BackgroundDraw* m_pBackgroundDraw; + + FX_BOOL m_bFirstLayer; + + void Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj, + const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pFinalMatrix); + friend class CPDF_RenderStatus; + friend class CPDF_ProgressiveRenderer; +}; +class IPDF_BackgroundDraw +{ +public: + + virtual void OnDrawBackground( + CFX_RenderDevice* pBitmapDevice, + const CFX_AffineMatrix* pOriginal2Bitmap + ) = 0; +}; +class CPDF_ProgressiveRenderer : public CFX_Object +{ +public: + + CPDF_ProgressiveRenderer(); + + ~CPDF_ProgressiveRenderer(); + + typedef enum { + Ready, + ToBeContinued, + Done, + Failed + } RenderStatus; + + RenderStatus GetStatus() + { + return m_Status; + } + + + + void Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, + const CPDF_RenderOptions* pOptions, class IFX_Pause* pPause, FX_BOOL bDropObjects = FALSE); + + void Continue(class IFX_Pause* pPause); + + + int EstimateProgress(); + + void Clear(); +protected: + + RenderStatus m_Status; + + CPDF_RenderContext* m_pContext; + + CFX_RenderDevice* m_pDevice; + + const CPDF_RenderOptions* m_pOptions; + + FX_BOOL m_bDropObjects; + + class CPDF_RenderStatus* m_pRenderer; + + CFX_FloatRect m_ClipRect; + + FX_DWORD m_LayerIndex; + + FX_DWORD m_ObjectIndex; + + FX_POSITION m_ObjectPos; + + FX_POSITION m_PrevLastPos; + + void RenderStep(); +}; +class CPDF_TextRenderer : public CFX_Object +{ +public: + + static void DrawTextString(CFX_RenderDevice* pDevice, int left, int top, + CPDF_Font* pFont, + int height, + const CFX_ByteString& str, + FX_ARGB argb); + + static void DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, + CPDF_Font* pFont, + FX_FLOAT font_size, + const CFX_AffineMatrix* matrix, + const CFX_ByteString& str, + FX_ARGB fill_argb, + FX_ARGB stroke_argb = 0, + const CFX_GraphStateData* pGraphState = NULL, + const CPDF_RenderOptions* pOptions = NULL + ); + + static FX_BOOL DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, + CPDF_Font* pFont, FX_FLOAT font_size, + const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device, + const CFX_GraphStateData* pGraphState, + FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag = 0); + + static FX_BOOL DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, + CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device, + FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions); + + static FX_BOOL DrawType3Text(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, + CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device, + FX_ARGB fill_argb); +}; +class IPDF_PageImageCache +{ +public: + + static IPDF_PageImageCache* Create(); + + virtual ~IPDF_PageImageCache() {} + + virtual void OutputPage(CFX_RenderDevice* pDevice, CPDF_Page* pPage, + int pos_x, int pos_y, int size_x, int size_y, int rotate) = 0; + + virtual void SetCacheLimit(FX_DWORD limit) = 0; +}; +class CPDF_PageRenderCache : public CFX_Object +{ +public: + CPDF_PageRenderCache(CPDF_Page* pPage) + { + m_pPage = pPage; + m_nTimeCount = 0; + m_nCacheSize = 0; + m_pCurImageCache = NULL; + m_bCurFindCache = FALSE; + m_pCurImageCaches = NULL; + } + ~CPDF_PageRenderCache() + { + ClearAll(); + } + void ClearAll(); + void ClearImageData(); + + FX_DWORD EstimateSize(); + void CacheOptimization(FX_INT32 dwLimitCacheSize); + FX_DWORD GetCachedSize(CPDF_Stream* pStream) const; + FX_DWORD GetTimeCount() const + { + return m_nTimeCount; + } + void SetTimeCount(FX_DWORD dwTimeCount) + { + m_nTimeCount = dwTimeCount; + } + + void GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, + FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, + CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0); + + void ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap); + void ClearImageCache(CPDF_Stream* pStream); + CPDF_Page* GetPage() + { + return m_pPage; + } + CFX_MapPtrToPtr m_ImageCaches; +public: + FX_BOOL StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, + FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, + FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0); + + FX_BOOL Continue(IFX_Pause* pPause); + CPDF_ImageCache* m_pCurImageCache; + CFX_PtrArray* m_pCurImageCaches; +protected: + friend class CPDF_Page; + CPDF_Page* m_pPage; + + FX_DWORD m_nTimeCount; + FX_DWORD m_nCacheSize; + FX_BOOL m_bCurFindCache; +}; +class CPDF_RenderConfig : public CFX_Object +{ +public: + CPDF_RenderConfig(); + ~CPDF_RenderConfig(); + int m_HalftoneLimit; + int m_RenderStepLimit; +}; +#endif -- cgit v1.2.3