#include "core/fxge/cfx_renderdevice.h"
#include <math.h>
#include <algorithm>
#include <memory>
#include <utility>
#include "build/build_config.h"
#include "core/fxcrt/check.h"
#include "core/fxcrt/check_op.h"
#include "core/fxcrt/compiler_specific.h"
#include "core/fxcrt/fx_safe_types.h"
#include "core/fxcrt/span.h"
#include "core/fxge/cfx_color.h"
#include "core/fxge/cfx_defaultrenderdevice.h"
#include "core/fxge/cfx_fillrenderoptions.h"
#include "core/fxge/cfx_font.h"
#include "core/fxge/cfx_fontmgr.h"
#include "core/fxge/cfx_gemodule.h"
#include "core/fxge/cfx_glyphbitmap.h"
#include "core/fxge/cfx_glyphcache.h"
#include "core/fxge/cfx_graphstatedata.h"
#include "core/fxge/cfx_path.h"
#include "core/fxge/cfx_textrenderoptions.h"
#include "core/fxge/dib/cfx_dibitmap.h"
#include "core/fxge/fx_font.h"
#include "core/fxge/renderdevicedriver_iface.h"
#include "core/fxge/text_char_pos.h"
#include "core/fxge/text_glyph_pos.h"
#if defined(PDF_USE_SKIA)
#include "third_party/skia/include/core/SkTypes.h"
#endif
namespace {
void AdjustGlyphSpace(std::vector<TextGlyphPos>* pGlyphAndPos) { … }
constexpr std::array<const uint8_t, 256> kTextGammaAdjust = …;
int TextGammaAdjust(int value) { … }
int CalcAlpha(int src, int alpha) { … }
void MergeGammaAdjust(uint8_t src, int channel, int alpha, uint8_t* dest) { … }
void MergeGammaAdjustRgb(const uint8_t* src,
const FX_BGRA_STRUCT<uint8_t>& bgra,
uint8_t* dest) { … }
int AverageRgb(const uint8_t* src) { … }
uint8_t CalculateDestAlpha(uint8_t back_alpha, int src_alpha) { … }
void ApplyAlpha(uint8_t* dest, const FX_BGRA_STRUCT<uint8_t>& bgra, int alpha) { … }
void ApplyDestAlpha(uint8_t back_alpha,
int src_alpha,
const FX_BGRA_STRUCT<uint8_t>& bgra,
uint8_t* dest) { … }
void NormalizeArgb(int src_value,
const FX_BGRA_STRUCT<uint8_t>& bgra,
uint8_t* dest,
int src_alpha) { … }
void NormalizeDest(bool has_alpha,
int src_value,
const FX_BGRA_STRUCT<uint8_t>& bgra,
uint8_t* dest) { … }
void NormalizeSrc(bool has_alpha,
int src_value,
const FX_BGRA_STRUCT<uint8_t>& bgra,
uint8_t* dest) { … }
void NextPixel(const uint8_t** src_scan, uint8_t** dst_scan, int bpp) { … }
void SetAlpha(bool has_alpha, uint8_t* alpha) { … }
void DrawNormalTextHelper(const RetainPtr<CFX_DIBitmap>& bitmap,
const RetainPtr<CFX_DIBitmap>& pGlyph,
int nrows,
int left,
int top,
int start_col,
int end_col,
bool normalize,
int x_subpixel,
const FX_BGRA_STRUCT<uint8_t>& bgra) { … }
bool ShouldDrawDeviceText(const CFX_Font* pFont,
const CFX_TextRenderOptions& options) { … }
bool CheckSimpleLinePath(pdfium::span<const CFX_Path::Point> points,
const CFX_Matrix* matrix,
bool adjust,
CFX_Path* new_path,
bool* thin,
bool* set_identity) { … }
bool CheckPalindromicPath(pdfium::span<const CFX_Path::Point> points,
CFX_Path* new_path,
bool* thin) { … }
bool IsFoldingVerticalLine(const CFX_PointF& a,
const CFX_PointF& b,
const CFX_PointF& c) { … }
bool IsFoldingHorizontalLine(const CFX_PointF& a,
const CFX_PointF& b,
const CFX_PointF& c) { … }
bool IsFoldingDiagonalLine(const CFX_PointF& a,
const CFX_PointF& b,
const CFX_PointF& c) { … }
bool GetZeroAreaPath(pdfium::span<const CFX_Path::Point> points,
const CFX_Matrix* matrix,
bool adjust,
CFX_Path* new_path,
bool* thin,
bool* set_identity) { … }
FXDIB_Format GetCreateCompatibleBitmapFormat(int render_caps,
bool use_argb_premul) { … }
}
CFX_RenderDevice::CFX_RenderDevice() = default;
CFX_RenderDevice::~CFX_RenderDevice() { … }
CFX_Matrix CFX_RenderDevice::GetFlipMatrix(float width,
float height,
float left,
float top) { … }
void CFX_RenderDevice::SetDeviceDriver(
std::unique_ptr<RenderDeviceDriverIface> pDriver) { … }
void CFX_RenderDevice::InitDeviceInfo() { … }
void CFX_RenderDevice::SaveState() { … }
void CFX_RenderDevice::RestoreState(bool bKeepSaved) { … }
int CFX_RenderDevice::GetDeviceCaps(int caps_id) const { … }
RetainPtr<CFX_DIBitmap> CFX_RenderDevice::GetBitmap() { … }
RetainPtr<const CFX_DIBitmap> CFX_RenderDevice::GetBitmap() const { … }
void CFX_RenderDevice::SetBitmap(RetainPtr<CFX_DIBitmap> bitmap) { … }
bool CFX_RenderDevice::CreateCompatibleBitmap(
const RetainPtr<CFX_DIBitmap>& pDIB,
int width,
int height) const { … }
void CFX_RenderDevice::SetBaseClip(const FX_RECT& rect) { … }
bool CFX_RenderDevice::SetClip_PathFill(
const CFX_Path& path,
const CFX_Matrix* pObject2Device,
const CFX_FillRenderOptions& fill_options) { … }
bool CFX_RenderDevice::SetClip_PathStroke(
const CFX_Path& path,
const CFX_Matrix* pObject2Device,
const CFX_GraphStateData* pGraphState) { … }
bool CFX_RenderDevice::SetClip_Rect(const FX_RECT& rect) { … }
void CFX_RenderDevice::UpdateClipBox() { … }
bool CFX_RenderDevice::DrawPath(const CFX_Path& path,
const CFX_Matrix* pObject2Device,
const CFX_GraphStateData* pGraphState,
uint32_t fill_color,
uint32_t stroke_color,
const CFX_FillRenderOptions& fill_options) { … }
bool CFX_RenderDevice::DrawFillStrokePath(
const CFX_Path& path,
const CFX_Matrix* pObject2Device,
const CFX_GraphStateData* pGraphState,
uint32_t fill_color,
uint32_t stroke_color,
const CFX_FillRenderOptions& fill_options) { … }
bool CFX_RenderDevice::FillRect(const FX_RECT& rect, uint32_t fill_color) { … }
bool CFX_RenderDevice::DrawCosmeticLine(
const CFX_PointF& ptMoveTo,
const CFX_PointF& ptLineTo,
uint32_t color,
const CFX_FillRenderOptions& fill_options) { … }
void CFX_RenderDevice::DrawZeroAreaPath(
const std::vector<CFX_Path::Point>& path,
const CFX_Matrix* matrix,
bool adjust,
bool aliased_path,
uint32_t fill_color,
uint8_t fill_alpha) { … }
bool CFX_RenderDevice::GetDIBits(RetainPtr<CFX_DIBitmap> bitmap,
int left,
int top) const { … }
bool CFX_RenderDevice::SetDIBits(RetainPtr<const CFX_DIBBase> bitmap,
int left,
int top) { … }
RetainPtr<const CFX_DIBitmap> CFX_RenderDevice::GetBackDrop() const { … }
bool CFX_RenderDevice::SetDIBitsWithBlend(RetainPtr<const CFX_DIBBase> bitmap,
int left,
int top,
BlendMode blend_mode) { … }
bool CFX_RenderDevice::StretchDIBits(RetainPtr<const CFX_DIBBase> bitmap,
int left,
int top,
int dest_width,
int dest_height) { … }
bool CFX_RenderDevice::StretchDIBitsWithFlagsAndBlend(
RetainPtr<const CFX_DIBBase> bitmap,
int left,
int top,
int dest_width,
int dest_height,
const FXDIB_ResampleOptions& options,
BlendMode blend_mode) { … }
bool CFX_RenderDevice::SetBitMask(RetainPtr<const CFX_DIBBase> bitmap,
int left,
int top,
uint32_t argb) { … }
bool CFX_RenderDevice::StretchBitMask(RetainPtr<CFX_DIBBase> bitmap,
int left,
int top,
int dest_width,
int dest_height,
uint32_t color) { … }
bool CFX_RenderDevice::StretchBitMaskWithFlags(
RetainPtr<CFX_DIBBase> bitmap,
int left,
int top,
int dest_width,
int dest_height,
uint32_t argb,
const FXDIB_ResampleOptions& options) { … }
RenderDeviceDriverIface::StartResult CFX_RenderDevice::StartDIBits(
RetainPtr<const CFX_DIBBase> bitmap,
float alpha,
uint32_t argb,
const CFX_Matrix& matrix,
const FXDIB_ResampleOptions& options) { … }
RenderDeviceDriverIface::StartResult CFX_RenderDevice::StartDIBitsWithBlend(
RetainPtr<const CFX_DIBBase> bitmap,
float alpha,
uint32_t argb,
const CFX_Matrix& matrix,
const FXDIB_ResampleOptions& options,
BlendMode blend_mode) { … }
bool CFX_RenderDevice::ContinueDIBits(CFX_AggImageRenderer* handle,
PauseIndicatorIface* pPause) { … }
#if defined(PDF_USE_SKIA)
bool CFX_RenderDevice::DrawShading(const CPDF_ShadingPattern& pattern,
const CFX_Matrix& matrix,
const FX_RECT& clip_rect,
int alpha) { … }
bool CFX_RenderDevice::SetBitsWithMask(RetainPtr<const CFX_DIBBase> bitmap,
RetainPtr<const CFX_DIBBase> mask,
int left,
int top,
float alpha,
BlendMode blend_type) { … }
void CFX_RenderDevice::SyncInternalBitmaps() { … }
#endif
bool CFX_RenderDevice::DrawNormalText(pdfium::span<const TextCharPos> pCharPos,
CFX_Font* pFont,
float font_size,
const CFX_Matrix& mtText2Device,
uint32_t fill_color,
const CFX_TextRenderOptions& options) { … }
bool CFX_RenderDevice::DrawTextPath(pdfium::span<const TextCharPos> pCharPos,
CFX_Font* pFont,
float font_size,
const CFX_Matrix& mtText2User,
const CFX_Matrix* pUser2Device,
const CFX_GraphStateData* pGraphState,
uint32_t fill_color,
FX_ARGB stroke_color,
CFX_Path* pClippingPath,
const CFX_FillRenderOptions& fill_options) { … }
void CFX_RenderDevice::DrawFillRect(const CFX_Matrix* pUser2Device,
const CFX_FloatRect& rect,
const FX_COLORREF& color) { … }
void CFX_RenderDevice::DrawFillArea(const CFX_Matrix& mtUser2Device,
const std::vector<CFX_PointF>& points,
const FX_COLORREF& color) { … }
void CFX_RenderDevice::DrawStrokeRect(const CFX_Matrix& mtUser2Device,
const CFX_FloatRect& rect,
const FX_COLORREF& color,
float fWidth) { … }
void CFX_RenderDevice::DrawStrokeLine(const CFX_Matrix* pUser2Device,
const CFX_PointF& ptMoveTo,
const CFX_PointF& ptLineTo,
const FX_COLORREF& color,
float fWidth) { … }
void CFX_RenderDevice::DrawFillRect(const CFX_Matrix* pUser2Device,
const CFX_FloatRect& rect,
const CFX_Color& color,
int32_t nTransparency) { … }
void CFX_RenderDevice::DrawShadow(const CFX_Matrix& mtUser2Device,
const CFX_FloatRect& rect,
int32_t nTransparency,
int32_t nStartGray,
int32_t nEndGray) { … }
void CFX_RenderDevice::DrawBorder(const CFX_Matrix* pUser2Device,
const CFX_FloatRect& rect,
float fWidth,
const CFX_Color& color,
const CFX_Color& crLeftTop,
const CFX_Color& crRightBottom,
BorderStyle nStyle,
int32_t nTransparency) { … }
bool CFX_RenderDevice::MultiplyAlpha(float alpha) { … }
bool CFX_RenderDevice::MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) { … }
CFX_RenderDevice::StateRestorer::StateRestorer(CFX_RenderDevice* pDevice)
: … { … }
CFX_RenderDevice::StateRestorer::~StateRestorer() { … }