Flutter Engine
The Flutter Engine
SkAnalyticEdge.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2006 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
9
13#include "src/core/SkFDot6.h"
14
15#include <algorithm>
16#include <cstddef>
17#include <iterator>
18
19static const int kInverseTableSize = 1024; // SK_FDot6One * 16
20
22 static const int32_t table[] = {
23 -4096, -4100, -4104, -4108, -4112, -4116, -4120, -4124, -4128, -4132, -4136,
24 -4140, -4144, -4148, -4152, -4156, -4161, -4165, -4169, -4173, -4177, -4181,
25 -4185, -4190, -4194, -4198, -4202, -4206, -4211, -4215, -4219, -4223, -4228,
26 -4232, -4236, -4240, -4245, -4249, -4253, -4258, -4262, -4266, -4271, -4275,
27 -4279, -4284, -4288, -4293, -4297, -4301, -4306, -4310, -4315, -4319, -4324,
28 -4328, -4332, -4337, -4341, -4346, -4350, -4355, -4359, -4364, -4369, -4373,
29 -4378, -4382, -4387, -4391, -4396, -4401, -4405, -4410, -4415, -4419, -4424,
30 -4429, -4433, -4438, -4443, -4447, -4452, -4457, -4462, -4466, -4471, -4476,
31 -4481, -4485, -4490, -4495, -4500, -4505, -4510, -4514, -4519, -4524, -4529,
32 -4534, -4539, -4544, -4549, -4554, -4559, -4563, -4568, -4573, -4578, -4583,
33 -4588, -4593, -4599, -4604, -4609, -4614, -4619, -4624, -4629, -4634, -4639,
34 -4644, -4650, -4655, -4660, -4665, -4670, -4675, -4681, -4686, -4691, -4696,
35 -4702, -4707, -4712, -4718, -4723, -4728, -4733, -4739, -4744, -4750, -4755,
36 -4760, -4766, -4771, -4777, -4782, -4788, -4793, -4798, -4804, -4809, -4815,
37 -4821, -4826, -4832, -4837, -4843, -4848, -4854, -4860, -4865, -4871, -4877,
38 -4882, -4888, -4894, -4899, -4905, -4911, -4917, -4922, -4928, -4934, -4940,
39 -4946, -4951, -4957, -4963, -4969, -4975, -4981, -4987, -4993, -4999, -5005,
40 -5011, -5017, -5023, -5029, -5035, -5041, -5047, -5053, -5059, -5065, -5071,
41 -5077, -5084, -5090, -5096, -5102, -5108, -5115, -5121, -5127, -5133, -5140,
42 -5146, -5152, -5159, -5165, -5171, -5178, -5184, -5190, -5197, -5203, -5210,
43 -5216, -5223, -5229, -5236, -5242, -5249, -5256, -5262, -5269, -5275, -5282,
44 -5289, -5295, -5302, -5309, -5315, -5322, -5329, -5336, -5343, -5349, -5356,
45 -5363, -5370, -5377, -5384, -5391, -5398, -5405, -5412, -5418, -5426, -5433,
46 -5440, -5447, -5454, -5461, -5468, -5475, -5482, -5489, -5497, -5504, -5511,
47 -5518, -5526, -5533, -5540, -5548, -5555, -5562, -5570, -5577, -5584, -5592,
48 -5599, -5607, -5614, -5622, -5629, -5637, -5645, -5652, -5660, -5667, -5675,
49 -5683, -5691, -5698, -5706, -5714, -5722, -5729, -5737, -5745, -5753, -5761,
50 -5769, -5777, -5785, -5793, -5801, -5809, -5817, -5825, -5833, -5841, -5849,
51 -5857, -5866, -5874, -5882, -5890, -5899, -5907, -5915, -5924, -5932, -5940,
52 -5949, -5957, -5966, -5974, -5983, -5991, -6000, -6009, -6017, -6026, -6034,
53 -6043, -6052, -6061, -6069, -6078, -6087, -6096, -6105, -6114, -6123, -6132,
54 -6141, -6150, -6159, -6168, -6177, -6186, -6195, -6204, -6213, -6223, -6232,
55 -6241, -6250, -6260, -6269, -6278, -6288, -6297, -6307, -6316, -6326, -6335,
56 -6345, -6355, -6364, -6374, -6384, -6393, -6403, -6413, -6423, -6432, -6442,
57 -6452, -6462, -6472, -6482, -6492, -6502, -6512, -6523, -6533, -6543, -6553,
58 -6563, -6574, -6584, -6594, -6605, -6615, -6626, -6636, -6647, -6657, -6668,
59 -6678, -6689, -6700, -6710, -6721, -6732, -6743, -6754, -6765, -6775, -6786,
60 -6797, -6808, -6820, -6831, -6842, -6853, -6864, -6875, -6887, -6898, -6909,
61 -6921, -6932, -6944, -6955, -6967, -6978, -6990, -7002, -7013, -7025, -7037,
62 -7049, -7061, -7073, -7084, -7096, -7108, -7121, -7133, -7145, -7157, -7169,
63 -7182, -7194, -7206, -7219, -7231, -7244, -7256, -7269, -7281, -7294, -7307,
64 -7319, -7332, -7345, -7358, -7371, -7384, -7397, -7410, -7423, -7436, -7449,
65 -7463, -7476, -7489, -7503, -7516, -7530, -7543, -7557, -7570, -7584, -7598,
66 -7612, -7626, -7639, -7653, -7667, -7681, -7695, -7710, -7724, -7738, -7752,
67 -7767, -7781, -7796, -7810, -7825, -7839, -7854, -7869, -7884, -7898, -7913,
68 -7928, -7943, -7958, -7973, -7989, -8004, -8019, -8035, -8050, -8065, -8081,
69 -8097, -8112, -8128, -8144, -8160, -8176, -8192, -8208, -8224, -8240, -8256,
70 -8272, -8289, -8305, -8322, -8338, -8355, -8371, -8388, -8405, -8422, -8439,
71 -8456, -8473, -8490, -8507, -8525, -8542, -8559, -8577, -8594, -8612, -8630,
72 -8648, -8665, -8683, -8701, -8719, -8738, -8756, -8774, -8793, -8811, -8830,
73 -8848, -8867, -8886, -8905, -8924, -8943, -8962, -8981, -9000, -9020, -9039,
74 -9058, -9078, -9098, -9118, -9137, -9157, -9177, -9198, -9218, -9238, -9258,
75 -9279, -9300, -9320, -9341, -9362, -9383, -9404, -9425, -9446, -9467, -9489,
76 -9510, -9532, -9554, -9576, -9597, -9619, -9642, -9664, -9686, -9709, -9731,
77 -9754, -9776, -9799, -9822, -9845, -9868, -9892, -9915, -9939, -9962, -9986,
78 -10010, -10034, -10058, -10082, -10106, -10131, -10155, -10180, -10205, -10230,
79 -10255, -10280, -10305, -10330, -10356, -10381, -10407, -10433, -10459, -10485,
80 -10512, -10538, -10564, -10591, -10618, -10645, -10672, -10699, -10727, -10754,
81 -10782, -10810, -10837, -10866, -10894, -10922, -10951, -10979, -11008, -11037,
82 -11066, -11096, -11125, -11155, -11184, -11214, -11244, -11275, -11305, -11335,
83 -11366, -11397, -11428, -11459, -11491, -11522, -11554, -11586, -11618, -11650,
84 -11683, -11715, -11748, -11781, -11814, -11848, -11881, -11915, -11949, -11983,
85 -12018, -12052, -12087, -12122, -12157, -12192, -12228, -12264, -12300, -12336,
86 -12372, -12409, -12446, -12483, -12520, -12557, -12595, -12633, -12671, -12710,
87 -12748, -12787, -12826, -12865, -12905, -12945, -12985, -13025, -13066, -13107,
88 -13148, -13189, -13231, -13273, -13315, -13357, -13400, -13443, -13486, -13530,
89 -13573, -13617, -13662, -13706, -13751, -13797, -13842, -13888, -13934, -13981,
90 -14027, -14074, -14122, -14169, -14217, -14266, -14315, -14364, -14413, -14463,
91 -14513, -14563, -14614, -14665, -14716, -14768, -14820, -14873, -14926, -14979,
92 -15033, -15087, -15141, -15196, -15252, -15307, -15363, -15420, -15477, -15534,
93 -15592, -15650, -15709, -15768, -15827, -15887, -15947, -16008, -16070, -16131,
94 -16194, -16256, -16320, -16384, -16448, -16513, -16578, -16644, -16710, -16777,
95 -16844, -16912, -16980, -17050, -17119, -17189, -17260, -17331, -17403, -17476,
96 -17549, -17623, -17697, -17772, -17848, -17924, -18001, -18078, -18157, -18236,
97 -18315, -18396, -18477, -18558, -18641, -18724, -18808, -18893, -18978, -19065,
98 -19152, -19239, -19328, -19418, -19508, -19599, -19691, -19784, -19878, -19972,
99 -20068, -20164, -20262, -20360, -20460, -20560, -20661, -20763, -20867, -20971,
100 -21076, -21183, -21290, -21399, -21509, -21620, -21732, -21845, -21959, -22075,
101 -22192, -22310, -22429, -22550, -22671, -22795, -22919, -23045, -23172, -23301,
102 -23431, -23563, -23696, -23831, -23967, -24105, -24244, -24385, -24528, -24672,
103 -24818, -24966, -25115, -25266, -25420, -25575, -25731, -25890, -26051, -26214,
104 -26379, -26546, -26715, -26886, -27060, -27235, -27413, -27594, -27776, -27962,
105 -28149, -28339, -28532, -28728, -28926, -29127, -29330, -29537, -29746, -29959,
106 -30174, -30393, -30615, -30840, -31068, -31300, -31536, -31775, -32017, -32263,
107 -32513, -32768, -33026, -33288, -33554, -33825, -34100, -34379, -34663, -34952,
108 -35246, -35544, -35848, -36157, -36472, -36792, -37117, -37449, -37786, -38130,
109 -38479, -38836, -39199, -39568, -39945, -40329, -40721, -41120, -41527, -41943,
110 -42366, -42799, -43240, -43690, -44150, -44620, -45100, -45590, -46091, -46603,
111 -47127, -47662, -48210, -48770, -49344, -49932, -50533, -51150, -51781, -52428,
112 -53092, -53773, -54471, -55188, -55924, -56679, -57456, -58254, -59074, -59918,
113 -60787, -61680, -62601, -63550, -64527, -65536, -66576, -67650, -68759, -69905,
114 -71089, -72315, -73584, -74898, -76260, -77672, -79137, -80659, -82241, -83886,
115 -85598, -87381, -89240, -91180, -93206, -95325, -97541, -99864, -102300,
116 -104857, -107546, -110376, -113359, -116508, -119837, -123361, -127100, -131072,
117 -135300, -139810, -144631, -149796, -155344, -161319, -167772, -174762, -182361,
118 -190650, -199728, -209715, -220752, -233016, -246723, -262144, -279620, -299593,
119 -322638, -349525, -381300, -419430, -466033, -524288, -599186, -699050, -838860,
120 -1048576, -1398101, -2097152, -4194304, 0
121 };
122
123 static constexpr size_t kLastEntry = std::size(table) - 1;
124 SkASSERT(SkAbs32(x) <= static_cast<int32_t>(kLastEntry));
125 static_assert(kLastEntry == kInverseTableSize);
126
127 if (x > 0) {
128 return -table[kLastEntry - x];
129 } else {
130 return table[kLastEntry + x];
131 }
132}
133
135 const int kMinBits = 3; // abs(b) should be at least (1 << kMinBits) for quick division
136 const int kMaxBits = 31; // Number of bits available in signed int
137 // Given abs(b) <= (1 << kMinBits), the inverse of abs(b) is at most 1 << (22 - kMinBits) in
138 // SkFixed format. Hence abs(a) should be less than kMaxAbsA
139 const int kMaxAbsA = 1 << (kMaxBits - (22 - kMinBits));
140 SkFDot6 abs_a = SkAbs32(a);
141 SkFDot6 abs_b = SkAbs32(b);
142 if (abs_b >= (1 << kMinBits) && abs_b < kInverseTableSize && abs_a < kMaxAbsA) {
143 SkASSERT((int64_t)a * quick_inverse(b) <= SK_MaxS32
144 && (int64_t)a * quick_inverse(b) >= SK_MinS32);
145 SkFixed ourAnswer = (a * quick_inverse(b)) >> 6;
146 SkASSERT(
147 (SkFDot6Div(a,b) == 0 && ourAnswer == 0) ||
148 SkFixedDiv(SkAbs32(SkFDot6Div(a,b) - ourAnswer), SkAbs32(SkFDot6Div(a,b))) <= 1 << 10
149 );
150 return ourAnswer;
151 }
152 return SkFDot6Div(a, b);
153}
154
155bool SkAnalyticEdge::setLine(const SkPoint& p0, const SkPoint& p1) {
156 // We must set X/Y using the same way (e.g., times 4, to FDot6, then to Fixed) as Quads/Cubics.
157 // Otherwise the order of the edge might be wrong due to precision limit.
158 const int accuracy = kDefaultAccuracy;
159#ifdef SK_RASTERIZE_EVEN_ROUNDING
160 SkFixed x0 = SkFDot6ToFixed(SkScalarRoundToFDot6(p0.fX, accuracy)) >> accuracy;
161 SkFixed y0 = SnapY(SkFDot6ToFixed(SkScalarRoundToFDot6(p0.fY, accuracy)) >> accuracy);
162 SkFixed x1 = SkFDot6ToFixed(SkScalarRoundToFDot6(p1.fX, accuracy)) >> accuracy;
163 SkFixed y1 = SnapY(SkFDot6ToFixed(SkScalarRoundToFDot6(p1.fY, accuracy)) >> accuracy);
164#else
165 const int multiplier = (1 << kDefaultAccuracy);
166 SkFixed x0 = SkFDot6ToFixed(SkScalarToFDot6(p0.fX * multiplier)) >> accuracy;
167 SkFixed y0 = SnapY(SkFDot6ToFixed(SkScalarToFDot6(p0.fY * multiplier)) >> accuracy);
168 SkFixed x1 = SkFDot6ToFixed(SkScalarToFDot6(p1.fX * multiplier)) >> accuracy;
169 SkFixed y1 = SnapY(SkFDot6ToFixed(SkScalarToFDot6(p1.fY * multiplier)) >> accuracy);
170#endif
171
172 int winding = 1;
173
174 if (y0 > y1) {
175 using std::swap;
176 swap(x0, x1);
177 swap(y0, y1);
178 winding = -1;
179 }
180
181 // are we a zero-height line?
182 SkFDot6 dy = SkFixedToFDot6(y1 - y0);
183 if (dy == 0) {
184 return false;
185 }
186 SkFDot6 dx = SkFixedToFDot6(x1 - x0);
187 SkFixed slope = quick_div(dx, dy);
188 SkFixed absSlope = SkAbs32(slope);
189
190 fX = x0;
191 fDX = slope;
192 fUpperX = x0;
193 fY = y0;
194 fUpperY = y0;
195 fLowerY = y1;
196 fDY = dx == 0 || slope == 0 ? SK_MaxS32 : absSlope < kInverseTableSize
197 ? quick_inverse(absSlope)
198 : SkAbs32(quick_div(dy, dx));
200 fCurveCount = 0;
201 fWinding = SkToS8(winding);
202 fCurveShift = 0;
203
204 return true;
205}
206
207// This will become a bottleneck for small ovals rendering if we call SkFixedDiv twice here.
208// Therefore, we'll let the outter function compute the slope once and send in the value.
209// Moreover, we'll compute fDY by quickly lookup the inverse table (if possible).
211 // Since we send in the slope, we can no longer snap y inside this function.
212 // If we don't send in the slope, or we do some more sophisticated snapping, this function
213 // could be a performance bottleneck.
214 SkASSERT(fWinding == 1 || fWinding == -1);
215 SkASSERT(fCurveCount != 0);
216
217 // We don't chop at y extrema for cubics so the y is not guaranteed to be increasing for them.
218 // In that case, we have to swap x/y and negate the winding.
219 if (y0 > y1) {
220 using std::swap;
221 swap(x0, x1);
222 swap(y0, y1);
224 }
225
226 SkASSERT(y0 <= y1);
227
228 SkFDot6 dx = SkFixedToFDot6(x1 - x0);
229 SkFDot6 dy = SkFixedToFDot6(y1 - y0);
230
231 // are we a zero-height line?
232 if (dy == 0) {
233 return false;
234 }
235
236 SkASSERT(slope < SK_MaxS32);
237
238 SkFDot6 absSlope = SkAbs32(SkFixedToFDot6(slope));
239 fX = x0;
240 fDX = slope;
241 fUpperX = x0;
242 fY = y0;
243 fUpperY = y0;
244 fLowerY = y1;
245 fDY = (dx == 0 || slope == 0)
246 ? SK_MaxS32
247 : absSlope < kInverseTableSize
248 ? quick_inverse(absSlope)
249 : SkAbs32(quick_div(dy, dx));
250
251 return true;
252}
253
254bool SkAnalyticEdge::update(SkFixed last_y, bool sortY) {
255 SkASSERT(last_y >= fLowerY); // we shouldn't update edge if last_y < fLowerY
256 if (fCurveCount < 0) {
257 return static_cast<SkAnalyticCubicEdge*>(this)->updateCubic(sortY);
258 } else if (fCurveCount > 0) {
259 return static_cast<SkAnalyticQuadraticEdge*>(this)->updateQuadratic();
260 }
261 return false;
262}
263
266 return false;
267 }
278
283
286
287 return this->updateQuadratic();
288}
289
291 int success = 0; // initialize to fail!
292 int count = fCurveCount;
293 SkFixed oldx = fQEdge.fQx;
294 SkFixed oldy = fQEdge.fQy;
296 SkFixed dy = fQEdge.fQDy;
297 SkFixed newx, newy, newSnappedX, newSnappedY;
298 int shift = fCurveShift;
299
300 SkASSERT(count > 0);
301
302 do {
303 SkFixed slope;
304 if (--count > 0)
305 {
306 newx = oldx + (dx >> shift);
307 newy = oldy + (dy >> shift);
308 if (SkAbs32(dy >> shift) >= SK_Fixed1 * 2) { // only snap when dy is large enough
309 SkFDot6 diffY = SkFixedToFDot6(newy - fSnappedY);
310 slope = diffY ? quick_div(SkFixedToFDot6(newx - fSnappedX), diffY)
311 : SK_MaxS32;
312 newSnappedY = std::min<SkFixed>(fQEdge.fQLastY, SkFixedRoundToFixed(newy));
313 newSnappedX = newx - SkFixedMul(slope, newy - newSnappedY);
314 } else {
315 newSnappedY = std::min(fQEdge.fQLastY, SnapY(newy));
316 newSnappedX = newx;
317 SkFDot6 diffY = SkFixedToFDot6(newSnappedY - fSnappedY);
318 slope = diffY ? quick_div(SkFixedToFDot6(newx - fSnappedX), diffY)
319 : SK_MaxS32;
320 }
321 dx += fQEdge.fQDDx;
322 dy += fQEdge.fQDDy;
323 }
324 else // last segment
325 {
326 newx = fQEdge.fQLastX;
327 newy = fQEdge.fQLastY;
328 newSnappedY = newy;
329 newSnappedX = newx;
330 SkFDot6 diffY = (newy - fSnappedY) >> 10;
331 slope = diffY ? quick_div((newx - fSnappedX) >> 10, diffY) : SK_MaxS32;
332 }
333 if (slope < SK_MaxS32) {
334 success = this->updateLine(fSnappedX, fSnappedY, newSnappedX, newSnappedY, slope);
335 }
336 oldx = newx;
337 oldy = newy;
338 } while (count > 0 && !success);
339
340 SkASSERT(newSnappedY <= fQEdge.fQLastY);
341
342 fQEdge.fQx = newx;
343 fQEdge.fQy = newy;
344 fQEdge.fQDx = dx;
345 fQEdge.fQDy = dy;
346 fSnappedX = newSnappedX;
347 fSnappedY = newSnappedY;
349 return success;
350}
351
352bool SkAnalyticCubicEdge::setCubic(const SkPoint pts[4], bool sortY) {
354 return false;
355 }
356
369
375
377
378 return this->updateCubic(sortY);
379}
380
382 int success;
383 int count = fCurveCount;
384 SkFixed oldx = fCEdge.fCx;
385 SkFixed oldy = fCEdge.fCy;
386 SkFixed newx, newy;
387 const int ddshift = fCurveShift;
388 const int dshift = fCubicDShift;
389
390 SkASSERT(count < 0);
391
392 do {
393 if (++count < 0) {
394 newx = oldx + (fCEdge.fCDx >> dshift);
395 fCEdge.fCDx += fCEdge.fCDDx >> ddshift;
397
398 newy = oldy + (fCEdge.fCDy >> dshift);
399 fCEdge.fCDy += fCEdge.fCDDy >> ddshift;
401 }
402 else { // last segment
403 newx = fCEdge.fCLastX;
404 newy = fCEdge.fCLastY;
405 }
406
407 // we want to say SkASSERT(oldy <= newy), but our finite fixedpoint
408 // doesn't always achieve that, so we have to explicitly pin it here.
409 if (sortY && newy < oldy) {
410 newy = oldy;
411 }
412
413 SkFixed newSnappedY = SnapY(newy);
414 // we want to SkASSERT(snappedNewY <= fCEdge.fCLastY), but our finite fixedpoint
415 // doesn't always achieve that, so we have to explicitly pin it here.
416 if (sortY && fCEdge.fCLastY < newSnappedY) {
417 newSnappedY = fCEdge.fCLastY;
418 count = 0;
419 }
420
421 SkFixed slope = SkFixedToFDot6(newSnappedY - fSnappedY) == 0
422 ? SK_MaxS32
423 : SkFDot6Div(SkFixedToFDot6(newx - oldx),
424 SkFixedToFDot6(newSnappedY - fSnappedY));
425
426 success = this->updateLine(oldx, fSnappedY, newx, newSnappedY, slope);
427
428 oldx = newx;
429 oldy = newy;
430 fSnappedY = newSnappedY;
431 } while (count < 0 && !success);
432
433 fCEdge.fCx = newx;
434 fCEdge.fCy = newy;
436 return success;
437}
int count
Definition: FontMgrTest.cpp:50
static SkFixed quick_div(SkFDot6 a, SkFDot6 b)
static const int kInverseTableSize
static SkFixed quick_inverse(SkFDot6 x)
#define SkASSERT(cond)
Definition: SkAssert.h:116
#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
SkFixed SkFDot6Div(SkFDot6 a, SkFDot6 b)
Definition: SkFDot6.h:68
SkFDot6 SkScalarRoundToFDot6(SkScalar x, int shift=0)
Definition: SkFDot6.h:23
int32_t SkFixed
Definition: SkFixed.h:25
#define SK_Fixed1
Definition: SkFixed.h:26
#define SkFixedDiv(numer, denom)
Definition: SkFixed.h:93
static SkFixed SkFixedMul(SkFixed a, SkFixed b)
Definition: SkFixed.h:96
static SkFixed SkFixedRoundToFixed(SkFixed x)
Definition: SkFixed.h:80
static constexpr int32_t SK_MinS32
Definition: SkMath.h:22
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
SI F table(const skcms_Curve *curve, F v)
static bool b
struct MyStruct a[10]
static float min(float r, float g, float b)
Definition: hsl.cpp:48
double x
skia_private::AutoTArray< sk_sp< SkImageFilter > > filters TypedMatrix matrix TypedMatrix matrix SkScalar dx
Definition: SkRecords.h:208
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition: switches.h:259
bool updateCubic(bool sortY=true)
bool setCubic(const SkPoint pts[4], bool sortY=true)
static const int kDefaultAccuracy
bool updateLine(SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by, SkFixed slope)
bool update(SkFixed last_y, bool sortY=true)
uint8_t fCurveShift
bool setLine(const SkPoint &p0, const SkPoint &p1)
static SkFixed SnapY(SkFixed y)
uint8_t fCubicDShift
bool setQuadratic(const SkPoint pts[3])
SkQuadraticEdge fQEdge
SkFixed fCx
Definition: SkEdge.h:83
SkFixed fCDDy
Definition: SkEdge.h:85
bool setCubicWithoutUpdate(const SkPoint pts[4], int shiftUp, bool sortY=true)
Definition: SkEdge.cpp:373
SkFixed fCLastY
Definition: SkEdge.h:87
SkFixed fCLastX
Definition: SkEdge.h:87
SkFixed fCDDDy
Definition: SkEdge.h:86
SkFixed fCDDDx
Definition: SkEdge.h:86
SkFixed fCDx
Definition: SkEdge.h:84
SkFixed fCy
Definition: SkEdge.h:83
SkFixed fCDy
Definition: SkEdge.h:84
SkFixed fCDDx
Definition: SkEdge.h:85
int8_t fWinding
Definition: SkEdge.h:45
uint8_t fCurveShift
Definition: SkEdge.h:43
int8_t fCurveCount
Definition: SkEdge.h:42
uint8_t fCubicDShift
Definition: SkEdge.h:44
float fX
x-axis value
Definition: SkPoint_impl.h:164
float fY
y-axis value
Definition: SkPoint_impl.h:165
SkFixed fQDx
Definition: SkEdge.h:73
SkFixed fQDDx
Definition: SkEdge.h:74
SkFixed fQLastX
Definition: SkEdge.h:75
SkFixed fQDy
Definition: SkEdge.h:73
SkFixed fQDDy
Definition: SkEdge.h:74
SkFixed fQLastY
Definition: SkEdge.h:75
bool setQuadraticWithoutUpdate(const SkPoint pts[3], int shiftUp)
Definition: SkEdge.cpp:202
SkFixed fQx
Definition: SkEdge.h:72
SkFixed fQy
Definition: SkEdge.h:72