107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* 207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2012 Google Inc. 307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * 407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be 507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * found in the LICENSE file. 607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com */ 707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkIntersections.h" 907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 10a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.comvoid SkIntersections::append(const SkIntersections& i) { 11a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com for (int index = 0; index < i.fUsed; ++index) { 12a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com insert(i[0][index], i[1][index], i.pt(index)); 13a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com } 14a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com} 15a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com 162e40381060794745562c4a26896970406114b07acaryclarkint (SkIntersections::* const CurveVertical[])(const SkPoint[], SkScalar, SkScalar, SkScalar, bool) = { 1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com NULL, 1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com &SkIntersections::verticalLine, 1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com &SkIntersections::verticalQuad, 2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com &SkIntersections::verticalCubic 2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 232e40381060794745562c4a26896970406114b07acaryclarkint ( SkIntersections::* const CurveRay[])(const SkPoint[], const SkDLine&) = { 2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com NULL, 25a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com &SkIntersections::lineRay, 2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com &SkIntersections::quadRay, 2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com &SkIntersections::cubicRay 2807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 2907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comint SkIntersections::coincidentUsed() const { 3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (!fIsCoincident[0]) { 32cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com SkASSERT(!fIsCoincident[1]); 3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return 0; 3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 3507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int count = 0; 3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDEBUGCODE(int count2 = 0;) 3707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (int index = 0; index < fUsed; ++index) { 3807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (fIsCoincident[0] & (1 << index)) { 3907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com ++count; 4007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 4107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#ifdef SK_DEBUG 4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (fIsCoincident[1] & (1 << index)) { 4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com ++count2; 4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#endif 4607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 4707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkASSERT(count == count2); 4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return count; 4907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 5007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comint SkIntersections::cubicRay(const SkPoint pts[4], const SkDLine& line) { 5207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDCubic cubic; 5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com cubic.set(pts); 547eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com fMax = 3; 5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return intersectRay(cubic, line); 5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 5707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comvoid SkIntersections::flip() { 5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (int index = 0; index < fUsed; ++index) { 6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fT[1][index] = 1 - fT[1][index]; 6107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 6207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 6307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 64fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.comint SkIntersections::insert(double one, double two, const SkDPoint& pt) { 65b3f0921fba9457ba7ea79f220d8c1ec9345bfd3acaryclark@google.com if (fIsCoincident[0] == 3 && between(fT[0][0], one, fT[0][1])) { 66b3f0921fba9457ba7ea79f220d8c1ec9345bfd3acaryclark@google.com // For now, don't allow a mix of coincident and non-coincident intersections 67b3f0921fba9457ba7ea79f220d8c1ec9345bfd3acaryclark@google.com return -1; 68b3f0921fba9457ba7ea79f220d8c1ec9345bfd3acaryclark@google.com } 6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkASSERT(fUsed <= 1 || fT[0][0] <= fT[0][1]); 7007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int index; 7107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (index = 0; index < fUsed; ++index) { 7207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com double oldOne = fT[0][index]; 7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com double oldTwo = fT[1][index]; 74fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com if (one == oldOne && two == oldTwo) { 75fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com return -1; 76fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com } 77fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com if (more_roughly_equal(oldOne, one) && more_roughly_equal(oldTwo, two)) { 7807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if ((precisely_zero(one) && !precisely_zero(oldOne)) 7907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com || (precisely_equal(one, 1) && !precisely_equal(oldOne, 1)) 8007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com || (precisely_zero(two) && !precisely_zero(oldTwo)) 8107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com || (precisely_equal(two, 1) && !precisely_equal(oldTwo, 1))) { 8207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fT[0][index] = one; 8307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fT[1][index] = two; 84fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com fPt[index] = pt; 8507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 8607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return -1; 8707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 8807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com #if ONE_OFF_DEBUG 8907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (pt.roughlyEqual(fPt[index])) { 9007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDebugf("%s t=%1.9g pts roughly equal\n", __FUNCTION__, one); 9107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 9207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com #endif 9307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (fT[0][index] > one) { 9407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com break; 9507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 9607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 977eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com if (fUsed >= fMax) { 987eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com SkASSERT(0); // FIXME : this error, if it is to be handled at runtime in release, must 997eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com // be propagated all the way back down to the caller, and return failure. 1007eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com fUsed = 0; 1017eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com return 0; 1027eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com } 10307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int remaining = fUsed - index; 10407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (remaining > 0) { 10507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com memmove(&fPt[index + 1], &fPt[index], sizeof(fPt[0]) * remaining); 106dac1d17027dcaa5596885a9f333979418b35001ccaryclark memmove(&fPt2[index + 1], &fPt2[index], sizeof(fPt2[0]) * remaining); 10707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com memmove(&fT[0][index + 1], &fT[0][index], sizeof(fT[0][0]) * remaining); 10807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com memmove(&fT[1][index + 1], &fT[1][index], sizeof(fT[1][0]) * remaining); 109570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com int clearMask = ~((1 << index) - 1); 110570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com fIsCoincident[0] += fIsCoincident[0] & clearMask; 111570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com fIsCoincident[1] += fIsCoincident[1] & clearMask; 11207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 113fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com fPt[index] = pt; 11407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fT[0][index] = one; 11507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fT[1][index] = two; 11607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com ++fUsed; 11707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return index; 11807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 11907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 120dac1d17027dcaa5596885a9f333979418b35001ccaryclarkvoid SkIntersections::insertNear(double one, double two, const SkDPoint& pt1, const SkDPoint& pt2) { 121dac1d17027dcaa5596885a9f333979418b35001ccaryclark SkASSERT(one == 0 || one == 1); 122dac1d17027dcaa5596885a9f333979418b35001ccaryclark SkASSERT(two == 0 || two == 1); 123dac1d17027dcaa5596885a9f333979418b35001ccaryclark SkASSERT(pt1 != pt2); 124dac1d17027dcaa5596885a9f333979418b35001ccaryclark SkASSERT(fNearlySame[(int) one]); 125dac1d17027dcaa5596885a9f333979418b35001ccaryclark (void) insert(one, two, pt1); 126dac1d17027dcaa5596885a9f333979418b35001ccaryclark fPt2[one ? fUsed - 1 : 0] = pt2; 127dac1d17027dcaa5596885a9f333979418b35001ccaryclark} 128dac1d17027dcaa5596885a9f333979418b35001ccaryclark 12907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comvoid SkIntersections::insertCoincident(double one, double two, const SkDPoint& pt) { 13007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int index = insertSwap(one, two, pt); 13107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int bit = 1 << index; 13207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fIsCoincident[0] |= bit; 13307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fIsCoincident[1] |= bit; 13407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 13507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 136a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.comint SkIntersections::lineRay(const SkPoint pts[2], const SkDLine& line) { 137a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com SkDLine l; 138a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com l.set(pts); 139a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com fMax = 2; 140a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com return intersectRay(l, line); 141a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com} 142a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com 14307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comvoid SkIntersections::offset(int base, double start, double end) { 14407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (int index = base; index < fUsed; ++index) { 14507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com double val = fT[fSwap][index]; 14607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com val *= end - start; 14707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com val += start; 14807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fT[fSwap][index] = val; 14907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 15007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 15107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 15207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comint SkIntersections::quadRay(const SkPoint pts[3], const SkDLine& line) { 15307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDQuad quad; 15407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com quad.set(pts); 1557eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com fMax = 2; 15607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return intersectRay(quad, line); 15707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 15807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 15907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comvoid SkIntersections::quickRemoveOne(int index, int replace) { 16007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (index < replace) { 16107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fT[0][index] = fT[0][replace]; 16207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 16307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 16407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 16507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comvoid SkIntersections::removeOne(int index) { 16607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int remaining = --fUsed - index; 16707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com if (remaining <= 0) { 16807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return; 16907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 17007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com memmove(&fPt[index], &fPt[index + 1], sizeof(fPt[0]) * remaining); 171dac1d17027dcaa5596885a9f333979418b35001ccaryclark memmove(&fPt2[index], &fPt2[index + 1], sizeof(fPt2[0]) * remaining); 17207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com memmove(&fT[0][index], &fT[0][index + 1], sizeof(fT[0][0]) * remaining); 17307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com memmove(&fT[1][index], &fT[1][index + 1], sizeof(fT[1][0]) * remaining); 17407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkASSERT(fIsCoincident[0] == 0); 17507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int coBit = fIsCoincident[0] & (1 << index); 17607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fIsCoincident[0] -= ((fIsCoincident[0] >> 1) & ~((1 << index) - 1)) + coBit; 17707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkASSERT(!(coBit ^ (fIsCoincident[1] & (1 << index)))); 17807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com fIsCoincident[1] -= ((fIsCoincident[1] >> 1) & ~((1 << index) - 1)) + coBit; 17907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 18007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 18107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comvoid SkIntersections::swapPts() { 18207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com int index; 18307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (index = 0; index < fUsed; ++index) { 18407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkTSwap(fT[0][index], fT[1][index]); 18507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 18607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 18707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 18807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comint SkIntersections::verticalLine(const SkPoint a[2], SkScalar top, SkScalar bottom, 18907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkScalar x, bool flipped) { 19007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDLine line; 19107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com line.set(a); 19207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return vertical(line, top, bottom, x, flipped); 19307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 19407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 19507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comint SkIntersections::verticalQuad(const SkPoint a[3], SkScalar top, SkScalar bottom, 19607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkScalar x, bool flipped) { 19707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDQuad quad; 19807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com quad.set(a); 19907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return vertical(quad, top, bottom, x, flipped); 20007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 20107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 20207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comint SkIntersections::verticalCubic(const SkPoint a[4], SkScalar top, SkScalar bottom, 20307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkScalar x, bool flipped) { 20407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDCubic cubic; 20507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com cubic.set(a); 20607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com return vertical(cubic, top, bottom, x, flipped); 20707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 208