#include "core/fpdfapi/render/cpdf_rendershading.h"
#include <math.h>
#include <algorithm>
#include <array>
#include <memory>
#include <utility>
#include <vector>
#include "core/fpdfapi/page/cpdf_colorspace.h"
#include "core/fpdfapi/page/cpdf_dib.h"
#include "core/fpdfapi/page/cpdf_function.h"
#include "core/fpdfapi/page/cpdf_meshstream.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/fpdf_parser_utility.h"
#include "core/fpdfapi/render/cpdf_devicebuffer.h"
#include "core/fpdfapi/render/cpdf_renderoptions.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/fx_system.h"
#include "core/fxcrt/numerics/clamped_math.h"
#include "core/fxcrt/span.h"
#include "core/fxcrt/span_util.h"
#include "core/fxcrt/stl_util.h"
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxge/cfx_defaultrenderdevice.h"
#include "core/fxge/cfx_fillrenderoptions.h"
#include "core/fxge/cfx_path.h"
#include "core/fxge/dib/cfx_dibitmap.h"
#include "core/fxge/dib/fx_dib.h"
namespace {
constexpr int kShadingSteps = …;
uint32_t CountOutputsFromFunctions(
const std::vector<std::unique_ptr<CPDF_Function>>& funcs) { … }
uint32_t GetValidatedOutputsCount(
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
const RetainPtr<CPDF_ColorSpace>& pCS) { … }
std::array<FX_ARGB, kShadingSteps> GetShadingSteps(
float t_min,
float t_max,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
const RetainPtr<CPDF_ColorSpace>& pCS,
int alpha,
size_t results_count) { … }
void DrawAxialShading(const RetainPtr<CFX_DIBitmap>& pBitmap,
const CFX_Matrix& mtObject2Bitmap,
const CPDF_Dictionary* pDict,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
const RetainPtr<CPDF_ColorSpace>& pCS,
int alpha) { … }
void DrawRadialShading(const RetainPtr<CFX_DIBitmap>& pBitmap,
const CFX_Matrix& mtObject2Bitmap,
const CPDF_Dictionary* pDict,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
const RetainPtr<CPDF_ColorSpace>& pCS,
int alpha) { … }
void DrawFuncShading(const RetainPtr<CFX_DIBitmap>& pBitmap,
const CFX_Matrix& mtObject2Bitmap,
const CPDF_Dictionary* pDict,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
const RetainPtr<CPDF_ColorSpace>& pCS,
int alpha) { … }
bool GetScanlineIntersect(int y,
const CFX_PointF& first,
const CFX_PointF& second,
float* x) { … }
void DrawGouraud(const RetainPtr<CFX_DIBitmap>& pBitmap,
int alpha,
pdfium::span<CPDF_MeshVertex, 3> triangle) { … }
void DrawFreeGouraudShading(
const RetainPtr<CFX_DIBitmap>& pBitmap,
const CFX_Matrix& mtObject2Bitmap,
RetainPtr<const CPDF_Stream> pShadingStream,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
RetainPtr<CPDF_ColorSpace> pCS,
int alpha) { … }
void DrawLatticeGouraudShading(
const RetainPtr<CFX_DIBitmap>& pBitmap,
const CFX_Matrix& mtObject2Bitmap,
RetainPtr<const CPDF_Stream> pShadingStream,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
RetainPtr<CPDF_ColorSpace> pCS,
int alpha) { … }
struct CoonBezierCoeff { … };
struct CoonBezier { … };
int Interpolate(int p1, int p2, int delta1, int delta2, bool* overflow) { … }
int BiInterpolImpl(int c0,
int c1,
int c2,
int c3,
int x,
int y,
int x_scale,
int y_scale,
bool* overflow) { … }
struct CoonColor { … };
struct PatchDrawer { … };
void DrawCoonPatchMeshes(
ShadingType type,
const RetainPtr<CFX_DIBitmap>& pBitmap,
const CFX_Matrix& mtObject2Bitmap,
RetainPtr<const CPDF_Stream> pShadingStream,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
RetainPtr<CPDF_ColorSpace> pCS,
bool bNoPathSmooth,
int alpha) { … }
}
void CPDF_RenderShading::Draw(CFX_RenderDevice* pDevice,
CPDF_RenderContext* pContext,
const CPDF_PageObject* pCurObj,
const CPDF_ShadingPattern* pPattern,
const CFX_Matrix& mtMatrix,
const FX_RECT& clip_rect,
int alpha,
const CPDF_RenderOptions& options) { … }