Home | History | Annotate | Download | only in pathops

Lines Matching refs:cubic

137     // note that three points in a line doesn't simplify a cubic
195 static int coincident_line(const SkDCubic& cubic, SkDCubic& reduction) {
196 reduction[0] = reduction[1] = cubic[0];
204 static int vertical_line(const SkDCubic& cubic, SkReduceOrder::Style reduceStyle,
207 reduction[0] = cubic[0];
208 reduction[1] = cubic[3];
214 int roots = SkDCubic::FindExtrema(cubic[0].fY, cubic[1].fY, cubic[2].fY, cubic[3].fY, tValues);
216 double yExtrema = interp_cubic_coords(&cubic[0].fY, tValues[index]);
228 static int horizontal_line(const SkDCubic& cubic, SkReduceOrder::Style reduceStyle,
231 reduction[0] = cubic[0];
232 reduction[1] = cubic[3];
238 int roots = SkDCubic::FindExtrema(cubic[0].fX, cubic[1].fX, cubic[2].fX, cubic[3].fX, tValues);
240 double xExtrema = interp_cubic_coords(&cubic[0].fX, tValues[index]);
253 static int check_quadratic(const SkDCubic& cubic, SkDCubic& reduction) {
254 double dx10 = cubic[1].fX - cubic[0].fX;
255 double dx23 = cubic[2].fX - cubic[3].fX;
256 double midX = cubic[0].fX + dx10 * 3 / 2;
257 double sideAx = midX - cubic[3].fX;
263 double dy10 = cubic[1].fY - cubic[0].fY;
264 double dy23 = cubic[2].fY - cubic[3].fY;
265 double midY = cubic[0].fY + dy10 * 3 / 2;
266 double sideAy = midY - cubic[3].fY;
272 reduction[0] = cubic[0];
275 reduction[2] = cubic[3];
279 static int check_linear(const SkDCubic& cubic, SkReduceOrder::Style reduceStyle,
283 while (cubic[startIndex].approximatelyEqual(cubic[endIndex])) {
290 if (!cubic.isLinear(startIndex, endIndex)) {
294 reduction[0] = cubic[0];
295 reduction[1] = cubic[3];
301 bool useX = cubic[maxX].fX - cubic[minX].fX >= cubic[maxY].fY - cubic[minY].fY;
303 sameSide1 = SkDSign(cubic[0].fX - cubic[1].fX) + SkDSign(cubic[3].fX - cubic[1].fX);
304 sameSide2 = SkDSign(cubic[0].fX - cubic[2].fX) + SkDSign(cubic[3].fX - cubic[2].fX);
306 sameSide1 = SkDSign(cubic[0].fY - cubic[1].fY) + SkDSign(cubic[3].fY - cubic[1].fY);
307 sameSide2 = SkDSign(cubic[0].fY - cubic[2].fY) + SkDSign(cubic[3].fY - cubic[2].fY);
315 roots = SkDCubic::FindExtrema(cubic[0].fX, cubic[1].fX, cubic[2].fX, cubic[3].fX, tValues);
317 roots = SkDCubic::FindExtrema(cubic[0].fY, cubic[1].fY, cubic[2].fY, cubic[3].fY, tValues);
321 extrema.fX = interp_cubic_coords(&cubic[0].fX, tValues[index]);
322 extrema.fY = interp_cubic_coords(&cubic[0].fY, tValues[index]);
326 if ((extrema.fX < cubic[0].fX) ^ (extrema.fX < cubic[3].fX)) {
329 replace = ((extrema.fX < cubic[0].fX) | (extrema.fX < cubic[3].fX))
330 ^ (cubic[0].fX < cubic[3].fX);
332 if ((extrema.fY < cubic[0].fY) ^ (extrema.fY < cubic[3].fY)) {
335 replace = ((extrema.fY < cubic[0].fY) | (extrema.fY < cubic[3].fY))
336 ^ (cubic[0].fY < cubic[3].fY);
344 http://objectmix.com/graphics/132906-fast-precision-driven-cubic-quadratic-piecewise-degree-reduction-algos-2-a.html
346 Given points c1, c2, c3 and c4 of a cubic Bezier, the points of the
366 // note that three points in a line doesn't simplify a cubic
369 int SkReduceOrder::reduce(const SkDCubic& cubic, Quadratics allowQuadratics,
376 if (cubic[minX].fX > cubic[index].fX) {
379 if (cubic[minY].fY > cubic[index].fY) {
382 if (cubic[maxX].fX < cubic[index].fX) {
385 if (cubic[maxY].fY < cubic[index].fY) {
390 double cx = cubic[index].fX;
391 double cy = cubic[index].fY;
393 SkTMax(fabs(cubic[minX].fX), fabs(cubic[minY].fY))));
400 if (approximately_equal_half(cx * inv, cubic[minX].fX * inv)) {
403 if (approximately_equal_half(cy * inv, cubic[minY].fY * inv)) {
409 return coincident_line(cubic, fCubic);
411 return vertical_line(cubic, reduceStyle, fCubic);
414 return horizontal_line(cubic, reduceStyle, fCubic);
416 int result = check_linear(cubic, reduceStyle, minX, maxX, minY, maxY, fCubic);
421 && (result = check_quadratic(cubic, fCubic))) {
424 fCubic = cubic;
441 SkPath::Verb SkReduceOrder::Cubic(const SkPoint a[4], SkPoint* reducePts) {
442 SkDCubic cubic;
443 cubic.set(a);
445 int order = reducer.reduce(cubic, kAllow_Quadratics, kFill_Style);
446 if (order == 2 || order == 3) { // cubic became line or quad