#include "core/fxge/skia/fx_skia_device.h"
#include <math.h>
#include <stddef.h>
#include <stdint.h>
#include <algorithm>
#include <array>
#include <limits>
#include <memory>
#include <utility>
#include <vector>
#include "build/build_config.h"
#include "core/fpdfapi/page/cpdf_expintfunc.h"
#include "core/fpdfapi/page/cpdf_function.h"
#include "core/fpdfapi/page/cpdf_meshstream.h"
#include "core/fpdfapi/page/cpdf_sampledfunc.h"
#include "core/fpdfapi/page/cpdf_shadingpattern.h"
#include "core/fpdfapi/page/cpdf_stitchfunc.h"
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_stream.h"
#include "core/fpdfapi/parser/cpdf_stream_acc.h"
#include "core/fxcrt/cfx_bitstream.h"
#include "core/fxcrt/check.h"
#include "core/fxcrt/check_op.h"
#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/fx_2d_size.h"
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/fx_memory.h"
#include "core/fxcrt/fx_system.h"
#include "core/fxcrt/notreached.h"
#include "core/fxcrt/numerics/safe_conversions.h"
#include "core/fxcrt/ptr_util.h"
#include "core/fxcrt/span.h"
#include "core/fxcrt/stl_util.h"
#include "core/fxge/agg/cfx_agg_imagerenderer.h"
#include "core/fxge/cfx_defaultrenderdevice.h"
#include "core/fxge/cfx_fillrenderoptions.h"
#include "core/fxge/cfx_font.h"
#include "core/fxge/cfx_graphstatedata.h"
#include "core/fxge/cfx_path.h"
#include "core/fxge/cfx_renderdevice.h"
#include "core/fxge/cfx_substfont.h"
#include "core/fxge/cfx_textrenderoptions.h"
#include "core/fxge/dib/cfx_dibitmap.h"
#include "core/fxge/dib/cstretchengine.h"
#include "core/fxge/dib/fx_dib.h"
#include "core/fxge/text_char_pos.h"
#include "third_party/skia/include/core/SkBlendMode.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkClipOp.h"
#include "third_party/skia/include/core/SkColorFilter.h"
#include "third_party/skia/include/core/SkColorPriv.h"
#include "third_party/skia/include/core/SkColorType.h"
#include "third_party/skia/include/core/SkImage.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkMaskFilter.h"
#include "third_party/skia/include/core/SkPaint.h"
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkPathEffect.h"
#include "third_party/skia/include/core/SkPathUtils.h"
#include "third_party/skia/include/core/SkPixmap.h"
#include "third_party/skia/include/core/SkRSXform.h"
#include "third_party/skia/include/core/SkRect.h"
#include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/core/SkSamplingOptions.h"
#include "third_party/skia/include/core/SkShader.h"
#include "third_party/skia/include/core/SkStream.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/core/SkTextBlob.h"
#include "third_party/skia/include/core/SkTileMode.h"
#include "third_party/skia/include/core/SkTypeface.h"
#include "third_party/skia/include/effects/SkDashPathEffect.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
#include "third_party/skia/include/pathops/SkPathOps.h"
namespace {
#define SHOW_SKIA_PATH …
#if SHOW_SKIA_PATH
#define SHOW_SKIA_PATH_SHORTHAND …
#endif
#if SHOW_SKIA_PATH
void DebugShowSkiaPaint(const SkPaint& paint) {
if (SkPaint::kFill_Style == paint.getStyle()) {
printf("fill 0x%08x\n", paint.getColor());
} else {
printf("stroke 0x%08x width %g\n", paint.getColor(),
paint.getStrokeWidth());
}
}
#endif
void DebugShowSkiaPath(const SkPath& path) { … }
void DebugShowCanvasClip(CFX_SkiaDeviceDriver* driver, const SkCanvas* canvas) { … }
void DebugShowSkiaDrawPath(CFX_SkiaDeviceDriver* driver,
const SkCanvas* canvas,
const SkPaint& paint,
const SkPath& path) { … }
void DebugShowSkiaDrawRect(CFX_SkiaDeviceDriver* driver,
const SkCanvas* canvas,
const SkPaint& paint,
const SkRect& rect) { … }
void DebugValidate(const RetainPtr<CFX_DIBitmap>& bitmap) { … }
SkColorType Get32BitSkColorType(bool is_rgb_byte_order) { … }
SkPathFillType GetAlternateOrWindingFillType(
const CFX_FillRenderOptions& fill_options) { … }
SkFont::Edging GetFontEdgingType(const CFX_TextRenderOptions& text_options) { … }
bool IsPathAPoint(const SkPath& path) { … }
SkPath BuildPath(const CFX_Path& path) { … }
SkMatrix ToSkMatrix(const CFX_Matrix& m) { … }
SkMatrix ToFlippedSkMatrix(const CFX_Matrix& m, SkScalar flip) { … }
SkBlendMode GetSkiaBlendMode(BlendMode blend_type) { … }
bool AddColors(const CPDF_ExpIntFunc* func,
DataVector<SkColor>& colors,
bool is_encode_reversed) { … }
uint8_t FloatToByte(float f) { … }
bool AddSamples(const CPDF_SampledFunc* func,
DataVector<SkColor>& colors,
DataVector<SkScalar>& pos) { … }
bool AddStitching(const CPDF_StitchFunc* func,
DataVector<SkColor>& colors,
DataVector<SkScalar>& pos) { … }
SkScalar LineSide(const SkPoint& line_start,
const SkPoint& line_end,
const SkPoint& pt) { … }
SkPoint IntersectSides(const SkPoint& parallelPt,
const SkVector& paraRay,
const SkPoint& perpendicularPt) { … }
void ClipAngledGradient(pdfium::span<const SkPoint, 2> pts,
pdfium::span<const SkPoint, 4> rect_pts,
bool clip_start,
bool clip_end,
SkPath* clip) { … }
void PaintStroke(SkPaint* spaint,
const CFX_GraphStateData* graph_state,
const SkMatrix& matrix,
const CFX_FillRenderOptions& fill_options) { … }
void SetBitmapMatrix(const CFX_Matrix& m,
int width,
int height,
SkMatrix* skMatrix) { … }
void SetBitmapPaint(bool is_mask,
bool anti_alias,
float alpha,
uint32_t argb,
BlendMode blend_type,
SkPaint* paint) { … }
void SetBitmapPaintForMerge(bool is_mask,
bool anti_alias,
float alpha,
BlendMode blend_type,
SkPaint* paint) { … }
RetainPtr<CFX_DIBitmap> MakeDebugBitmap(int width, int height, uint32_t color) { … }
bool HasRSX(pdfium::span<const TextCharPos> char_pos,
float* scaleXPtr,
bool* oneAtATimePtr) { … }
}
std::unique_ptr<CFX_SkiaDeviceDriver> CFX_SkiaDeviceDriver::Create(
RetainPtr<CFX_DIBitmap> pBitmap,
bool bRgbByteOrder,
RetainPtr<CFX_DIBitmap> pBackdropBitmap,
bool bGroupKnockout) { … }
std::unique_ptr<CFX_SkiaDeviceDriver> CFX_SkiaDeviceDriver::Create(
SkCanvas& canvas) { … }
CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(
RetainPtr<CFX_DIBitmap> pBitmap,
bool bRgbByteOrder,
RetainPtr<CFX_DIBitmap> pBackdropBitmap,
bool bGroupKnockout)
: … { … }
CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkCanvas& canvas)
: … { … }
CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() { … }
bool CFX_SkiaDeviceDriver::DrawDeviceText(
pdfium::span<const TextCharPos> pCharPos,
CFX_Font* pFont,
const CFX_Matrix& mtObject2Device,
float font_size,
uint32_t color,
const CFX_TextRenderOptions& options) { … }
bool CFX_SkiaDeviceDriver::TryDrawText(pdfium::span<const TextCharPos> char_pos,
const CFX_Font* pFont,
const CFX_Matrix& matrix,
float font_size,
uint32_t color,
const CFX_TextRenderOptions& options) { … }
int CFX_SkiaDeviceDriver::GetDriverType() const { … }
bool CFX_SkiaDeviceDriver::MultiplyAlpha(float alpha) { … }
bool CFX_SkiaDeviceDriver::MultiplyAlphaMask(
RetainPtr<const CFX_DIBitmap> mask) { … }
DeviceType CFX_SkiaDeviceDriver::GetDeviceType() const { … }
int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) const { … }
void CFX_SkiaDeviceDriver::SaveState() { … }
void CFX_SkiaDeviceDriver::RestoreState(bool bKeepSaved) { … }
bool CFX_SkiaDeviceDriver::SetClip_PathFill(
const CFX_Path& path,
const CFX_Matrix* pObject2Device,
const CFX_FillRenderOptions& fill_options) { … }
bool CFX_SkiaDeviceDriver::SetClip_PathStroke(
const CFX_Path& path,
const CFX_Matrix* pObject2Device,
const CFX_GraphStateData* pGraphState
) { … }
bool CFX_SkiaDeviceDriver::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_SkiaDeviceDriver::FillRect(const FX_RECT& rect, uint32_t fill_color) { … }
bool CFX_SkiaDeviceDriver::DrawShading(const CPDF_ShadingPattern& pattern,
const CFX_Matrix& matrix,
const FX_RECT& clip_rect,
int alpha) { … }
FX_RECT CFX_SkiaDeviceDriver::GetClipBox() const { … }
bool CFX_SkiaDeviceDriver::GetDIBits(RetainPtr<CFX_DIBitmap> bitmap,
int left,
int top) const { … }
RetainPtr<const CFX_DIBitmap> CFX_SkiaDeviceDriver::GetBackDrop() const { … }
bool CFX_SkiaDeviceDriver::SetDIBits(RetainPtr<const CFX_DIBBase> bitmap,
uint32_t color,
const FX_RECT& src_rect,
int left,
int top,
BlendMode blend_type) { … }
bool CFX_SkiaDeviceDriver::StretchDIBits(RetainPtr<const CFX_DIBBase> bitmap,
uint32_t color,
int dest_left,
int dest_top,
int dest_width,
int dest_height,
const FX_RECT* pClipRect,
const FXDIB_ResampleOptions& options,
BlendMode blend_type) { … }
RenderDeviceDriverIface::StartResult CFX_SkiaDeviceDriver::StartDIBits(
RetainPtr<const CFX_DIBBase> bitmap,
float alpha,
uint32_t color,
const CFX_Matrix& matrix,
const FXDIB_ResampleOptions& options,
BlendMode blend_type) { … }
void CFX_DIBitmap::PreMultiply() { … }
void CFX_DIBitmap::UnPreMultiply() { … }
bool CFX_SkiaDeviceDriver::DrawBitsWithMask(RetainPtr<const CFX_DIBBase> bitmap,
RetainPtr<const CFX_DIBBase> mask,
float alpha,
const CFX_Matrix& matrix,
BlendMode blend_type) { … }
bool CFX_SkiaDeviceDriver::SetBitsWithMask(RetainPtr<const CFX_DIBBase> bitmap,
RetainPtr<const CFX_DIBBase> mask,
int dest_left,
int dest_top,
float alpha,
BlendMode blend_type) { … }
void CFX_SkiaDeviceDriver::SetGroupKnockout(bool group_knockout) { … }
void CFX_SkiaDeviceDriver::SyncInternalBitmaps() { … }
void CFX_SkiaDeviceDriver::Clear(uint32_t color) { … }
bool CFX_SkiaDeviceDriver::StartDIBitsSkia(RetainPtr<const CFX_DIBBase> bitmap,
const FX_RECT& src_rect,
float alpha,
uint32_t color,
const CFX_Matrix& matrix,
const FXDIB_ResampleOptions& options,
BlendMode blend_type) { … }
void CFX_SkiaDeviceDriver::DrawPathImpl(const SkPath& path,
const SkPaint& paint) { … }
CFX_SkiaDeviceDriver::CharDetail::CharDetail() = default;
CFX_SkiaDeviceDriver::CharDetail::~CharDetail() = default;
bool CFX_DefaultRenderDevice::AttachSkiaImpl(
RetainPtr<CFX_DIBitmap> pBitmap,
bool bRgbByteOrder,
RetainPtr<CFX_DIBitmap> pBackdropBitmap,
bool bGroupKnockout) { … }
bool CFX_DefaultRenderDevice::AttachCanvas(SkCanvas& canvas) { … }
bool CFX_DefaultRenderDevice::CreateSkia(
int width,
int height,
FXDIB_Format format,
RetainPtr<CFX_DIBitmap> pBackdropBitmap) { … }