blob: 47fbac8a7c8e72a17bf6e249233c5f0e3474ea6f [file] [log] [blame]
// Copyright 2016 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 CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_
#define CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_
#include <memory>
#include <vector>
#include "core/fpdfapi/page/cpdf_clippath.h"
#include "core/fpdfapi/page/cpdf_graphicstates.h"
#include "core/fpdfapi/render/cpdf_renderoptions.h"
#include "core/fxcrt/cfx_unowned_ptr.h"
#include "core/fxge/cfx_renderdevice.h"
class CFX_PathData;
class CPDF_Color;
class CPDF_Dictionary;
class CPDF_Font;
class CPDF_FormObject;
class CPDF_ImageCacheEntry;
class CPDF_ImageObject;
class CPDF_ImageRenderer;
class CPDF_Object;
class CPDF_PageObject;
class CPDF_PageObjectHolder;
class CPDF_PathObject;
class CPDF_ShadingObject;
class CPDF_ShadingPattern;
class CPDF_TilingPattern;
class CPDF_TransferFunc;
class CPDF_Type3Cache;
class CPDF_Type3Char;
class CPDF_Type3Font;
class CPDF_RenderStatus {
public:
CPDF_RenderStatus();
~CPDF_RenderStatus();
bool Initialize(class CPDF_RenderContext* pContext,
CFX_RenderDevice* pDevice,
const CFX_Matrix* pDeviceMatrix,
const CPDF_PageObject* pStopObj,
const CPDF_RenderStatus* pParentStatus,
const CPDF_GraphicStates* pInitialStates,
const CPDF_RenderOptions* pOptions,
int transparency,
bool bDropObjects,
CPDF_Dictionary* pFormResource = nullptr,
bool bStdCS = false,
CPDF_Type3Char* pType3Char = nullptr,
FX_ARGB fill_color = 0,
uint32_t GroupFamily = 0,
bool bLoadMask = false);
void RenderObjectList(const CPDF_PageObjectHolder* pObjectHolder,
const CFX_Matrix* pObj2Device);
void RenderSingleObject(CPDF_PageObject* pObj, const CFX_Matrix* pObj2Device);
bool ContinueSingleObject(CPDF_PageObject* pObj,
const CFX_Matrix* pObj2Device,
IFX_Pause* pPause);
CPDF_RenderContext* GetContext() const { return m_pContext.Get(); }
#if defined _SKIA_SUPPORT_
void DebugVerifyDeviceIsPreMultiplied() const;
#endif
CPDF_RenderOptions m_Options;
CFX_UnownedPtr<CPDF_Dictionary> m_pFormResource;
CFX_UnownedPtr<CPDF_Dictionary> m_pPageResource;
std::vector<CPDF_Type3Font*> m_Type3FontCache;
private:
friend class CPDF_ImageRenderer;
friend class CPDF_RenderContext;
void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_Matrix* pObj2Device);
bool ProcessTransparency(CPDF_PageObject* PageObj,
const CFX_Matrix* pObj2Device);
void ProcessObjectNoClip(CPDF_PageObject* PageObj,
const CFX_Matrix* pObj2Device);
void DrawObjWithBackground(CPDF_PageObject* pObj,
const CFX_Matrix* pObj2Device);
bool DrawObjWithBlend(CPDF_PageObject* pObj, const CFX_Matrix* pObj2Device);
bool ProcessPath(CPDF_PathObject* pPathObj, const CFX_Matrix* pObj2Device);
void ProcessPathPattern(CPDF_PathObject* pPathObj,
const CFX_Matrix* pObj2Device,
int& filltype,
bool& bStroke);
void DrawPathWithPattern(CPDF_PathObject* pPathObj,
const CFX_Matrix* pObj2Device,
const CPDF_Color* pColor,
bool bStroke);
void DrawTilingPattern(CPDF_TilingPattern* pPattern,
CPDF_PageObject* pPageObj,
const CFX_Matrix* pObj2Device,
bool bStroke);
void DrawShadingPattern(CPDF_ShadingPattern* pPattern,
const CPDF_PageObject* pPageObj,
const CFX_Matrix* pObj2Device,
bool bStroke);
bool SelectClipPath(const CPDF_PathObject* pPathObj,
const CFX_Matrix* pObj2Device,
bool bStroke);
bool ProcessImage(CPDF_ImageObject* pImageObj, const CFX_Matrix* pObj2Device);
void CompositeDIBitmap(const CFX_RetainPtr<CFX_DIBitmap>& pDIBitmap,
int left,
int top,
FX_ARGB mask_argb,
int bitmap_alpha,
int blend_mode,
int bIsolated);
void ProcessShading(const CPDF_ShadingObject* pShadingObj,
const CFX_Matrix* pObj2Device);
void DrawShading(CPDF_ShadingPattern* pPattern,
CFX_Matrix* pMatrix,
FX_RECT& clip_rect,
int alpha,
bool bAlphaMode);
bool ProcessType3Text(CPDF_TextObject* textobj,
const CFX_Matrix* pObj2Device);
bool ProcessText(CPDF_TextObject* textobj,
const CFX_Matrix* pObj2Device,
CFX_PathData* pClippingPath);
void DrawTextPathWithPattern(const CPDF_TextObject* textobj,
const CFX_Matrix* pObj2Device,
CPDF_Font* pFont,
float font_size,
const CFX_Matrix* pTextMatrix,
bool bFill,
bool bStroke);
bool ProcessForm(const CPDF_FormObject* pFormObj,
const CFX_Matrix* pObj2Device);
CFX_RetainPtr<CFX_DIBitmap> GetBackdrop(const CPDF_PageObject* pObj,
const FX_RECT& rect,
int& left,
int& top,
bool bBackAlphaRequired);
CFX_RetainPtr<CFX_DIBitmap> LoadSMask(CPDF_Dictionary* pSMaskDict,
FX_RECT* pClipRect,
const CFX_Matrix* pMatrix);
static CFX_RetainPtr<CPDF_Type3Cache> GetCachedType3(CPDF_Type3Font* pFont);
static std::unique_ptr<CPDF_GraphicStates> CloneObjStates(
const CPDF_GraphicStates* pPathObj,
bool bStroke);
CFX_RetainPtr<CPDF_TransferFunc> GetTransferFunc(CPDF_Object* pObject) const;
FX_ARGB GetFillArgb(CPDF_PageObject* pObj, bool bType3 = false) const;
FX_ARGB GetStrokeArgb(CPDF_PageObject* pObj) const;
bool GetObjectClippedRect(const CPDF_PageObject* pObj,
const CFX_Matrix* pObj2Device,
bool bLogical,
FX_RECT& rect) const;
void GetScaledMatrix(CFX_Matrix& matrix) const;
static const int kRenderMaxRecursionDepth = 64;
static int s_CurrentRecursionDepth;
CFX_UnownedPtr<CPDF_RenderContext> m_pContext;
bool m_bStopped;
CFX_RenderDevice* m_pDevice;
CFX_Matrix m_DeviceMatrix;
CPDF_ClipPath m_LastClipPath;
const CPDF_PageObject* m_pCurObj;
const CPDF_PageObject* m_pStopObj;
CPDF_GraphicStates m_InitialStates;
std::unique_ptr<CPDF_ImageRenderer> m_pImageRenderer;
bool m_bPrint;
int m_Transparency;
bool m_bDropObjects;
bool m_bStdCS;
uint32_t m_GroupFamily;
bool m_bLoadMask;
CFX_UnownedPtr<CPDF_Type3Char> m_pType3Char;
FX_ARGB m_T3FillColor;
int m_curBlend;
};
#endif // CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_