struct SkAnalyticEdge { // Similar to SkEdge, the conic edges will be converted to quadratic edges enumclass Type : int8_t {
kLine,
kQuad,
kCubic,
}; enumclass Winding : int8_t {
kCW = 1, // clockwise
kCCW = -1, // counter clockwise
};
SkAnalyticEdge* fNext;
SkAnalyticEdge* fPrev;
SkFixed fX;
SkFixed fDX;
SkFixed fUpperX; // The x value when y = fUpperY
SkFixed fY; // The current y
SkFixed fUpperY; // The upper bound of y (our edge is from y = fUpperY to y = fLowerY)
SkFixed fLowerY; // The lower bound of y (our edge is from y = fUpperY to y = fLowerY)
SkFixed fDY; // abs(1/fDX); may be SK_MaxS32 when fDX is close to 0. // fDY is only used for blitting trapezoids.
Type fEdgeType; // Remembers the *initial* edge type
int8_t fCurveCount; // only used by kQuad(+) and kCubic(-)
uint8_t fCurveShift; // appled to all Dx/DDx/DDDx except for fCubicDShift exception
Winding fWinding;
static constexpr int kDefaultAccuracy = 2; // default accuracy for snapping
staticinline SkFixed SnapY(SkFixed y) {
constexpr int accuracy = kDefaultAccuracy; // This approach is safer than left shift, round, then right shift return ((unsigned)y + (SK_Fixed1 >> (accuracy + 1))) >> (16 - accuracy) << (16 - accuracy);
}
// Update fX, fY of this edge so fY = y inlinevoid goY(SkFixed y) { if (y == fY + SK_Fixed1) {
fX = fX + fDX;
fY = y;
} elseif (y != fY) { // Drop lower digits as our alpha only has 8 bits // (fDX and y - fUpperY may be greater than SK_Fixed1)
fX = fUpperX + SkFixedMul(fDX, y - fUpperY);
fY = y;
}
}
inlinevoid goY(SkFixed y, int yShift) {
SkASSERT(yShift >= 0 && yShift <= kDefaultAccuracy);
SkASSERT(fDX == 0 || y - fY == SK_Fixed1 >> yShift);
fY = y;
fX += fDX >> yShift;
}
// snap y to integer points in the middle of the curve to accelerate AAA path filling
SkFixed fSnappedX, fSnappedY;
bool setQuadraticWithoutUpdate(const SkPoint pts[3], int shiftUp); bool setQuadratic(const SkPoint pts[3]); bool updateQuadratic(); inlinevoid keepContinuous() { // We use fX as the starting x to ensure the continuouty. // Without it, we may break the sorted edge list.
SkASSERT(SkAbs32(fX - SkFixedMul(fY - fSnappedY, fDX) - fSnappedX) < SK_Fixed1);
SkASSERT(SkAbs32(fY - fSnappedY) < SK_Fixed1); // This may differ due to smooth jump
fSnappedX = fX;
fSnappedY = fY;
}
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.