Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | List of all members
SkAnalyticEdge Struct Reference

#include <SkAnalyticEdge.h>

Inheritance diagram for SkAnalyticEdge:
SkAnalyticCubicEdge SkAnalyticQuadraticEdge

Public Types

enum  Type { kLine_Type , kQuad_Type , kCubic_Type }
 

Public Member Functions

void goY (SkFixed y)
 
void goY (SkFixed y, int yShift)
 
void saveXY (SkFixed x, SkFixed y, SkFixed dY)
 
bool setLine (const SkPoint &p0, const SkPoint &p1)
 
bool updateLine (SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by, SkFixed slope)
 
bool update (SkFixed last_y, bool sortY=true)
 

Static Public Member Functions

static SkFixed SnapY (SkFixed y)
 

Public Attributes

SkAnalyticEdgefNext
 
SkAnalyticEdgefPrev
 
SkAnalyticEdgefRiteE
 
SkFixed fX
 
SkFixed fDX
 
SkFixed fUpperX
 
SkFixed fY
 
SkFixed fUpperY
 
SkFixed fLowerY
 
SkFixed fDY
 
SkFixed fSavedX
 
SkFixed fSavedY
 
SkFixed fSavedDY
 
Type fEdgeType
 
int8_t fCurveCount
 
uint8_t fCurveShift
 
uint8_t fCubicDShift
 
int8_t fWinding
 

Static Public Attributes

static const int kDefaultAccuracy = 2
 

Detailed Description

Definition at line 21 of file SkAnalyticEdge.h.

Member Enumeration Documentation

◆ Type

Enumerator
kLine_Type 
kQuad_Type 
kCubic_Type 

Definition at line 23 of file SkAnalyticEdge.h.

Member Function Documentation

◆ goY() [1/2]

void SkAnalyticEdge::goY ( SkFixed  y)
inline

Definition at line 65 of file SkAnalyticEdge.h.

65 {
66 if (y == fY + SK_Fixed1) {
67 fX = fX + fDX;
68 fY = y;
69 } else if (y != fY) {
70 // Drop lower digits as our alpha only has 8 bits
71 // (fDX and y - fUpperY may be greater than SK_Fixed1)
73 fY = y;
74 }
75 }
#define SK_Fixed1
Definition SkFixed.h:26
static SkFixed SkFixedMul(SkFixed a, SkFixed b)
Definition SkFixed.h:96
double y

◆ goY() [2/2]

void SkAnalyticEdge::goY ( SkFixed  y,
int  yShift 
)
inline

Definition at line 77 of file SkAnalyticEdge.h.

77 {
78 SkASSERT(yShift >= 0 && yShift <= kDefaultAccuracy);
79 SkASSERT(fDX == 0 || y - fY == SK_Fixed1 >> yShift);
80 fY = y;
81 fX += fDX >> yShift;
82 }
#define SkASSERT(cond)
Definition SkAssert.h:116
static const int kDefaultAccuracy

◆ saveXY()

void SkAnalyticEdge::saveXY ( SkFixed  x,
SkFixed  y,
SkFixed  dY 
)
inline

Definition at line 84 of file SkAnalyticEdge.h.

84 {
85 fSavedX = x;
86 fSavedY = y;
87 fSavedDY = dY;
88 }
double x

◆ setLine()

bool SkAnalyticEdge::setLine ( const SkPoint p0,
const SkPoint p1 
)

Definition at line 155 of file SkAnalyticEdge.cpp.

