#include "src/utils/SkShadowTessellator.h"
#include "include/core/SkColor.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPath.h"
#include "include/core/SkPoint.h"
#include "include/core/SkPoint3.h"
#include "include/core/SkRect.h"
#include "include/core/SkTypes.h"
#include "include/core/SkVertices.h"
#include "include/private/SkColorData.h"
#include "include/private/base/SkFloatingPoint.h"
#include "include/private/base/SkTDArray.h"
#include "include/private/base/SkTemplates.h"
#include "src/core/SkDrawShadowInfo.h"
#include "src/core/SkGeometry.h"
#include "src/core/SkPointPriv.h"
#include "src/core/SkRectPriv.h"
#include "src/utils/SkPolyUtils.h"
#include <algorithm>
#include <cstdint>
#if defined(SK_GANESH)
#include "src/gpu/ganesh/geometry/GrPathUtils.h"
#endif
usingnamespaceskia_private;
#if !defined(SK_ENABLE_OPTIMIZE_SIZE)
class SkBaseShadowTessellator { … };
static bool compute_normal(const SkPoint& p0, const SkPoint& p1, SkScalar dir,
SkVector* newNormal) { … }
static bool duplicate_pt(const SkPoint& p0, const SkPoint& p1) { … }
static SkScalar perp_dot(const SkPoint& p0, const SkPoint& p1, const SkPoint& p2) { … }
SkBaseShadowTessellator::SkBaseShadowTessellator(const SkPoint3& zPlaneParams, const SkRect& bounds,
bool transparent)
: … { … }
bool SkBaseShadowTessellator::accumulateCentroid(const SkPoint& curr, const SkPoint& next) { … }
bool SkBaseShadowTessellator::checkConvexity(const SkPoint& p0,
const SkPoint& p1,
const SkPoint& p2) { … }
void SkBaseShadowTessellator::finishPathPolygon() { … }
bool SkBaseShadowTessellator::computeConvexShadow(SkScalar inset, SkScalar outset, bool doClip) { … }
void SkBaseShadowTessellator::computeClipVectorsAndTestCentroid() { … }
void SkBaseShadowTessellator::addEdge(const SkPoint& nextPoint, const SkVector& nextNormal,
SkColor umbraColor, const SkTDArray<SkPoint>& umbraPolygon,
bool lastEdge, bool doClip) { … }
bool SkBaseShadowTessellator::clipUmbraPoint(const SkPoint& umbraPoint, const SkPoint& centroid,
SkPoint* clipPoint) { … }
bool SkBaseShadowTessellator::addInnerPoint(const SkPoint& pathPoint, SkColor umbraColor,
const SkTDArray<SkPoint>& umbraPolygon,
int* currUmbraIndex) { … }
int SkBaseShadowTessellator::getClosestUmbraIndex(const SkPoint& p,
const SkTDArray<SkPoint>& umbraPolygon) { … }
bool SkBaseShadowTessellator::computeConcaveShadow(SkScalar inset, SkScalar outset) { … }
void SkBaseShadowTessellator::stitchConcaveRings(const SkTDArray<SkPoint>& umbraPolygon,
SkTDArray<int>* umbraIndices,
const SkTDArray<SkPoint>& penumbraPolygon,
SkTDArray<int>* penumbraIndices) { … }
#if defined(SK_GANESH)
static constexpr SkScalar kQuadTolerance = …;
static constexpr SkScalar kCubicTolerance = …;
static constexpr SkScalar kQuadToleranceSqd = …;
static constexpr SkScalar kCubicToleranceSqd = …;
#endif
static constexpr SkScalar kConicTolerance = …;
static void sanitize_point(const SkPoint& in, SkPoint* out) { … }
void SkBaseShadowTessellator::handleLine(const SkPoint& p) { … }
void SkBaseShadowTessellator::handleLine(const SkMatrix& m, SkPoint* p) { … }
void SkBaseShadowTessellator::handleQuad(const SkPoint pts[3]) { … }
void SkBaseShadowTessellator::handleQuad(const SkMatrix& m, SkPoint pts[3]) { … }
void SkBaseShadowTessellator::handleCubic(const SkMatrix& m, SkPoint pts[4]) { … }
void SkBaseShadowTessellator::handleConic(const SkMatrix& m, SkPoint pts[3], SkScalar w) { … }
bool SkBaseShadowTessellator::addArc(const SkVector& nextNormal, SkScalar offset, bool finishArc) { … }
void SkBaseShadowTessellator::appendTriangle(uint16_t index0, uint16_t index1, uint16_t index2) { … }
void SkBaseShadowTessellator::appendQuad(uint16_t index0, uint16_t index1,
uint16_t index2, uint16_t index3) { … }
class SkAmbientShadowTessellator : public SkBaseShadowTessellator { … };
SkAmbientShadowTessellator::SkAmbientShadowTessellator(const SkPath& path,
const SkMatrix& ctm,
const SkPoint3& zPlaneParams,
bool transparent)
: … { … }
bool SkAmbientShadowTessellator::computePathPolygon(const SkPath& path, const SkMatrix& ctm) { … }
class SkSpotShadowTessellator : public SkBaseShadowTessellator { … };
SkSpotShadowTessellator::SkSpotShadowTessellator(const SkPath& path, const SkMatrix& ctm,
const SkPoint3& zPlaneParams,
const SkPoint3& lightPos, SkScalar lightRadius,
bool transparent, bool directional)
: … { … }
bool SkSpotShadowTessellator::computeClipAndPathPolygons(const SkPath& path, const SkMatrix& ctm,
const SkMatrix& shadowTransform) { … }
void SkSpotShadowTessellator::addToClip(const SkPoint& point) { … }
sk_sp<SkVertices> SkShadowTessellator::MakeAmbient(const SkPath& path, const SkMatrix& ctm,
const SkPoint3& zPlane, bool transparent) { … }
sk_sp<SkVertices> SkShadowTessellator::MakeSpot(const SkPath& path, const SkMatrix& ctm,
const SkPoint3& zPlane, const SkPoint3& lightPos,
SkScalar lightRadius, bool transparent,
bool directional) { … }
#endif