blob: 5f896943e1c9734d85920c11688e216d0341c0c4 [file] [log] [blame] [edit]
// Copyright 2016 The PDFium Authors
// 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 <utility>
#include <vector>
#include "build/build_config.h"
#include "core/fpdfapi/page/cpdf_clippath.h"
#include "core/fpdfapi/page/cpdf_colorspace.h"
#include "core/fpdfapi/page/cpdf_graphicstates.h"
#include "core/fpdfapi/page/cpdf_transparency.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/render/cpdf_renderoptions.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxge/dib/fx_dib.h"
class CFX_DIBitmap;
class CFX_Path;
class CFX_RenderDevice;
class CPDF_Color;
class CPDF_Font;
class CPDF_FormObject;
class CPDF_ImageObject;
class CPDF_ImageRenderer;
class CPDF_Object;
class CPDF_PageObject;
class CPDF_PageObjectHolder;
class CPDF_PathObject;
class CPDF_RenderContext;
class CPDF_ShadingObject;
class CPDF_ShadingPattern;
class CPDF_TilingPattern;
class CPDF_TransferFunc;
class CPDF_Type3Char;
class CPDF_Type3Font;
class PauseIndicatorIface;
class CPDF_RenderStatus {
public:
CPDF_RenderStatus(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice);
~CPDF_RenderStatus();
// Called prior to Initialize().
void SetOptions(const CPDF_RenderOptions& options) { m_Options = options; }
void SetDeviceMatrix(const CFX_Matrix& matrix) { m_DeviceMatrix = matrix; }
void SetStopObject(const CPDF_PageObject* pStopObj) { m_pStopObj = pStopObj; }
void SetFormResource(RetainPtr<const CPDF_Dictionary> pRes) {
m_pFormResource = std::move(pRes);
}
void SetType3Char(CPDF_Type3Char* pType3Char) { m_pType3Char = pType3Char; }
void SetFillColor(FX_ARGB color) { m_T3FillColor = color; }
void SetDropObjects(bool bDropObjects) { m_bDropObjects = bDropObjects; }
void SetLoadMask(bool bLoadMask) { m_bLoadMask = bLoadMask; }
void SetStdCS(bool bStdCS) { m_bStdCS = bStdCS; }
void SetGroupFamily(CPDF_ColorSpace::Family family) {
m_GroupFamily = family;
}
void SetTransparency(const CPDF_Transparency& transparency) {
m_Transparency = transparency;
}
void SetInGroup(bool bInGroup) { m_bInGroup = bInGroup; }
void Initialize(const CPDF_RenderStatus* pParentStatus,
const CPDF_GraphicStates* pInitialStates);
void RenderObjectList(const CPDF_PageObjectHolder* pObjectHolder,
const CFX_Matrix& mtObj2Device);
void RenderSingleObject(CPDF_PageObject* pObj,
const CFX_Matrix& mtObj2Device);
bool ContinueSingleObject(CPDF_PageObject* pObj,
const CFX_Matrix& mtObj2Device,
PauseIndicatorIface* pPause);
void ProcessClipPath(const CPDF_ClipPath& ClipPath,
const CFX_Matrix& mtObj2Device);
CPDF_ColorSpace::Family GetGroupFamily() const { return m_GroupFamily; }
bool GetLoadMask() const { return m_bLoadMask; }
bool GetDropObjects() const { return m_bDropObjects; }
bool IsPrint() const {
#if BUILDFLAG(IS_WIN)
return m_bPrint;
#else
return false;
#endif
}
bool IsStopped() const { return m_bStopped; }
CPDF_RenderContext* GetContext() const { return m_pContext; }
const CPDF_Dictionary* GetFormResource() const {
return m_pFormResource.Get();
}
const CPDF_Dictionary* GetPageResource() const {
return m_pPageResource.Get();
}
CFX_RenderDevice* GetRenderDevice() const { return m_pDevice; }
const CPDF_RenderOptions& GetRenderOptions() const { return m_Options; }
RetainPtr<CPDF_TransferFunc> GetTransferFunc(
RetainPtr<const CPDF_Object> pObject) const;
FX_ARGB GetFillArgb(CPDF_PageObject* pObj) const;
FX_ARGB GetFillArgbForType3(CPDF_PageObject* pObj) const;
void DrawTilingPattern(CPDF_TilingPattern* pattern,
CPDF_PageObject* pPageObj,
const CFX_Matrix& mtObj2Device,
bool stroke);
void DrawShadingPattern(CPDF_ShadingPattern* pattern,
const CPDF_PageObject* pPageObj,
const CFX_Matrix& mtObj2Device,
bool stroke);
// `pDIBitmap` must be non-null.
void CompositeDIBitmap(RetainPtr<CFX_DIBitmap> bitmap,
int left,
int top,
FX_ARGB mask_argb,
float alpha,
BlendMode blend_mode,
const CPDF_Transparency& transparency);
static std::unique_ptr<CPDF_GraphicStates> CloneObjStates(
const CPDF_GraphicStates* pSrcStates,
bool stroke);
private:
bool ProcessTransparency(CPDF_PageObject* PageObj,
const CFX_Matrix& mtObj2Device);
void ProcessObjectNoClip(CPDF_PageObject* pObj,
const CFX_Matrix& mtObj2Device);
void DrawObjWithBackground(CPDF_PageObject* pObj,
const CFX_Matrix& mtObj2Device);
void DrawObjWithBackgroundToDevice(CPDF_PageObject* obj,
const CFX_Matrix& object_to_device,
CFX_RenderDevice* device,
const CFX_Matrix& device_matrix);
bool DrawObjWithBlend(CPDF_PageObject* pObj, const CFX_Matrix& mtObj2Device);
bool ProcessPath(CPDF_PathObject* path_obj, const CFX_Matrix& mtObj2Device);
void ProcessPathPattern(CPDF_PathObject* path_obj,
const CFX_Matrix& mtObj2Device,
CFX_FillRenderOptions::FillType* fill_type,
bool* stroke);
void DrawPathWithPattern(CPDF_PathObject* path_obj,
const CFX_Matrix& mtObj2Device,
const CPDF_Color* pColor,
bool stroke);
bool ClipPattern(const CPDF_PageObject* page_obj,
const CFX_Matrix& mtObj2Device,
bool stroke);
bool SelectClipPath(const CPDF_PathObject* path_obj,
const CFX_Matrix& mtObj2Device,
bool stroke);
bool ProcessImage(CPDF_ImageObject* pImageObj,
const CFX_Matrix& mtObj2Device);
void ProcessShading(const CPDF_ShadingObject* pShadingObj,
const CFX_Matrix& mtObj2Device);
bool ProcessType3Text(CPDF_TextObject* textobj,
const CFX_Matrix& mtObj2Device);
bool ProcessText(CPDF_TextObject* textobj,
const CFX_Matrix& mtObj2Device,
CFX_Path* clipping_path);
void DrawTextPathWithPattern(const CPDF_TextObject* textobj,
const CFX_Matrix& mtObj2Device,
CPDF_Font* pFont,
float font_size,
const CFX_Matrix& mtTextMatrix,
bool fill,
bool stroke);
bool ProcessForm(const CPDF_FormObject* pFormObj,
const CFX_Matrix& mtObj2Device);
FX_RECT GetClippedBBox(const FX_RECT& rect) const;
RetainPtr<CFX_DIBitmap> GetBackdrop(const CPDF_PageObject* pObj,
const FX_RECT& bbox,
bool bBackAlphaRequired);
RetainPtr<CFX_DIBitmap> LoadSMask(CPDF_Dictionary* smask_dict,
const FX_RECT& clip_rect,
const CFX_Matrix& smask_matrix);
// Optionally write the colorspace family value into |pCSFamily|.
FX_ARGB GetBackgroundColor(const CPDF_Dictionary* pSMaskDict,
const CPDF_Dictionary* pGroupDict,
CPDF_ColorSpace::Family* pCSFamily);
FX_ARGB GetStrokeArgb(CPDF_PageObject* pObj) const;
FX_RECT GetObjectClippedRect(const CPDF_PageObject* pObj,
const CFX_Matrix& mtObj2Device) const;
// Returns the format that is compatible with `m_pDevice`.
FXDIB_Format GetCompatibleArgbFormat() const;
CPDF_RenderOptions m_Options;
RetainPtr<const CPDF_Dictionary> m_pFormResource;
RetainPtr<const CPDF_Dictionary> m_pPageResource;
std::vector<UnownedPtr<const CPDF_Type3Font>> m_Type3FontCache;
UnownedPtr<CPDF_RenderContext> const m_pContext;
UnownedPtr<CFX_RenderDevice> const m_pDevice;
CFX_Matrix m_DeviceMatrix;
CPDF_ClipPath m_LastClipPath;
UnownedPtr<const CPDF_PageObject> m_pCurObj;
UnownedPtr<const CPDF_PageObject> m_pStopObj;
CPDF_GraphicStates m_InitialStates;
std::unique_ptr<CPDF_ImageRenderer> m_pImageRenderer;
UnownedPtr<const CPDF_Type3Char> m_pType3Char;
CPDF_Transparency m_Transparency;
bool m_bStopped = false;
#if BUILDFLAG(IS_WIN)
bool m_bPrint = false;
#endif
bool m_bDropObjects = false;
bool m_bStdCS = false;
bool m_bLoadMask = false;
bool m_bInGroup = false;
CPDF_ColorSpace::Family m_GroupFamily = CPDF_ColorSpace::Family::kUnknown;
FX_ARGB m_T3FillColor = 0;
BlendMode m_curBlend = BlendMode::kNormal;
};
#endif // CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_