155 {
156 fRiteE = nullptr;
157
158 // We must set X/Y using the same way (e.g., times 4, to FDot6, then to Fixed) as Quads/Cubics.
159 // Otherwise the order of the edge might be wrong due to precision limit.
160 const int accuracy = kDefaultAccuracy;
161#ifdef SK_RASTERIZE_EVEN_ROUNDING
162 SkFixed x0 = SkFDot6ToFixed(SkScalarRoundToFDot6(p0.fX, accuracy)) >> accuracy;
163 SkFixed y0 = SnapY(SkFDot6ToFixed(SkScalarRoundToFDot6(p0.fY, accuracy)) >> accuracy);
164 SkFixed x1 = SkFDot6ToFixed(SkScalarRoundToFDot6(p1.fX, accuracy)) >> accuracy;
165 SkFixed y1 = SnapY(SkFDot6ToFixed(SkScalarRoundToFDot6(p1.fY, accuracy)) >> accuracy);
166#else
167 const int multiplier = (1 << kDefaultAccuracy);
168 SkFixed x0 = SkFDot6ToFixed(SkScalarToFDot6(p0.fX * multiplier)) >> accuracy;
169 SkFixed y0 = SnapY(SkFDot6ToFixed(SkScalarToFDot6(p0.fY * multiplier)) >> accuracy);
170 SkFixed x1 = SkFDot6ToFixed(SkScalarToFDot6(p1.fX * multiplier)) >> accuracy;
171 SkFixed y1 = SnapY(SkFDot6ToFixed(SkScalarToFDot6(p1.fY * multiplier)) >> accuracy);
172#endif
173
174 int winding = 1;
175
176 if (y0 > y1) {
177 using std::swap;
178 swap(x0, x1);
179 swap(y0, y1);
180 winding = -1;
181 }
182
183 // are we a zero-height line?
184 SkFDot6 dy = SkFixedToFDot6(y1 - y0);
185 if (dy == 0) {
186 return false;
187 }
188 SkFDot6 dx = SkFixedToFDot6(x1 - x0);
189 SkFixed slope = quick_div(dx, dy);
190 SkFixed absSlope = SkAbs32(slope);
191
192 fX = x0;
193 fDX = slope;
194 fUpperX = x0;
195 fY = y0;
196 fUpperY = y0;
197 fLowerY = y1;
198 fDY = dx == 0 || slope == 0 ? SK_MaxS32 : absSlope < kInverseTableSize
199 ? quick_inverse(absSlope)
200 : SkAbs32(quick_div(dy, dx));
202 fCurveCount = 0;
203 fWinding = SkToS8(winding);
204 fCurveShift = 0;
205
206 return true;
207}
static SkFixed quick_div(SkFDot6 a, SkFDot6 b)
static const int kInverseTableSize
static SkFixed quick_inverse(SkFDot6 x)
#define SkFixedToFDot6(x)
Definition SkFDot6.h:56
int32_t SkFDot6
Definition SkFDot6.h:16
SkFixed SkFDot6ToFixed(SkFDot6 x)
Definition SkFDot6.h:58
#define SkScalarToFDot6(x)
Definition SkFDot6.h:64
SkFDot6 SkScalarRoundToFDot6(SkScalar x, int shift=0)
Definition SkFDot6.h:23
int32_t SkFixed
Definition SkFixed.h:25
static constexpr int32_t SK_MaxS32
Definition SkMath.h:21
void swap(sk_sp< T > &a, sk_sp< T > &b)
Definition SkRefCnt.h:341
static int32_t SkAbs32(int32_t value)
Definition SkSafe32.h:41
constexpr int8_t SkToS8(S x)
Definition SkTo.h:21
skia_private::AutoTArray< sk_sp< SkImageFilter > > filters TypedMatrix matrix TypedMatrix matrix SkScalar dx
Definition SkRecords.h:208
SkAnalyticEdge * fRiteE
static SkFixed SnapY(SkFixed y)
float fX
x-axis value
float fY
y-axis value

◆ SnapY()

static SkFixed SkAnalyticEdge::SnapY ( SkFixed  y)
inlinestatic

Definition at line 58 of file SkAnalyticEdge.h.

58 {
59 const int accuracy = kDefaultAccuracy;
60 // This approach is safer than left shift, round, then right shift
61 return ((unsigned)y + (SK_Fixed1 >> (accuracy + 1))) >> (16 - accuracy) << (16 - accuracy);
62 }

◆ update()

bool SkAnalyticEdge::update ( SkFixed  last_y,
bool  sortY = true 
)

Definition at line 256 of file SkAnalyticEdge.cpp.

256 {
257 SkASSERT(last_y >= fLowerY); // we shouldn't update edge if last_y < fLowerY
258 if (fCurveCount < 0) {
259 return static_cast<SkAnalyticCubicEdge*>(this)->updateCubic(sortY);
260 } else if (fCurveCount > 0) {
261 return static_cast<SkAnalyticQuadraticEdge*>(this)->updateQuadratic();
262 }
263 return false;
264}

◆ updateLine()

bool SkAnalyticEdge::updateLine ( SkFixed  ax,
SkFixed  ay,
SkFixed  bx,
SkFixed  by,
SkFixed  slope 
)

