#include "include/core/SkColor.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathTypes.h"
#include "include/core/SkRect.h"
#include "include/core/SkRegion.h"
#include "include/core/SkScalar.h"
#include "include/private/base/SkAssert.h"
#include "include/private/base/SkDebug.h"
#include "include/private/base/SkFixed.h"
#include "include/private/base/SkFloatingPoint.h"
#include "include/private/base/SkMacros.h"
#include "include/private/base/SkMath.h"
#include "include/private/base/SkPoint_impl.h"
#include "include/private/base/SkSafe32.h"
#include "src/base/SkTSort.h"
#include "src/core/SkBlitter.h"
#include "src/core/SkEdge.h"
#include "src/core/SkEdgeBuilder.h"
#include "src/core/SkFDot6.h"
#include "src/core/SkRasterClip.h"
#include "src/core/SkRectPriv.h"
#include "src/core/SkScan.h"
#include "src/core/SkScanPriv.h"
#include <algorithm>
#include <cmath>
#include <cstdint>
struct SkMask;
#define kEDGE_HEAD_Y …
#define kEDGE_TAIL_Y …
#ifdef SK_DEBUG
static void validate_sort(const SkEdge* edge) { … }
#else
#define validate_sort …
#endif
static void insert_new_edges(SkEdge* newEdge, int curr_y) { … }
#ifdef SK_DEBUG
static void validate_edges_for_y(const SkEdge* edge, int curr_y) { … }
#else
#define validate_edges_for_y …
#endif
#if defined _WIN32
#pragma warning ( push )
#pragma warning ( disable : 4701 )
#endif
PrePostProc;
#define PREPOST_START …
#define PREPOST_END …
static void walk_edges(SkEdge* prevHead, SkPathFillType fillType,
SkBlitter* blitter, int start_y, int stop_y,
PrePostProc proc, int rightClip) { … }
static bool update_edge(SkEdge* edge, int last_y) { … }
#define ASSERT_RETURN(cond) …
static void walk_simple_edges(SkEdge* prevHead, SkBlitter* blitter, int start_y, int stop_y) { … }
class InverseBlitter : public SkBlitter { … };
static void PrePostInverseBlitterProc(SkBlitter* blitter, int y, bool isStart) { … }
#if defined _WIN32
#pragma warning ( pop )
#endif
static bool operator<(const SkEdge& a, const SkEdge& b) { … }
static SkEdge* sort_edges(SkEdge* list[], int count, SkEdge** last) { … }
void sk_fill_path(const SkPath& path, const SkIRect& clipRect, SkBlitter* blitter,
int start_y, int stop_y, int shiftEdgesUp, bool pathContainedInClip) { … }
void sk_blit_above(SkBlitter* blitter, const SkIRect& ir, const SkRegion& clip) { … }
void sk_blit_below(SkBlitter* blitter, const SkIRect& ir, const SkRegion& clip) { … }
SkScanClipper::SkScanClipper(SkBlitter* blitter, const SkRegion* clip,
const SkIRect& ir, bool skipRejectTest, bool irPreClipped) { … }
static bool clip_to_limit(const SkRegion& orig, SkRegion* reduced) { … }
static const double kConservativeRoundBias = …;
static inline int round_down_to_int(SkScalar x) { … }
static inline int round_up_to_int(SkScalar x) { … }
static SkIRect conservative_round_to_int(const SkRect& src) { … }
void SkScan::FillPath(const SkPath& path, const SkRegion& origClip,
SkBlitter* blitter) { … }
void SkScan::FillPath(const SkPath& path, const SkIRect& ir,
SkBlitter* blitter) { … }
bool SkScan::PathRequiresTiling(const SkIRect& bounds) { … }
static int build_tri_edges(SkEdge edge[], const SkPoint pts[],
const SkIRect* clipRect, SkEdge* list[]) { … }
static void sk_fill_triangle(const SkPoint pts[], const SkIRect* clipRect,
SkBlitter* blitter, const SkIRect& ir) { … }
void SkScan::FillTriangle(const SkPoint pts[], const SkRasterClip& clip,
SkBlitter* blitter) { … }