Definition at line 212 of file SkAnalyticEdge.cpp.

212 {
213 // Since we send in the slope, we can no longer snap y inside this function.
214 // If we don't send in the slope, or we do some more sophisticated snapping, this function
215 // could be a performance bottleneck.
216 SkASSERT(fWinding == 1 || fWinding == -1);
217 SkASSERT(fCurveCount != 0);
218
219 // We don't chop at y extrema for cubics so the y is not guaranteed to be increasing for them.
220 // In that case, we have to swap x/y and negate the winding.
221 if (y0 > y1) {
222 using std::swap;
223 swap(x0, x1);
224 swap(y0, y1);
226 }
227
228 SkASSERT(y0 <= y1);
229
230 SkFDot6 dx = SkFixedToFDot6(x1 - x0);
231 SkFDot6 dy = SkFixedToFDot6(y1 - y0);
232
233 // are we a zero-height line?
234 if (dy == 0) {
235 return false;
236 }
237
238 SkASSERT(slope < SK_MaxS32);
239
240 SkFDot6 absSlope = SkAbs32(SkFixedToFDot6(slope));
241 fX = x0;
242 fDX = slope;
243 fUpperX = x0;
244 fY = y0;
245 fUpperY = y0;
246 fLowerY = y1;
247 fDY = (dx == 0 || slope == 0)
248 ? SK_MaxS32
249 : absSlope < kInverseTableSize
250 ? quick_inverse(absSlope)
251 : SkAbs32(quick_div(dy, dx));
252
253 return true;
254}

Member Data Documentation

◆ fCubicDShift

uint8_t SkAnalyticEdge::fCubicDShift

Definition at line 53 of file SkAnalyticEdge.h.

◆ fCurveCount

int8_t SkAnalyticEdge::fCurveCount

Definition at line 51 of file SkAnalyticEdge.h.

◆ fCurveShift

uint8_t SkAnalyticEdge::fCurveShift

Definition at line 52 of file SkAnalyticEdge.h.

◆ fDX

SkFixed SkAnalyticEdge::fDX

Definition at line 37 of file SkAnalyticEdge.h.

◆ fDY

SkFixed SkAnalyticEdge::fDY

Definition at line 42 of file SkAnalyticEdge.h.

◆ fEdgeType

Type SkAnalyticEdge::fEdgeType

Definition at line 49 of file SkAnalyticEdge.h.

◆ fLowerY

SkFixed SkAnalyticEdge::fLowerY

Definition at line 41 of file SkAnalyticEdge.h.

◆ fNext

SkAnalyticEdge* SkAnalyticEdge::fNext

Definition at line 29 of file SkAnalyticEdge.h.

◆ fPrev

SkAnalyticEdge* SkAnalyticEdge::fPrev

Definition at line 30 of file SkAnalyticEdge.h.

◆ fRiteE

SkAnalyticEdge* SkAnalyticEdge::fRiteE

Definition at line 34 of file SkAnalyticEdge.h.

◆ fSavedDY

SkFixed SkAnalyticEdge::fSavedDY

Definition at line 47 of file SkAnalyticEdge.h.

◆ fSavedX

SkFixed SkAnalyticEdge::fSavedX

Definition at line 45 of file SkAnalyticEdge.h.

◆ fSavedY

SkFixed SkAnalyticEdge::fSavedY

Definition at line 46 of file SkAnalyticEdge.h.

◆ fUpperX

SkFixed SkAnalyticEdge::fUpperX

Definition at line 38 of file SkAnalyticEdge.h.

◆ fUpperY

SkFixed SkAnalyticEdge::fUpperY

Definition at line 40 of file SkAnalyticEdge.h.

◆ fWinding

int8_t SkAnalyticEdge::fWinding

Definition at line 54 of file SkAnalyticEdge.h.

◆ fX

SkFixed SkAnalyticEdge::fX

Definition at line 36 of file SkAnalyticEdge.h.

◆ fY

SkFixed SkAnalyticEdge::fY

Definition at line 39 of file SkAnalyticEdge.h.

◆ kDefaultAccuracy

const int SkAnalyticEdge::kDefaultAccuracy = 2
static

Definition at line 56 of file SkAnalyticEdge.h.


The documentation for this struct was generated from the following files: