diff options
-rw-r--r-- | src/pathops/SkOpBuilder.cpp | 86 | ||||
-rw-r--r-- | src/pathops/SkOpCoincidence.h | 41 | ||||
-rw-r--r-- | src/pathops/SkOpCubicHull.cpp | 126 | ||||
-rw-r--r-- | src/pathops/SkOpTAllocator.h | 27 | ||||
-rw-r--r-- | src/pathops/SkPathOpsCubicSect.h | 175 | ||||
-rw-r--r-- | src/pathops/SkPathOpsPostSect.cpp | 502 | ||||
-rw-r--r-- | src/pathops/SkPathOpsQuadSect.h | 175 | ||||
-rw-r--r-- | src/pathops/SkPathOpsTCubicSect.cpp | 15 | ||||
-rw-r--r-- | src/pathops/SkPathOpsTQuadSect.cpp | 15 | ||||
-rw-r--r-- | src/pathops/SkPathOpsTSect.h | 1211 | ||||
-rw-r--r-- | tests/PathOpsBuildUseTest.cpp | 2435 | ||||
-rw-r--r-- | tests/PathOpsBuilderTest.cpp | 73 | ||||
-rw-r--r-- | tests/PathOpsTSectDebug.h | 84 | ||||
-rw-r--r-- | tests/PathOpsThreeWayTest.cpp | 78 |
14 files changed, 5043 insertions, 0 deletions
diff --git a/src/pathops/SkOpBuilder.cpp b/src/pathops/SkOpBuilder.cpp new file mode 100644 index 0000000000..489ad639c1 --- /dev/null +++ b/src/pathops/SkOpBuilder.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkMatrix.h" +#include "SkPath.h" +#include "SkPathOps.h" + +void SkOpBuilder::add(const SkPath& path, SkPathOp op) { + if (0 == fOps.count() && op != kUnion_PathOp) { + fPathRefs.push_back() = SkPath(); + *fOps.append() = kUnion_PathOp; + } + fPathRefs.push_back() = path; + *fOps.append() = op; +} + +void SkOpBuilder::reset() { + fPathRefs.reset(); + fOps.reset(); +} + +/* OPTIMIZATION: Union doesn't need to be all-or-nothing. A run of three or more convex + paths with union ops could be locally resolved and still improve over doing the + ops one at a time. */ +bool SkOpBuilder::resolve(SkPath* result) { + int count = fOps.count(); + bool allUnion = true; + SkPath::Direction firstDir; + for (int index = 0; index < count; ++index) { + SkPath* test = &fPathRefs[index]; + if (kUnion_PathOp != fOps[index] || test->isInverseFillType()) { + allUnion = false; + break; + } + // If all paths are convex, track direction, reversing as needed. + if (test->isConvex()) { + SkPath::Direction dir; + if (!test->cheapComputeDirection(&dir)) { + allUnion = false; + break; + } + if (index == 0) { + firstDir = dir; + } else if (firstDir != dir) { + SkPath temp; + temp.reverseAddPath(*test); + *test = temp; + } + continue; + } + // If the path is not convex but its bounds do not intersect the others, simplify is enough. + const SkRect& testBounds = test->getBounds(); + for (int inner = 0; inner < index; ++inner) { + // OPTIMIZE: check to see if the contour bounds do not intersect other contour bounds? + if (SkRect::Intersects(fPathRefs[inner].getBounds(), testBounds)) { + allUnion = false; + break; + } + } + } + if (!allUnion) { + *result = fPathRefs[0]; + for (int index = 1; index < count; ++index) { + if (!Op(*result, fPathRefs[index], fOps[index], result)) { + reset(); + return false; + } + } + reset(); + return true; + } + SkPath sum; + for (int index = 0; index < count; ++index) { + if (!Simplify(fPathRefs[index], &fPathRefs[index])) { + reset(); + return false; + } + sum.addPath(fPathRefs[index]); + } + reset(); + return Simplify(sum, result); +} diff --git a/src/pathops/SkOpCoincidence.h b/src/pathops/SkOpCoincidence.h new file mode 100644 index 0000000000..287bfd12d4 --- /dev/null +++ b/src/pathops/SkOpCoincidence.h @@ -0,0 +1,41 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef SkOpCoincidence_DEFINED +#define SkOpCoincidence_DEFINED + +#include "SkOpTAllocator.h" +#include "SkOpSpan.h" + +class SkOpPtT; + +struct SkCoincidentSpans { + SkCoincidentSpans* fNext; + SkOpPtT* fCoinPtTStart; + SkOpPtT* fCoinPtTEnd; + SkOpPtT* fOppPtTStart; + SkOpPtT* fOppPtTEnd; + bool fFlipped; +}; + +class SkOpCoincidence { +public: + SkOpCoincidence() + : fHead(NULL) { + } + + void add(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart, + SkOpPtT* oppPtTEnd, bool flipped, SkChunkAlloc* allocator); + void apply(); + bool contains(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart, + SkOpPtT* oppPtTEnd, bool flipped); + void dump() const; + void mark(); + + SkCoincidentSpans* fHead; +}; + +#endif diff --git a/src/pathops/SkOpCubicHull.cpp b/src/pathops/SkOpCubicHull.cpp new file mode 100644 index 0000000000..11eaa1f8a9 --- /dev/null +++ b/src/pathops/SkOpCubicHull.cpp @@ -0,0 +1,126 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "SkPathOpsCubic.h" + +static bool rotate(const SkDCubic& cubic, int zero, int index, SkDCubic& rotPath) { + double dy = cubic[index].fY - cubic[zero].fY; + double dx = cubic[index].fX - cubic[zero].fX; + if (approximately_zero(dy)) { + if (approximately_zero(dx)) { + return false; + } + rotPath = cubic; + return true; + } + for (int index = 0; index < 4; ++index) { + rotPath[index].fX = cubic[index].fX * dx + cubic[index].fY * dy; + rotPath[index].fY = cubic[index].fY * dx - cubic[index].fX * dy; + } + return true; +} + + +// Returns 0 if negative, 1 if zero, 2 if positive +static int side(double x) { + return (x > 0) + (x >= 0); +} + +/* Given a cubic, find the convex hull described by the end and control points. + The hull may have 3 or 4 points. Cubics that degenerate into a point or line + are not considered. + + The hull is computed by assuming that three points, if unique and non-linear, + form a triangle. The fourth point may replace one of the first three, may be + discarded if in the triangle or on an edge, or may be inserted between any of + the three to form a convex quadralateral. + + The indices returned in order describe the convex hull. +*/ +int SkDCubic::convexHull(char order[4]) const { + size_t index; + // find top point + size_t yMin = 0; + for (index = 1; index < 4; ++index) { + if (fPts[yMin].fY > fPts[index].fY || (fPts[yMin].fY == fPts[index].fY + && fPts[yMin].fX > fPts[index].fX)) { + yMin = index; + } + } + order[0] = yMin; + int midX = -1; + int backupYMin = -1; + for (int pass = 0; pass < 2; ++pass) { + for (index = 0; index < 4; ++index) { + if (index == yMin) { + continue; + } + // rotate line from (yMin, index) to axis + // see if remaining two points are both above or below + // use this to find mid + int mask = other_two(yMin, index); + int side1 = yMin ^ mask; + int side2 = index ^ mask; + SkDCubic rotPath; + if (!rotate(*this, yMin, index, rotPath)) { // ! if cbc[yMin]==cbc[idx] + order[1] = side1; + order[2] = side2; + return 3; + } + int sides = side(rotPath[side1].fY - rotPath[yMin].fY); + sides ^= side(rotPath[side2].fY - rotPath[yMin].fY); + if (sides == 2) { // '2' means one remaining point <0, one >0 + if (midX >= 0) { + // one of the control points is equal to an end point + order[0] = 0; + order[1] = 3; + if (fPts[1] == fPts[0] || fPts[1] == fPts[3]) { + order[2] = 2; + return 3; + } + SkASSERT(fPts[2] == fPts[0] || fPts[2] == fPts[3]); + order[2] = 1; + return 3; + } + midX = index; + } else if (sides == 0) { // '0' means both to one side or the other + backupYMin = index; + } + } + if (midX >= 0) { + break; + } + if (backupYMin < 0) { + break; + } + yMin = backupYMin; + backupYMin = -1; + } + if (midX < 0) { + midX = yMin ^ 3; // choose any other point + } + int mask = other_two(yMin, midX); + int least = yMin ^ mask; + int most = midX ^ mask; + order[0] = yMin; + order[1] = least; + + // see if mid value is on same side of line (least, most) as yMin + SkDCubic midPath; + if (!rotate(*this, least, most, midPath)) { // ! if cbc[least]==cbc[most] + order[2] = midX; + return 3; + } + int midSides = side(midPath[yMin].fY - midPath[least].fY); + midSides ^= side(midPath[midX].fY - midPath[least].fY); + if (midSides != 2) { // if mid point is not between + order[2] = most; + return 3; // result is a triangle + } + order[2] = midX; + order[3] = most; + return 4; // result is a quadralateral +} diff --git a/src/pathops/SkOpTAllocator.h b/src/pathops/SkOpTAllocator.h new file mode 100644 index 0000000000..c80c12f63b --- /dev/null +++ b/src/pathops/SkOpTAllocator.h @@ -0,0 +1,27 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef SkOpTAllocator_DEFINED +#define SkOpTAllocator_DEFINED + +#include "SkChunkAlloc.h" + +// T is SkOpAngle2, SkOpSpan2, or SkOpSegment2 +template<typename T> +class SkOpTAllocator { +public: + static T* Allocate(SkChunkAlloc* allocator) { + void* ptr = allocator->allocThrow(sizeof(T)); + T* record = (T*) ptr; + return record; + } + + static T* New(SkChunkAlloc* allocator) { + return new (Allocate(allocator)) T(); + } +}; + +#endif diff --git a/src/pathops/SkPathOpsCubicSect.h b/src/pathops/SkPathOpsCubicSect.h new file mode 100644 index 0000000000..d7634449b6 --- /dev/null +++ b/src/pathops/SkPathOpsCubicSect.h @@ -0,0 +1,175 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef SkCubicSpan_DEFINE +#define SkCubicSpan_DEFINE + +#include "SkChunkAlloc.h" +#include "SkPathOpsRect.h" +#include "SkPathOpsCubic.h" +#include "SkTArray.h" + +class SkIntersections; + +class SkCubicCoincident { +public: + bool isCoincident() const { + return fCoincident; + } + + void init() { + fCoincident = false; + SkDEBUGCODE(fPerpPt.fX = fPerpPt.fY = SK_ScalarNaN); + SkDEBUGCODE(fPerpT = SK_ScalarNaN); + } + + void markCoincident() { + if (!fCoincident) { + fPerpT = -1; + } + fCoincident = true; + } + + const SkDPoint& perpPt() const { + return fPerpPt; + } + + double perpT() const { + return fPerpT; + } + + void setPerp(const SkDCubic& cubic1, double t, const SkDPoint& qPt, const SkDCubic& cubic2); + +private: + SkDPoint fPerpPt; + double fPerpT; // perpendicular intersection on opposite Cubic + bool fCoincident; +}; + +class SkCubicSect; // used only by debug id + +class SkCubicSpan { +public: + void init(const SkDCubic& Cubic); + void initBounds(const SkDCubic& Cubic); + + bool contains(double t) const { + return !! const_cast<SkCubicSpan*>(this)->innerFind(t); + } + + bool contains(const SkCubicSpan* span) const; + + SkCubicSpan* find(double t) { + SkCubicSpan* result = innerFind(t); + SkASSERT(result); + return result; + } + + bool intersects(const SkCubicSpan* span) const; + + const SkCubicSpan* next() const { + return fNext; + } + + void reset() { + fBounded.reset(); + } + + bool split(SkCubicSpan* work) { + return splitAt(work, (work->fStartT + work->fEndT) * 0.5); + } + + bool splitAt(SkCubicSpan* work, double t); + bool tightBoundsIntersects(const SkCubicSpan* span) const; + + // implementation is for testing only + void dump() const; + +private: + bool hullIntersects(const SkDCubic& ) const; + SkCubicSpan* innerFind(double t); + bool linearIntersects(const SkDCubic& ) const; + + // implementation is for testing only +#if DEBUG_BINARY_CUBIC + int debugID(const SkCubicSect* ) const { return fDebugID; } +#else + int debugID(const SkCubicSect* ) const; +#endif + void dump(const SkCubicSect* ) const; + void dumpID(const SkCubicSect* ) const; + +#if DEBUG_BINARY_CUBIC + void validate() const; +#endif + + SkDCubic fPart; + SkCubicCoincident fCoinStart; + SkCubicCoincident fCoinEnd; + SkSTArray<4, SkCubicSpan*, true> fBounded; + SkCubicSpan* fPrev; + SkCubicSpan* fNext; + SkDRect fBounds; + double fStartT; + double fEndT; + double fBoundsMax; + bool fCollapsed; + bool fHasPerp; + mutable bool fIsLinear; +#if DEBUG_BINARY_CUBIC + int fDebugID; + bool fDebugDeleted; +#endif + friend class SkCubicSect; +}; + +class SkCubicSect { +public: + SkCubicSect(const SkDCubic& Cubic PATH_OPS_DEBUG_PARAMS(int id)); + static void BinarySearch(SkCubicSect* sect1, SkCubicSect* sect2, SkIntersections* intersections); + + // for testing only + void dumpCubics() const; +private: + SkCubicSpan* addOne(); + bool binarySearchCoin(const SkCubicSect& , double tStart, double tStep, double* t, + double* oppT); + SkCubicSpan* boundsMax() const; + void coincidentCheck(SkCubicSect* sect2); + bool intersects(const SkCubicSpan* span, const SkCubicSect* opp, const SkCubicSpan* oppSpan) const; + void onCurveCheck(SkCubicSect* sect2, SkCubicSpan* first, SkCubicSpan* last); + void recoverCollapsed(); + void removeSpan(SkCubicSpan* span); + void removeOne(const SkCubicSpan* test, SkCubicSpan* span); + void removeSpans(SkCubicSpan* span, SkCubicSect* opp); + void setPerp(const SkDCubic& opp, SkCubicSpan* first, SkCubicSpan* last); + void trim(SkCubicSpan* span, SkCubicSect* opp); + + // for testing only + void dump() const; + void dumpBoth(const SkCubicSect& opp) const; + void dumpBoth(const SkCubicSect* opp) const; + +#if DEBUG_BINARY_CUBIC + int debugID() const { return fDebugID; } + void validate() const; +#else + int debugID() const { return 0; } +#endif + const SkDCubic& fCubic; + SkChunkAlloc fHeap; + SkCubicSpan* fHead; + SkCubicSpan* fDeleted; + int fActiveCount; +#if DEBUG_BINARY_CUBIC + int fDebugID; + int fDebugCount; + int fDebugAllocatedCount; +#endif + friend class SkCubicSpan; // only used by debug id +}; + +#endif diff --git a/src/pathops/SkPathOpsPostSect.cpp b/src/pathops/SkPathOpsPostSect.cpp new file mode 100644 index 0000000000..15a1900ce3 --- /dev/null +++ b/src/pathops/SkPathOpsPostSect.cpp @@ -0,0 +1,502 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "SkOpCoincidence.h" +#include "SkOpContour.h" +#include "SkOpSegment.h" +#include "SkPathWriter.h" + +bool SkOpPtT::alias() const { + return this->span()->ptT() != this; +} + +SkOpContour* SkOpPtT::contour() const { + return segment()->contour(); +} + +SkOpDebugState* SkOpPtT::debugState() const { + return PATH_OPS_DEBUG_RELEASE(contour()->debugState(), NULL); +} + +void SkOpPtT::init(SkOpSpanBase* span, double t, const SkPoint& pt, bool duplicate) { + fT = t; + fPt = pt; + fSpan = span; + fNext = this; + fDuplicatePt = duplicate; + fDeleted = false; + PATH_OPS_DEBUG_CODE(fID = ++span->debugState()->fPtTID); +} + +bool SkOpPtT::onEnd() const { + const SkOpSpanBase* span = this->span(); + if (span->ptT() != this) { + return false; + } + const SkOpSegment* segment = this->segment(); + return span == segment->head() || span == segment->tail(); +} + +SkOpPtT* SkOpPtT::remove() { + SkOpPtT* prev = this; + do { + SkOpPtT* next = prev->fNext; + if (next == this) { + prev->removeNext(); + fDeleted = true; + return prev; + } + prev = next; + } while (prev != this); + SkASSERT(0); + return NULL; +} + +void SkOpPtT::removeNext() { + SkASSERT(this->fNext); + SkOpPtT* next = this->fNext; + this->fNext = next->fNext; + SkOpSpanBase* span = next->span(); + next->setDeleted(); + if (span->ptT() == next) { + span->upCast()->detach(); + } +} + +const SkOpSegment* SkOpPtT::segment() const { + return span()->segment(); +} + +SkOpSegment* SkOpPtT::segment() { + return span()->segment(); +} + +// find the starting or ending span with an existing loop of angles +// OPTIMIZE? remove the spans pointing to windValue==0 here or earlier? +// FIXME? assert that only one other span has a valid windValue or oppValue +void SkOpSpanBase::addSimpleAngle(bool checkFrom, SkChunkAlloc* allocator) { + SkOpAngle* angle; + if (checkFrom) { + SkASSERT(this->final()); + if (this->fromAngle()) { + SkASSERT(this->fromAngle()->loopCount() == 2); + return; + } + angle = this->segment()->addEndSpan(allocator); + } else { + SkASSERT(this->t() == 0); + SkOpSpan* span = this->upCast(); + if (span->toAngle()) { + SkASSERT(span->toAngle()->loopCount() == 2); + SkASSERT(!span->fromAngle()); + span->setFromAngle(span->toAngle()->next()); + return; + } + angle = this->segment()->addStartSpan(allocator); + } + SkOpPtT* ptT = this->ptT(); + SkOpSpanBase* oSpanBase; + SkOpSpan* oSpan; + SkOpSegment* other; + do { + ptT = ptT->next(); + oSpanBase = ptT->span(); + oSpan = oSpanBase->upCastable(); + other = oSpanBase->segment(); + if (oSpan && oSpan->windValue()) { + break; + } + if (oSpanBase->t() == 0) { + continue; + } + SkOpSpan* oFromSpan = oSpanBase->prev(); + SkASSERT(oFromSpan->t() < 1); + if (oFromSpan->windValue()) { + break; + } + } while (ptT != this->ptT()); + SkOpAngle* oAngle; + if (checkFrom) { + oAngle = other->addStartSpan(allocator); + SkASSERT(oSpan && !oSpan->final()); + SkASSERT(oAngle == oSpan->toAngle()); + } else { + oAngle = other->addEndSpan(allocator); + SkASSERT(oAngle == oSpanBase->fromAngle()); + } + angle->insert(oAngle); +} + +void SkOpSpanBase::align() { + if (this->fAligned) { + return; + } + SkASSERT(!zero_or_one(this->fPtT.fT)); + SkASSERT(this->fPtT.next()); + // if a linked pt/t pair has a t of zero or one, use it as the base for alignment + SkOpPtT* ptT = &this->fPtT, * stopPtT = ptT; + while ((ptT = ptT->next()) != stopPtT) { + if (zero_or_one(ptT->fT)) { + SkOpSegment* segment = ptT->segment(); + SkASSERT(this->segment() != segment); + SkASSERT(segment->head()->ptT() == ptT || segment->tail()->ptT() == ptT); + if (ptT->fT) { + segment->tail()->alignEnd(1, segment->lastPt()); + } else { + segment->head()->alignEnd(0, segment->pts()[0]); + } + return; + } + } + alignInner(); + this->fAligned = true; +} + + +// FIXME: delete spans that collapse +// delete segments that collapse +// delete contours that collapse +void SkOpSpanBase::alignEnd(double t, const SkPoint& pt) { + SkASSERT(zero_or_one(t)); + SkOpSegment* segment = this->segment(); + SkASSERT(t ? segment->lastPt() == pt : segment->pts()[0] == pt); + alignInner(); + *segment->writablePt(!!t) = pt; + SkOpPtT* ptT = &this->fPtT; + SkASSERT(t == ptT->fT); + SkASSERT(pt == ptT->fPt); + SkOpPtT* test = ptT, * stopPtT = ptT; + while ((test = test->next()) != stopPtT) { + SkOpSegment* other = test->segment(); + if (other == this->segment()) { + continue; + } + if (!zero_or_one(test->fT)) { + continue; + } + *other->writablePt(!!test->fT) = pt; + } + this->fAligned = true; +} + +void SkOpSpanBase::alignInner() { + // force the spans to share points and t values + SkOpPtT* ptT = &this->fPtT, * stopPtT = ptT; + const SkPoint& pt = ptT->fPt; + do { + ptT->fPt = pt; + const SkOpSpanBase* span = ptT->span(); + SkOpPtT* test = ptT; + do { + SkOpPtT* prev = test; + if ((test = test->next()) == stopPtT) { + break; + } + if (span == test->span() && !span->segment()->ptsDisjoint(*ptT, *test)) { + // omit aliases that alignment makes redundant + if ((!ptT->alias() || test->alias()) && (ptT->onEnd() || !test->onEnd())) { + SkASSERT(test->alias()); + prev->removeNext(); + test = prev; + } else { + SkASSERT(ptT->alias()); + stopPtT = ptT = ptT->remove(); + break; + } + } + } while (true); + } while ((ptT = ptT->next()) != stopPtT); +} + +bool SkOpSpanBase::contains(const SkOpSpanBase* span) const { + const SkOpPtT* start = &fPtT; + const SkOpPtT* check = &span->fPtT; + SkASSERT(start != check); + const SkOpPtT* walk = start; + while ((walk = walk->next()) != start) { + if (walk == check) { + return true; + } + } + return false; +} + +bool SkOpSpanBase::containsCoinEnd(const SkOpSegment* segment) const { + SkASSERT(this->segment() != segment); + const SkOpSpanBase* next = this; + while ((next = next->fCoinEnd) != this) { + if (next->segment() == segment) { + return true; + } + } + return false; +} + +SkOpContour* SkOpSpanBase::contour() const { + return segment()->contour(); +} + +SkOpDebugState* SkOpSpanBase::debugState() const { + return PATH_OPS_DEBUG_RELEASE(contour()->debugState(), NULL); +} + +void SkOpSpanBase::initBase(SkOpSegment* segment, SkOpSpan* prev, double t, const SkPoint& pt) { + fSegment = segment; + fPtT.init(this, t, pt, false); + fCoinEnd = this; + fFromAngle = NULL; + fPrev = prev; + fAligned = true; + fChased = false; + PATH_OPS_DEBUG_CODE(fCount = 1); + PATH_OPS_DEBUG_CODE(fID = ++debugState()->fSpanID); +} + +// this pair of spans share a common t value or point; merge them and eliminate duplicates +// this does not compute the best t or pt value; this merely moves all data into a single list +void SkOpSpanBase::merge(SkOpSpan* span) { + SkOpPtT* spanPtT = span->ptT(); + SkASSERT(this->t() != spanPtT->fT); + SkASSERT(!zero_or_one(spanPtT->fT)); + span->detach(); + SkOpPtT* remainder = spanPtT->next(); + ptT()->insert(spanPtT); + while (remainder != spanPtT) { + SkOpPtT* next = remainder->next(); + SkOpPtT* compare = spanPtT->next(); + while (compare != spanPtT) { + SkOpPtT* nextC = compare->next(); + if (nextC->span() == remainder->span() && nextC->fT == remainder->fT) { + goto tryNextRemainder; + } + compare = nextC; + } + spanPtT->insert(remainder); +tryNextRemainder: + remainder = next; + } +} + +void SkOpSpanBase::mergeBaseAttributes(SkOpSpanBase* span) { + SkASSERT(!span->fChased); + SkASSERT(!span->fFromAngle); + if (this->upCastable() && span->upCastable()) { + this->upCast()->mergeAttributes(span->upCast()); + } +} + +void SkOpSpan::applyCoincidence(SkOpSpan* opp) { + SkASSERT(!final()); + SkASSERT(0); // incomplete +} + +bool SkOpSpan::containsCoincidence(const SkOpSegment* segment) const { + SkASSERT(this->segment() != segment); + const SkOpSpan* next = this; + while ((next = next->fCoincident) != this) { + if (next->segment() == segment) { + return true; + } + } + return false; +} + +void SkOpSpan::detach() { + SkASSERT(!final()); + SkOpSpan* prev = this->prev(); + SkASSERT(prev); + SkOpSpanBase* next = this->next(); + SkASSERT(next); + prev->setNext(next); + next->setPrev(prev); + this->segment()->detach(this); + this->ptT()->setDeleted(); +} + +void SkOpSpan::init(SkOpSegment* segment, SkOpSpan* prev, double t, const SkPoint& pt) { + SkASSERT(t != 1); + initBase(segment, prev, t, pt); + fCoincident = this; + fToAngle = NULL; + fWindSum = fOppSum = SK_MinS32; + fWindValue = 1; + fOppValue = 0; + fChased = fDone = false; + segment->bumpCount(); +} + +void SkOpSpan::mergeAttributes(SkOpSpan* span) { + SkASSERT(!span->fToAngle); + if (span->fCoincident) { + this->insertCoincidence(span); + } +} + +void SkOpCoincidence::add(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart, + SkOpPtT* oppPtTEnd, bool flipped, SkChunkAlloc* allocator) { + SkCoincidentSpans* coinRec = SkOpTAllocator<SkCoincidentSpans>::Allocate(allocator); + SkOpSpanBase* coinEnd = coinPtTEnd->span(); + SkOpSpanBase* oppEnd = oppPtTEnd->span(); + SkOpSpan* coinStart = coinPtTStart->span()->upCast(); + SkASSERT(coinStart == coinStart->starter(coinEnd)); + SkOpSpan* oppStart = (flipped ? oppPtTEnd : oppPtTStart)->span()->upCast(); + SkASSERT(oppStart == oppStart->starter(oppEnd)); + coinStart->insertCoincidence(oppStart); + coinEnd->insertCoinEnd(oppEnd); + coinRec->fNext = this->fHead; + coinRec->fCoinPtTStart = coinPtTStart; + coinRec->fCoinPtTEnd = coinPtTEnd; + coinRec->fOppPtTStart = oppPtTStart; + coinRec->fOppPtTEnd = oppPtTEnd; + coinRec->fFlipped = flipped; + this->fHead = coinRec; +} + +bool SkOpCoincidence::contains(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart, + SkOpPtT* oppPtTEnd, bool flipped) { + SkCoincidentSpans* coin = fHead; + if (!coin) { + return false; + } + do { + if (coin->fCoinPtTStart == coinPtTStart && coin->fCoinPtTEnd == coinPtTEnd + && coin->fOppPtTStart == oppPtTStart && coin->fOppPtTEnd == oppPtTEnd + && coin->fFlipped == flipped) { + return true; + } + } while ((coin = coin->fNext)); + return false; +} + +// walk span sets in parallel, moving winding from one to the other +void SkOpCoincidence::apply() { + SkCoincidentSpans* coin = fHead; + if (!coin) { + return; + } + do { + SkOpSpanBase* end = coin->fCoinPtTEnd->span(); + SkOpSpan* start = coin->fCoinPtTStart->span()->upCast(); + SkASSERT(start == start->starter(end)); + bool flipped = coin->fFlipped; + SkOpSpanBase* oEnd = (flipped ? coin->fOppPtTStart : coin->fOppPtTEnd)->span(); + SkOpSpan* oStart = (flipped ? coin->fOppPtTEnd : coin->fOppPtTStart)->span()->upCast(); + SkASSERT(oStart == oStart->starter(oEnd)); + SkOpSegment* segment = start->segment(); + SkOpSegment* oSegment = oStart->segment(); + bool operandSwap = segment->operand() != oSegment->operand(); + if (flipped) { + do { + SkOpSpanBase* oNext = oStart->next(); + if (oNext == oEnd) { + break; + } + oStart = oNext->upCast(); + } while (true); + } + bool isXor = segment->isXor(); + bool oppXor = oSegment->isXor(); + do { + int windValue = start->windValue(); + int oWindValue = oStart->windValue(); + int oppValue = start->oppValue(); + int oOppValue = oStart->oppValue(); + // winding values are added or subtracted depending on direction and wind type + // same or opposite values are summed depending on the operand value + if (windValue >= oWindValue) { + if (operandSwap) { + SkTSwap(oWindValue, oOppValue); + } + if (flipped) { + windValue -= oWindValue; + oppValue -= oOppValue; + } else { + windValue += oWindValue; + oppValue += oOppValue; + } + if (isXor) { + windValue &= 1; + } + if (oppXor) { + oppValue &= 1; + } + oWindValue = oOppValue = 0; + } else { + if (operandSwap) { + SkTSwap(windValue, oppValue); + } + if (flipped) { + oWindValue -= windValue; + oOppValue -= oppValue; + } else { + oWindValue += windValue; + oOppValue += oppValue; + } + if (isXor) { + oOppValue &= 1; + } + if (oppXor) { + oWindValue &= 1; + } + windValue = oppValue = 0; + } + start->setWindValue(windValue); + start->setOppValue(oppValue); + oStart->setWindValue(oWindValue); + oStart->setOppValue(oOppValue); + if (!windValue && !oppValue) { + segment->markDone(start); + } + if (!oWindValue && !oOppValue) { + oSegment->markDone(oStart); + } + SkOpSpanBase* next = start->next(); + SkOpSpanBase* oNext = flipped ? oStart->prev() : oStart->next(); + if (next == end) { + break; + } + start = next->upCast(); + oStart = oNext->upCast(); + } while (true); + } while ((coin = coin->fNext)); +} + +void SkOpCoincidence::mark() { + SkCoincidentSpans* coin = fHead; + if (!coin) { + return; + } + do { + SkOpSpanBase* end = coin->fCoinPtTEnd->span(); + SkOpSpanBase* oldEnd = end; + SkOpSpan* start = coin->fCoinPtTStart->span()->starter(&end); + SkOpSpanBase* oEnd = coin->fOppPtTEnd->span(); + SkOpSpanBase* oOldEnd = oEnd; + SkOpSpanBase* oStart = coin->fOppPtTStart->span()->starter(&oEnd); + bool flipped = (end == oldEnd) != (oEnd == oOldEnd); + if (flipped) { + SkTSwap(oStart, oEnd); + } + SkOpSpanBase* next = start; + SkOpSpanBase* oNext = oStart; + do { + next = next->upCast()->next(); + oNext = flipped ? oNext->prev() : oNext->upCast()->next(); + if (next == end) { + SkASSERT(oNext == oEnd); + break; + } + if (!next->containsCoinEnd(oNext)) { + next->insertCoinEnd(oNext); + } + SkOpSpan* nextSpan = next->upCast(); + SkOpSpan* oNextSpan = oNext->upCast(); + if (!nextSpan->containsCoincidence(oNextSpan)) { + nextSpan->insertCoincidence(oNextSpan); + } + } while (true); + } while ((coin = coin->fNext)); +} diff --git a/src/pathops/SkPathOpsQuadSect.h b/src/pathops/SkPathOpsQuadSect.h new file mode 100644 index 0000000000..57f1aa08d8 --- /dev/null +++ b/src/pathops/SkPathOpsQuadSect.h @@ -0,0 +1,175 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef SkQuadSpan_DEFINE +#define SkQuadSpan_DEFINE + +#include "SkChunkAlloc.h" +#include "SkPathOpsRect.h" +#include "SkPathOpsQuad.h" +#include "SkTArray.h" + +class SkIntersections; + +class SkQuadCoincident { +public: + bool isCoincident() const { + return fCoincident; + } + + void init() { + fCoincident = false; + SkDEBUGCODE(fPerpPt.fX = fPerpPt.fY = SK_ScalarNaN); + SkDEBUGCODE(fPerpT = SK_ScalarNaN); + } + + void markCoincident() { + if (!fCoincident) { + fPerpT = -1; + } + fCoincident = true; + } + + const SkDPoint& perpPt() const { + return fPerpPt; + } + + double perpT() const { + return fPerpT; + } + + void setPerp(const SkDQuad& quad1, double t, const SkDPoint& qPt, const SkDQuad& quad2); + +private: + SkDPoint fPerpPt; + double fPerpT; // perpendicular intersection on opposite quad + bool fCoincident; +}; + +class SkQuadSect; // used only by debug id + +class SkQuadSpan { +public: + void init(const SkDQuad& quad); + void initBounds(const SkDQuad& quad); + + bool contains(double t) const { + return !! const_cast<SkQuadSpan*>(this)->innerFind(t); + } + + bool contains(const SkQuadSpan* span) const; + + SkQuadSpan* find(double t) { + SkQuadSpan* result = innerFind(t); + SkASSERT(result); + return result; + } + + bool intersects(const SkQuadSpan* span) const; + + const SkQuadSpan* next() const { + return fNext; + } + + void reset() { + fBounded.reset(); + } + + bool split(SkQuadSpan* work) { + return splitAt(work, (work->fStartT + work->fEndT) * 0.5); + } + + bool splitAt(SkQuadSpan* work, double t); + bool tightBoundsIntersects(const SkQuadSpan* span) const; + + // implementation is for testing only + void dump() const; + +private: + bool hullIntersects(const SkDQuad& q2) const; + SkQuadSpan* innerFind(double t); + bool linearIntersects(const SkDQuad& q2) const; + + // implementation is for testing only +#if DEBUG_BINARY_QUAD + int debugID(const SkQuadSect* ) const { return fDebugID; } +#else + int debugID(const SkQuadSect* ) const; +#endif + void dump(const SkQuadSect* ) const; + void dumpID(const SkQuadSect* ) const; + +#if DEBUG_BINARY_QUAD + void validate() const; +#endif + + SkDQuad fPart; + SkQuadCoincident fCoinStart; + SkQuadCoincident fCoinEnd; + SkSTArray<4, SkQuadSpan*, true> fBounded; + SkQuadSpan* fPrev; + SkQuadSpan* fNext; + SkDRect fBounds; + double fStartT; + double fEndT; + double fBoundsMax; + bool fCollapsed; + bool fHasPerp; + mutable bool fIsLinear; +#if DEBUG_BINARY_QUAD + int fDebugID; + bool fDebugDeleted; +#endif + friend class SkQuadSect; +}; + +class SkQuadSect { +public: + SkQuadSect(const SkDQuad& quad PATH_OPS_DEBUG_PARAMS(int id)); + static void BinarySearch(SkQuadSect* sect1, SkQuadSect* sect2, SkIntersections* intersections); + + // for testing only + void dumpQuads() const; +private: + SkQuadSpan* addOne(); + bool binarySearchCoin(const SkQuadSect& , double tStart, double tStep, double* t, double* oppT); + SkQuadSpan* boundsMax() const; + void coincidentCheck(SkQuadSect* sect2); + bool intersects(const SkQuadSpan* span, const SkQuadSect* opp, const SkQuadSpan* oppSpan) const; + void onCurveCheck(SkQuadSect* sect2, SkQuadSpan* first, SkQuadSpan* last); + void recoverCollapsed(); + void removeSpan(SkQuadSpan* span); + void removeOne(const SkQuadSpan* test, SkQuadSpan* span); + void removeSpans(SkQuadSpan* span, SkQuadSect* opp); + void setPerp(const SkDQuad& opp, SkQuadSpan* first, SkQuadSpan* last); + const SkQuadSpan* tail() const; + void trim(SkQuadSpan* span, SkQuadSect* opp); + + // for testing only + void dump() const; + void dumpBoth(const SkQuadSect& opp) const; + void dumpBoth(const SkQuadSect* opp) const; + +#if DEBUG_BINARY_QUAD + int debugID() const { return fDebugID; } + void validate() const; +#else + int debugID() const { return 0; } +#endif + const SkDQuad& fQuad; + SkChunkAlloc fHeap; + SkQuadSpan* fHead; + SkQuadSpan* fDeleted; + int fActiveCount; +#if DEBUG_BINARY_QUAD + int fDebugID; + int fDebugCount; + int fDebugAllocatedCount; +#endif + friend class SkQuadSpan; // only used by debug id +}; + +#endif diff --git a/src/pathops/SkPathOpsTCubicSect.cpp b/src/pathops/SkPathOpsTCubicSect.cpp new file mode 100644 index 0000000000..0b3ddd7d0d --- /dev/null +++ b/src/pathops/SkPathOpsTCubicSect.cpp @@ -0,0 +1,15 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkPathOpsTSect.h" + +int SkIntersections::intersectB(const SkDCubic& cubic1, const SkDCubic& cubic2) { + SkTSect<SkDCubic> sect1(cubic1 PATH_OPS_DEBUG_PARAMS(1)); + SkTSect<SkDCubic> sect2(cubic2 PATH_OPS_DEBUG_PARAMS(2)); + SkTSect<SkDCubic>::BinarySearch(§1, §2, this); + return used(); +} diff --git a/src/pathops/SkPathOpsTQuadSect.cpp b/src/pathops/SkPathOpsTQuadSect.cpp new file mode 100644 index 0000000000..46ce5cfdbb --- /dev/null +++ b/src/pathops/SkPathOpsTQuadSect.cpp @@ -0,0 +1,15 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkPathOpsTSect.h" + +int SkIntersections::intersectB(const SkDQuad& quad1, const SkDQuad& quad2) { + SkTSect<SkDQuad> sect1(quad1 PATH_OPS_DEBUG_PARAMS(1)); + SkTSect<SkDQuad> sect2(quad2 PATH_OPS_DEBUG_PARAMS(2)); + SkTSect<SkDQuad>::BinarySearch(§1, §2, this); + return used(); +} diff --git a/src/pathops/SkPathOpsTSect.h b/src/pathops/SkPathOpsTSect.h new file mode 100644 index 0000000000..4e7d3b1795 --- /dev/null +++ b/src/pathops/SkPathOpsTSect.h @@ -0,0 +1,1211 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkChunkAlloc.h" +#include "SkPathOpsRect.h" +#include "SkPathOpsQuad.h" +#include "SkIntersections.h" +#include "SkTArray.h" + +/* TCurve is either SkDQuadratic or SkDCubic */ +template<typename TCurve> +class SkTCoincident { +public: + bool isCoincident() const { + return fCoincident; + } + + void init() { + fCoincident = false; + SkDEBUGCODE(fPerpPt.fX = fPerpPt.fY = SK_ScalarNaN); + SkDEBUGCODE(fPerpT = SK_ScalarNaN); + } + + void markCoincident() { + if (!fCoincident) { + fPerpT = -1; + } + fCoincident = true; + } + + const SkDPoint& perpPt() const { + return fPerpPt; + } + + double perpT() const { + return fPerpT; + } + + void setPerp(const TCurve& c1, double t, const SkDPoint& cPt, const TCurve& ); + +private: + SkDPoint fPerpPt; + double fPerpT; // perpendicular intersection on opposite curve + bool fCoincident; +}; + +template<typename TCurve> class SkTSect; + +/* Curve is either TCurve or SkDCubic */ +template<typename TCurve> +class SkTSpan { +public: + void init(const TCurve& ); + void initBounds(const TCurve& ); + + double closestBoundedT(const SkDPoint& pt) const; + + bool contains(double t) const { + return !! const_cast<SkTSpan*>(this)->innerFind(t); + } + + bool contains(const SkTSpan* span) const; + + double endT() const { + return fEndT; + } + + SkTSpan* find(double t) { + SkTSpan* result = innerFind(t); + SkASSERT(result); + return result; + } + + bool intersects(const SkTSpan* span, bool* check); + + const SkTSpan* next() const { + return fNext; + } + + const TCurve& part() const { + return fPart; + } + + void reset() { + fBounded.reset(); + } + + bool split(SkTSpan* work) { + return splitAt(work, (work->fStartT + work->fEndT) * 0.5); + } + + bool splitAt(SkTSpan* work, double t); + + double startT() const { + return fStartT; + } + + bool tightBoundsIntersects(const SkTSpan* span) const; + + // implementation is for testing only + void dump() const { + dump(NULL); + } + +private: + SkTSpan* innerFind(double t); + bool linearIntersects(const TCurve& ) const; + + // implementation is for testing only +#if DEBUG_T_SECT + int debugID(const SkTSect<TCurve>* ) const { return fDebugID; } +#else + int debugID(const SkTSect<TCurve>* ) const; +#endif + void dump(const SkTSect<TCurve>* ) const; + void dumpID(const SkTSect<TCurve>* ) const; + +#if DEBUG_T_SECT + void validate() const; +#endif + + TCurve fPart; + SkTCoincident<TCurve> fCoinStart; + SkTCoincident<TCurve> fCoinEnd; + SkSTArray<4, SkTSpan*, true> fBounded; + SkTSpan* fPrev; + SkTSpan* fNext; + SkDRect fBounds; + double fStartT; + double fEndT; + double fBoundsMax; + bool fCollapsed; + bool fHasPerp; + bool fIsLinear; +#if DEBUG_T_SECT + int fDebugID; + bool fDebugDeleted; +#endif + friend class SkTSect<TCurve>; +}; + +template<typename TCurve> +class SkTSect { +public: + SkTSect(const TCurve& c PATH_OPS_DEBUG_PARAMS(int id)); + static void BinarySearch(SkTSect* sect1, SkTSect* sect2, SkIntersections* intersections); + + // for testing only + void dump() const; + void dumpBoth(const SkTSect& opp) const; + void dumpBoth(const SkTSect* opp) const; + void dumpCurves() const; + +private: + enum { + kZeroS1Set = 1, + kOneS1Set = 2, + kZeroS2Set = 4, + kOneS2Set = 8 + }; + + SkTSpan<TCurve>* addOne(); + bool binarySearchCoin(const SkTSect& , double tStart, double tStep, double* t, double* oppT); + SkTSpan<TCurve>* boundsMax() const; + void coincidentCheck(SkTSect* sect2); + static int EndsEqual(const SkTSect* sect1, const SkTSect* sect2, SkIntersections* ); + bool intersects(SkTSpan<TCurve>* span, const SkTSect* opp, + const SkTSpan<TCurve>* oppSpan) const; + void onCurveCheck(SkTSect* sect2, SkTSpan<TCurve>* first, SkTSpan<TCurve>* last); + void recoverCollapsed(); + void removeSpan(SkTSpan<TCurve>* span); + void removeOne(const SkTSpan<TCurve>* test, SkTSpan<TCurve>* span); + void removeSpans(SkTSpan<TCurve>* span, SkTSect* opp); + void setPerp(const TCurve& opp, SkTSpan<TCurve>* first, SkTSpan<TCurve>* last); + const SkTSpan<TCurve>* tail() const; + void trim(SkTSpan<TCurve>* span, SkTSect* opp); + +#if DEBUG_T_SECT + int debugID() const { return fDebugID; } + void validate() const; +#else + int debugID() const { return 0; } +#endif + const TCurve& fCurve; + SkChunkAlloc fHeap; + SkTSpan<TCurve>* fHead; + SkTSpan<TCurve>* fDeleted; + int fActiveCount; +#if DEBUG_T_SECT + int fDebugID; + int fDebugCount; + int fDebugAllocatedCount; +#endif + friend class SkTSpan<TCurve>; // only used by debug id +}; + +#define COINCIDENT_SPAN_COUNT 9 + +template<typename TCurve> +void SkTCoincident<TCurve>::setPerp(const TCurve& c1, double t, + const SkDPoint& cPt, const TCurve& c2) { + SkDVector dxdy = c1.dxdyAtT(t); + SkDLine perp = {{ cPt, {cPt.fX + dxdy.fY, cPt.fY - dxdy.fX} }}; + SkIntersections i; + int used = i.intersectRay(c2, perp); + // only keep closest + if (used == 0) { + fPerpT = -1; + return; + } + fPerpT = i[0][0]; + fPerpPt = i.pt(0); + SkASSERT(used <= 2); + if (used == 2) { + double distSq = (fPerpPt - cPt).lengthSquared(); + double dist2Sq = (i.pt(1) - cPt).lengthSquared(); + if (dist2Sq < distSq) { + fPerpT = i[0][1]; + fPerpPt = i.pt(1); + } + } + fCoincident = cPt.approximatelyEqual(fPerpPt); +#if DEBUG_T_SECT + if (fCoincident) { + SkDebugf(""); // allow setting breakpoint + } +#endif +} + +template<typename TCurve> +void SkTSpan<TCurve>::init(const TCurve& c) { + fPrev = fNext = NULL; + fIsLinear = false; + fStartT = 0; + fEndT = 1; + initBounds(c); +} + +template<typename TCurve> +void SkTSpan<TCurve>::initBounds(const TCurve& c) { + fPart = c.subDivide(fStartT, fEndT); + fBounds.setBounds(fPart); + fCoinStart.init(); + fCoinEnd.init(); + fBoundsMax = SkTMax(fBounds.width(), fBounds.height()); + fCollapsed = fPart.collapsed(); + fHasPerp = false; +#if DEBUG_T_SECT + fDebugDeleted = false; + if (fCollapsed) { + SkDebugf(""); // for convenient breakpoints + } +#endif +} + +template<typename TCurve> +double SkTSpan<TCurve>::closestBoundedT(const SkDPoint& pt) const { + int count = fBounded.count(); + double result = -1; + double closest = FLT_MAX; + for (int index = 0; index < count; ++index) { + const SkTSpan* test = fBounded[index]; + double startDist = test->fPart[0].distanceSquared(pt); + if (closest > startDist) { + closest = startDist; + result = test->fStartT; + } + double endDist = test->fPart[TCurve::kPointLast].distanceSquared(pt); + if (closest > endDist) { + closest = endDist; + result = test->fEndT; + } + } + SkASSERT(between(0, result, 1)); + return result; +} + +template<typename TCurve> +bool SkTSpan<TCurve>::contains(const SkTSpan* span) const { + int count = fBounded.count(); + for (int index = 0; index < count; ++index) { + const SkTSpan* test = fBounded[index]; + if (span == test) { + return true; + } + } + return false; +} + +template<typename TCurve> +SkTSpan<TCurve>* SkTSpan<TCurve>::innerFind(double t) { + SkTSpan* work = this; + do { + if (between(work->fStartT, t, work->fEndT)) { + return work; + } + } while ((work = work->fNext)); + return NULL; +} + +// OPTIMIZE ? If at_most_end_pts_in_common detects that one quad is near linear, +// use line intersection to guess a better split than 0.5 +// OPTIMIZE Once at_most_end_pts_in_common detects linear, mark span so all future splits are linear +template<typename TCurve> +bool SkTSpan<TCurve>::intersects(const SkTSpan* span, bool* check) { + if (!fBounds.intersects(span->fBounds)) { + *check = false; // no need to check to see if the bounds have end points in common + return false; + } + if (!fIsLinear && fPart.hullIntersects(span->fPart, check)) { + if (!*check) { + return true; + } + fIsLinear = true; + } + if (fIsLinear) { + *check = false; + return linearIntersects(span->fPart); + } + return *check; +} + +template<typename TCurve> +bool SkTSpan<TCurve>::linearIntersects(const TCurve& q2) const { + // looks like q1 is near-linear + int start = 0, end = TCurve::kPointCount - 1; // the outside points are usually the extremes + if (!fPart.controlsInside()) { + double dist = 0; // if there's any question, compute distance to find best outsiders + for (int outer = 0; outer < TCurve::kPointCount - 1; ++outer) { + for (int inner = outer + 1; inner < TCurve::kPointCount; ++inner) { + double test = (fPart[outer] - fPart[inner]).lengthSquared(); + if (dist > test) { + continue; + } + dist = test; + start = outer; + end = inner; + } + } + } + // see if q2 is on one side of the line formed by the extreme points + double origX = fPart[start].fX; + double origY = fPart[start].fY; + double adj = fPart[end].fX - origX; + double opp = fPart[end].fY - origY; + double sign; + for (int n = 0; n < TCurve::kPointCount; ++n) { + double test = (q2[n].fY - origY) * adj - (q2[n].fX - origX) * opp; + if (precisely_zero(test)) { + return true; + } + if (n == 0) { + sign = test; + continue; + } + if (test * sign < 0) { + return true; + } + } + return false; +} + +template<typename TCurve> +bool SkTSpan<TCurve>::splitAt(SkTSpan* work, double t) { + fStartT = t; + fEndT = work->fEndT; + if (fStartT == fEndT) { + fCollapsed = true; + return false; + } + work->fEndT = t; + if (work->fStartT == work->fEndT) { + work->fCollapsed = true; + return false; + } + fPrev = work; + fNext = work->fNext; + fIsLinear = work->fIsLinear; + work->fNext = this; + if (fNext) { + fNext->fPrev = this; + } + fBounded = work->fBounded; + int count = fBounded.count(); + for (int index = 0; index < count; ++index) { + fBounded[index]->fBounded.push_back() = this; + } + return true; +} + +template<typename TCurve> +bool SkTSpan<TCurve>::tightBoundsIntersects(const SkTSpan* span) const { + // skew all to an axis + SkDVector v2_0 = fPart[TCurve::kPointLast] - fPart[0]; + bool skewToXAxis = fabs(v2_0.fX) > fabs(v2_0.fY); + double ratio = skewToXAxis ? v2_0.fY / v2_0.fX : v2_0.fX / v2_0.fY; + TCurve r1 = fPart; + if (skewToXAxis) { + r1[1].fY -= (fPart[1].fX - r1[0].fX) * ratio; + if (TCurve::IsCubic()) { + r1[2].fY -= (fPart[2].fX - r1[0].fX) * ratio; + r1[3].fY = r1[0].fY; + } else { + r1[2].fY = r1[0].fY; + } + } else { + r1[1].fX -= (fPart[1].fY - r1[0].fY) * ratio; + if (TCurve::IsCubic()) { + r1[2].fX -= (fPart[2].fY - r1[0].fY) * ratio; + r1[3].fX = r1[0].fX; + } else { + r1[2].fX = r1[0].fX; + } + } + // compute the tight skewed bounds + SkDRect bounds; + bounds.setBounds(r1); + // see if opposite ends are within range of tight skewed bounds + TCurve r2 = span->fPart; + for (int i = 0; i < TCurve::kPointCount; i += 2) { + if (skewToXAxis) { + r2[i].fY -= (r2[i].fX - r1[0].fX) * ratio; + if (between(bounds.fTop, r2[i].fY, bounds.fBottom)) { + return true; + } + } else { + r2[i].fX -= (r2[i].fY - r1[0].fY) * ratio; + if (between(bounds.fLeft, r2[i].fX, bounds.fRight)) { + return true; + } + } + } + // see if opposite ends are on either side of tight skewed bounds + if ((skewToXAxis ? (r2[0].fY - r1[0].fY) * (r2[TCurve::kPointLast].fY - r1[0].fY) + : (r2[0].fX - r1[0].fX) * (r2[TCurve::kPointLast].fX - r1[0].fX)) < 0) { + return true; + } + // compute opposite tight skewed bounds + if (skewToXAxis) { + r2[1].fY -= (r2[1].fX - r1[0].fX) * ratio; + if (TCurve::IsCubic()) { + r2[2].fY -= (r2[2].fX - r1[0].fX) * ratio; + } + } else { + r2[1].fX -= (r2[1].fY - r1[0].fY) * ratio; + if (TCurve::IsCubic()) { + r2[2].fX -= (r2[2].fY - r1[0].fY) * ratio; + } + } + SkDRect sBounds; + sBounds.setBounds(r2); + // see if tight bounds overlap + if (skewToXAxis) { + return bounds.fTop <= sBounds.fBottom && sBounds.fTop <= bounds.fBottom; + } else { + return bounds.fLeft <= sBounds.fRight && sBounds.fLeft <= bounds.fRight; + } +} + +#if DEBUG_T_SECT +template<typename TCurve> +void SkTSpan<TCurve>::validate() const { + SkASSERT(fNext == NULL || fNext != fPrev); + SkASSERT(fNext == NULL || this == fNext->fPrev); + SkASSERT(fBounds.width() || fBounds.height()); + SkASSERT(fBoundsMax == SkTMax(fBounds.width(), fBounds.height())); + SkASSERT(0 <= fStartT); + SkASSERT(fEndT <= 1); + SkASSERT(fStartT < fEndT); + SkASSERT(fBounded.count() > 0); + for (int index = 0; index < fBounded.count(); ++index) { + const SkTSpan* overlap = fBounded[index]; + SkASSERT(((fDebugID ^ overlap->fDebugID) & 1) == 1); + SkASSERT(overlap->contains(this)); + } +} +#endif + +template<typename TCurve> +SkTSect<TCurve>::SkTSect(const TCurve& c PATH_OPS_DEBUG_PARAMS(int id)) + : fCurve(c) + , fHeap(sizeof(SkTSpan<TCurve>) * 4) + , fDeleted(NULL) + , fActiveCount(0) + PATH_OPS_DEBUG_PARAMS(fDebugID(id)) + PATH_OPS_DEBUG_PARAMS(fDebugCount(0)) + PATH_OPS_DEBUG_PARAMS(fDebugAllocatedCount(0)) +{ + fHead = addOne(); + fHead->init(c); +} + +template<typename TCurve> +SkTSpan<TCurve>* SkTSect<TCurve>::addOne() { + SkTSpan<TCurve>* result; + if (fDeleted) { + result = fDeleted; + result->reset(); + fDeleted = result->fNext; + } else { + result = SkNEW_PLACEMENT(fHeap.allocThrow(sizeof(SkTSpan<TCurve>)), SkTSpan<TCurve>); +#if DEBUG_T_SECT + ++fDebugAllocatedCount; +#endif + } + ++fActiveCount; +#if DEBUG_T_SECT + result->fDebugID = fDebugCount++ * 2 + fDebugID; +#endif + return result; +} + +template<typename TCurve> +bool SkTSect<TCurve>::binarySearchCoin(const SkTSect& sect2, double tStart, double tStep, + double* resultT, double* oppT) { + SkTSpan<TCurve> work; + double result = work.fStartT = work.fEndT = tStart; + SkDPoint last = fCurve.ptAtT(tStart); + SkDPoint oppPt; + bool flip = false; + SkDEBUGCODE(bool down = tStep < 0); + const TCurve& opp = sect2.fCurve; + do { + tStep *= 0.5; + work.fStartT += tStep; + if (flip) { + tStep = -tStep; + flip = false; + } + work.initBounds(fCurve); + if (work.fCollapsed) { + return false; + } + if (last.approximatelyEqual(work.fPart[0])) { + break; + } + last = work.fPart[0]; + work.fCoinStart.setPerp(fCurve, work.fStartT, last, opp); + if (work.fCoinStart.isCoincident()) { + double oppTTest = work.fCoinStart.perpT(); + if (sect2.fHead->contains(oppTTest)) { + *oppT = oppTTest; + oppPt = work.fCoinStart.perpPt(); + SkASSERT(down ? result > work.fStartT : result < work.fStartT); + result = work.fStartT; + continue; + } + } + tStep = -tStep; + flip = true; + } while (true); + if (last.approximatelyEqual(fCurve[0])) { + result = 0; + } else if (last.approximatelyEqual(fCurve[TCurve::kPointLast])) { + result = 1; + } + if (oppPt.approximatelyEqual(opp[0])) { + *oppT = 0; + } else if (oppPt.approximatelyEqual(opp[TCurve::kPointLast])) { + *oppT = 1; + } + *resultT = result; + return true; +} + +// OPTIMIZE ? keep a sorted list of sizes in the form of a doubly-linked list in quad span +// so that each quad sect has a pointer to the largest, and can update it as spans +// are split +template<typename TCurve> +SkTSpan<TCurve>* SkTSect<TCurve>::boundsMax() const { + SkTSpan<TCurve>* test = fHead; + SkTSpan<TCurve>* largest = fHead; + bool largestCoin = largest->fCoinStart.isCoincident() && largest->fCoinEnd.isCoincident(); + while ((test = test->fNext)) { + bool testCoin = test->fCoinStart.isCoincident() || test->fCoinEnd.isCoincident(); + if ((largestCoin && !testCoin) || (largestCoin == testCoin + && (largest->fBoundsMax < test->fBoundsMax + || (largest->fCollapsed && !test->fCollapsed)))) { + largest = test; + largestCoin = testCoin; + } + } + return largestCoin ? NULL : largest; +} + +template<typename TCurve> +void SkTSect<TCurve>::coincidentCheck(SkTSect* sect2) { + SkTSpan<TCurve>* first = fHead; + SkTSpan<TCurve>* next; + do { + int consecutive = 1; + SkTSpan<TCurve>* last = first; + do { + next = last->fNext; + if (!next) { + break; + } + if (next->fStartT > last->fEndT) { + break; + } + ++consecutive; + last = next; + } while (true); + if (consecutive < COINCIDENT_SPAN_COUNT) { + continue; + } + setPerp(sect2->fCurve, first, last); + // check to see if a range of points are on the curve + onCurveCheck(sect2, first, last); + SkTSpan<TCurve>* removalCandidate = NULL; + if (!first->fCoinStart.isCoincident()) { + SkTSpan<TCurve>* firstCoin = first->fNext; + removalCandidate = first; + first = firstCoin; + } + if (!first->fCoinStart.isCoincident()) { + continue; + } + if (removalCandidate) { + removeSpans(removalCandidate, sect2); + } + if (!last->fCoinStart.isCoincident()) { + continue; + } + if (!last->fCoinEnd.isCoincident()) { + if (--consecutive < COINCIDENT_SPAN_COUNT) { + continue; + } + last = last->fPrev; + SkASSERT(last->fCoinStart.isCoincident()); + SkASSERT(last->fCoinEnd.isCoincident()); + } + SkASSERT(between(0, first->fCoinStart.perpT(), 1) || first->fCoinStart.perpT() == -1); + if (first->fCoinStart.perpT() < 0) { + first->fCoinStart.setPerp(fCurve, first->fStartT, first->fPart[0], sect2->fCurve); + } + SkASSERT(between(0, last->fCoinEnd.perpT(), 1) || last->fCoinEnd.perpT() == -1); + if (last->fCoinEnd.perpT() < 0) { + last->fCoinEnd.setPerp(fCurve, last->fEndT, last->fPart[TCurve::kPointLast], + sect2->fCurve); + } + SkTSpan<TCurve>* removeMe = first->fNext; + while (removeMe != last) { + SkTSpan<TCurve>* removeNext = removeMe->fNext; + removeSpans(removeMe, sect2); + removeMe = removeNext; + } + } while ((first = next)); +} + +template<typename TCurve> +bool SkTSect<TCurve>::intersects(SkTSpan<TCurve>* span, const SkTSect* opp, + const SkTSpan<TCurve>* oppSpan) const { + bool check; // we ignore whether the end points are in common or not + if (!span->intersects(oppSpan, &check)) { + return false; + } + if (fActiveCount < COINCIDENT_SPAN_COUNT || opp->fActiveCount < COINCIDENT_SPAN_COUNT) { + return true; + } + return span->tightBoundsIntersects(oppSpan); +} + +template<typename TCurve> +void SkTSect<TCurve>::onCurveCheck(SkTSect* sect2, SkTSpan<TCurve>* first, SkTSpan<TCurve>* last) { + SkTSpan<TCurve>* work = first; + first = NULL; + do { + if (work->fCoinStart.isCoincident()) { + if (!first) { + first = work; + } + } else if (first) { + break; + } + if (work == last) { + break; + } + work = work->fNext; + SkASSERT(work); + } while (true); + if (!first) { + return; + } + // march outwards to find limit of coincidence from here to previous and next spans + double startT = first->fStartT; + double oppT; + SkTSpan<TCurve>* prev = first->fPrev; + if (prev) { + double coinStart; + if (binarySearchCoin(*sect2, startT, prev->fStartT - startT, &coinStart, &oppT)) { + if (coinStart < startT) { + SkASSERT(prev->fStartT < coinStart && coinStart < prev->fEndT); + SkTSpan<TCurve>* oppStart = sect2->fHead->find(oppT); + if (oppStart->fStartT < oppT && oppT < oppStart->fEndT) { + // split prev at coinStart if needed + SkTSpan<TCurve>* half2 = addOne(); + half2->splitAt(prev, coinStart); + half2->initBounds(fCurve); + prev->initBounds(fCurve); + prev->fCoinEnd.markCoincident(); + half2->fCoinStart.markCoincident(); + half2->fCoinEnd.markCoincident(); + // find span containing opposite t, and split that too + SkTSpan<TCurve>* oppHalf = sect2->addOne(); + oppHalf->splitAt(oppStart, oppT); + oppHalf->initBounds(sect2->fCurve); + oppStart->initBounds(sect2->fCurve); + } else { + SkASSERT(oppStart->fStartT == oppT || oppT == oppStart->fEndT); + first->fStartT = coinStart; + prev->fEndT = coinStart; + first->initBounds(fCurve); + prev->initBounds(fCurve); + first->fCoinStart.markCoincident(); + first->fCoinEnd.markCoincident(); + } + } + } + } + if (!work->fCoinEnd.isCoincident()) { + if (work->fEndT == 1) { + SkDebugf("!"); + } +// SkASSERT(work->fEndT < 1); + startT = work->fStartT; + double coinEnd; + if (binarySearchCoin(*sect2, startT, work->fEndT - startT, &coinEnd, &oppT)) { + if (coinEnd > startT) { + SkTSpan<TCurve>* oppStart = sect2->fHead->find(oppT); + if (oppStart->fStartT < oppT && oppT < oppStart->fEndT) { + SkASSERT(coinEnd < work->fEndT); + // split prev at coinEnd if needed + SkTSpan<TCurve>* half2 = addOne(); + half2->splitAt(work, coinEnd); + half2->initBounds(fCurve); + work->initBounds(fCurve); + work->fCoinStart.markCoincident(); + work->fCoinEnd.markCoincident(); + half2->fCoinStart.markCoincident(); + SkTSpan<TCurve>* oppHalf = sect2->addOne(); + oppHalf->splitAt(oppStart, oppT); + oppHalf->initBounds(sect2->fCurve); + oppStart->initBounds(sect2->fCurve); + } else { + SkASSERT(oppStart->fStartT == oppT || oppT == oppStart->fEndT); + SkTSpan<TCurve>* next = work->fNext; + bool hasNext = next && work->fEndT == next->fStartT; + work->fEndT = coinEnd; + work->initBounds(fCurve); + work->fCoinStart.markCoincident(); + work->fCoinEnd.markCoincident(); + if (hasNext) { + next->fStartT = coinEnd; + next->initBounds(fCurve); + } + } + } + } + } +} + +template<typename TCurve> +void SkTSect<TCurve>::recoverCollapsed() { + SkTSpan<TCurve>* deleted = fDeleted; + while (deleted) { + SkTSpan<TCurve>* delNext = deleted->fNext; + if (deleted->fCollapsed) { + SkTSpan<TCurve>** spanPtr = &fHead; + while (*spanPtr && (*spanPtr)->fEndT <= deleted->fStartT) { + spanPtr = &(*spanPtr)->fNext; + } + deleted->fNext = *spanPtr; + *spanPtr = deleted; + } + deleted = delNext; + } +} + +template<typename TCurve> +void SkTSect<TCurve>::removeSpan(SkTSpan<TCurve>* span) { + SkTSpan<TCurve>* prev = span->fPrev; + SkTSpan<TCurve>* next = span->fNext; + if (prev) { + prev->fNext = next; + if (next) { + next->fPrev = prev; + } + } else { + fHead = next; + if (next) { + next->fPrev = NULL; + } + } + --fActiveCount; + span->fNext = fDeleted; + fDeleted = span; +#if DEBUG_T_SECT + SkASSERT(!span->fDebugDeleted); + span->fDebugDeleted = true; +#endif +} + +template<typename TCurve> +void SkTSect<TCurve>::removeOne(const SkTSpan<TCurve>* test, SkTSpan<TCurve>* span) { + int last = span->fBounded.count() - 1; + for (int index = 0; index <= last; ++index) { + if (span->fBounded[index] == test) { + span->fBounded.removeShuffle(index); + if (!last) { + removeSpan(span); + } + return; + } + } +} + +template<typename TCurve> +void SkTSect<TCurve>::removeSpans(SkTSpan<TCurve>* span, SkTSect<TCurve>* opp) { + int count = span->fBounded.count(); + for (int index = 0; index < count; ++index) { + SkTSpan<TCurve>* bounded = span->fBounded[0]; + removeOne(bounded, span); // shuffles last into position 0 + opp->removeOne(span, bounded); + } +} + +template<typename TCurve> +void SkTSect<TCurve>::setPerp(const TCurve& opp, SkTSpan<TCurve>* first, SkTSpan<TCurve>* last) { + SkTSpan<TCurve>* work = first; + if (!work->fHasPerp) { + work->fCoinStart.setPerp(fCurve, work->fStartT, work->fPart[0], opp); + } + do { + if (!work->fHasPerp) { + work->fCoinEnd.setPerp(fCurve, work->fEndT, work->fPart[TCurve::kPointLast], opp); + work->fHasPerp = true; + } + if (work == last) { + break; + } + SkTSpan<TCurve>* last = work; + work = work->fNext; + SkASSERT(work); + if (!work->fHasPerp) { + work->fCoinStart = last->fCoinEnd; + } + } while (true); +} + +template<typename TCurve> +const SkTSpan<TCurve>* SkTSect<TCurve>::tail() const { + const SkTSpan<TCurve>* result = fHead; + const SkTSpan<TCurve>* next = fHead; + while ((next = next->fNext)) { + if (next->fEndT > result->fEndT) { + result = next; + } + } + return result; +} + +/* Each span has a range of opposite spans it intersects. After the span is split in two, + adjust the range to its new size */ +template<typename TCurve> +void SkTSect<TCurve>::trim(SkTSpan<TCurve>* span, SkTSect* opp) { + span->initBounds(fCurve); + int count = span->fBounded.count(); + for (int index = 0; index < count; ) { + SkTSpan<TCurve>* test = span->fBounded[index]; + bool sects = intersects(span, opp, test); + if (sects) { + ++index; + } else { + removeOne(test, span); + opp->removeOne(span, test); + --count; + } + } +} + +#if DEBUG_T_SECT +template<typename TCurve> +void SkTSect<TCurve>::validate() const { + int count = 0; + if (fHead) { + const SkTSpan<TCurve>* span = fHead; + SkASSERT(!span->fPrev); + double last = 0; + do { + span->validate(); + SkASSERT(span->fStartT >= last); + last = span->fEndT; + ++count; + } while ((span = span->fNext) != NULL); + } + SkASSERT(count == fActiveCount); + SkASSERT(fActiveCount <= fDebugAllocatedCount); + int deletedCount = 0; + const SkTSpan<TCurve>* deleted = fDeleted; + while (deleted) { + ++deletedCount; + deleted = deleted->fNext; + } + SkASSERT(fActiveCount + deletedCount == fDebugAllocatedCount); +} +#endif + +template<typename TCurve> +int SkTSect<TCurve>::EndsEqual(const SkTSect* sect1, const SkTSect* sect2, + SkIntersections* intersections) { + int zeroOneSet = 0; + // check for zero + if (sect1->fCurve[0].approximatelyEqual(sect2->fCurve[0])) { + zeroOneSet |= kZeroS1Set | kZeroS2Set; + if (sect1->fCurve[0] != sect2->fCurve[0]) { + intersections->insertNear(0, 0, sect1->fCurve[0], sect2->fCurve[0]); + } else { + intersections->insert(0, 0, sect1->fCurve[0]); + } + } + if (sect1->fCurve[0].approximatelyEqual(sect2->fCurve[TCurve::kPointLast])) { + zeroOneSet |= kZeroS1Set | kOneS2Set; + if (sect1->fCurve[0] != sect2->fCurve[TCurve::kPointLast]) { + intersections->insertNear(0, 1, sect1->fCurve[0], sect2->fCurve[TCurve::kPointLast]); + } else { + intersections->insert(0, 1, sect1->fCurve[0]); + } + } + // check for one + if (sect1->fCurve[TCurve::kPointLast].approximatelyEqual(sect2->fCurve[0])) { + zeroOneSet |= kOneS1Set | kZeroS2Set; + if (sect1->fCurve[TCurve::kPointLast] != sect2->fCurve[0]) { + intersections->insertNear(1, 0, sect1->fCurve[TCurve::kPointLast], sect2->fCurve[0]); + } else { + intersections->insert(1, 0, sect1->fCurve[TCurve::kPointLast]); + } + } + if (sect1->fCurve[TCurve::kPointLast].approximatelyEqual(sect2->fCurve[TCurve::kPointLast])) { + zeroOneSet |= kOneS1Set | kOneS2Set; + if (sect1->fCurve[TCurve::kPointLast] != sect2->fCurve[TCurve::kPointLast]) { + intersections->insertNear(1, 1, sect1->fCurve[TCurve::kPointLast], + sect2->fCurve[TCurve::kPointLast]); + } else { + intersections->insert(1, 1, sect1->fCurve[TCurve::kPointLast]); + } + } + return zeroOneSet; +} + +template<typename TCurve> +struct SkClosestRecord { + void addIntersection(SkIntersections* intersections) const { + double r1t = fC1Index ? fC1Span->endT() : fC1Span->startT(); + double r2t = fC2Index ? fC2Span->endT() : fC2Span->startT(); + intersections->insert(r1t, r2t, fC1Span->part()[fC1Index]); + } + + void findEnd(const SkTSpan<TCurve>* span1, const SkTSpan<TCurve>* span2, + int c1Index, int c2Index) { + const TCurve& c1 = span1->part(); + const TCurve& c2 = span2->part(); + if (!c1[c1Index].approximatelyEqual(c2[c2Index])) { + return; + } + double dist = c1[c1Index].distanceSquared(c2[c2Index]); + if (fClosest < dist) { + return; + } + fC1Span = span1; + fC2Span = span2; + fC1StartT = span1->startT(); + fC1EndT = span1->endT(); + fC2StartT = span2->startT(); + fC2EndT = span2->endT(); + fC1Index = c1Index; + fC2Index = c2Index; + fClosest = dist; + } + + bool matesWith(const SkClosestRecord& mate) const { + SkASSERT(fC1Span == mate.fC1Span || fC1Span->endT() <= mate.fC1Span->startT() + || mate.fC1Span->endT() <= fC1Span->startT()); + SkASSERT(fC2Span == mate.fC2Span || fC2Span->endT() <= mate.fC2Span->startT() + || mate.fC2Span->endT() <= fC2Span->startT()); + return fC1Span == mate.fC1Span || fC1Span->endT() == mate.fC1Span->startT() + || fC1Span->startT() == mate.fC1Span->endT() + || fC2Span == mate.fC2Span + || fC2Span->endT() == mate.fC2Span->startT() + || fC2Span->startT() == mate.fC2Span->endT(); + } + + void merge(const SkClosestRecord& mate) { + fC1Span = mate.fC1Span; + fC2Span = mate.fC2Span; + fClosest = mate.fClosest; + fC1Index = mate.fC1Index; + fC2Index = mate.fC2Index; + } + + void reset() { + fClosest = FLT_MAX; + SkDEBUGCODE(fC1Span = fC2Span = NULL); + SkDEBUGCODE(fC1Index = fC2Index = -1); + } + + void update(const SkClosestRecord& mate) { + fC1StartT = SkTMin(fC1StartT, mate.fC1StartT); + fC1EndT = SkTMax(fC1EndT, mate.fC1EndT); + fC2StartT = SkTMin(fC2StartT, mate.fC2StartT); + fC2EndT = SkTMax(fC2EndT, mate.fC2EndT); + } + + const SkTSpan<TCurve>* fC1Span; + const SkTSpan<TCurve>* fC2Span; + double fC1StartT; + double fC1EndT; + double fC2StartT; + double fC2EndT; + double fClosest; + int fC1Index; + int fC2Index; +}; + +template<typename TCurve> +struct SkClosestSect { + SkClosestSect() + : fUsed(0) { + fClosest.push_back().reset(); + } + + void find(const SkTSpan<TCurve>* span1, const SkTSpan<TCurve>* span2) { + SkClosestRecord<TCurve>* record = &fClosest[fUsed]; + record->findEnd(span1, span2, 0, 0); + record->findEnd(span1, span2, 0, TCurve::kPointLast); + record->findEnd(span1, span2, TCurve::kPointLast, 0); + record->findEnd(span1, span2, TCurve::kPointLast, TCurve::kPointLast); + if (record->fClosest == FLT_MAX) { + return; + } + for (int index = 0; index < fUsed; ++index) { + SkClosestRecord<TCurve>* test = &fClosest[index]; + if (test->matesWith(*record)) { + if (test->fClosest > record->fClosest) { + test->merge(*record); + } + test->update(*record); + record->reset(); + return; + } + } + ++fUsed; + fClosest.push_back().reset(); + } + + void finish(SkIntersections* intersections) const { + for (int index = 0; index < fUsed; ++index) { + const SkClosestRecord<TCurve>& test = fClosest[index]; + test.addIntersection(intersections); + } + } + + // this is oversized by one so that an extra record can merge into final one + SkSTArray<TCurve::kMaxIntersections + 1, SkClosestRecord<TCurve>, true> fClosest; + int fUsed; +}; + +// returns true if the rect is too small to consider +template<typename TCurve> +void SkTSect<TCurve>::BinarySearch(SkTSect* sect1, SkTSect* sect2, SkIntersections* intersections) { + intersections->reset(); + intersections->setMax(TCurve::kMaxIntersections); + SkTSpan<TCurve>* span1 = sect1->fHead; + SkTSpan<TCurve>* span2 = sect2->fHead; + bool check; + if (!span1->intersects(span2, &check)) { + return; + } + if (check) { + (void) EndsEqual(sect1, sect2, intersections); + return; + } + span1->fBounded.push_back() = span2; + span2->fBounded.push_back() = span1; + do { + // find the largest bounds + SkTSpan<TCurve>* largest1 = sect1->boundsMax(); + if (!largest1) { + break; + } + SkTSpan<TCurve>* largest2 = sect2->boundsMax(); + bool split1 = !largest2 || (largest1 && (largest1->fBoundsMax > largest2->fBoundsMax + || (!largest1->fCollapsed && largest2->fCollapsed))); + // split it + SkTSect* splitSect = split1 ? sect1 : sect2; + SkTSpan<TCurve>* half1 = split1 ? largest1 : largest2; + SkASSERT(half1); + if (half1->fCollapsed) { + break; + } + // trim parts that don't intersect the opposite + SkTSpan<TCurve>* half2 = splitSect->addOne(); + SkTSect* unsplitSect = split1 ? sect2 : sect1; + if (!half2->split(half1)) { + break; + } + splitSect->trim(half1, unsplitSect); + splitSect->trim(half2, unsplitSect); + // if there are 9 or more continuous spans on both sects, suspect coincidence + if (sect1->fActiveCount >= COINCIDENT_SPAN_COUNT + && sect2->fActiveCount >= COINCIDENT_SPAN_COUNT) { + sect1->coincidentCheck(sect2); + } +#if DEBUG_T_SECT + sect1->validate(); + sect2->validate(); +#endif +#if DEBUG_T_SECT_DUMP > 1 + sect1->dumpBoth(*sect2); +#endif + if (!sect1->fHead || !sect2->fHead) { + return; + } + } while (true); + if (sect1->fActiveCount >= 2 && sect2->fActiveCount >= 2) { + // check for coincidence + SkTSpan<TCurve>* first = sect1->fHead; + do { + if (!first->fCoinStart.isCoincident()) { + continue; + } + int spanCount = 1; + SkTSpan<TCurve>* last = first; + while (last->fCoinEnd.isCoincident()) { + SkTSpan<TCurve>* next = last->fNext; + if (!next || !next->fCoinEnd.isCoincident()) { + break; + } + last = next; + ++spanCount; + } + if (spanCount < 2) { + first = last; + continue; + } + int index = intersections->insertCoincident(first->fStartT, first->fCoinStart.perpT(), + first->fPart[0]); + if (intersections->insertCoincident(last->fEndT, last->fCoinEnd.perpT(), + last->fPart[TCurve::kPointLast]) < 0) { + intersections->clearCoincidence(index); + } + } while ((first = first->fNext)); + } + int zeroOneSet = EndsEqual(sect1, sect2, intersections); + sect1->recoverCollapsed(); + sect2->recoverCollapsed(); + SkTSpan<TCurve>* result1 = sect1->fHead; + // check heads and tails for zero and ones and insert them if we haven't already done so + const SkTSpan<TCurve>* head1 = result1; + if (!(zeroOneSet & kZeroS1Set) && approximately_less_than_zero(head1->fStartT)) { + const SkDPoint& start1 = sect1->fCurve[0]; + double t = head1->closestBoundedT(start1); + if (sect2->fCurve.ptAtT(t).approximatelyEqual(start1)) { + intersections->insert(0, t, start1); + } + } + const SkTSpan<TCurve>* head2 = sect2->fHead; + if (!(zeroOneSet & kZeroS2Set) && approximately_less_than_zero(head2->fStartT)) { + const SkDPoint& start2 = sect2->fCurve[0]; + double t = head2->closestBoundedT(start2); + if (sect1->fCurve.ptAtT(t).approximatelyEqual(start2)) { + intersections->insert(t, 0, start2); + } + } + const SkTSpan<TCurve>* tail1 = sect1->tail(); + if (!(zeroOneSet & kOneS1Set) && approximately_greater_than_one(tail1->fEndT)) { + const SkDPoint& end1 = sect1->fCurve[TCurve::kPointLast]; + double t = tail1->closestBoundedT(end1); + if (sect2->fCurve.ptAtT(t).approximatelyEqual(end1)) { + intersections->insert(1, t, end1); + } + } + const SkTSpan<TCurve>* tail2 = sect2->tail(); + if (!(zeroOneSet & kOneS2Set) && approximately_greater_than_one(tail2->fEndT)) { + const SkDPoint& end2 = sect2->fCurve[TCurve::kPointLast]; + double t = tail2->closestBoundedT(end2); + if (sect1->fCurve.ptAtT(t).approximatelyEqual(end2)) { + intersections->insert(t, 1, end2); + } + } + SkClosestSect<TCurve> closest; + do { + while (result1 && result1->fCoinStart.isCoincident() && result1->fCoinEnd.isCoincident()) { + result1 = result1->fNext; + } + if (!result1) { + break; + } + SkTSpan<TCurve>* result2 = sect2->fHead; + while (result2) { + closest.find(result1, result2); + result2 = result2->fNext; + } + + } while ((result1 = result1->fNext)); + closest.finish(intersections); +} diff --git a/tests/PathOpsBuildUseTest.cpp b/tests/PathOpsBuildUseTest.cpp new file mode 100644 index 0000000000..76a54f6fbe --- /dev/null +++ b/tests/PathOpsBuildUseTest.cpp @@ -0,0 +1,2435 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "PathOpsExtendedTest.h" +#include "PathOpsTestCommon.h" + +#define TEST(name) { name, #name } + +static void build1_1(skiatest::Reporter* reporter, const char* filename) { + SkOpBuilder builder; + SkPath path; + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x436ae68e), SkBits2Float(0x43adff26)); // 234.901f, 347.993f +path.quadTo(SkBits2Float(0x436ae68e), SkBits2Float(0x43b32ca2), SkBits2Float(0x4363940a), SkBits2Float(0x43b6d5e4)); // 234.901f, 358.349f, 227.578f, 365.671f +path.quadTo(SkBits2Float(0x435c4186), SkBits2Float(0x43ba7f26), SkBits2Float(0x4351e68e), SkBits2Float(0x43ba7f26)); // 220.256f, 372.993f, 209.901f, 372.993f +path.quadTo(SkBits2Float(0x43478b96), SkBits2Float(0x43ba7f26), SkBits2Float(0x43403912), SkBits2Float(0x43b6d5e4)); // 199.545f, 372.993f, 192.223f, 365.671f +path.quadTo(SkBits2Float(0x4338e68e), SkBits2Float(0x43b32ca2), SkBits2Float(0x4338e68e), SkBits2Float(0x43adff26)); // 184.901f, 358.349f, 184.901f, 347.993f +path.quadTo(SkBits2Float(0x4338e68e), SkBits2Float(0x43a8d1aa), SkBits2Float(0x43403912), SkBits2Float(0x43a52868)); // 184.901f, 337.638f, 192.223f, 330.316f +path.quadTo(SkBits2Float(0x43478b96), SkBits2Float(0x43a17f26), SkBits2Float(0x4351e68e), SkBits2Float(0x43a17f26)); // 199.545f, 322.993f, 209.901f, 322.993f +path.quadTo(SkBits2Float(0x435c4186), SkBits2Float(0x43a17f26), SkBits2Float(0x4363940a), SkBits2Float(0x43a52868)); // 220.256f, 322.993f, 227.578f, 330.316f +path.quadTo(SkBits2Float(0x436ae68e), SkBits2Float(0x43a8d1aa), SkBits2Float(0x436ae68e), SkBits2Float(0x43adff26)); // 234.901f, 337.638f, 234.901f, 347.993f +path.close(); + SkPath path0(path); + builder.add(path0, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ad0aca), SkBits2Float(0x432a0e2c)); // 346.084f, 170.055f +path.quadTo(SkBits2Float(0x43ad0aca), SkBits2Float(0x43346924), SkBits2Float(0x43a96188), SkBits2Float(0x433bbba8)); // 346.084f, 180.411f, 338.762f, 187.733f +path.quadTo(SkBits2Float(0x43a5b846), SkBits2Float(0x43430e2c), SkBits2Float(0x43a08aca), SkBits2Float(0x43430e2c)); // 331.44f, 195.055f, 321.084f, 195.055f +path.quadTo(SkBits2Float(0x439b5d4e), SkBits2Float(0x43430e2c), SkBits2Float(0x4397b40c), SkBits2Float(0x433bbba8)); // 310.729f, 195.055f, 303.407f, 187.733f +path.quadTo(SkBits2Float(0x43940aca), SkBits2Float(0x43346924), SkBits2Float(0x43940aca), SkBits2Float(0x432a0e2c)); // 296.084f, 180.411f, 296.084f, 170.055f +path.quadTo(SkBits2Float(0x43940aca), SkBits2Float(0x431fb334), SkBits2Float(0x4397b40c), SkBits2Float(0x431860b0)); // 296.084f, 159.7f, 303.407f, 152.378f +path.quadTo(SkBits2Float(0x439b5d4e), SkBits2Float(0x43110e2c), SkBits2Float(0x43a08aca), SkBits2Float(0x43110e2c)); // 310.729f, 145.055f, 321.084f, 145.055f +path.quadTo(SkBits2Float(0x43a5b846), SkBits2Float(0x43110e2c), SkBits2Float(0x43a96188), SkBits2Float(0x431860b0)); // 331.44f, 145.055f, 338.762f, 152.378f +path.quadTo(SkBits2Float(0x43ad0aca), SkBits2Float(0x431fb334), SkBits2Float(0x43ad0aca), SkBits2Float(0x432a0e2c)); // 346.084f, 159.7f, 346.084f, 170.055f +path.close(); + SkPath path1(path); + builder.add(path1, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x431f14f9), SkBits2Float(0x433943fd)); // 159.082f, 185.266f +path.quadTo(SkBits2Float(0x431f14f9), SkBits2Float(0x43439ef4), SkBits2Float(0x4317c275), SkBits2Float(0x434af179)); // 159.082f, 195.621f, 151.76f, 202.943f +path.quadTo(SkBits2Float(0x43106ff0), SkBits2Float(0x435243fd), SkBits2Float(0x430614f9), SkBits2Float(0x435243fd)); // 144.437f, 210.266f, 134.082f, 210.266f +path.quadTo(SkBits2Float(0x42f77403), SkBits2Float(0x435243fd), SkBits2Float(0x42e8cefa), SkBits2Float(0x434af179)); // 123.727f, 210.266f, 116.404f, 202.943f +path.quadTo(SkBits2Float(0x42da29f2), SkBits2Float(0x43439ef4), SkBits2Float(0x42da29f2), SkBits2Float(0x433943fd)); // 109.082f, 195.621f, 109.082f, 185.266f +path.quadTo(SkBits2Float(0x42da29f2), SkBits2Float(0x432ee906), SkBits2Float(0x42e8cefa), SkBits2Float(0x43279681)); // 109.082f, 174.91f, 116.404f, 167.588f +path.quadTo(SkBits2Float(0x42f77403), SkBits2Float(0x432043fd), SkBits2Float(0x430614f9), SkBits2Float(0x432043fd)); // 123.727f, 160.266f, 134.082f, 160.266f +path.quadTo(SkBits2Float(0x43106ff0), SkBits2Float(0x432043fd), SkBits2Float(0x4317c275), SkBits2Float(0x43279681)); // 144.437f, 160.266f, 151.76f, 167.588f +path.quadTo(SkBits2Float(0x431f14f9), SkBits2Float(0x432ee906), SkBits2Float(0x431f14f9), SkBits2Float(0x433943fd)); // 159.082f, 174.91f, 159.082f, 185.266f +path.close(); + SkPath path2(path); + builder.add(path2, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x433ad67a), SkBits2Float(0x43abd585)); // 186.838f, 343.668f +path.quadTo(SkBits2Float(0x433ad67a), SkBits2Float(0x43b10301), SkBits2Float(0x433383f6), SkBits2Float(0x43b4ac43)); // 186.838f, 354.023f, 179.515f, 361.346f +path.quadTo(SkBits2Float(0x432c3172), SkBits2Float(0x43b85585), SkBits2Float(0x4321d67a), SkBits2Float(0x43b85585)); // 172.193f, 368.668f, 161.838f, 368.668f +path.quadTo(SkBits2Float(0x43177b82), SkBits2Float(0x43b85585), SkBits2Float(0x431028fe), SkBits2Float(0x43b4ac43)); // 151.482f, 368.668f, 144.16f, 361.346f +path.quadTo(SkBits2Float(0x4308d67a), SkBits2Float(0x43b10301), SkBits2Float(0x4308d67a), SkBits2Float(0x43abd585)); // 136.838f, 354.023f, 136.838f, 343.668f +path.quadTo(SkBits2Float(0x4308d67a), SkBits2Float(0x43a6a809), SkBits2Float(0x431028fe), SkBits2Float(0x43a2fec7)); // 136.838f, 333.313f, 144.16f, 325.99f +path.quadTo(SkBits2Float(0x43177b82), SkBits2Float(0x439f5585), SkBits2Float(0x4321d67a), SkBits2Float(0x439f5585)); // 151.482f, 318.668f, 161.838f, 318.668f +path.quadTo(SkBits2Float(0x432c3172), SkBits2Float(0x439f5585), SkBits2Float(0x433383f6), SkBits2Float(0x43a2fec7)); // 172.193f, 318.668f, 179.515f, 325.99f +path.quadTo(SkBits2Float(0x433ad67a), SkBits2Float(0x43a6a809), SkBits2Float(0x433ad67a), SkBits2Float(0x43abd585)); // 186.838f, 333.313f, 186.838f, 343.668f +path.close(); + SkPath path3(path); + builder.add(path3, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43bff91b), SkBits2Float(0x43973a57)); // 383.946f, 302.456f +path.quadTo(SkBits2Float(0x43bff91b), SkBits2Float(0x439c67d3), SkBits2Float(0x43bc4fd9), SkBits2Float(0x43a01115)); // 383.946f, 312.811f, 376.624f, 320.133f +path.quadTo(SkBits2Float(0x43b8a697), SkBits2Float(0x43a3ba57), SkBits2Float(0x43b3791b), SkBits2Float(0x43a3ba57)); // 369.301f, 327.456f, 358.946f, 327.456f +path.quadTo(SkBits2Float(0x43ae4b9f), SkBits2Float(0x43a3ba57), SkBits2Float(0x43aaa25d), SkBits2Float(0x43a01115)); // 348.591f, 327.456f, 341.268f, 320.133f +path.quadTo(SkBits2Float(0x43a6f91b), SkBits2Float(0x439c67d3), SkBits2Float(0x43a6f91b), SkBits2Float(0x43973a57)); // 333.946f, 312.811f, 333.946f, 302.456f +path.quadTo(SkBits2Float(0x43a6f91b), SkBits2Float(0x43920cdb), SkBits2Float(0x43aaa25d), SkBits2Float(0x438e6399)); // 333.946f, 292.1f, 341.268f, 284.778f +path.quadTo(SkBits2Float(0x43ae4b9f), SkBits2Float(0x438aba57), SkBits2Float(0x43b3791b), SkBits2Float(0x438aba57)); // 348.591f, 277.456f, 358.946f, 277.456f +path.quadTo(SkBits2Float(0x43b8a697), SkBits2Float(0x438aba57), SkBits2Float(0x43bc4fd9), SkBits2Float(0x438e6399)); // 369.301f, 277.456f, 376.624f, 284.778f +path.quadTo(SkBits2Float(0x43bff91b), SkBits2Float(0x43920cdb), SkBits2Float(0x43bff91b), SkBits2Float(0x43973a57)); // 383.946f, 292.1f, 383.946f, 302.456f +path.close(); + SkPath path4(path); + builder.add(path4, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43374c2c), SkBits2Float(0x437e8a30)); // 183.298f, 254.54f +path.quadTo(SkBits2Float(0x43374c2c), SkBits2Float(0x43847294), SkBits2Float(0x432ff9a8), SkBits2Float(0x43881bd6)); // 183.298f, 264.895f, 175.975f, 272.217f +path.quadTo(SkBits2Float(0x4328a724), SkBits2Float(0x438bc518), SkBits2Float(0x431e4c2c), SkBits2Float(0x438bc518)); // 168.653f, 279.54f, 158.298f, 279.54f +path.quadTo(SkBits2Float(0x4313f134), SkBits2Float(0x438bc518), SkBits2Float(0x430c9eb0), SkBits2Float(0x43881bd6)); // 147.942f, 279.54f, 140.62f, 272.217f +path.quadTo(SkBits2Float(0x43054c2c), SkBits2Float(0x43847294), SkBits2Float(0x43054c2c), SkBits2Float(0x437e8a30)); // 133.298f, 264.895f, 133.298f, 254.54f +path.quadTo(SkBits2Float(0x43054c2c), SkBits2Float(0x43742f38), SkBits2Float(0x430c9eb0), SkBits2Float(0x436cdcb4)); // 133.298f, 244.184f, 140.62f, 236.862f +path.quadTo(SkBits2Float(0x4313f134), SkBits2Float(0x43658a30), SkBits2Float(0x431e4c2c), SkBits2Float(0x43658a30)); // 147.942f, 229.54f, 158.298f, 229.54f +path.quadTo(SkBits2Float(0x4328a724), SkBits2Float(0x43658a30), SkBits2Float(0x432ff9a8), SkBits2Float(0x436cdcb4)); // 168.653f, 229.54f, 175.975f, 236.862f +path.quadTo(SkBits2Float(0x43374c2c), SkBits2Float(0x43742f38), SkBits2Float(0x43374c2c), SkBits2Float(0x437e8a30)); // 183.298f, 244.184f, 183.298f, 254.54f +path.close(); + SkPath path5(path); + builder.add(path5, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x430e01e8), SkBits2Float(0x435c8671)); // 142.007f, 220.525f +path.quadTo(SkBits2Float(0x430e01e8), SkBits2Float(0x4366e168), SkBits2Float(0x4306af64), SkBits2Float(0x436e33ed)); // 142.007f, 230.88f, 134.685f, 238.203f +path.quadTo(SkBits2Float(0x42feb9bf), SkBits2Float(0x43758671), SkBits2Float(0x42ea03d0), SkBits2Float(0x43758671)); // 127.363f, 245.525f, 117.007f, 245.525f +path.quadTo(SkBits2Float(0x42d54de1), SkBits2Float(0x43758671), SkBits2Float(0x42c6a8d8), SkBits2Float(0x436e33ed)); // 106.652f, 245.525f, 99.3298f, 238.203f +path.quadTo(SkBits2Float(0x42b803d0), SkBits2Float(0x4366e168), SkBits2Float(0x42b803d0), SkBits2Float(0x435c8671)); // 92.0074f, 230.88f, 92.0074f, 220.525f +path.quadTo(SkBits2Float(0x42b803d0), SkBits2Float(0x43522b7a), SkBits2Float(0x42c6a8d8), SkBits2Float(0x434ad8f5)); // 92.0074f, 210.17f, 99.3298f, 202.847f +path.quadTo(SkBits2Float(0x42d54de1), SkBits2Float(0x43438671), SkBits2Float(0x42ea03d0), SkBits2Float(0x43438671)); // 106.652f, 195.525f, 117.007f, 195.525f +path.quadTo(SkBits2Float(0x42feb9bf), SkBits2Float(0x43438671), SkBits2Float(0x4306af64), SkBits2Float(0x434ad8f5)); // 127.363f, 195.525f, 134.685f, 202.847f +path.quadTo(SkBits2Float(0x430e01e8), SkBits2Float(0x43522b7a), SkBits2Float(0x430e01e8), SkBits2Float(0x435c8671)); // 142.007f, 210.17f, 142.007f, 220.525f +path.close(); + SkPath path6(path); + builder.add(path6, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x438b7062), SkBits2Float(0x42d54bf2)); // 278.878f, 106.648f +path.quadTo(SkBits2Float(0x438b7062), SkBits2Float(0x42ea01e1), SkBits2Float(0x4387c720), SkBits2Float(0x42f8a6ea)); // 278.878f, 117.004f, 271.556f, 124.326f +path.quadTo(SkBits2Float(0x43841dde), SkBits2Float(0x4303a5f9), SkBits2Float(0x437de0c4), SkBits2Float(0x4303a5f9)); // 264.233f, 131.648f, 253.878f, 131.648f +path.quadTo(SkBits2Float(0x437385cc), SkBits2Float(0x4303a5f9), SkBits2Float(0x436c3348), SkBits2Float(0x42f8a6ea)); // 243.523f, 131.648f, 236.2f, 124.326f +path.quadTo(SkBits2Float(0x4364e0c3), SkBits2Float(0x42ea01e1), SkBits2Float(0x4364e0c3), SkBits2Float(0x42d54bf2)); // 228.878f, 117.004f, 228.878f, 106.648f +path.quadTo(SkBits2Float(0x4364e0c3), SkBits2Float(0x42c09603), SkBits2Float(0x436c3348), SkBits2Float(0x42b1f0fa)); // 228.878f, 96.293f, 236.2f, 88.9707f +path.quadTo(SkBits2Float(0x437385cc), SkBits2Float(0x42a34bf2), SkBits2Float(0x437de0c4), SkBits2Float(0x42a34bf2)); // 243.523f, 81.6483f, 253.878f, 81.6483f +path.quadTo(SkBits2Float(0x43841dde), SkBits2Float(0x42a34bf2), SkBits2Float(0x4387c720), SkBits2Float(0x42b1f0fa)); // 264.233f, 81.6483f, 271.556f, 88.9707f +path.quadTo(SkBits2Float(0x438b7062), SkBits2Float(0x42c09603), SkBits2Float(0x438b7062), SkBits2Float(0x42d54bf2)); // 278.878f, 96.293f, 278.878f, 106.648f +path.close(); + SkPath path7(path); + builder.add(path7, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43de3ff6), SkBits2Float(0x43963745)); // 444.5f, 300.432f +path.quadTo(SkBits2Float(0x43de3ff6), SkBits2Float(0x439b64c1), SkBits2Float(0x43da96b4), SkBits2Float(0x439f0e03)); // 444.5f, 310.787f, 437.177f, 318.109f +path.quadTo(SkBits2Float(0x43d6ed72), SkBits2Float(0x43a2b745), SkBits2Float(0x43d1bff6), SkBits2Float(0x43a2b745)); // 429.855f, 325.432f, 419.5f, 325.432f +path.quadTo(SkBits2Float(0x43cc927a), SkBits2Float(0x43a2b745), SkBits2Float(0x43c8e938), SkBits2Float(0x439f0e03)); // 409.144f, 325.432f, 401.822f, 318.109f +path.quadTo(SkBits2Float(0x43c53ff6), SkBits2Float(0x439b64c1), SkBits2Float(0x43c53ff6), SkBits2Float(0x43963745)); // 394.5f, 310.787f, 394.5f, 300.432f +path.quadTo(SkBits2Float(0x43c53ff6), SkBits2Float(0x439109c9), SkBits2Float(0x43c8e938), SkBits2Float(0x438d6087)); // 394.5f, 290.076f, 401.822f, 282.754f +path.quadTo(SkBits2Float(0x43cc927a), SkBits2Float(0x4389b745), SkBits2Float(0x43d1bff6), SkBits2Float(0x4389b745)); // 409.144f, 275.432f, 419.5f, 275.432f +path.quadTo(SkBits2Float(0x43d6ed72), SkBits2Float(0x4389b745), SkBits2Float(0x43da96b4), SkBits2Float(0x438d6087)); // 429.855f, 275.432f, 437.177f, 282.754f +path.quadTo(SkBits2Float(0x43de3ff6), SkBits2Float(0x439109c9), SkBits2Float(0x43de3ff6), SkBits2Float(0x43963745)); // 444.5f, 290.076f, 444.5f, 300.432f +path.close(); + SkPath path8(path); + builder.add(path8, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43aae79c), SkBits2Float(0x438d0cbc)); // 341.809f, 282.099f +path.quadTo(SkBits2Float(0x43aae79c), SkBits2Float(0x43923a38), SkBits2Float(0x43a73e5a), SkBits2Float(0x4395e37a)); // 341.809f, 292.455f, 334.487f, 299.777f +path.quadTo(SkBits2Float(0x43a39518), SkBits2Float(0x43998cbc), SkBits2Float(0x439e679c), SkBits2Float(0x43998cbc)); // 327.165f, 307.099f, 316.809f, 307.099f +path.quadTo(SkBits2Float(0x43993a20), SkBits2Float(0x43998cbc), SkBits2Float(0x439590de), SkBits2Float(0x4395e37a)); // 306.454f, 307.099f, 299.132f, 299.777f +path.quadTo(SkBits2Float(0x4391e79c), SkBits2Float(0x43923a38), SkBits2Float(0x4391e79c), SkBits2Float(0x438d0cbc)); // 291.809f, 292.455f, 291.809f, 282.099f +path.quadTo(SkBits2Float(0x4391e79c), SkBits2Float(0x4387df40), SkBits2Float(0x439590de), SkBits2Float(0x438435fe)); // 291.809f, 271.744f, 299.132f, 264.422f +path.quadTo(SkBits2Float(0x43993a20), SkBits2Float(0x43808cbc), SkBits2Float(0x439e679c), SkBits2Float(0x43808cbc)); // 306.454f, 257.099f, 316.809f, 257.099f +path.quadTo(SkBits2Float(0x43a39518), SkBits2Float(0x43808cbc), SkBits2Float(0x43a73e5a), SkBits2Float(0x438435fe)); // 327.165f, 257.099f, 334.487f, 264.422f +path.quadTo(SkBits2Float(0x43aae79c), SkBits2Float(0x4387df40), SkBits2Float(0x43aae79c), SkBits2Float(0x438d0cbc)); // 341.809f, 271.744f, 341.809f, 282.099f +path.close(); + SkPath path9(path); + builder.add(path9, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4354ce7d), SkBits2Float(0x43842ec9)); // 212.807f, 264.366f +path.quadTo(SkBits2Float(0x4354ce7d), SkBits2Float(0x43895c45), SkBits2Float(0x434d7bf9), SkBits2Float(0x438d0587)); // 212.807f, 274.721f, 205.484f, 282.043f +path.quadTo(SkBits2Float(0x43462974), SkBits2Float(0x4390aec9), SkBits2Float(0x433bce7d), SkBits2Float(0x4390aec9)); // 198.162f, 289.366f, 187.807f, 289.366f +path.quadTo(SkBits2Float(0x43317386), SkBits2Float(0x4390aec9), SkBits2Float(0x432a2101), SkBits2Float(0x438d0587)); // 177.451f, 289.366f, 170.129f, 282.043f +path.quadTo(SkBits2Float(0x4322ce7d), SkBits2Float(0x43895c45), SkBits2Float(0x4322ce7d), SkBits2Float(0x43842ec9)); // 162.807f, 274.721f, 162.807f, 264.366f +path.quadTo(SkBits2Float(0x4322ce7d), SkBits2Float(0x437e029a), SkBits2Float(0x432a2101), SkBits2Float(0x4376b016)); // 162.807f, 254.01f, 170.129f, 246.688f +path.quadTo(SkBits2Float(0x43317386), SkBits2Float(0x436f5d92), SkBits2Float(0x433bce7d), SkBits2Float(0x436f5d92)); // 177.451f, 239.366f, 187.807f, 239.366f +path.quadTo(SkBits2Float(0x43462974), SkBits2Float(0x436f5d92), SkBits2Float(0x434d7bf9), SkBits2Float(0x4376b016)); // 198.162f, 239.366f, 205.484f, 246.688f +path.quadTo(SkBits2Float(0x4354ce7d), SkBits2Float(0x437e029a), SkBits2Float(0x4354ce7d), SkBits2Float(0x43842ec9)); // 212.807f, 254.01f, 212.807f, 264.366f +path.close(); + SkPath path10(path); + builder.add(path10, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a8c299), SkBits2Float(0x432fce08)); // 337.52f, 175.805f +path.quadTo(SkBits2Float(0x43a8c299), SkBits2Float(0x433a2900), SkBits2Float(0x43a51957), SkBits2Float(0x43417b84)); // 337.52f, 186.16f, 330.198f, 193.482f +path.quadTo(SkBits2Float(0x43a17015), SkBits2Float(0x4348ce08), SkBits2Float(0x439c4299), SkBits2Float(0x4348ce08)); // 322.876f, 200.805f, 312.52f, 200.805f +path.quadTo(SkBits2Float(0x4397151d), SkBits2Float(0x4348ce08), SkBits2Float(0x43936bdb), SkBits2Float(0x43417b84)); // 302.165f, 200.805f, 294.843f, 193.482f +path.quadTo(SkBits2Float(0x438fc299), SkBits2Float(0x433a2900), SkBits2Float(0x438fc299), SkBits2Float(0x432fce08)); // 287.52f, 186.16f, 287.52f, 175.805f +path.quadTo(SkBits2Float(0x438fc299), SkBits2Float(0x43257310), SkBits2Float(0x43936bdb), SkBits2Float(0x431e208c)); // 287.52f, 165.449f, 294.843f, 158.127f +path.quadTo(SkBits2Float(0x4397151d), SkBits2Float(0x4316ce08), SkBits2Float(0x439c4299), SkBits2Float(0x4316ce08)); // 302.165f, 150.805f, 312.52f, 150.805f +path.quadTo(SkBits2Float(0x43a17015), SkBits2Float(0x4316ce08), SkBits2Float(0x43a51957), SkBits2Float(0x431e208c)); // 322.876f, 150.805f, 330.198f, 158.127f +path.quadTo(SkBits2Float(0x43a8c299), SkBits2Float(0x43257310), SkBits2Float(0x43a8c299), SkBits2Float(0x432fce08)); // 337.52f, 165.449f, 337.52f, 175.805f +path.close(); + SkPath path11(path); + builder.add(path11, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43d7486e), SkBits2Float(0x430ebc47)); // 430.566f, 142.735f +path.quadTo(SkBits2Float(0x43d7486e), SkBits2Float(0x4319173e), SkBits2Float(0x43d39f2c), SkBits2Float(0x432069c3)); // 430.566f, 153.091f, 423.244f, 160.413f +path.quadTo(SkBits2Float(0x43cff5ea), SkBits2Float(0x4327bc47), SkBits2Float(0x43cac86e), SkBits2Float(0x4327bc47)); // 415.921f, 167.735f, 405.566f, 167.735f +path.quadTo(SkBits2Float(0x43c59af2), SkBits2Float(0x4327bc47), SkBits2Float(0x43c1f1b0), SkBits2Float(0x432069c3)); // 395.211f, 167.735f, 387.888f, 160.413f +path.quadTo(SkBits2Float(0x43be486e), SkBits2Float(0x4319173e), SkBits2Float(0x43be486e), SkBits2Float(0x430ebc47)); // 380.566f, 153.091f, 380.566f, 142.735f +path.quadTo(SkBits2Float(0x43be486e), SkBits2Float(0x43046150), SkBits2Float(0x43c1f1b0), SkBits2Float(0x42fa1d96)); // 380.566f, 132.38f, 387.888f, 125.058f +path.quadTo(SkBits2Float(0x43c59af2), SkBits2Float(0x42eb788e), SkBits2Float(0x43cac86e), SkBits2Float(0x42eb788e)); // 395.211f, 117.735f, 405.566f, 117.735f +path.quadTo(SkBits2Float(0x43cff5ea), SkBits2Float(0x42eb788e), SkBits2Float(0x43d39f2c), SkBits2Float(0x42fa1d96)); // 415.921f, 117.735f, 423.244f, 125.058f +path.quadTo(SkBits2Float(0x43d7486e), SkBits2Float(0x43046150), SkBits2Float(0x43d7486e), SkBits2Float(0x430ebc47)); // 430.566f, 132.38f, 430.566f, 142.735f +path.close(); + SkPath path12(path); + builder.add(path12, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43484ac4), SkBits2Float(0x43421f09)); // 200.292f, 194.121f +path.quadTo(SkBits2Float(0x43484ac4), SkBits2Float(0x434c7a00), SkBits2Float(0x4340f840), SkBits2Float(0x4353cc85)); // 200.292f, 204.477f, 192.97f, 211.799f +path.quadTo(SkBits2Float(0x4339a5bc), SkBits2Float(0x435b1f09), SkBits2Float(0x432f4ac4), SkBits2Float(0x435b1f09)); // 185.647f, 219.121f, 175.292f, 219.121f +path.quadTo(SkBits2Float(0x4324efcc), SkBits2Float(0x435b1f09), SkBits2Float(0x431d9d48), SkBits2Float(0x4353cc85)); // 164.937f, 219.121f, 157.614f, 211.799f +path.quadTo(SkBits2Float(0x43164ac4), SkBits2Float(0x434c7a00), SkBits2Float(0x43164ac4), SkBits2Float(0x43421f09)); // 150.292f, 204.477f, 150.292f, 194.121f +path.quadTo(SkBits2Float(0x43164ac4), SkBits2Float(0x4337c412), SkBits2Float(0x431d9d48), SkBits2Float(0x4330718d)); // 150.292f, 183.766f, 157.614f, 176.444f +path.quadTo(SkBits2Float(0x4324efcc), SkBits2Float(0x43291f09), SkBits2Float(0x432f4ac4), SkBits2Float(0x43291f09)); // 164.937f, 169.121f, 175.292f, 169.121f +path.quadTo(SkBits2Float(0x4339a5bc), SkBits2Float(0x43291f09), SkBits2Float(0x4340f840), SkBits2Float(0x4330718d)); // 185.647f, 169.121f, 192.97f, 176.444f +path.quadTo(SkBits2Float(0x43484ac4), SkBits2Float(0x4337c412), SkBits2Float(0x43484ac4), SkBits2Float(0x43421f09)); // 200.292f, 183.766f, 200.292f, 194.121f +path.close(); + SkPath path13(path); + builder.add(path13, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4328883e), SkBits2Float(0x42fb0be0)); // 168.532f, 125.523f +path.quadTo(SkBits2Float(0x4328883e), SkBits2Float(0x4307e0e7), SkBits2Float(0x432135ba), SkBits2Float(0x430f336c)); // 168.532f, 135.879f, 161.21f, 143.201f +path.quadTo(SkBits2Float(0x4319e336), SkBits2Float(0x431685f0), SkBits2Float(0x430f883e), SkBits2Float(0x431685f0)); // 153.888f, 150.523f, 143.532f, 150.523f +path.quadTo(SkBits2Float(0x43052d46), SkBits2Float(0x431685f0), SkBits2Float(0x42fbb584), SkBits2Float(0x430f336c)); // 133.177f, 150.523f, 125.855f, 143.201f +path.quadTo(SkBits2Float(0x42ed107c), SkBits2Float(0x4307e0e7), SkBits2Float(0x42ed107c), SkBits2Float(0x42fb0be0)); // 118.532f, 135.879f, 118.532f, 125.523f +path.quadTo(SkBits2Float(0x42ed107c), SkBits2Float(0x42e655f1), SkBits2Float(0x42fbb584), SkBits2Float(0x42d7b0e9)); // 118.532f, 115.168f, 125.855f, 107.846f +path.quadTo(SkBits2Float(0x43052d46), SkBits2Float(0x42c90be1), SkBits2Float(0x430f883e), SkBits2Float(0x42c90be1)); // 133.177f, 100.523f, 143.532f, 100.523f +path.quadTo(SkBits2Float(0x4319e336), SkBits2Float(0x42c90be1), SkBits2Float(0x432135ba), SkBits2Float(0x42d7b0e9)); // 153.888f, 100.523f, 161.21f, 107.846f +path.quadTo(SkBits2Float(0x4328883e), SkBits2Float(0x42e655f1), SkBits2Float(0x4328883e), SkBits2Float(0x42fb0be0)); // 168.532f, 115.168f, 168.532f, 125.523f +path.close(); + SkPath path14(path); + builder.add(path14, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b2bff8), SkBits2Float(0x439bb140)); // 357.5f, 311.385f +path.quadTo(SkBits2Float(0x43b2bff8), SkBits2Float(0x43a0debc), SkBits2Float(0x43af16b6), SkBits2Float(0x43a487fe)); // 357.5f, 321.74f, 350.177f, 329.062f +path.quadTo(SkBits2Float(0x43ab6d74), SkBits2Float(0x43a83140), SkBits2Float(0x43a63ff8), SkBits2Float(0x43a83140)); // 342.855f, 336.385f, 332.5f, 336.385f +path.quadTo(SkBits2Float(0x43a1127c), SkBits2Float(0x43a83140), SkBits2Float(0x439d693a), SkBits2Float(0x43a487fe)); // 322.144f, 336.385f, 314.822f, 329.062f +path.quadTo(SkBits2Float(0x4399bff8), SkBits2Float(0x43a0debc), SkBits2Float(0x4399bff8), SkBits2Float(0x439bb140)); // 307.5f, 321.74f, 307.5f, 311.385f +path.quadTo(SkBits2Float(0x4399bff8), SkBits2Float(0x439683c4), SkBits2Float(0x439d693a), SkBits2Float(0x4392da82)); // 307.5f, 301.029f, 314.822f, 293.707f +path.quadTo(SkBits2Float(0x43a1127c), SkBits2Float(0x438f3140), SkBits2Float(0x43a63ff8), SkBits2Float(0x438f3140)); // 322.144f, 286.385f, 332.5f, 286.385f +path.quadTo(SkBits2Float(0x43ab6d74), SkBits2Float(0x438f3140), SkBits2Float(0x43af16b6), SkBits2Float(0x4392da82)); // 342.855f, 286.385f, 350.177f, 293.707f +path.quadTo(SkBits2Float(0x43b2bff8), SkBits2Float(0x439683c4), SkBits2Float(0x43b2bff8), SkBits2Float(0x439bb140)); // 357.5f, 301.029f, 357.5f, 311.385f +path.close(); + SkPath path15(path); + builder.add(path15, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x435ae426), SkBits2Float(0x4341f066)); // 218.891f, 193.939f +path.quadTo(SkBits2Float(0x435ae426), SkBits2Float(0x434c4b5e), SkBits2Float(0x435391a2), SkBits2Float(0x43539de2)); // 218.891f, 204.294f, 211.569f, 211.617f +path.quadTo(SkBits2Float(0x434c3f1e), SkBits2Float(0x435af066), SkBits2Float(0x4341e426), SkBits2Float(0x435af066)); // 204.247f, 218.939f, 193.891f, 218.939f +path.quadTo(SkBits2Float(0x4337892e), SkBits2Float(0x435af066), SkBits2Float(0x433036aa), SkBits2Float(0x43539de2)); // 183.536f, 218.939f, 176.214f, 211.617f +path.quadTo(SkBits2Float(0x4328e426), SkBits2Float(0x434c4b5e), SkBits2Float(0x4328e426), SkBits2Float(0x4341f066)); // 168.891f, 204.294f, 168.891f, 193.939f +path.quadTo(SkBits2Float(0x4328e426), SkBits2Float(0x4337956e), SkBits2Float(0x433036aa), SkBits2Float(0x433042ea)); // 168.891f, 183.584f, 176.214f, 176.261f +path.quadTo(SkBits2Float(0x4337892e), SkBits2Float(0x4328f066), SkBits2Float(0x4341e426), SkBits2Float(0x4328f066)); // 183.536f, 168.939f, 193.891f, 168.939f +path.quadTo(SkBits2Float(0x434c3f1e), SkBits2Float(0x4328f066), SkBits2Float(0x435391a2), SkBits2Float(0x433042ea)); // 204.247f, 168.939f, 211.569f, 176.261f +path.quadTo(SkBits2Float(0x435ae426), SkBits2Float(0x4337956e), SkBits2Float(0x435ae426), SkBits2Float(0x4341f066)); // 218.891f, 183.584f, 218.891f, 193.939f +path.close(); + SkPath path16(path); + builder.add(path16, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x439817ba), SkBits2Float(0x42e83ba4)); // 304.185f, 116.116f +path.quadTo(SkBits2Float(0x439817ba), SkBits2Float(0x42fcf193), SkBits2Float(0x43946e78), SkBits2Float(0x4305cb4e)); // 304.185f, 126.472f, 296.863f, 133.794f +path.quadTo(SkBits2Float(0x4390c536), SkBits2Float(0x430d1dd2), SkBits2Float(0x438b97ba), SkBits2Float(0x430d1dd2)); // 289.541f, 141.116f, 279.185f, 141.116f +path.quadTo(SkBits2Float(0x43866a3e), SkBits2Float(0x430d1dd2), SkBits2Float(0x4382c0fc), SkBits2Float(0x4305cb4e)); // 268.83f, 141.116f, 261.508f, 133.794f +path.quadTo(SkBits2Float(0x437e2f74), SkBits2Float(0x42fcf193), SkBits2Float(0x437e2f74), SkBits2Float(0x42e83ba4)); // 254.185f, 126.472f, 254.185f, 116.116f +path.quadTo(SkBits2Float(0x437e2f74), SkBits2Float(0x42d385b5), SkBits2Float(0x4382c0fc), SkBits2Float(0x42c4e0ac)); // 254.185f, 105.761f, 261.508f, 98.4388f +path.quadTo(SkBits2Float(0x43866a3e), SkBits2Float(0x42b63ba4), SkBits2Float(0x438b97ba), SkBits2Float(0x42b63ba4)); // 268.83f, 91.1165f, 279.185f, 91.1165f +path.quadTo(SkBits2Float(0x4390c536), SkBits2Float(0x42b63ba4), SkBits2Float(0x43946e78), SkBits2Float(0x42c4e0ac)); // 289.541f, 91.1165f, 296.863f, 98.4388f +path.quadTo(SkBits2Float(0x439817ba), SkBits2Float(0x42d385b5), SkBits2Float(0x439817ba), SkBits2Float(0x42e83ba4)); // 304.185f, 105.761f, 304.185f, 116.116f +path.close(); + SkPath path17(path); + builder.add(path17, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4350558c), SkBits2Float(0x4382efb0)); // 208.334f, 261.873f +path.quadTo(SkBits2Float(0x4350558c), SkBits2Float(0x43881d2c), SkBits2Float(0x43490308), SkBits2Float(0x438bc66e)); // 208.334f, 272.228f, 201.012f, 279.55f +path.quadTo(SkBits2Float(0x4341b084), SkBits2Float(0x438f6fb0), SkBits2Float(0x4337558c), SkBits2Float(0x438f6fb0)); // 193.69f, 286.873f, 183.334f, 286.873f +path.quadTo(SkBits2Float(0x432cfa94), SkBits2Float(0x438f6fb0), SkBits2Float(0x4325a810), SkBits2Float(0x438bc66e)); // 172.979f, 286.873f, 165.656f, 279.55f +path.quadTo(SkBits2Float(0x431e558c), SkBits2Float(0x43881d2c), SkBits2Float(0x431e558c), SkBits2Float(0x4382efb0)); // 158.334f, 272.228f, 158.334f, 261.873f +path.quadTo(SkBits2Float(0x431e558c), SkBits2Float(0x437b8468), SkBits2Float(0x4325a810), SkBits2Float(0x437431e4)); // 158.334f, 251.517f, 165.656f, 244.195f +path.quadTo(SkBits2Float(0x432cfa94), SkBits2Float(0x436cdf60), SkBits2Float(0x4337558c), SkBits2Float(0x436cdf60)); // 172.979f, 236.873f, 183.334f, 236.873f +path.quadTo(SkBits2Float(0x4341b084), SkBits2Float(0x436cdf60), SkBits2Float(0x43490308), SkBits2Float(0x437431e4)); // 193.69f, 236.873f, 201.012f, 244.195f +path.quadTo(SkBits2Float(0x4350558c), SkBits2Float(0x437b8468), SkBits2Float(0x4350558c), SkBits2Float(0x4382efb0)); // 208.334f, 251.517f, 208.334f, 261.873f +path.close(); + SkPath path18(path); + builder.add(path18, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42a8ec1a), SkBits2Float(0x43a51083)); // 84.4611f, 330.129f +path.quadTo(SkBits2Float(0x42a8ec1a), SkBits2Float(0x43aa3dff), SkBits2Float(0x429a4711), SkBits2Float(0x43ade741)); // 84.4611f, 340.484f, 77.1388f, 347.807f +path.quadTo(SkBits2Float(0x428ba209), SkBits2Float(0x43b19083), SkBits2Float(0x426dd834), SkBits2Float(0x43b19083)); // 69.8165f, 355.129f, 59.4611f, 355.129f +path.quadTo(SkBits2Float(0x42446c56), SkBits2Float(0x43b19083), SkBits2Float(0x42272246), SkBits2Float(0x43ade741)); // 49.1058f, 355.129f, 41.7835f, 347.807f +path.quadTo(SkBits2Float(0x4209d835), SkBits2Float(0x43aa3dff), SkBits2Float(0x4209d835), SkBits2Float(0x43a51083)); // 34.4611f, 340.484f, 34.4611f, 330.129f +path.quadTo(SkBits2Float(0x4209d835), SkBits2Float(0x439fe307), SkBits2Float(0x42272246), SkBits2Float(0x439c39c5)); // 34.4611f, 319.774f, 41.7835f, 312.451f +path.quadTo(SkBits2Float(0x42446c56), SkBits2Float(0x43989083), SkBits2Float(0x426dd834), SkBits2Float(0x43989083)); // 49.1058f, 305.129f, 59.4611f, 305.129f +path.quadTo(SkBits2Float(0x428ba209), SkBits2Float(0x43989083), SkBits2Float(0x429a4711), SkBits2Float(0x439c39c5)); // 69.8165f, 305.129f, 77.1388f, 312.451f +path.quadTo(SkBits2Float(0x42a8ec1a), SkBits2Float(0x439fe307), SkBits2Float(0x42a8ec1a), SkBits2Float(0x43a51083)); // 84.4611f, 319.774f, 84.4611f, 330.129f +path.close(); + SkPath path19(path); + builder.add(path19, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43aca5fa), SkBits2Float(0x438f0f1d)); // 345.297f, 286.118f +path.quadTo(SkBits2Float(0x43aca5fa), SkBits2Float(0x43943c99), SkBits2Float(0x43a8fcb8), SkBits2Float(0x4397e5db)); // 345.297f, 296.473f, 337.974f, 303.796f +path.quadTo(SkBits2Float(0x43a55376), SkBits2Float(0x439b8f1d), SkBits2Float(0x43a025fa), SkBits2Float(0x439b8f1d)); // 330.652f, 311.118f, 320.297f, 311.118f +path.quadTo(SkBits2Float(0x439af87e), SkBits2Float(0x439b8f1d), SkBits2Float(0x43974f3c), SkBits2Float(0x4397e5db)); // 309.941f, 311.118f, 302.619f, 303.796f +path.quadTo(SkBits2Float(0x4393a5fa), SkBits2Float(0x43943c99), SkBits2Float(0x4393a5fa), SkBits2Float(0x438f0f1d)); // 295.297f, 296.473f, 295.297f, 286.118f +path.quadTo(SkBits2Float(0x4393a5fa), SkBits2Float(0x4389e1a1), SkBits2Float(0x43974f3c), SkBits2Float(0x4386385f)); // 295.297f, 275.763f, 302.619f, 268.44f +path.quadTo(SkBits2Float(0x439af87e), SkBits2Float(0x43828f1d), SkBits2Float(0x43a025fa), SkBits2Float(0x43828f1d)); // 309.941f, 261.118f, 320.297f, 261.118f +path.quadTo(SkBits2Float(0x43a55376), SkBits2Float(0x43828f1d), SkBits2Float(0x43a8fcb8), SkBits2Float(0x4386385f)); // 330.652f, 261.118f, 337.974f, 268.44f +path.quadTo(SkBits2Float(0x43aca5fa), SkBits2Float(0x4389e1a1), SkBits2Float(0x43aca5fa), SkBits2Float(0x438f0f1d)); // 345.297f, 275.763f, 345.297f, 286.118f +path.close(); + SkPath path20(path); + builder.add(path20, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43846cfc), SkBits2Float(0x431b61f0)); // 264.851f, 155.383f +path.quadTo(SkBits2Float(0x43846cfc), SkBits2Float(0x4325bce8), SkBits2Float(0x4380c3ba), SkBits2Float(0x432d0f6c)); // 264.851f, 165.738f, 257.529f, 173.06f +path.quadTo(SkBits2Float(0x437a34f0), SkBits2Float(0x433461f0), SkBits2Float(0x436fd9f8), SkBits2Float(0x433461f0)); // 250.207f, 180.383f, 239.851f, 180.383f +path.quadTo(SkBits2Float(0x43657f00), SkBits2Float(0x433461f0), SkBits2Float(0x435e2c7c), SkBits2Float(0x432d0f6c)); // 229.496f, 180.383f, 222.174f, 173.06f +path.quadTo(SkBits2Float(0x4356d9f7), SkBits2Float(0x4325bce8), SkBits2Float(0x4356d9f7), SkBits2Float(0x431b61f0)); // 214.851f, 165.738f, 214.851f, 155.383f +path.quadTo(SkBits2Float(0x4356d9f7), SkBits2Float(0x431106f8), SkBits2Float(0x435e2c7c), SkBits2Float(0x4309b474)); // 214.851f, 145.027f, 222.174f, 137.705f +path.quadTo(SkBits2Float(0x43657f00), SkBits2Float(0x430261f0), SkBits2Float(0x436fd9f8), SkBits2Float(0x430261f0)); // 229.496f, 130.383f, 239.851f, 130.383f +path.quadTo(SkBits2Float(0x437a34f0), SkBits2Float(0x430261f0), SkBits2Float(0x4380c3ba), SkBits2Float(0x4309b474)); // 250.207f, 130.383f, 257.529f, 137.705f +path.quadTo(SkBits2Float(0x43846cfc), SkBits2Float(0x431106f8), SkBits2Float(0x43846cfc), SkBits2Float(0x431b61f0)); // 264.851f, 145.027f, 264.851f, 155.383f +path.close(); + SkPath path21(path); + builder.add(path21, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x439597be), SkBits2Float(0x438dc3e1)); // 299.185f, 283.53f +path.quadTo(SkBits2Float(0x439597be), SkBits2Float(0x4392f15d), SkBits2Float(0x4391ee7c), SkBits2Float(0x43969a9f)); // 299.185f, 293.886f, 291.863f, 301.208f +path.quadTo(SkBits2Float(0x438e453a), SkBits2Float(0x439a43e1), SkBits2Float(0x438917be), SkBits2Float(0x439a43e1)); // 284.541f, 308.53f, 274.185f, 308.53f +path.quadTo(SkBits2Float(0x4383ea42), SkBits2Float(0x439a43e1), SkBits2Float(0x43804100), SkBits2Float(0x43969a9f)); // 263.83f, 308.53f, 256.508f, 301.208f +path.quadTo(SkBits2Float(0x43792f7c), SkBits2Float(0x4392f15d), SkBits2Float(0x43792f7c), SkBits2Float(0x438dc3e1)); // 249.185f, 293.886f, 249.185f, 283.53f +path.quadTo(SkBits2Float(0x43792f7c), SkBits2Float(0x43889665), SkBits2Float(0x43804100), SkBits2Float(0x4384ed23)); // 249.185f, 273.175f, 256.508f, 265.853f +path.quadTo(SkBits2Float(0x4383ea42), SkBits2Float(0x438143e1), SkBits2Float(0x438917be), SkBits2Float(0x438143e1)); // 263.83f, 258.53f, 274.185f, 258.53f +path.quadTo(SkBits2Float(0x438e453a), SkBits2Float(0x438143e1), SkBits2Float(0x4391ee7c), SkBits2Float(0x4384ed23)); // 284.541f, 258.53f, 291.863f, 265.853f +path.quadTo(SkBits2Float(0x439597be), SkBits2Float(0x43889665), SkBits2Float(0x439597be), SkBits2Float(0x438dc3e1)); // 299.185f, 273.175f, 299.185f, 283.53f +path.close(); + SkPath path22(path); + builder.add(path22, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42db7a2b), SkBits2Float(0x43699568)); // 109.739f, 233.584f +path.quadTo(SkBits2Float(0x42db7a2b), SkBits2Float(0x4373f05f), SkBits2Float(0x42ccd522), SkBits2Float(0x437b42e3)); // 109.739f, 243.939f, 102.416f, 251.261f +path.quadTo(SkBits2Float(0x42be301a), SkBits2Float(0x43814ab4), SkBits2Float(0x42a97a2b), SkBits2Float(0x43814ab4)); // 95.0939f, 258.584f, 84.7386f, 258.584f +path.quadTo(SkBits2Float(0x4294c43c), SkBits2Float(0x43814ab4), SkBits2Float(0x42861f34), SkBits2Float(0x437b42e3)); // 74.3833f, 258.584f, 67.0609f, 251.261f +path.quadTo(SkBits2Float(0x426ef456), SkBits2Float(0x4373f05f), SkBits2Float(0x426ef456), SkBits2Float(0x43699568)); // 59.7386f, 243.939f, 59.7386f, 233.584f +path.quadTo(SkBits2Float(0x426ef456), SkBits2Float(0x435f3a71), SkBits2Float(0x42861f34), SkBits2Float(0x4357e7ed)); // 59.7386f, 223.228f, 67.0609f, 215.906f +path.quadTo(SkBits2Float(0x4294c43c), SkBits2Float(0x43509569), SkBits2Float(0x42a97a2b), SkBits2Float(0x43509569)); // 74.3833f, 208.584f, 84.7386f, 208.584f +path.quadTo(SkBits2Float(0x42be301a), SkBits2Float(0x43509569), SkBits2Float(0x42ccd522), SkBits2Float(0x4357e7ed)); // 95.0939f, 208.584f, 102.416f, 215.906f +path.quadTo(SkBits2Float(0x42db7a2b), SkBits2Float(0x435f3a71), SkBits2Float(0x42db7a2b), SkBits2Float(0x43699568)); // 109.739f, 223.228f, 109.739f, 233.584f +path.close(); + SkPath path23(path); + builder.add(path23, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x433bea80), SkBits2Float(0x43861662)); // 187.916f, 268.175f +path.quadTo(SkBits2Float(0x433bea80), SkBits2Float(0x438b43de), SkBits2Float(0x433497fc), SkBits2Float(0x438eed20)); // 187.916f, 278.53f, 180.594f, 285.853f +path.quadTo(SkBits2Float(0x432d4578), SkBits2Float(0x43929662), SkBits2Float(0x4322ea80), SkBits2Float(0x43929662)); // 173.271f, 293.175f, 162.916f, 293.175f +path.quadTo(SkBits2Float(0x43188f88), SkBits2Float(0x43929662), SkBits2Float(0x43113d04), SkBits2Float(0x438eed20)); // 152.561f, 293.175f, 145.238f, 285.853f +path.quadTo(SkBits2Float(0x4309ea80), SkBits2Float(0x438b43de), SkBits2Float(0x4309ea80), SkBits2Float(0x43861662)); // 137.916f, 278.53f, 137.916f, 268.175f +path.quadTo(SkBits2Float(0x4309ea80), SkBits2Float(0x4380e8e6), SkBits2Float(0x43113d04), SkBits2Float(0x437a7f48)); // 137.916f, 257.82f, 145.238f, 250.497f +path.quadTo(SkBits2Float(0x43188f88), SkBits2Float(0x43732cc4), SkBits2Float(0x4322ea80), SkBits2Float(0x43732cc4)); // 152.561f, 243.175f, 162.916f, 243.175f +path.quadTo(SkBits2Float(0x432d4578), SkBits2Float(0x43732cc4), SkBits2Float(0x433497fc), SkBits2Float(0x437a7f48)); // 173.271f, 243.175f, 180.594f, 250.497f +path.quadTo(SkBits2Float(0x433bea80), SkBits2Float(0x4380e8e6), SkBits2Float(0x433bea80), SkBits2Float(0x43861662)); // 187.916f, 257.82f, 187.916f, 268.175f +path.close(); + SkPath path24(path); + builder.add(path24, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4386aaee), SkBits2Float(0x43991356)); // 269.335f, 306.151f +path.quadTo(SkBits2Float(0x4386aaee), SkBits2Float(0x439e40d2), SkBits2Float(0x438301ac), SkBits2Float(0x43a1ea14)); // 269.335f, 316.506f, 262.013f, 323.829f +path.quadTo(SkBits2Float(0x437eb0d4), SkBits2Float(0x43a59356), SkBits2Float(0x437455dc), SkBits2Float(0x43a59356)); // 254.691f, 331.151f, 244.335f, 331.151f +path.quadTo(SkBits2Float(0x4369fae4), SkBits2Float(0x43a59356), SkBits2Float(0x4362a860), SkBits2Float(0x43a1ea14)); // 233.98f, 331.151f, 226.658f, 323.829f +path.quadTo(SkBits2Float(0x435b55dc), SkBits2Float(0x439e40d2), SkBits2Float(0x435b55dc), SkBits2Float(0x43991356)); // 219.335f, 316.506f, 219.335f, 306.151f +path.quadTo(SkBits2Float(0x435b55dc), SkBits2Float(0x4393e5da), SkBits2Float(0x4362a860), SkBits2Float(0x43903c98)); // 219.335f, 295.796f, 226.658f, 288.473f +path.quadTo(SkBits2Float(0x4369fae4), SkBits2Float(0x438c9356), SkBits2Float(0x437455dc), SkBits2Float(0x438c9356)); // 233.98f, 281.151f, 244.335f, 281.151f +path.quadTo(SkBits2Float(0x437eb0d4), SkBits2Float(0x438c9356), SkBits2Float(0x438301ac), SkBits2Float(0x43903c98)); // 254.691f, 281.151f, 262.013f, 288.473f +path.quadTo(SkBits2Float(0x4386aaee), SkBits2Float(0x4393e5da), SkBits2Float(0x4386aaee), SkBits2Float(0x43991356)); // 269.335f, 295.796f, 269.335f, 306.151f +path.close(); + SkPath path25(path); + builder.add(path25, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b0a7ab), SkBits2Float(0x42d6b25c)); // 353.31f, 107.348f +path.quadTo(SkBits2Float(0x43b0a7ab), SkBits2Float(0x42eb684b), SkBits2Float(0x43acfe69), SkBits2Float(0x42fa0d53)); // 353.31f, 117.704f, 345.988f, 125.026f +path.quadTo(SkBits2Float(0x43a95527), SkBits2Float(0x4304592e), SkBits2Float(0x43a427ab), SkBits2Float(0x4304592e)); // 338.665f, 132.348f, 328.31f, 132.348f +path.quadTo(SkBits2Float(0x439efa2f), SkBits2Float(0x4304592e), SkBits2Float(0x439b50ed), SkBits2Float(0x42fa0d53)); // 317.955f, 132.348f, 310.632f, 125.026f +path.quadTo(SkBits2Float(0x4397a7ab), SkBits2Float(0x42eb684b), SkBits2Float(0x4397a7ab), SkBits2Float(0x42d6b25c)); // 303.31f, 117.704f, 303.31f, 107.348f +path.quadTo(SkBits2Float(0x4397a7ab), SkBits2Float(0x42c1fc6d), SkBits2Float(0x439b50ed), SkBits2Float(0x42b35765)); // 303.31f, 96.993f, 310.632f, 89.6707f +path.quadTo(SkBits2Float(0x439efa2f), SkBits2Float(0x42a4b25d), SkBits2Float(0x43a427ab), SkBits2Float(0x42a4b25d)); // 317.955f, 82.3484f, 328.31f, 82.3484f +path.quadTo(SkBits2Float(0x43a95527), SkBits2Float(0x42a4b25d), SkBits2Float(0x43acfe69), SkBits2Float(0x42b35765)); // 338.665f, 82.3484f, 345.988f, 89.6707f +path.quadTo(SkBits2Float(0x43b0a7ab), SkBits2Float(0x42c1fc6d), SkBits2Float(0x43b0a7ab), SkBits2Float(0x42d6b25c)); // 353.31f, 96.993f, 353.31f, 107.348f +path.close(); + SkPath path26(path); + builder.add(path26, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43d478db), SkBits2Float(0x4301c45a)); // 424.944f, 129.767f +path.quadTo(SkBits2Float(0x43d478db), SkBits2Float(0x430c1f52), SkBits2Float(0x43d0cf99), SkBits2Float(0x431371d6)); // 424.944f, 140.122f, 417.622f, 147.445f +path.quadTo(SkBits2Float(0x43cd2657), SkBits2Float(0x431ac45a), SkBits2Float(0x43c7f8db), SkBits2Float(0x431ac45a)); // 410.3f, 154.767f, 399.944f, 154.767f +path.quadTo(SkBits2Float(0x43c2cb5f), SkBits2Float(0x431ac45a), SkBits2Float(0x43bf221d), SkBits2Float(0x431371d6)); // 389.589f, 154.767f, 382.267f, 147.445f +path.quadTo(SkBits2Float(0x43bb78db), SkBits2Float(0x430c1f52), SkBits2Float(0x43bb78db), SkBits2Float(0x4301c45a)); // 374.944f, 140.122f, 374.944f, 129.767f +path.quadTo(SkBits2Float(0x43bb78db), SkBits2Float(0x42eed2c5), SkBits2Float(0x43bf221d), SkBits2Float(0x42e02dbc)); // 374.944f, 119.412f, 382.267f, 112.089f +path.quadTo(SkBits2Float(0x43c2cb5f), SkBits2Float(0x42d188b4), SkBits2Float(0x43c7f8db), SkBits2Float(0x42d188b4)); // 389.589f, 104.767f, 399.944f, 104.767f +path.quadTo(SkBits2Float(0x43cd2657), SkBits2Float(0x42d188b4), SkBits2Float(0x43d0cf99), SkBits2Float(0x42e02dbc)); // 410.3f, 104.767f, 417.622f, 112.089f +path.quadTo(SkBits2Float(0x43d478db), SkBits2Float(0x42eed2c5), SkBits2Float(0x43d478db), SkBits2Float(0x4301c45a)); // 424.944f, 119.412f, 424.944f, 129.767f +path.close(); + SkPath path27(path); + builder.add(path27, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4370d681), SkBits2Float(0x4375fc44)); // 240.838f, 245.985f +path.quadTo(SkBits2Float(0x4370d681), SkBits2Float(0x43802b9e), SkBits2Float(0x436983fd), SkBits2Float(0x4383d4e0)); // 240.838f, 256.341f, 233.516f, 263.663f +path.quadTo(SkBits2Float(0x43623178), SkBits2Float(0x43877e22), SkBits2Float(0x4357d681), SkBits2Float(0x43877e22)); // 226.193f, 270.985f, 215.838f, 270.985f +path.quadTo(SkBits2Float(0x434d7b8a), SkBits2Float(0x43877e22), SkBits2Float(0x43462905), SkBits2Float(0x4383d4e0)); // 205.483f, 270.985f, 198.16f, 263.663f +path.quadTo(SkBits2Float(0x433ed681), SkBits2Float(0x43802b9e), SkBits2Float(0x433ed681), SkBits2Float(0x4375fc44)); // 190.838f, 256.341f, 190.838f, 245.985f +path.quadTo(SkBits2Float(0x433ed681), SkBits2Float(0x436ba14d), SkBits2Float(0x43462905), SkBits2Float(0x43644ec9)); // 190.838f, 235.63f, 198.16f, 228.308f +path.quadTo(SkBits2Float(0x434d7b8a), SkBits2Float(0x435cfc45), SkBits2Float(0x4357d681), SkBits2Float(0x435cfc45)); // 205.483f, 220.985f, 215.838f, 220.985f +path.quadTo(SkBits2Float(0x43623178), SkBits2Float(0x435cfc45), SkBits2Float(0x436983fd), SkBits2Float(0x43644ec9)); // 226.193f, 220.985f, 233.516f, 228.308f +path.quadTo(SkBits2Float(0x4370d681), SkBits2Float(0x436ba14d), SkBits2Float(0x4370d681), SkBits2Float(0x4375fc44)); // 240.838f, 235.63f, 240.838f, 245.985f +path.close(); + SkPath path28(path); + builder.add(path28, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43883c1d), SkBits2Float(0x438a9227)); // 272.47f, 277.142f +path.quadTo(SkBits2Float(0x43883c1d), SkBits2Float(0x438fbfa3), SkBits2Float(0x438492db), SkBits2Float(0x439368e5)); // 272.47f, 287.497f, 265.147f, 294.819f +path.quadTo(SkBits2Float(0x4380e999), SkBits2Float(0x43971227), SkBits2Float(0x4377783a), SkBits2Float(0x43971227)); // 257.825f, 302.142f, 247.47f, 302.142f +path.quadTo(SkBits2Float(0x436d1d42), SkBits2Float(0x43971227), SkBits2Float(0x4365cabe), SkBits2Float(0x439368e5)); // 237.114f, 302.142f, 229.792f, 294.819f +path.quadTo(SkBits2Float(0x435e783a), SkBits2Float(0x438fbfa3), SkBits2Float(0x435e783a), SkBits2Float(0x438a9227)); // 222.47f, 287.497f, 222.47f, 277.142f +path.quadTo(SkBits2Float(0x435e783a), SkBits2Float(0x438564ab), SkBits2Float(0x4365cabe), SkBits2Float(0x4381bb69)); // 222.47f, 266.786f, 229.792f, 259.464f +path.quadTo(SkBits2Float(0x436d1d42), SkBits2Float(0x437c244e), SkBits2Float(0x4377783a), SkBits2Float(0x437c244e)); // 237.114f, 252.142f, 247.47f, 252.142f +path.quadTo(SkBits2Float(0x4380e999), SkBits2Float(0x437c244e), SkBits2Float(0x438492db), SkBits2Float(0x4381bb69)); // 257.825f, 252.142f, 265.147f, 259.464f +path.quadTo(SkBits2Float(0x43883c1d), SkBits2Float(0x438564ab), SkBits2Float(0x43883c1d), SkBits2Float(0x438a9227)); // 272.47f, 266.786f, 272.47f, 277.142f +path.close(); + SkPath path29(path); + builder.add(path29, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b5b3a4), SkBits2Float(0x43a2dbb0)); // 363.403f, 325.716f +path.quadTo(SkBits2Float(0x43b5b3a4), SkBits2Float(0x43a8092c), SkBits2Float(0x43b20a62), SkBits2Float(0x43abb26e)); // 363.403f, 336.072f, 356.081f, 343.394f +path.quadTo(SkBits2Float(0x43ae6120), SkBits2Float(0x43af5bb0), SkBits2Float(0x43a933a4), SkBits2Float(0x43af5bb0)); // 348.759f, 350.716f, 338.403f, 350.716f +path.quadTo(SkBits2Float(0x43a40628), SkBits2Float(0x43af5bb0), SkBits2Float(0x43a05ce6), SkBits2Float(0x43abb26e)); // 328.048f, 350.716f, 320.726f, 343.394f +path.quadTo(SkBits2Float(0x439cb3a4), SkBits2Float(0x43a8092c), SkBits2Float(0x439cb3a4), SkBits2Float(0x43a2dbb0)); // 313.403f, 336.072f, 313.403f, 325.716f +path.quadTo(SkBits2Float(0x439cb3a4), SkBits2Float(0x439dae34), SkBits2Float(0x43a05ce6), SkBits2Float(0x439a04f2)); // 313.403f, 315.361f, 320.726f, 308.039f +path.quadTo(SkBits2Float(0x43a40628), SkBits2Float(0x43965bb0), SkBits2Float(0x43a933a4), SkBits2Float(0x43965bb0)); // 328.048f, 300.716f, 338.403f, 300.716f +path.quadTo(SkBits2Float(0x43ae6120), SkBits2Float(0x43965bb0), SkBits2Float(0x43b20a62), SkBits2Float(0x439a04f2)); // 348.759f, 300.716f, 356.081f, 308.039f +path.quadTo(SkBits2Float(0x43b5b3a4), SkBits2Float(0x439dae34), SkBits2Float(0x43b5b3a4), SkBits2Float(0x43a2dbb0)); // 363.403f, 315.361f, 363.403f, 325.716f +path.close(); + SkPath path30(path); + builder.add(path30, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a81cf4), SkBits2Float(0x431b2abc)); // 336.226f, 155.167f +path.quadTo(SkBits2Float(0x43a81cf4), SkBits2Float(0x432585b4), SkBits2Float(0x43a473b2), SkBits2Float(0x432cd838)); // 336.226f, 165.522f, 328.904f, 172.845f +path.quadTo(SkBits2Float(0x43a0ca70), SkBits2Float(0x43342abc), SkBits2Float(0x439b9cf4), SkBits2Float(0x43342abc)); // 321.582f, 180.167f, 311.226f, 180.167f +path.quadTo(SkBits2Float(0x43966f78), SkBits2Float(0x43342abc), SkBits2Float(0x4392c636), SkBits2Float(0x432cd838)); // 300.871f, 180.167f, 293.549f, 172.845f +path.quadTo(SkBits2Float(0x438f1cf4), SkBits2Float(0x432585b4), SkBits2Float(0x438f1cf4), SkBits2Float(0x431b2abc)); // 286.226f, 165.522f, 286.226f, 155.167f +path.quadTo(SkBits2Float(0x438f1cf4), SkBits2Float(0x4310cfc4), SkBits2Float(0x4392c636), SkBits2Float(0x43097d40)); // 286.226f, 144.812f, 293.549f, 137.489f +path.quadTo(SkBits2Float(0x43966f78), SkBits2Float(0x43022abc), SkBits2Float(0x439b9cf4), SkBits2Float(0x43022abc)); // 300.871f, 130.167f, 311.226f, 130.167f +path.quadTo(SkBits2Float(0x43a0ca70), SkBits2Float(0x43022abc), SkBits2Float(0x43a473b2), SkBits2Float(0x43097d40)); // 321.582f, 130.167f, 328.904f, 137.489f +path.quadTo(SkBits2Float(0x43a81cf4), SkBits2Float(0x4310cfc4), SkBits2Float(0x43a81cf4), SkBits2Float(0x431b2abc)); // 336.226f, 144.812f, 336.226f, 155.167f +path.close(); + SkPath path31(path); + builder.add(path31, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x435e092f), SkBits2Float(0x43698168)); // 222.036f, 233.505f +path.quadTo(SkBits2Float(0x435e092f), SkBits2Float(0x4373dc5f), SkBits2Float(0x4356b6ab), SkBits2Float(0x437b2ee3)); // 222.036f, 243.861f, 214.714f, 251.183f +path.quadTo(SkBits2Float(0x434f6426), SkBits2Float(0x438140b4), SkBits2Float(0x4345092f), SkBits2Float(0x438140b4)); // 207.391f, 258.505f, 197.036f, 258.505f +path.quadTo(SkBits2Float(0x433aae38), SkBits2Float(0x438140b4), SkBits2Float(0x43335bb3), SkBits2Float(0x437b2ee3)); // 186.681f, 258.505f, 179.358f, 251.183f +path.quadTo(SkBits2Float(0x432c092f), SkBits2Float(0x4373dc5f), SkBits2Float(0x432c092f), SkBits2Float(0x43698168)); // 172.036f, 243.861f, 172.036f, 233.505f +path.quadTo(SkBits2Float(0x432c092f), SkBits2Float(0x435f2671), SkBits2Float(0x43335bb3), SkBits2Float(0x4357d3ed)); // 172.036f, 223.15f, 179.358f, 215.828f +path.quadTo(SkBits2Float(0x433aae38), SkBits2Float(0x43508169), SkBits2Float(0x4345092f), SkBits2Float(0x43508169)); // 186.681f, 208.506f, 197.036f, 208.506f +path.quadTo(SkBits2Float(0x434f6426), SkBits2Float(0x43508169), SkBits2Float(0x4356b6ab), SkBits2Float(0x4357d3ed)); // 207.391f, 208.506f, 214.714f, 215.828f +path.quadTo(SkBits2Float(0x435e092f), SkBits2Float(0x435f2671), SkBits2Float(0x435e092f), SkBits2Float(0x43698168)); // 222.036f, 223.15f, 222.036f, 233.505f +path.close(); + SkPath path32(path); + builder.add(path32, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b29d51), SkBits2Float(0x434f504b)); // 357.229f, 207.314f +path.quadTo(SkBits2Float(0x43b29d51), SkBits2Float(0x4359ab42), SkBits2Float(0x43aef40f), SkBits2Float(0x4360fdc7)); // 357.229f, 217.669f, 349.907f, 224.991f +path.quadTo(SkBits2Float(0x43ab4acd), SkBits2Float(0x4368504b), SkBits2Float(0x43a61d51), SkBits2Float(0x4368504b)); // 342.584f, 232.314f, 332.229f, 232.314f +path.quadTo(SkBits2Float(0x43a0efd5), SkBits2Float(0x4368504b), SkBits2Float(0x439d4693), SkBits2Float(0x4360fdc7)); // 321.874f, 232.314f, 314.551f, 224.991f +path.quadTo(SkBits2Float(0x43999d51), SkBits2Float(0x4359ab42), SkBits2Float(0x43999d51), SkBits2Float(0x434f504b)); // 307.229f, 217.669f, 307.229f, 207.314f +path.quadTo(SkBits2Float(0x43999d51), SkBits2Float(0x4344f554), SkBits2Float(0x439d4693), SkBits2Float(0x433da2cf)); // 307.229f, 196.958f, 314.551f, 189.636f +path.quadTo(SkBits2Float(0x43a0efd5), SkBits2Float(0x4336504b), SkBits2Float(0x43a61d51), SkBits2Float(0x4336504b)); // 321.874f, 182.314f, 332.229f, 182.314f +path.quadTo(SkBits2Float(0x43ab4acd), SkBits2Float(0x4336504b), SkBits2Float(0x43aef40f), SkBits2Float(0x433da2cf)); // 342.584f, 182.314f, 349.907f, 189.636f +path.quadTo(SkBits2Float(0x43b29d51), SkBits2Float(0x4344f554), SkBits2Float(0x43b29d51), SkBits2Float(0x434f504b)); // 357.229f, 196.958f, 357.229f, 207.314f +path.close(); + SkPath path33(path); + builder.add(path33, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x439022b6), SkBits2Float(0x434132a3)); // 288.271f, 193.198f +path.quadTo(SkBits2Float(0x439022b6), SkBits2Float(0x434b8d9a), SkBits2Float(0x438c7974), SkBits2Float(0x4352e01f)); // 288.271f, 203.553f, 280.949f, 210.875f +path.quadTo(SkBits2Float(0x4388d032), SkBits2Float(0x435a32a3), SkBits2Float(0x4383a2b6), SkBits2Float(0x435a32a3)); // 273.627f, 218.198f, 263.271f, 218.198f +path.quadTo(SkBits2Float(0x437cea74), SkBits2Float(0x435a32a3), SkBits2Float(0x437597f0), SkBits2Float(0x4352e01f)); // 252.916f, 218.198f, 245.594f, 210.875f +path.quadTo(SkBits2Float(0x436e456c), SkBits2Float(0x434b8d9a), SkBits2Float(0x436e456c), SkBits2Float(0x434132a3)); // 238.271f, 203.553f, 238.271f, 193.198f +path.quadTo(SkBits2Float(0x436e456c), SkBits2Float(0x4336d7ac), SkBits2Float(0x437597f0), SkBits2Float(0x432f8527)); // 238.271f, 182.842f, 245.594f, 175.52f +path.quadTo(SkBits2Float(0x437cea74), SkBits2Float(0x432832a3), SkBits2Float(0x4383a2b6), SkBits2Float(0x432832a3)); // 252.916f, 168.198f, 263.271f, 168.198f +path.quadTo(SkBits2Float(0x4388d032), SkBits2Float(0x432832a3), SkBits2Float(0x438c7974), SkBits2Float(0x432f8527)); // 273.627f, 168.198f, 280.949f, 175.52f +path.quadTo(SkBits2Float(0x439022b6), SkBits2Float(0x4336d7ac), SkBits2Float(0x439022b6), SkBits2Float(0x434132a3)); // 288.271f, 182.842f, 288.271f, 193.198f +path.close(); + SkPath path34(path); + builder.add(path34, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x434c6e1b), SkBits2Float(0x4386bd38)); // 204.43f, 269.478f +path.quadTo(SkBits2Float(0x434c6e1b), SkBits2Float(0x438beab4), SkBits2Float(0x43451b97), SkBits2Float(0x438f93f6)); // 204.43f, 279.834f, 197.108f, 287.156f +path.quadTo(SkBits2Float(0x433dc912), SkBits2Float(0x43933d38), SkBits2Float(0x43336e1b), SkBits2Float(0x43933d38)); // 189.785f, 294.478f, 179.43f, 294.478f +path.quadTo(SkBits2Float(0x43291324), SkBits2Float(0x43933d38), SkBits2Float(0x4321c09f), SkBits2Float(0x438f93f6)); // 169.075f, 294.478f, 161.752f, 287.156f +path.quadTo(SkBits2Float(0x431a6e1b), SkBits2Float(0x438beab4), SkBits2Float(0x431a6e1b), SkBits2Float(0x4386bd38)); // 154.43f, 279.834f, 154.43f, 269.478f +path.quadTo(SkBits2Float(0x431a6e1b), SkBits2Float(0x43818fbc), SkBits2Float(0x4321c09f), SkBits2Float(0x437bccf4)); // 154.43f, 259.123f, 161.752f, 251.801f +path.quadTo(SkBits2Float(0x43291324), SkBits2Float(0x43747a70), SkBits2Float(0x43336e1b), SkBits2Float(0x43747a70)); // 169.075f, 244.478f, 179.43f, 244.478f +path.quadTo(SkBits2Float(0x433dc912), SkBits2Float(0x43747a70), SkBits2Float(0x43451b97), SkBits2Float(0x437bccf4)); // 189.785f, 244.478f, 197.108f, 251.801f +path.quadTo(SkBits2Float(0x434c6e1b), SkBits2Float(0x43818fbc), SkBits2Float(0x434c6e1b), SkBits2Float(0x4386bd38)); // 204.43f, 259.123f, 204.43f, 269.478f +path.close(); + SkPath path35(path); + builder.add(path35, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43926b36), SkBits2Float(0x43b08773)); // 292.838f, 353.058f +path.quadTo(SkBits2Float(0x43926b36), SkBits2Float(0x43b5b4ef), SkBits2Float(0x438ec1f4), SkBits2Float(0x43b95e31)); // 292.838f, 363.414f, 285.515f, 370.736f +path.quadTo(SkBits2Float(0x438b18b2), SkBits2Float(0x43bd0773), SkBits2Float(0x4385eb36), SkBits2Float(0x43bd0773)); // 278.193f, 378.058f, 267.838f, 378.058f +path.quadTo(SkBits2Float(0x4380bdba), SkBits2Float(0x43bd0773), SkBits2Float(0x437a28f0), SkBits2Float(0x43b95e31)); // 257.482f, 378.058f, 250.16f, 370.736f +path.quadTo(SkBits2Float(0x4372d66c), SkBits2Float(0x43b5b4ef), SkBits2Float(0x4372d66c), SkBits2Float(0x43b08773)); // 242.838f, 363.414f, 242.838f, 353.058f +path.quadTo(SkBits2Float(0x4372d66c), SkBits2Float(0x43ab59f7), SkBits2Float(0x437a28f0), SkBits2Float(0x43a7b0b5)); // 242.838f, 342.703f, 250.16f, 335.381f +path.quadTo(SkBits2Float(0x4380bdba), SkBits2Float(0x43a40773), SkBits2Float(0x4385eb36), SkBits2Float(0x43a40773)); // 257.482f, 328.058f, 267.838f, 328.058f +path.quadTo(SkBits2Float(0x438b18b2), SkBits2Float(0x43a40773), SkBits2Float(0x438ec1f4), SkBits2Float(0x43a7b0b5)); // 278.193f, 328.058f, 285.515f, 335.381f +path.quadTo(SkBits2Float(0x43926b36), SkBits2Float(0x43ab59f7), SkBits2Float(0x43926b36), SkBits2Float(0x43b08773)); // 292.838f, 342.703f, 292.838f, 353.058f +path.close(); + SkPath path36(path); + builder.add(path36, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ea874d), SkBits2Float(0x4382542c)); // 469.057f, 260.658f +path.quadTo(SkBits2Float(0x43ea874d), SkBits2Float(0x438781a8), SkBits2Float(0x43e6de0b), SkBits2Float(0x438b2aea)); // 469.057f, 271.013f, 461.735f, 278.335f +path.quadTo(SkBits2Float(0x43e334c9), SkBits2Float(0x438ed42c), SkBits2Float(0x43de074d), SkBits2Float(0x438ed42c)); // 454.412f, 285.658f, 444.057f, 285.658f +path.quadTo(SkBits2Float(0x43d8d9d1), SkBits2Float(0x438ed42c), SkBits2Float(0x43d5308f), SkBits2Float(0x438b2aea)); // 433.702f, 285.658f, 426.379f, 278.335f +path.quadTo(SkBits2Float(0x43d1874d), SkBits2Float(0x438781a8), SkBits2Float(0x43d1874d), SkBits2Float(0x4382542c)); // 419.057f, 271.013f, 419.057f, 260.658f +path.quadTo(SkBits2Float(0x43d1874d), SkBits2Float(0x437a4d60), SkBits2Float(0x43d5308f), SkBits2Float(0x4372fadc)); // 419.057f, 250.302f, 426.379f, 242.98f +path.quadTo(SkBits2Float(0x43d8d9d1), SkBits2Float(0x436ba858), SkBits2Float(0x43de074d), SkBits2Float(0x436ba858)); // 433.702f, 235.658f, 444.057f, 235.658f +path.quadTo(SkBits2Float(0x43e334c9), SkBits2Float(0x436ba858), SkBits2Float(0x43e6de0b), SkBits2Float(0x4372fadc)); // 454.412f, 235.658f, 461.735f, 242.98f +path.quadTo(SkBits2Float(0x43ea874d), SkBits2Float(0x437a4d60), SkBits2Float(0x43ea874d), SkBits2Float(0x4382542c)); // 469.057f, 250.302f, 469.057f, 260.658f +path.close(); + SkPath path37(path); + builder.add(path37, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42e7d715), SkBits2Float(0x436cecfc)); // 115.92f, 236.926f +path.quadTo(SkBits2Float(0x42e7d715), SkBits2Float(0x437747f3), SkBits2Float(0x42d9320c), SkBits2Float(0x437e9a77)); // 115.92f, 247.281f, 108.598f, 254.603f +path.quadTo(SkBits2Float(0x42ca8d04), SkBits2Float(0x4382f67e), SkBits2Float(0x42b5d715), SkBits2Float(0x4382f67e)); // 101.275f, 261.926f, 90.9201f, 261.926f +path.quadTo(SkBits2Float(0x42a12126), SkBits2Float(0x4382f67e), SkBits2Float(0x42927c1e), SkBits2Float(0x437e9a77)); // 80.5647f, 261.926f, 73.2424f, 254.603f +path.quadTo(SkBits2Float(0x4283d715), SkBits2Float(0x437747f3), SkBits2Float(0x4283d715), SkBits2Float(0x436cecfc)); // 65.9201f, 247.281f, 65.9201f, 236.926f +path.quadTo(SkBits2Float(0x4283d715), SkBits2Float(0x43629205), SkBits2Float(0x42927c1e), SkBits2Float(0x435b3f81)); // 65.9201f, 226.57f, 73.2424f, 219.248f +path.quadTo(SkBits2Float(0x42a12126), SkBits2Float(0x4353ecfd), SkBits2Float(0x42b5d715), SkBits2Float(0x4353ecfd)); // 80.5647f, 211.926f, 90.9201f, 211.926f +path.quadTo(SkBits2Float(0x42ca8d04), SkBits2Float(0x4353ecfd), SkBits2Float(0x42d9320c), SkBits2Float(0x435b3f81)); // 101.275f, 211.926f, 108.598f, 219.248f +path.quadTo(SkBits2Float(0x42e7d715), SkBits2Float(0x43629205), SkBits2Float(0x42e7d715), SkBits2Float(0x436cecfc)); // 115.92f, 226.57f, 115.92f, 236.926f +path.close(); + SkPath path38(path); + builder.add(path38, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43545413), SkBits2Float(0x4333cfcf)); // 212.328f, 179.812f +path.quadTo(SkBits2Float(0x43545413), SkBits2Float(0x433e2ac6), SkBits2Float(0x434d018f), SkBits2Float(0x43457d4b)); // 212.328f, 190.167f, 205.006f, 197.489f +path.quadTo(SkBits2Float(0x4345af0a), SkBits2Float(0x434ccfcf), SkBits2Float(0x433b5413), SkBits2Float(0x434ccfcf)); // 197.684f, 204.812f, 187.328f, 204.812f +path.quadTo(SkBits2Float(0x4330f91c), SkBits2Float(0x434ccfcf), SkBits2Float(0x4329a697), SkBits2Float(0x43457d4b)); // 176.973f, 204.812f, 169.651f, 197.489f +path.quadTo(SkBits2Float(0x43225413), SkBits2Float(0x433e2ac6), SkBits2Float(0x43225413), SkBits2Float(0x4333cfcf)); // 162.328f, 190.167f, 162.328f, 179.812f +path.quadTo(SkBits2Float(0x43225413), SkBits2Float(0x432974d8), SkBits2Float(0x4329a697), SkBits2Float(0x43222253)); // 162.328f, 169.456f, 169.651f, 162.134f +path.quadTo(SkBits2Float(0x4330f91c), SkBits2Float(0x431acfcf), SkBits2Float(0x433b5413), SkBits2Float(0x431acfcf)); // 176.973f, 154.812f, 187.328f, 154.812f +path.quadTo(SkBits2Float(0x4345af0a), SkBits2Float(0x431acfcf), SkBits2Float(0x434d018f), SkBits2Float(0x43222253)); // 197.684f, 154.812f, 205.006f, 162.134f +path.quadTo(SkBits2Float(0x43545413), SkBits2Float(0x432974d8), SkBits2Float(0x43545413), SkBits2Float(0x4333cfcf)); // 212.328f, 169.456f, 212.328f, 179.812f +path.close(); + SkPath path39(path); + builder.add(path39, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43c9b16c), SkBits2Float(0x41823be6)); // 403.386f, 16.2792f +path.quadTo(SkBits2Float(0x43c9b16c), SkBits2Float(0x41d513a2), SkBits2Float(0x43c6082a), SkBits2Float(0x4207d3e2)); // 403.386f, 26.6346f, 396.064f, 33.9569f +path.quadTo(SkBits2Float(0x43c25ee8), SkBits2Float(0x42251df3), SkBits2Float(0x43bd316c), SkBits2Float(0x42251df3)); // 388.741f, 41.2792f, 378.386f, 41.2792f +path.quadTo(SkBits2Float(0x43b803f0), SkBits2Float(0x42251df3), SkBits2Float(0x43b45aae), SkBits2Float(0x4207d3e2)); // 368.031f, 41.2792f, 360.708f, 33.9569f +path.quadTo(SkBits2Float(0x43b0b16c), SkBits2Float(0x41d513a2), SkBits2Float(0x43b0b16c), SkBits2Float(0x41823be6)); // 353.386f, 26.6346f, 353.386f, 16.2792f +path.quadTo(SkBits2Float(0x43b0b16c), SkBits2Float(0x40bd90a8), SkBits2Float(0x43b45aae), SkBits2Float(0xbfb2ff80)); // 353.386f, 5.92391f, 360.708f, -1.39842f +path.quadTo(SkBits2Float(0x43b803f0), SkBits2Float(0xc10b8834), SkBits2Float(0x43bd316c), SkBits2Float(0xc10b8834)); // 368.031f, -8.72075f, 378.386f, -8.72075f +path.quadTo(SkBits2Float(0x43c25ee8), SkBits2Float(0xc10b8834), SkBits2Float(0x43c6082a), SkBits2Float(0xbfb2ff80)); // 388.741f, -8.72075f, 396.064f, -1.39842f +path.quadTo(SkBits2Float(0x43c9b16c), SkBits2Float(0x40bd90a8), SkBits2Float(0x43c9b16c), SkBits2Float(0x41823be6)); // 403.386f, 5.92391f, 403.386f, 16.2792f +path.close(); + SkPath path40(path); + builder.add(path40, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43747fcb), SkBits2Float(0x43805e9d)); // 244.499f, 256.739f +path.quadTo(SkBits2Float(0x43747fcb), SkBits2Float(0x43858c19), SkBits2Float(0x436d2d47), SkBits2Float(0x4389355b)); // 244.499f, 267.095f, 237.177f, 274.417f +path.quadTo(SkBits2Float(0x4365dac2), SkBits2Float(0x438cde9d), SkBits2Float(0x435b7fcb), SkBits2Float(0x438cde9d)); // 229.855f, 281.739f, 219.499f, 281.739f +path.quadTo(SkBits2Float(0x435124d4), SkBits2Float(0x438cde9d), SkBits2Float(0x4349d24f), SkBits2Float(0x4389355b)); // 209.144f, 281.739f, 201.822f, 274.417f +path.quadTo(SkBits2Float(0x43427fcb), SkBits2Float(0x43858c19), SkBits2Float(0x43427fcb), SkBits2Float(0x43805e9d)); // 194.499f, 267.095f, 194.499f, 256.739f +path.quadTo(SkBits2Float(0x43427fcb), SkBits2Float(0x43766242), SkBits2Float(0x4349d24f), SkBits2Float(0x436f0fbe)); // 194.499f, 246.384f, 201.822f, 239.061f +path.quadTo(SkBits2Float(0x435124d4), SkBits2Float(0x4367bd3a), SkBits2Float(0x435b7fcb), SkBits2Float(0x4367bd3a)); // 209.144f, 231.739f, 219.499f, 231.739f +path.quadTo(SkBits2Float(0x4365dac2), SkBits2Float(0x4367bd3a), SkBits2Float(0x436d2d47), SkBits2Float(0x436f0fbe)); // 229.855f, 231.739f, 237.177f, 239.061f +path.quadTo(SkBits2Float(0x43747fcb), SkBits2Float(0x43766242), SkBits2Float(0x43747fcb), SkBits2Float(0x43805e9d)); // 244.499f, 246.384f, 244.499f, 256.739f +path.close(); + SkPath path41(path); + builder.add(path41, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43910318), SkBits2Float(0x43826a1e)); // 290.024f, 260.829f +path.quadTo(SkBits2Float(0x43910318), SkBits2Float(0x4387979a), SkBits2Float(0x438d59d6), SkBits2Float(0x438b40dc)); // 290.024f, 271.184f, 282.702f, 278.507f +path.quadTo(SkBits2Float(0x4389b094), SkBits2Float(0x438eea1e), SkBits2Float(0x43848318), SkBits2Float(0x438eea1e)); // 275.38f, 285.829f, 265.024f, 285.829f +path.quadTo(SkBits2Float(0x437eab38), SkBits2Float(0x438eea1e), SkBits2Float(0x437758b4), SkBits2Float(0x438b40dc)); // 254.669f, 285.829f, 247.346f, 278.507f +path.quadTo(SkBits2Float(0x43700630), SkBits2Float(0x4387979a), SkBits2Float(0x43700630), SkBits2Float(0x43826a1e)); // 240.024f, 271.184f, 240.024f, 260.829f +path.quadTo(SkBits2Float(0x43700630), SkBits2Float(0x437a7944), SkBits2Float(0x437758b4), SkBits2Float(0x437326c0)); // 240.024f, 250.474f, 247.346f, 243.151f +path.quadTo(SkBits2Float(0x437eab38), SkBits2Float(0x436bd43c), SkBits2Float(0x43848318), SkBits2Float(0x436bd43c)); // 254.669f, 235.829f, 265.024f, 235.829f +path.quadTo(SkBits2Float(0x4389b094), SkBits2Float(0x436bd43c), SkBits2Float(0x438d59d6), SkBits2Float(0x437326c0)); // 275.38f, 235.829f, 282.702f, 243.151f +path.quadTo(SkBits2Float(0x43910318), SkBits2Float(0x437a7944), SkBits2Float(0x43910318), SkBits2Float(0x43826a1e)); // 290.024f, 250.474f, 290.024f, 260.829f +path.close(); + SkPath path42(path); + builder.add(path42, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x41c80000), SkBits2Float(0x436edb04)); // 25, 238.856f +path.quadTo(SkBits2Float(0x41c80000), SkBits2Float(0x437935fb), SkBits2Float(0x418d6bde), SkBits2Float(0x43804440)); // 25, 249.211f, 17.6777f, 256.533f +path.quadTo(SkBits2Float(0x4125af78), SkBits2Float(0x4383ed82), SkBits2Float(0x00000000), SkBits2Float(0x4383ed82)); // 10.3553f, 263.856f, 0, 263.856f +path.quadTo(SkBits2Float(0xc125af78), SkBits2Float(0x4383ed82), SkBits2Float(0xc18d6bde), SkBits2Float(0x43804440)); // -10.3553f, 263.856f, -17.6777f, 256.533f +path.quadTo(SkBits2Float(0xc1c80000), SkBits2Float(0x437935fb), SkBits2Float(0xc1c80000), SkBits2Float(0x436edb04)); // -25, 249.211f, -25, 238.856f +path.quadTo(SkBits2Float(0xc1c80000), SkBits2Float(0x4364800d), SkBits2Float(0xc18d6bde), SkBits2Float(0x435d2d89)); // -25, 228.5f, -17.6777f, 221.178f +path.quadTo(SkBits2Float(0xc125af78), SkBits2Float(0x4355db05), SkBits2Float(0x00000000), SkBits2Float(0x4355db05)); // -10.3553f, 213.856f, 0, 213.856f +path.quadTo(SkBits2Float(0x4125af78), SkBits2Float(0x4355db05), SkBits2Float(0x418d6bde), SkBits2Float(0x435d2d89)); // 10.3553f, 213.856f, 17.6777f, 221.178f +path.quadTo(SkBits2Float(0x41c80000), SkBits2Float(0x4364800d), SkBits2Float(0x41c80000), SkBits2Float(0x436edb04)); // 25, 228.5f, 25, 238.856f +path.close(); + SkPath path43(path); + builder.add(path43, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x435d07bd), SkBits2Float(0x4395fbb5)); // 221.03f, 299.966f +path.quadTo(SkBits2Float(0x435d07bd), SkBits2Float(0x439b2931), SkBits2Float(0x4355b539), SkBits2Float(0x439ed273)); // 221.03f, 310.322f, 213.708f, 317.644f +path.quadTo(SkBits2Float(0x434e62b4), SkBits2Float(0x43a27bb5), SkBits2Float(0x434407bd), SkBits2Float(0x43a27bb5)); // 206.386f, 324.966f, 196.03f, 324.966f +path.quadTo(SkBits2Float(0x4339acc6), SkBits2Float(0x43a27bb5), SkBits2Float(0x43325a41), SkBits2Float(0x439ed273)); // 185.675f, 324.966f, 178.353f, 317.644f +path.quadTo(SkBits2Float(0x432b07bd), SkBits2Float(0x439b2931), SkBits2Float(0x432b07bd), SkBits2Float(0x4395fbb5)); // 171.03f, 310.322f, 171.03f, 299.966f +path.quadTo(SkBits2Float(0x432b07bd), SkBits2Float(0x4390ce39), SkBits2Float(0x43325a41), SkBits2Float(0x438d24f7)); // 171.03f, 289.611f, 178.353f, 282.289f +path.quadTo(SkBits2Float(0x4339acc6), SkBits2Float(0x43897bb5), SkBits2Float(0x434407bd), SkBits2Float(0x43897bb5)); // 185.675f, 274.966f, 196.03f, 274.966f +path.quadTo(SkBits2Float(0x434e62b4), SkBits2Float(0x43897bb5), SkBits2Float(0x4355b539), SkBits2Float(0x438d24f7)); // 206.386f, 274.966f, 213.708f, 282.289f +path.quadTo(SkBits2Float(0x435d07bd), SkBits2Float(0x4390ce39), SkBits2Float(0x435d07bd), SkBits2Float(0x4395fbb5)); // 221.03f, 289.611f, 221.03f, 299.966f +path.close(); + SkPath path44(path); + builder.add(path44, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a3ec29), SkBits2Float(0x434ac5a3)); // 327.845f, 202.772f +path.quadTo(SkBits2Float(0x43a3ec29), SkBits2Float(0x4355209a), SkBits2Float(0x43a042e7), SkBits2Float(0x435c731f)); // 327.845f, 213.127f, 320.523f, 220.45f +path.quadTo(SkBits2Float(0x439c99a5), SkBits2Float(0x4363c5a3), SkBits2Float(0x43976c29), SkBits2Float(0x4363c5a3)); // 313.2f, 227.772f, 302.845f, 227.772f +path.quadTo(SkBits2Float(0x43923ead), SkBits2Float(0x4363c5a3), SkBits2Float(0x438e956b), SkBits2Float(0x435c731f)); // 292.49f, 227.772f, 285.167f, 220.45f +path.quadTo(SkBits2Float(0x438aec29), SkBits2Float(0x4355209a), SkBits2Float(0x438aec29), SkBits2Float(0x434ac5a3)); // 277.845f, 213.127f, 277.845f, 202.772f +path.quadTo(SkBits2Float(0x438aec29), SkBits2Float(0x43406aac), SkBits2Float(0x438e956b), SkBits2Float(0x43391827)); // 277.845f, 192.417f, 285.167f, 185.094f +path.quadTo(SkBits2Float(0x43923ead), SkBits2Float(0x4331c5a3), SkBits2Float(0x43976c29), SkBits2Float(0x4331c5a3)); // 292.49f, 177.772f, 302.845f, 177.772f +path.quadTo(SkBits2Float(0x439c99a5), SkBits2Float(0x4331c5a3), SkBits2Float(0x43a042e7), SkBits2Float(0x43391827)); // 313.2f, 177.772f, 320.523f, 185.094f +path.quadTo(SkBits2Float(0x43a3ec29), SkBits2Float(0x43406aac), SkBits2Float(0x43a3ec29), SkBits2Float(0x434ac5a3)); // 327.845f, 192.417f, 327.845f, 202.772f +path.close(); + SkPath path45(path); + builder.add(path45, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4380585e), SkBits2Float(0x43199f0e)); // 256.69f, 153.621f +path.quadTo(SkBits2Float(0x4380585e), SkBits2Float(0x4323fa06), SkBits2Float(0x43795e38), SkBits2Float(0x432b4c8a)); // 256.69f, 163.977f, 249.368f, 171.299f +path.quadTo(SkBits2Float(0x43720bb4), SkBits2Float(0x43329f0e), SkBits2Float(0x4367b0bc), SkBits2Float(0x43329f0e)); // 242.046f, 178.621f, 231.69f, 178.621f +path.quadTo(SkBits2Float(0x435d55c4), SkBits2Float(0x43329f0e), SkBits2Float(0x43560340), SkBits2Float(0x432b4c8a)); // 221.335f, 178.621f, 214.013f, 171.299f +path.quadTo(SkBits2Float(0x434eb0bc), SkBits2Float(0x4323fa06), SkBits2Float(0x434eb0bc), SkBits2Float(0x43199f0e)); // 206.69f, 163.977f, 206.69f, 153.621f +path.quadTo(SkBits2Float(0x434eb0bc), SkBits2Float(0x430f4416), SkBits2Float(0x43560340), SkBits2Float(0x4307f192)); // 206.69f, 143.266f, 214.013f, 135.944f +path.quadTo(SkBits2Float(0x435d55c4), SkBits2Float(0x43009f0e), SkBits2Float(0x4367b0bc), SkBits2Float(0x43009f0e)); // 221.335f, 128.621f, 231.69f, 128.621f +path.quadTo(SkBits2Float(0x43720bb4), SkBits2Float(0x43009f0e), SkBits2Float(0x43795e38), SkBits2Float(0x4307f192)); // 242.046f, 128.621f, 249.368f, 135.944f +path.quadTo(SkBits2Float(0x4380585e), SkBits2Float(0x430f4416), SkBits2Float(0x4380585e), SkBits2Float(0x43199f0e)); // 256.69f, 143.266f, 256.69f, 153.621f +path.close(); + SkPath path46(path); + builder.add(path46, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43599e4b), SkBits2Float(0x43c5e452)); // 217.618f, 395.784f +path.quadTo(SkBits2Float(0x43599e4b), SkBits2Float(0x43cb11ce), SkBits2Float(0x43524bc7), SkBits2Float(0x43cebb10)); // 217.618f, 406.139f, 210.296f, 413.461f +path.quadTo(SkBits2Float(0x434af942), SkBits2Float(0x43d26452), SkBits2Float(0x43409e4b), SkBits2Float(0x43d26452)); // 202.974f, 420.784f, 192.618f, 420.784f +path.quadTo(SkBits2Float(0x43364354), SkBits2Float(0x43d26452), SkBits2Float(0x432ef0cf), SkBits2Float(0x43cebb10)); // 182.263f, 420.784f, 174.941f, 413.461f +path.quadTo(SkBits2Float(0x43279e4b), SkBits2Float(0x43cb11ce), SkBits2Float(0x43279e4b), SkBits2Float(0x43c5e452)); // 167.618f, 406.139f, 167.618f, 395.784f +path.quadTo(SkBits2Float(0x43279e4b), SkBits2Float(0x43c0b6d6), SkBits2Float(0x432ef0cf), SkBits2Float(0x43bd0d94)); // 167.618f, 385.428f, 174.941f, 378.106f +path.quadTo(SkBits2Float(0x43364354), SkBits2Float(0x43b96452), SkBits2Float(0x43409e4b), SkBits2Float(0x43b96452)); // 182.263f, 370.784f, 192.618f, 370.784f +path.quadTo(SkBits2Float(0x434af942), SkBits2Float(0x43b96452), SkBits2Float(0x43524bc7), SkBits2Float(0x43bd0d94)); // 202.974f, 370.784f, 210.296f, 378.106f +path.quadTo(SkBits2Float(0x43599e4b), SkBits2Float(0x43c0b6d6), SkBits2Float(0x43599e4b), SkBits2Float(0x43c5e452)); // 217.618f, 385.428f, 217.618f, 395.784f +path.close(); + SkPath path47(path); + builder.add(path47, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x435e28dc), SkBits2Float(0x43a32a69)); // 222.16f, 326.331f +path.quadTo(SkBits2Float(0x435e28dc), SkBits2Float(0x43a857e5), SkBits2Float(0x4356d658), SkBits2Float(0x43ac0127)); // 222.16f, 336.687f, 214.837f, 344.009f +path.quadTo(SkBits2Float(0x434f83d4), SkBits2Float(0x43afaa69), SkBits2Float(0x434528dc), SkBits2Float(0x43afaa69)); // 207.515f, 351.331f, 197.16f, 351.331f +path.quadTo(SkBits2Float(0x433acde4), SkBits2Float(0x43afaa69), SkBits2Float(0x43337b60), SkBits2Float(0x43ac0127)); // 186.804f, 351.331f, 179.482f, 344.009f +path.quadTo(SkBits2Float(0x432c28dc), SkBits2Float(0x43a857e5), SkBits2Float(0x432c28dc), SkBits2Float(0x43a32a69)); // 172.16f, 336.687f, 172.16f, 326.331f +path.quadTo(SkBits2Float(0x432c28dc), SkBits2Float(0x439dfced), SkBits2Float(0x43337b60), SkBits2Float(0x439a53ab)); // 172.16f, 315.976f, 179.482f, 308.654f +path.quadTo(SkBits2Float(0x433acde4), SkBits2Float(0x4396aa69), SkBits2Float(0x434528dc), SkBits2Float(0x4396aa69)); // 186.804f, 301.331f, 197.16f, 301.331f +path.quadTo(SkBits2Float(0x434f83d4), SkBits2Float(0x4396aa69), SkBits2Float(0x4356d658), SkBits2Float(0x439a53ab)); // 207.515f, 301.331f, 214.837f, 308.654f +path.quadTo(SkBits2Float(0x435e28dc), SkBits2Float(0x439dfced), SkBits2Float(0x435e28dc), SkBits2Float(0x43a32a69)); // 222.16f, 315.976f, 222.16f, 326.331f +path.close(); + SkPath path48(path); + builder.add(path48, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x433b4ff9), SkBits2Float(0x438034ac)); // 187.312f, 256.411f +path.quadTo(SkBits2Float(0x433b4ff9), SkBits2Float(0x43856228), SkBits2Float(0x4333fd75), SkBits2Float(0x43890b6a)); // 187.312f, 266.767f, 179.99f, 274.089f +path.quadTo(SkBits2Float(0x432caaf0), SkBits2Float(0x438cb4ac), SkBits2Float(0x43224ff9), SkBits2Float(0x438cb4ac)); // 172.668f, 281.411f, 162.312f, 281.411f +path.quadTo(SkBits2Float(0x4317f502), SkBits2Float(0x438cb4ac), SkBits2Float(0x4310a27d), SkBits2Float(0x43890b6a)); // 151.957f, 281.411f, 144.635f, 274.089f +path.quadTo(SkBits2Float(0x43094ff9), SkBits2Float(0x43856228), SkBits2Float(0x43094ff9), SkBits2Float(0x438034ac)); // 137.312f, 266.767f, 137.312f, 256.411f +path.quadTo(SkBits2Float(0x43094ff9), SkBits2Float(0x43760e60), SkBits2Float(0x4310a27d), SkBits2Float(0x436ebbdc)); // 137.312f, 246.056f, 144.635f, 238.734f +path.quadTo(SkBits2Float(0x4317f502), SkBits2Float(0x43676958), SkBits2Float(0x43224ff9), SkBits2Float(0x43676958)); // 151.957f, 231.411f, 162.312f, 231.411f +path.quadTo(SkBits2Float(0x432caaf0), SkBits2Float(0x43676958), SkBits2Float(0x4333fd75), SkBits2Float(0x436ebbdc)); // 172.668f, 231.411f, 179.99f, 238.734f +path.quadTo(SkBits2Float(0x433b4ff9), SkBits2Float(0x43760e60), SkBits2Float(0x433b4ff9), SkBits2Float(0x438034ac)); // 187.312f, 246.056f, 187.312f, 256.411f +path.close(); + SkPath path49(path); + builder.add(path49, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4346c2ee), SkBits2Float(0x435b284b)); // 198.761f, 219.157f +path.quadTo(SkBits2Float(0x4346c2ee), SkBits2Float(0x43658342), SkBits2Float(0x433f706a), SkBits2Float(0x436cd5c7)); // 198.761f, 229.513f, 191.439f, 236.835f +path.quadTo(SkBits2Float(0x43381de6), SkBits2Float(0x4374284b), SkBits2Float(0x432dc2ee), SkBits2Float(0x4374284b)); // 184.117f, 244.157f, 173.761f, 244.157f +path.quadTo(SkBits2Float(0x432367f6), SkBits2Float(0x4374284b), SkBits2Float(0x431c1572), SkBits2Float(0x436cd5c7)); // 163.406f, 244.157f, 156.084f, 236.835f +path.quadTo(SkBits2Float(0x4314c2ee), SkBits2Float(0x43658342), SkBits2Float(0x4314c2ee), SkBits2Float(0x435b284b)); // 148.761f, 229.513f, 148.761f, 219.157f +path.quadTo(SkBits2Float(0x4314c2ee), SkBits2Float(0x4350cd54), SkBits2Float(0x431c1572), SkBits2Float(0x43497acf)); // 148.761f, 208.802f, 156.084f, 201.48f +path.quadTo(SkBits2Float(0x432367f6), SkBits2Float(0x4342284b), SkBits2Float(0x432dc2ee), SkBits2Float(0x4342284b)); // 163.406f, 194.157f, 173.761f, 194.157f +path.quadTo(SkBits2Float(0x43381de6), SkBits2Float(0x4342284b), SkBits2Float(0x433f706a), SkBits2Float(0x43497acf)); // 184.117f, 194.157f, 191.439f, 201.48f +path.quadTo(SkBits2Float(0x4346c2ee), SkBits2Float(0x4350cd54), SkBits2Float(0x4346c2ee), SkBits2Float(0x435b284b)); // 198.761f, 208.802f, 198.761f, 219.157f +path.close(); + SkPath path50(path); + builder.add(path50, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43fb0cf6), SkBits2Float(0x438812a5)); // 502.101f, 272.146f +path.quadTo(SkBits2Float(0x43fb0cf6), SkBits2Float(0x438d4021), SkBits2Float(0x43f763b4), SkBits2Float(0x4390e963)); // 502.101f, 282.501f, 494.779f, 289.823f +path.quadTo(SkBits2Float(0x43f3ba72), SkBits2Float(0x439492a5), SkBits2Float(0x43ee8cf6), SkBits2Float(0x439492a5)); // 487.457f, 297.146f, 477.101f, 297.146f +path.quadTo(SkBits2Float(0x43e95f7a), SkBits2Float(0x439492a5), SkBits2Float(0x43e5b638), SkBits2Float(0x4390e963)); // 466.746f, 297.146f, 459.424f, 289.823f +path.quadTo(SkBits2Float(0x43e20cf6), SkBits2Float(0x438d4021), SkBits2Float(0x43e20cf6), SkBits2Float(0x438812a5)); // 452.101f, 282.501f, 452.101f, 272.146f +path.quadTo(SkBits2Float(0x43e20cf6), SkBits2Float(0x4382e529), SkBits2Float(0x43e5b638), SkBits2Float(0x437e77ce)); // 452.101f, 261.79f, 459.424f, 254.468f +path.quadTo(SkBits2Float(0x43e95f7a), SkBits2Float(0x4377254a), SkBits2Float(0x43ee8cf6), SkBits2Float(0x4377254a)); // 466.746f, 247.146f, 477.101f, 247.146f +path.quadTo(SkBits2Float(0x43f3ba72), SkBits2Float(0x4377254a), SkBits2Float(0x43f763b4), SkBits2Float(0x437e77ce)); // 487.457f, 247.146f, 494.779f, 254.468f +path.quadTo(SkBits2Float(0x43fb0cf6), SkBits2Float(0x4382e529), SkBits2Float(0x43fb0cf6), SkBits2Float(0x438812a5)); // 502.101f, 261.79f, 502.101f, 272.146f +path.close(); + SkPath path51(path); + builder.add(path51, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x438f42d6), SkBits2Float(0x435a09d4)); // 286.522f, 218.038f +path.quadTo(SkBits2Float(0x438f42d6), SkBits2Float(0x436464cc), SkBits2Float(0x438b9994), SkBits2Float(0x436bb750)); // 286.522f, 228.394f, 279.2f, 235.716f +path.quadTo(SkBits2Float(0x4387f052), SkBits2Float(0x437309d4), SkBits2Float(0x4382c2d6), SkBits2Float(0x437309d4)); // 271.878f, 243.038f, 261.522f, 243.038f +path.quadTo(SkBits2Float(0x437b2ab4), SkBits2Float(0x437309d4), SkBits2Float(0x4373d830), SkBits2Float(0x436bb750)); // 251.167f, 243.038f, 243.844f, 235.716f +path.quadTo(SkBits2Float(0x436c85ac), SkBits2Float(0x436464cc), SkBits2Float(0x436c85ac), SkBits2Float(0x435a09d4)); // 236.522f, 228.394f, 236.522f, 218.038f +path.quadTo(SkBits2Float(0x436c85ac), SkBits2Float(0x434faedc), SkBits2Float(0x4373d830), SkBits2Float(0x43485c58)); // 236.522f, 207.683f, 243.844f, 200.361f +path.quadTo(SkBits2Float(0x437b2ab4), SkBits2Float(0x434109d4), SkBits2Float(0x4382c2d6), SkBits2Float(0x434109d4)); // 251.167f, 193.038f, 261.522f, 193.038f +path.quadTo(SkBits2Float(0x4387f052), SkBits2Float(0x434109d4), SkBits2Float(0x438b9994), SkBits2Float(0x43485c58)); // 271.878f, 193.038f, 279.2f, 200.361f +path.quadTo(SkBits2Float(0x438f42d6), SkBits2Float(0x434faedc), SkBits2Float(0x438f42d6), SkBits2Float(0x435a09d4)); // 286.522f, 207.683f, 286.522f, 218.038f +path.close(); + SkPath path52(path); + builder.add(path52, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ac18fb), SkBits2Float(0x43378440)); // 344.195f, 183.517f +path.quadTo(SkBits2Float(0x43ac18fb), SkBits2Float(0x4341df38), SkBits2Float(0x43a86fb9), SkBits2Float(0x434931bc)); // 344.195f, 193.872f, 336.873f, 201.194f +path.quadTo(SkBits2Float(0x43a4c677), SkBits2Float(0x43508440), SkBits2Float(0x439f98fb), SkBits2Float(0x43508440)); // 329.551f, 208.517f, 319.195f, 208.517f +path.quadTo(SkBits2Float(0x439a6b7f), SkBits2Float(0x43508440), SkBits2Float(0x4396c23d), SkBits2Float(0x434931bc)); // 308.84f, 208.517f, 301.517f, 201.194f +path.quadTo(SkBits2Float(0x439318fb), SkBits2Float(0x4341df38), SkBits2Float(0x439318fb), SkBits2Float(0x43378440)); // 294.195f, 193.872f, 294.195f, 183.517f +path.quadTo(SkBits2Float(0x439318fb), SkBits2Float(0x432d2948), SkBits2Float(0x4396c23d), SkBits2Float(0x4325d6c4)); // 294.195f, 173.161f, 301.517f, 165.839f +path.quadTo(SkBits2Float(0x439a6b7f), SkBits2Float(0x431e8440), SkBits2Float(0x439f98fb), SkBits2Float(0x431e8440)); // 308.84f, 158.517f, 319.195f, 158.517f +path.quadTo(SkBits2Float(0x43a4c677), SkBits2Float(0x431e8440), SkBits2Float(0x43a86fb9), SkBits2Float(0x4325d6c4)); // 329.551f, 158.517f, 336.873f, 165.839f +path.quadTo(SkBits2Float(0x43ac18fb), SkBits2Float(0x432d2948), SkBits2Float(0x43ac18fb), SkBits2Float(0x43378440)); // 344.195f, 173.161f, 344.195f, 183.517f +path.close(); + SkPath path53(path); + builder.add(path53, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42ef12a3), SkBits2Float(0x430c5faa)); // 119.536f, 140.374f +path.quadTo(SkBits2Float(0x42ef12a3), SkBits2Float(0x4316baa2), SkBits2Float(0x42e06d9a), SkBits2Float(0x431e0d26)); // 119.536f, 150.729f, 112.214f, 158.051f +path.quadTo(SkBits2Float(0x42d1c892), SkBits2Float(0x43255faa), SkBits2Float(0x42bd12a3), SkBits2Float(0x43255faa)); // 104.892f, 165.374f, 94.5364f, 165.374f +path.quadTo(SkBits2Float(0x42a85cb4), SkBits2Float(0x43255faa), SkBits2Float(0x4299b7ac), SkBits2Float(0x431e0d26)); // 84.1811f, 165.374f, 76.8587f, 158.051f +path.quadTo(SkBits2Float(0x428b12a3), SkBits2Float(0x4316baa2), SkBits2Float(0x428b12a3), SkBits2Float(0x430c5faa)); // 69.5364f, 150.729f, 69.5364f, 140.374f +path.quadTo(SkBits2Float(0x428b12a3), SkBits2Float(0x430204b2), SkBits2Float(0x4299b7ac), SkBits2Float(0x42f5645c)); // 69.5364f, 130.018f, 76.8587f, 122.696f +path.quadTo(SkBits2Float(0x42a85cb4), SkBits2Float(0x42e6bf54), SkBits2Float(0x42bd12a3), SkBits2Float(0x42e6bf54)); // 84.1811f, 115.374f, 94.5364f, 115.374f +path.quadTo(SkBits2Float(0x42d1c892), SkBits2Float(0x42e6bf54), SkBits2Float(0x42e06d9a), SkBits2Float(0x42f5645c)); // 104.892f, 115.374f, 112.214f, 122.696f +path.quadTo(SkBits2Float(0x42ef12a3), SkBits2Float(0x430204b2), SkBits2Float(0x42ef12a3), SkBits2Float(0x430c5faa)); // 119.536f, 130.018f, 119.536f, 140.374f +path.close(); + SkPath path54(path); + builder.add(path54, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43f569c1), SkBits2Float(0x43463314)); // 490.826f, 198.2f +path.quadTo(SkBits2Float(0x43f569c1), SkBits2Float(0x43508e0c), SkBits2Float(0x43f1c07f), SkBits2Float(0x4357e090)); // 490.826f, 208.555f, 483.504f, 215.877f +path.quadTo(SkBits2Float(0x43ee173d), SkBits2Float(0x435f3314), SkBits2Float(0x43e8e9c1), SkBits2Float(0x435f3314)); // 476.182f, 223.2f, 465.826f, 223.2f +path.quadTo(SkBits2Float(0x43e3bc45), SkBits2Float(0x435f3314), SkBits2Float(0x43e01303), SkBits2Float(0x4357e090)); // 455.471f, 223.2f, 448.149f, 215.877f +path.quadTo(SkBits2Float(0x43dc69c1), SkBits2Float(0x43508e0c), SkBits2Float(0x43dc69c1), SkBits2Float(0x43463314)); // 440.826f, 208.555f, 440.826f, 198.2f +path.quadTo(SkBits2Float(0x43dc69c1), SkBits2Float(0x433bd81c), SkBits2Float(0x43e01303), SkBits2Float(0x43348598)); // 440.826f, 187.844f, 448.149f, 180.522f +path.quadTo(SkBits2Float(0x43e3bc45), SkBits2Float(0x432d3314), SkBits2Float(0x43e8e9c1), SkBits2Float(0x432d3314)); // 455.471f, 173.2f, 465.826f, 173.2f +path.quadTo(SkBits2Float(0x43ee173d), SkBits2Float(0x432d3314), SkBits2Float(0x43f1c07f), SkBits2Float(0x43348598)); // 476.182f, 173.2f, 483.504f, 180.522f +path.quadTo(SkBits2Float(0x43f569c1), SkBits2Float(0x433bd81c), SkBits2Float(0x43f569c1), SkBits2Float(0x43463314)); // 490.826f, 187.844f, 490.826f, 198.2f +path.close(); + SkPath path55(path); + builder.add(path55, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4346ee50), SkBits2Float(0x4386bdd6)); // 198.931f, 269.483f +path.quadTo(SkBits2Float(0x4346ee50), SkBits2Float(0x438beb52), SkBits2Float(0x433f9bcc), SkBits2Float(0x438f9494)); // 198.931f, 279.838f, 191.609f, 287.161f +path.quadTo(SkBits2Float(0x43384948), SkBits2Float(0x43933dd6), SkBits2Float(0x432dee50), SkBits2Float(0x43933dd6)); // 184.286f, 294.483f, 173.931f, 294.483f +path.quadTo(SkBits2Float(0x43239358), SkBits2Float(0x43933dd6), SkBits2Float(0x431c40d4), SkBits2Float(0x438f9494)); // 163.576f, 294.483f, 156.253f, 287.161f +path.quadTo(SkBits2Float(0x4314ee50), SkBits2Float(0x438beb52), SkBits2Float(0x4314ee50), SkBits2Float(0x4386bdd6)); // 148.931f, 279.838f, 148.931f, 269.483f +path.quadTo(SkBits2Float(0x4314ee50), SkBits2Float(0x4381905a), SkBits2Float(0x431c40d4), SkBits2Float(0x437bce30)); // 148.931f, 259.128f, 156.253f, 251.805f +path.quadTo(SkBits2Float(0x43239358), SkBits2Float(0x43747bac), SkBits2Float(0x432dee50), SkBits2Float(0x43747bac)); // 163.576f, 244.483f, 173.931f, 244.483f +path.quadTo(SkBits2Float(0x43384948), SkBits2Float(0x43747bac), SkBits2Float(0x433f9bcc), SkBits2Float(0x437bce30)); // 184.286f, 244.483f, 191.609f, 251.805f +path.quadTo(SkBits2Float(0x4346ee50), SkBits2Float(0x4381905a), SkBits2Float(0x4346ee50), SkBits2Float(0x4386bdd6)); // 198.931f, 259.128f, 198.931f, 269.483f +path.close(); + SkPath path56(path); + builder.add(path56, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4403bd60), SkBits2Float(0x438666a7)); // 526.959f, 268.802f +path.quadTo(SkBits2Float(0x4403bd60), SkBits2Float(0x438b9423), SkBits2Float(0x4401e8bf), SkBits2Float(0x438f3d65)); // 526.959f, 279.157f, 519.637f, 286.48f +path.quadTo(SkBits2Float(0x4400141e), SkBits2Float(0x4392e6a7), SkBits2Float(0x43fafac0), SkBits2Float(0x4392e6a7)); // 512.314f, 293.802f, 501.959f, 293.802f +path.quadTo(SkBits2Float(0x43f5cd44), SkBits2Float(0x4392e6a7), SkBits2Float(0x43f22402), SkBits2Float(0x438f3d65)); // 491.604f, 293.802f, 484.281f, 286.48f +path.quadTo(SkBits2Float(0x43ee7ac1), SkBits2Float(0x438b9423), SkBits2Float(0x43ee7ac1), SkBits2Float(0x438666a7)); // 476.959f, 279.157f, 476.959f, 268.802f +path.quadTo(SkBits2Float(0x43ee7ac1), SkBits2Float(0x4381392b), SkBits2Float(0x43f22402), SkBits2Float(0x437b1fd2)); // 476.959f, 258.447f, 484.281f, 251.124f +path.quadTo(SkBits2Float(0x43f5cd44), SkBits2Float(0x4373cd4e), SkBits2Float(0x43fafac0), SkBits2Float(0x4373cd4e)); // 491.604f, 243.802f, 501.959f, 243.802f +path.quadTo(SkBits2Float(0x4400141e), SkBits2Float(0x4373cd4e), SkBits2Float(0x4401e8bf), SkBits2Float(0x437b1fd2)); // 512.314f, 243.802f, 519.637f, 251.124f +path.quadTo(SkBits2Float(0x4403bd60), SkBits2Float(0x4381392b), SkBits2Float(0x4403bd60), SkBits2Float(0x438666a7)); // 526.959f, 258.447f, 526.959f, 268.802f +path.close(); + SkPath path57(path); + builder.add(path57, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x433c6aff), SkBits2Float(0x439bf9f9)); // 188.418f, 311.953f +path.quadTo(SkBits2Float(0x433c6aff), SkBits2Float(0x43a12775), SkBits2Float(0x4335187b), SkBits2Float(0x43a4d0b7)); // 188.418f, 322.308f, 181.096f, 329.631f +path.quadTo(SkBits2Float(0x432dc5f6), SkBits2Float(0x43a879f9), SkBits2Float(0x43236aff), SkBits2Float(0x43a879f9)); // 173.773f, 336.953f, 163.418f, 336.953f +path.quadTo(SkBits2Float(0x43191008), SkBits2Float(0x43a879f9), SkBits2Float(0x4311bd83), SkBits2Float(0x43a4d0b7)); // 153.063f, 336.953f, 145.74f, 329.631f +path.quadTo(SkBits2Float(0x430a6aff), SkBits2Float(0x43a12775), SkBits2Float(0x430a6aff), SkBits2Float(0x439bf9f9)); // 138.418f, 322.308f, 138.418f, 311.953f +path.quadTo(SkBits2Float(0x430a6aff), SkBits2Float(0x4396cc7d), SkBits2Float(0x4311bd83), SkBits2Float(0x4393233b)); // 138.418f, 301.598f, 145.74f, 294.275f +path.quadTo(SkBits2Float(0x43191008), SkBits2Float(0x438f79f9), SkBits2Float(0x43236aff), SkBits2Float(0x438f79f9)); // 153.063f, 286.953f, 163.418f, 286.953f +path.quadTo(SkBits2Float(0x432dc5f6), SkBits2Float(0x438f79f9), SkBits2Float(0x4335187b), SkBits2Float(0x4393233b)); // 173.773f, 286.953f, 181.096f, 294.275f +path.quadTo(SkBits2Float(0x433c6aff), SkBits2Float(0x4396cc7d), SkBits2Float(0x433c6aff), SkBits2Float(0x439bf9f9)); // 188.418f, 301.598f, 188.418f, 311.953f +path.close(); + SkPath path58(path); + builder.add(path58, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4397b4f8), SkBits2Float(0x43598b8a)); // 303.414f, 217.545f +path.quadTo(SkBits2Float(0x4397b4f8), SkBits2Float(0x4363e682), SkBits2Float(0x43940bb6), SkBits2Float(0x436b3906)); // 303.414f, 227.9f, 296.091f, 235.223f +path.quadTo(SkBits2Float(0x43906274), SkBits2Float(0x43728b8a), SkBits2Float(0x438b34f8), SkBits2Float(0x43728b8a)); // 288.769f, 242.545f, 278.414f, 242.545f +path.quadTo(SkBits2Float(0x4386077c), SkBits2Float(0x43728b8a), SkBits2Float(0x43825e3a), SkBits2Float(0x436b3906)); // 268.058f, 242.545f, 260.736f, 235.223f +path.quadTo(SkBits2Float(0x437d69f0), SkBits2Float(0x4363e682), SkBits2Float(0x437d69f0), SkBits2Float(0x43598b8a)); // 253.414f, 227.9f, 253.414f, 217.545f +path.quadTo(SkBits2Float(0x437d69f0), SkBits2Float(0x434f3092), SkBits2Float(0x43825e3a), SkBits2Float(0x4347de0e)); // 253.414f, 207.19f, 260.736f, 199.867f +path.quadTo(SkBits2Float(0x4386077c), SkBits2Float(0x43408b8a), SkBits2Float(0x438b34f8), SkBits2Float(0x43408b8a)); // 268.058f, 192.545f, 278.414f, 192.545f +path.quadTo(SkBits2Float(0x43906274), SkBits2Float(0x43408b8a), SkBits2Float(0x43940bb6), SkBits2Float(0x4347de0e)); // 288.769f, 192.545f, 296.091f, 199.867f +path.quadTo(SkBits2Float(0x4397b4f8), SkBits2Float(0x434f3092), SkBits2Float(0x4397b4f8), SkBits2Float(0x43598b8a)); // 303.414f, 207.19f, 303.414f, 217.545f +path.close(); + SkPath path59(path); + builder.add(path59, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x430d7c0c), SkBits2Float(0x435ebbfb)); // 141.485f, 222.734f +path.quadTo(SkBits2Float(0x430d7c0c), SkBits2Float(0x436916f2), SkBits2Float(0x43062988), SkBits2Float(0x43706977)); // 141.485f, 233.09f, 134.162f, 240.412f +path.quadTo(SkBits2Float(0x42fdae07), SkBits2Float(0x4377bbfb), SkBits2Float(0x42e8f818), SkBits2Float(0x4377bbfb)); // 126.84f, 247.734f, 116.485f, 247.734f +path.quadTo(SkBits2Float(0x42d44229), SkBits2Float(0x4377bbfb), SkBits2Float(0x42c59d20), SkBits2Float(0x43706977)); // 106.129f, 247.734f, 98.8069f, 240.412f +path.quadTo(SkBits2Float(0x42b6f818), SkBits2Float(0x436916f2), SkBits2Float(0x42b6f818), SkBits2Float(0x435ebbfb)); // 91.4846f, 233.09f, 91.4846f, 222.734f +path.quadTo(SkBits2Float(0x42b6f818), SkBits2Float(0x43546104), SkBits2Float(0x42c59d20), SkBits2Float(0x434d0e7f)); // 91.4846f, 212.379f, 98.8069f, 205.057f +path.quadTo(SkBits2Float(0x42d44229), SkBits2Float(0x4345bbfb), SkBits2Float(0x42e8f818), SkBits2Float(0x4345bbfb)); // 106.129f, 197.734f, 116.485f, 197.734f +path.quadTo(SkBits2Float(0x42fdae07), SkBits2Float(0x4345bbfb), SkBits2Float(0x43062988), SkBits2Float(0x434d0e7f)); // 126.84f, 197.734f, 134.162f, 205.057f +path.quadTo(SkBits2Float(0x430d7c0c), SkBits2Float(0x43546104), SkBits2Float(0x430d7c0c), SkBits2Float(0x435ebbfb)); // 141.485f, 212.379f, 141.485f, 222.734f +path.close(); + SkPath path60(path); + builder.add(path60, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b7303b), SkBits2Float(0x42e664c0)); // 366.377f, 115.197f +path.quadTo(SkBits2Float(0x43b7303b), SkBits2Float(0x42fb1aaf), SkBits2Float(0x43b386f9), SkBits2Float(0x4304dfdc)); // 366.377f, 125.552f, 359.054f, 132.874f +path.quadTo(SkBits2Float(0x43afddb7), SkBits2Float(0x430c3260), SkBits2Float(0x43aab03b), SkBits2Float(0x430c3260)); // 351.732f, 140.197f, 341.377f, 140.197f +path.quadTo(SkBits2Float(0x43a582bf), SkBits2Float(0x430c3260), SkBits2Float(0x43a1d97d), SkBits2Float(0x4304dfdc)); // 331.021f, 140.197f, 323.699f, 132.874f +path.quadTo(SkBits2Float(0x439e303b), SkBits2Float(0x42fb1aaf), SkBits2Float(0x439e303b), SkBits2Float(0x42e664c0)); // 316.377f, 125.552f, 316.377f, 115.197f +path.quadTo(SkBits2Float(0x439e303b), SkBits2Float(0x42d1aed1), SkBits2Float(0x43a1d97d), SkBits2Float(0x42c309c8)); // 316.377f, 104.841f, 323.699f, 97.5191f +path.quadTo(SkBits2Float(0x43a582bf), SkBits2Float(0x42b464bf), SkBits2Float(0x43aab03b), SkBits2Float(0x42b464bf)); // 331.021f, 90.1968f, 341.377f, 90.1968f +path.quadTo(SkBits2Float(0x43afddb7), SkBits2Float(0x42b464bf), SkBits2Float(0x43b386f9), SkBits2Float(0x42c309c8)); // 351.732f, 90.1968f, 359.054f, 97.5191f +path.quadTo(SkBits2Float(0x43b7303b), SkBits2Float(0x42d1aed1), SkBits2Float(0x43b7303b), SkBits2Float(0x42e664c0)); // 366.377f, 104.841f, 366.377f, 115.197f +path.close(); + SkPath path61(path); + builder.add(path61, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ded748), SkBits2Float(0x43786398)); // 445.682f, 248.389f +path.quadTo(SkBits2Float(0x43ded748), SkBits2Float(0x43815f48), SkBits2Float(0x43db2e06), SkBits2Float(0x4385088a)); // 445.682f, 258.744f, 438.36f, 266.067f +path.quadTo(SkBits2Float(0x43d784c4), SkBits2Float(0x4388b1cc), SkBits2Float(0x43d25748), SkBits2Float(0x4388b1cc)); // 431.037f, 273.389f, 420.682f, 273.389f +path.quadTo(SkBits2Float(0x43cd29cc), SkBits2Float(0x4388b1cc), SkBits2Float(0x43c9808a), SkBits2Float(0x4385088a)); // 410.327f, 273.389f, 403.004f, 266.067f +path.quadTo(SkBits2Float(0x43c5d748), SkBits2Float(0x43815f48), SkBits2Float(0x43c5d748), SkBits2Float(0x43786398)); // 395.682f, 258.744f, 395.682f, 248.389f +path.quadTo(SkBits2Float(0x43c5d748), SkBits2Float(0x436e08a1), SkBits2Float(0x43c9808a), SkBits2Float(0x4366b61d)); // 395.682f, 238.034f, 403.004f, 230.711f +path.quadTo(SkBits2Float(0x43cd29cc), SkBits2Float(0x435f6399), SkBits2Float(0x43d25748), SkBits2Float(0x435f6399)); // 410.327f, 223.389f, 420.682f, 223.389f +path.quadTo(SkBits2Float(0x43d784c4), SkBits2Float(0x435f6399), SkBits2Float(0x43db2e06), SkBits2Float(0x4366b61d)); // 431.037f, 223.389f, 438.36f, 230.711f +path.quadTo(SkBits2Float(0x43ded748), SkBits2Float(0x436e08a1), SkBits2Float(0x43ded748), SkBits2Float(0x43786398)); // 445.682f, 238.034f, 445.682f, 248.389f +path.close(); + SkPath path62(path); + builder.add(path62, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43bbf04d), SkBits2Float(0x4397997d)); // 375.877f, 303.199f +path.quadTo(SkBits2Float(0x43bbf04d), SkBits2Float(0x439cc6f9), SkBits2Float(0x43b8470b), SkBits2Float(0x43a0703b)); // 375.877f, 313.554f, 368.555f, 320.877f +path.quadTo(SkBits2Float(0x43b49dc9), SkBits2Float(0x43a4197d), SkBits2Float(0x43af704d), SkBits2Float(0x43a4197d)); // 361.233f, 328.199f, 350.877f, 328.199f +path.quadTo(SkBits2Float(0x43aa42d1), SkBits2Float(0x43a4197d), SkBits2Float(0x43a6998f), SkBits2Float(0x43a0703b)); // 340.522f, 328.199f, 333.2f, 320.877f +path.quadTo(SkBits2Float(0x43a2f04d), SkBits2Float(0x439cc6f9), SkBits2Float(0x43a2f04d), SkBits2Float(0x4397997d)); // 325.877f, 313.554f, 325.877f, 303.199f +path.quadTo(SkBits2Float(0x43a2f04d), SkBits2Float(0x43926c01), SkBits2Float(0x43a6998f), SkBits2Float(0x438ec2bf)); // 325.877f, 292.844f, 333.2f, 285.521f +path.quadTo(SkBits2Float(0x43aa42d1), SkBits2Float(0x438b197d), SkBits2Float(0x43af704d), SkBits2Float(0x438b197d)); // 340.522f, 278.199f, 350.877f, 278.199f +path.quadTo(SkBits2Float(0x43b49dc9), SkBits2Float(0x438b197d), SkBits2Float(0x43b8470b), SkBits2Float(0x438ec2bf)); // 361.233f, 278.199f, 368.555f, 285.521f +path.quadTo(SkBits2Float(0x43bbf04d), SkBits2Float(0x43926c01), SkBits2Float(0x43bbf04d), SkBits2Float(0x4397997d)); // 375.877f, 292.844f, 375.877f, 303.199f +path.close(); + SkPath path63(path); + builder.add(path63, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b62e97), SkBits2Float(0x4313ec95)); // 364.364f, 147.924f +path.quadTo(SkBits2Float(0x43b62e97), SkBits2Float(0x431e478c), SkBits2Float(0x43b28555), SkBits2Float(0x43259a11)); // 364.364f, 158.279f, 357.042f, 165.602f +path.quadTo(SkBits2Float(0x43aedc13), SkBits2Float(0x432cec95), SkBits2Float(0x43a9ae97), SkBits2Float(0x432cec95)); // 349.719f, 172.924f, 339.364f, 172.924f +path.quadTo(SkBits2Float(0x43a4811b), SkBits2Float(0x432cec95), SkBits2Float(0x43a0d7d9), SkBits2Float(0x43259a11)); // 329.009f, 172.924f, 321.686f, 165.602f +path.quadTo(SkBits2Float(0x439d2e97), SkBits2Float(0x431e478c), SkBits2Float(0x439d2e97), SkBits2Float(0x4313ec95)); // 314.364f, 158.279f, 314.364f, 147.924f +path.quadTo(SkBits2Float(0x439d2e97), SkBits2Float(0x4309919e), SkBits2Float(0x43a0d7d9), SkBits2Float(0x43023f19)); // 314.364f, 137.569f, 321.686f, 130.246f +path.quadTo(SkBits2Float(0x43a4811b), SkBits2Float(0x42f5d92a), SkBits2Float(0x43a9ae97), SkBits2Float(0x42f5d92a)); // 329.009f, 122.924f, 339.364f, 122.924f +path.quadTo(SkBits2Float(0x43aedc13), SkBits2Float(0x42f5d92a), SkBits2Float(0x43b28555), SkBits2Float(0x43023f19)); // 349.719f, 122.924f, 357.042f, 130.246f +path.quadTo(SkBits2Float(0x43b62e97), SkBits2Float(0x4309919e), SkBits2Float(0x43b62e97), SkBits2Float(0x4313ec95)); // 364.364f, 137.569f, 364.364f, 147.924f +path.close(); + SkPath path64(path); + builder.add(path64, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ec86f7), SkBits2Float(0x43b37791)); // 473.054f, 358.934f +path.quadTo(SkBits2Float(0x43ec86f7), SkBits2Float(0x43b8a50d), SkBits2Float(0x43e8ddb5), SkBits2Float(0x43bc4e4f)); // 473.054f, 369.289f, 465.732f, 376.612f +path.quadTo(SkBits2Float(0x43e53473), SkBits2Float(0x43bff791), SkBits2Float(0x43e006f7), SkBits2Float(0x43bff791)); // 458.41f, 383.934f, 448.054f, 383.934f +path.quadTo(SkBits2Float(0x43dad97b), SkBits2Float(0x43bff791), SkBits2Float(0x43d73039), SkBits2Float(0x43bc4e4f)); // 437.699f, 383.934f, 430.377f, 376.612f +path.quadTo(SkBits2Float(0x43d386f7), SkBits2Float(0x43b8a50d), SkBits2Float(0x43d386f7), SkBits2Float(0x43b37791)); // 423.054f, 369.289f, 423.054f, 358.934f +path.quadTo(SkBits2Float(0x43d386f7), SkBits2Float(0x43ae4a15), SkBits2Float(0x43d73039), SkBits2Float(0x43aaa0d3)); // 423.054f, 348.579f, 430.377f, 341.256f +path.quadTo(SkBits2Float(0x43dad97b), SkBits2Float(0x43a6f791), SkBits2Float(0x43e006f7), SkBits2Float(0x43a6f791)); // 437.699f, 333.934f, 448.054f, 333.934f +path.quadTo(SkBits2Float(0x43e53473), SkBits2Float(0x43a6f791), SkBits2Float(0x43e8ddb5), SkBits2Float(0x43aaa0d3)); // 458.41f, 333.934f, 465.732f, 341.256f +path.quadTo(SkBits2Float(0x43ec86f7), SkBits2Float(0x43ae4a15), SkBits2Float(0x43ec86f7), SkBits2Float(0x43b37791)); // 473.054f, 348.579f, 473.054f, 358.934f +path.close(); + SkPath path65(path); + builder.add(path65, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43840826), SkBits2Float(0x43927b24)); // 264.064f, 292.962f +path.quadTo(SkBits2Float(0x43840826), SkBits2Float(0x4397a8a0), SkBits2Float(0x43805ee4), SkBits2Float(0x439b51e2)); // 264.064f, 303.317f, 256.741f, 310.64f +path.quadTo(SkBits2Float(0x43796b44), SkBits2Float(0x439efb24), SkBits2Float(0x436f104c), SkBits2Float(0x439efb24)); // 249.419f, 317.962f, 239.064f, 317.962f +path.quadTo(SkBits2Float(0x4364b554), SkBits2Float(0x439efb24), SkBits2Float(0x435d62d0), SkBits2Float(0x439b51e2)); // 228.708f, 317.962f, 221.386f, 310.64f +path.quadTo(SkBits2Float(0x4356104c), SkBits2Float(0x4397a8a0), SkBits2Float(0x4356104c), SkBits2Float(0x43927b24)); // 214.064f, 303.317f, 214.064f, 292.962f +path.quadTo(SkBits2Float(0x4356104c), SkBits2Float(0x438d4da8), SkBits2Float(0x435d62d0), SkBits2Float(0x4389a466)); // 214.064f, 282.607f, 221.386f, 275.284f +path.quadTo(SkBits2Float(0x4364b554), SkBits2Float(0x4385fb24), SkBits2Float(0x436f104c), SkBits2Float(0x4385fb24)); // 228.708f, 267.962f, 239.064f, 267.962f +path.quadTo(SkBits2Float(0x43796b44), SkBits2Float(0x4385fb24), SkBits2Float(0x43805ee4), SkBits2Float(0x4389a466)); // 249.419f, 267.962f, 256.741f, 275.284f +path.quadTo(SkBits2Float(0x43840826), SkBits2Float(0x438d4da8), SkBits2Float(0x43840826), SkBits2Float(0x43927b24)); // 264.064f, 282.607f, 264.064f, 292.962f +path.close(); + SkPath path66(path); + builder.add(path66, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4387c794), SkBits2Float(0x43567a78)); // 271.559f, 214.478f +path.quadTo(SkBits2Float(0x4387c794), SkBits2Float(0x4360d570), SkBits2Float(0x43841e52), SkBits2Float(0x436827f4)); // 271.559f, 224.834f, 264.237f, 232.156f +path.quadTo(SkBits2Float(0x43807510), SkBits2Float(0x436f7a78), SkBits2Float(0x43768f28), SkBits2Float(0x436f7a78)); // 256.915f, 239.478f, 246.559f, 239.478f +path.quadTo(SkBits2Float(0x436c3430), SkBits2Float(0x436f7a78), SkBits2Float(0x4364e1ac), SkBits2Float(0x436827f4)); // 236.204f, 239.478f, 228.882f, 232.156f +path.quadTo(SkBits2Float(0x435d8f27), SkBits2Float(0x4360d570), SkBits2Float(0x435d8f27), SkBits2Float(0x43567a78)); // 221.559f, 224.834f, 221.559f, 214.478f +path.quadTo(SkBits2Float(0x435d8f27), SkBits2Float(0x434c1f80), SkBits2Float(0x4364e1ac), SkBits2Float(0x4344ccfc)); // 221.559f, 204.123f, 228.882f, 196.801f +path.quadTo(SkBits2Float(0x436c3430), SkBits2Float(0x433d7a78), SkBits2Float(0x43768f28), SkBits2Float(0x433d7a78)); // 236.204f, 189.478f, 246.559f, 189.478f +path.quadTo(SkBits2Float(0x43807510), SkBits2Float(0x433d7a78), SkBits2Float(0x43841e52), SkBits2Float(0x4344ccfc)); // 256.915f, 189.478f, 264.237f, 196.801f +path.quadTo(SkBits2Float(0x4387c794), SkBits2Float(0x434c1f80), SkBits2Float(0x4387c794), SkBits2Float(0x43567a78)); // 271.559f, 204.123f, 271.559f, 214.478f +path.close(); + SkPath path67(path); + builder.add(path67, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43cfc71f), SkBits2Float(0x4314ea3c)); // 415.556f, 148.915f +path.quadTo(SkBits2Float(0x43cfc71f), SkBits2Float(0x431f4534), SkBits2Float(0x43cc1ddd), SkBits2Float(0x432697b8)); // 415.556f, 159.27f, 408.233f, 166.593f +path.quadTo(SkBits2Float(0x43c8749b), SkBits2Float(0x432dea3c), SkBits2Float(0x43c3471f), SkBits2Float(0x432dea3c)); // 400.911f, 173.915f, 390.556f, 173.915f +path.quadTo(SkBits2Float(0x43be19a3), SkBits2Float(0x432dea3c), SkBits2Float(0x43ba7061), SkBits2Float(0x432697b8)); // 380.2f, 173.915f, 372.878f, 166.593f +path.quadTo(SkBits2Float(0x43b6c71f), SkBits2Float(0x431f4534), SkBits2Float(0x43b6c71f), SkBits2Float(0x4314ea3c)); // 365.556f, 159.27f, 365.556f, 148.915f +path.quadTo(SkBits2Float(0x43b6c71f), SkBits2Float(0x430a8f44), SkBits2Float(0x43ba7061), SkBits2Float(0x43033cc0)); // 365.556f, 138.56f, 372.878f, 131.237f +path.quadTo(SkBits2Float(0x43be19a3), SkBits2Float(0x42f7d478), SkBits2Float(0x43c3471f), SkBits2Float(0x42f7d478)); // 380.2f, 123.915f, 390.556f, 123.915f +path.quadTo(SkBits2Float(0x43c8749b), SkBits2Float(0x42f7d478), SkBits2Float(0x43cc1ddd), SkBits2Float(0x43033cc0)); // 400.911f, 123.915f, 408.233f, 131.237f +path.quadTo(SkBits2Float(0x43cfc71f), SkBits2Float(0x430a8f44), SkBits2Float(0x43cfc71f), SkBits2Float(0x4314ea3c)); // 415.556f, 138.56f, 415.556f, 148.915f +path.close(); + SkPath path68(path); + builder.add(path68, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a48336), SkBits2Float(0x4336f503)); // 329.025f, 182.957f +path.quadTo(SkBits2Float(0x43a48336), SkBits2Float(0x43414ffa), SkBits2Float(0x43a0d9f4), SkBits2Float(0x4348a27f)); // 329.025f, 193.312f, 321.703f, 200.635f +path.quadTo(SkBits2Float(0x439d30b2), SkBits2Float(0x434ff503), SkBits2Float(0x43980336), SkBits2Float(0x434ff503)); // 314.38f, 207.957f, 304.025f, 207.957f +path.quadTo(SkBits2Float(0x4392d5ba), SkBits2Float(0x434ff503), SkBits2Float(0x438f2c78), SkBits2Float(0x4348a27f)); // 293.67f, 207.957f, 286.347f, 200.635f +path.quadTo(SkBits2Float(0x438b8336), SkBits2Float(0x43414ffa), SkBits2Float(0x438b8336), SkBits2Float(0x4336f503)); // 279.025f, 193.312f, 279.025f, 182.957f +path.quadTo(SkBits2Float(0x438b8336), SkBits2Float(0x432c9a0c), SkBits2Float(0x438f2c78), SkBits2Float(0x43254787)); // 279.025f, 172.602f, 286.347f, 165.279f +path.quadTo(SkBits2Float(0x4392d5ba), SkBits2Float(0x431df503), SkBits2Float(0x43980336), SkBits2Float(0x431df503)); // 293.67f, 157.957f, 304.025f, 157.957f +path.quadTo(SkBits2Float(0x439d30b2), SkBits2Float(0x431df503), SkBits2Float(0x43a0d9f4), SkBits2Float(0x43254787)); // 314.38f, 157.957f, 321.703f, 165.279f +path.quadTo(SkBits2Float(0x43a48336), SkBits2Float(0x432c9a0c), SkBits2Float(0x43a48336), SkBits2Float(0x4336f503)); // 329.025f, 172.602f, 329.025f, 182.957f +path.close(); + SkPath path69(path); + builder.add(path69, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x439a774e), SkBits2Float(0x43a57837)); // 308.932f, 330.939f +path.quadTo(SkBits2Float(0x439a774e), SkBits2Float(0x43aaa5b3), SkBits2Float(0x4396ce0c), SkBits2Float(0x43ae4ef5)); // 308.932f, 341.295f, 301.61f, 348.617f +path.quadTo(SkBits2Float(0x439324ca), SkBits2Float(0x43b1f837), SkBits2Float(0x438df74e), SkBits2Float(0x43b1f837)); // 294.287f, 355.939f, 283.932f, 355.939f +path.quadTo(SkBits2Float(0x4388c9d2), SkBits2Float(0x43b1f837), SkBits2Float(0x43852090), SkBits2Float(0x43ae4ef5)); // 273.577f, 355.939f, 266.254f, 348.617f +path.quadTo(SkBits2Float(0x4381774e), SkBits2Float(0x43aaa5b3), SkBits2Float(0x4381774e), SkBits2Float(0x43a57837)); // 258.932f, 341.295f, 258.932f, 330.939f +path.quadTo(SkBits2Float(0x4381774e), SkBits2Float(0x43a04abb), SkBits2Float(0x43852090), SkBits2Float(0x439ca179)); // 258.932f, 320.584f, 266.254f, 313.262f +path.quadTo(SkBits2Float(0x4388c9d2), SkBits2Float(0x4398f837), SkBits2Float(0x438df74e), SkBits2Float(0x4398f837)); // 273.577f, 305.939f, 283.932f, 305.939f +path.quadTo(SkBits2Float(0x439324ca), SkBits2Float(0x4398f837), SkBits2Float(0x4396ce0c), SkBits2Float(0x439ca179)); // 294.287f, 305.939f, 301.61f, 313.262f +path.quadTo(SkBits2Float(0x439a774e), SkBits2Float(0x43a04abb), SkBits2Float(0x439a774e), SkBits2Float(0x43a57837)); // 308.932f, 320.584f, 308.932f, 330.939f +path.close(); + SkPath path70(path); + builder.add(path70, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x439be624), SkBits2Float(0x438cec6f)); // 311.798f, 281.847f +path.quadTo(SkBits2Float(0x439be624), SkBits2Float(0x439219eb), SkBits2Float(0x43983ce2), SkBits2Float(0x4395c32d)); // 311.798f, 292.202f, 304.476f, 299.525f +path.quadTo(SkBits2Float(0x439493a0), SkBits2Float(0x43996c6f), SkBits2Float(0x438f6624), SkBits2Float(0x43996c6f)); // 297.153f, 306.847f, 286.798f, 306.847f +path.quadTo(SkBits2Float(0x438a38a8), SkBits2Float(0x43996c6f), SkBits2Float(0x43868f66), SkBits2Float(0x4395c32d)); // 276.443f, 306.847f, 269.12f, 299.525f +path.quadTo(SkBits2Float(0x4382e624), SkBits2Float(0x439219eb), SkBits2Float(0x4382e624), SkBits2Float(0x438cec6f)); // 261.798f, 292.202f, 261.798f, 281.847f +path.quadTo(SkBits2Float(0x4382e624), SkBits2Float(0x4387bef3), SkBits2Float(0x43868f66), SkBits2Float(0x438415b1)); // 261.798f, 271.492f, 269.12f, 264.169f +path.quadTo(SkBits2Float(0x438a38a8), SkBits2Float(0x43806c6f), SkBits2Float(0x438f6624), SkBits2Float(0x43806c6f)); // 276.443f, 256.847f, 286.798f, 256.847f +path.quadTo(SkBits2Float(0x439493a0), SkBits2Float(0x43806c6f), SkBits2Float(0x43983ce2), SkBits2Float(0x438415b1)); // 297.153f, 256.847f, 304.476f, 264.169f +path.quadTo(SkBits2Float(0x439be624), SkBits2Float(0x4387bef3), SkBits2Float(0x439be624), SkBits2Float(0x438cec6f)); // 311.798f, 271.492f, 311.798f, 281.847f +path.close(); + SkPath path71(path); + builder.add(path71, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43714851), SkBits2Float(0x43aff2c0)); // 241.282f, 351.896f +path.quadTo(SkBits2Float(0x43714851), SkBits2Float(0x43b5203c), SkBits2Float(0x4369f5cd), SkBits2Float(0x43b8c97e)); // 241.282f, 362.252f, 233.96f, 369.574f +path.quadTo(SkBits2Float(0x4362a348), SkBits2Float(0x43bc72c0), SkBits2Float(0x43584851), SkBits2Float(0x43bc72c0)); // 226.638f, 376.896f, 216.282f, 376.896f +path.quadTo(SkBits2Float(0x434ded5a), SkBits2Float(0x43bc72c0), SkBits2Float(0x43469ad5), SkBits2Float(0x43b8c97e)); // 205.927f, 376.896f, 198.605f, 369.574f +path.quadTo(SkBits2Float(0x433f4851), SkBits2Float(0x43b5203c), SkBits2Float(0x433f4851), SkBits2Float(0x43aff2c0)); // 191.282f, 362.252f, 191.282f, 351.896f +path.quadTo(SkBits2Float(0x433f4851), SkBits2Float(0x43aac544), SkBits2Float(0x43469ad5), SkBits2Float(0x43a71c02)); // 191.282f, 341.541f, 198.605f, 334.219f +path.quadTo(SkBits2Float(0x434ded5a), SkBits2Float(0x43a372c0), SkBits2Float(0x43584851), SkBits2Float(0x43a372c0)); // 205.927f, 326.896f, 216.282f, 326.896f +path.quadTo(SkBits2Float(0x4362a348), SkBits2Float(0x43a372c0), SkBits2Float(0x4369f5cd), SkBits2Float(0x43a71c02)); // 226.638f, 326.896f, 233.96f, 334.219f +path.quadTo(SkBits2Float(0x43714851), SkBits2Float(0x43aac544), SkBits2Float(0x43714851), SkBits2Float(0x43aff2c0)); // 241.282f, 341.541f, 241.282f, 351.896f +path.close(); + SkPath path72(path); + builder.add(path72, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43e644d3), SkBits2Float(0x43041b70)); // 460.538f, 132.107f +path.quadTo(SkBits2Float(0x43e644d3), SkBits2Float(0x430e7668), SkBits2Float(0x43e29b91), SkBits2Float(0x4315c8ec)); // 460.538f, 142.463f, 453.215f, 149.785f +path.quadTo(SkBits2Float(0x43def24f), SkBits2Float(0x431d1b70), SkBits2Float(0x43d9c4d3), SkBits2Float(0x431d1b70)); // 445.893f, 157.107f, 435.538f, 157.107f +path.quadTo(SkBits2Float(0x43d49757), SkBits2Float(0x431d1b70), SkBits2Float(0x43d0ee15), SkBits2Float(0x4315c8ec)); // 425.182f, 157.107f, 417.86f, 149.785f +path.quadTo(SkBits2Float(0x43cd44d3), SkBits2Float(0x430e7668), SkBits2Float(0x43cd44d3), SkBits2Float(0x43041b70)); // 410.538f, 142.463f, 410.538f, 132.107f +path.quadTo(SkBits2Float(0x43cd44d3), SkBits2Float(0x42f380f1), SkBits2Float(0x43d0ee15), SkBits2Float(0x42e4dbe8)); // 410.538f, 121.752f, 417.86f, 114.43f +path.quadTo(SkBits2Float(0x43d49757), SkBits2Float(0x42d636e0), SkBits2Float(0x43d9c4d3), SkBits2Float(0x42d636e0)); // 425.182f, 107.107f, 435.538f, 107.107f +path.quadTo(SkBits2Float(0x43def24f), SkBits2Float(0x42d636e0), SkBits2Float(0x43e29b91), SkBits2Float(0x42e4dbe8)); // 445.893f, 107.107f, 453.215f, 114.43f +path.quadTo(SkBits2Float(0x43e644d3), SkBits2Float(0x42f380f1), SkBits2Float(0x43e644d3), SkBits2Float(0x43041b70)); // 460.538f, 121.752f, 460.538f, 132.107f +path.close(); + SkPath path73(path); + builder.add(path73, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43c29be7), SkBits2Float(0x4366bcd5)); // 389.218f, 230.738f +path.quadTo(SkBits2Float(0x43c29be7), SkBits2Float(0x437117cc), SkBits2Float(0x43bef2a5), SkBits2Float(0x43786a51)); // 389.218f, 241.093f, 381.896f, 248.415f +path.quadTo(SkBits2Float(0x43bb4963), SkBits2Float(0x437fbcd5), SkBits2Float(0x43b61be7), SkBits2Float(0x437fbcd5)); // 374.573f, 255.738f, 364.218f, 255.738f +path.quadTo(SkBits2Float(0x43b0ee6b), SkBits2Float(0x437fbcd5), SkBits2Float(0x43ad4529), SkBits2Float(0x43786a51)); // 353.863f, 255.738f, 346.54f, 248.415f +path.quadTo(SkBits2Float(0x43a99be7), SkBits2Float(0x437117cc), SkBits2Float(0x43a99be7), SkBits2Float(0x4366bcd5)); // 339.218f, 241.093f, 339.218f, 230.738f +path.quadTo(SkBits2Float(0x43a99be7), SkBits2Float(0x435c61de), SkBits2Float(0x43ad4529), SkBits2Float(0x43550f59)); // 339.218f, 220.382f, 346.54f, 213.06f +path.quadTo(SkBits2Float(0x43b0ee6b), SkBits2Float(0x434dbcd5), SkBits2Float(0x43b61be7), SkBits2Float(0x434dbcd5)); // 353.863f, 205.738f, 364.218f, 205.738f +path.quadTo(SkBits2Float(0x43bb4963), SkBits2Float(0x434dbcd5), SkBits2Float(0x43bef2a5), SkBits2Float(0x43550f59)); // 374.573f, 205.738f, 381.896f, 213.06f +path.quadTo(SkBits2Float(0x43c29be7), SkBits2Float(0x435c61de), SkBits2Float(0x43c29be7), SkBits2Float(0x4366bcd5)); // 389.218f, 220.382f, 389.218f, 230.738f +path.close(); + SkPath path74(path); + builder.add(path74, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b8637d), SkBits2Float(0x435f209d)); // 368.777f, 223.127f +path.quadTo(SkBits2Float(0x43b8637d), SkBits2Float(0x43697b94), SkBits2Float(0x43b4ba3b), SkBits2Float(0x4370ce19)); // 368.777f, 233.483f, 361.455f, 240.805f +path.quadTo(SkBits2Float(0x43b110f9), SkBits2Float(0x4378209d), SkBits2Float(0x43abe37d), SkBits2Float(0x4378209d)); // 354.133f, 248.127f, 343.777f, 248.127f +path.quadTo(SkBits2Float(0x43a6b601), SkBits2Float(0x4378209d), SkBits2Float(0x43a30cbf), SkBits2Float(0x4370ce19)); // 333.422f, 248.127f, 326.1f, 240.805f +path.quadTo(SkBits2Float(0x439f637d), SkBits2Float(0x43697b94), SkBits2Float(0x439f637d), SkBits2Float(0x435f209d)); // 318.777f, 233.483f, 318.777f, 223.127f +path.quadTo(SkBits2Float(0x439f637d), SkBits2Float(0x4354c5a6), SkBits2Float(0x43a30cbf), SkBits2Float(0x434d7321)); // 318.777f, 212.772f, 326.1f, 205.45f +path.quadTo(SkBits2Float(0x43a6b601), SkBits2Float(0x4346209d), SkBits2Float(0x43abe37d), SkBits2Float(0x4346209d)); // 333.422f, 198.127f, 343.777f, 198.127f +path.quadTo(SkBits2Float(0x43b110f9), SkBits2Float(0x4346209d), SkBits2Float(0x43b4ba3b), SkBits2Float(0x434d7321)); // 354.133f, 198.127f, 361.455f, 205.45f +path.quadTo(SkBits2Float(0x43b8637d), SkBits2Float(0x4354c5a6), SkBits2Float(0x43b8637d), SkBits2Float(0x435f209d)); // 368.777f, 212.772f, 368.777f, 223.127f +path.close(); + SkPath path75(path); + builder.add(path75, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a3ec8f), SkBits2Float(0x435dba35)); // 327.848f, 221.727f +path.quadTo(SkBits2Float(0x43a3ec8f), SkBits2Float(0x4368152c), SkBits2Float(0x43a0434d), SkBits2Float(0x436f67b1)); // 327.848f, 232.083f, 320.526f, 239.405f +path.quadTo(SkBits2Float(0x439c9a0b), SkBits2Float(0x4376ba35), SkBits2Float(0x43976c8f), SkBits2Float(0x4376ba35)); // 313.203f, 246.727f, 302.848f, 246.727f +path.quadTo(SkBits2Float(0x43923f13), SkBits2Float(0x4376ba35), SkBits2Float(0x438e95d1), SkBits2Float(0x436f67b1)); // 292.493f, 246.727f, 285.17f, 239.405f +path.quadTo(SkBits2Float(0x438aec8f), SkBits2Float(0x4368152c), SkBits2Float(0x438aec8f), SkBits2Float(0x435dba35)); // 277.848f, 232.083f, 277.848f, 221.727f +path.quadTo(SkBits2Float(0x438aec8f), SkBits2Float(0x43535f3e), SkBits2Float(0x438e95d1), SkBits2Float(0x434c0cb9)); // 277.848f, 211.372f, 285.17f, 204.05f +path.quadTo(SkBits2Float(0x43923f13), SkBits2Float(0x4344ba35), SkBits2Float(0x43976c8f), SkBits2Float(0x4344ba35)); // 292.493f, 196.727f, 302.848f, 196.727f +path.quadTo(SkBits2Float(0x439c9a0b), SkBits2Float(0x4344ba35), SkBits2Float(0x43a0434d), SkBits2Float(0x434c0cb9)); // 313.203f, 196.727f, 320.526f, 204.05f +path.quadTo(SkBits2Float(0x43a3ec8f), SkBits2Float(0x43535f3e), SkBits2Float(0x43a3ec8f), SkBits2Float(0x435dba35)); // 327.848f, 211.372f, 327.848f, 221.727f +path.close(); + SkPath path76(path); + builder.add(path76, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4408ede5), SkBits2Float(0x436af388)); // 547.717f, 234.951f +path.quadTo(SkBits2Float(0x4408ede5), SkBits2Float(0x43754e7f), SkBits2Float(0x44071944), SkBits2Float(0x437ca103)); // 547.717f, 245.307f, 540.395f, 252.629f +path.quadTo(SkBits2Float(0x440544a3), SkBits2Float(0x4381f9c4), SkBits2Float(0x4402ade5), SkBits2Float(0x4381f9c4)); // 533.072f, 259.951f, 522.717f, 259.951f +path.quadTo(SkBits2Float(0x44001727), SkBits2Float(0x4381f9c4), SkBits2Float(0x43fc850c), SkBits2Float(0x437ca103)); // 512.362f, 259.951f, 505.039f, 252.629f +path.quadTo(SkBits2Float(0x43f8dbca), SkBits2Float(0x43754e7f), SkBits2Float(0x43f8dbca), SkBits2Float(0x436af388)); // 497.717f, 245.307f, 497.717f, 234.951f +path.quadTo(SkBits2Float(0x43f8dbca), SkBits2Float(0x43609891), SkBits2Float(0x43fc850c), SkBits2Float(0x4359460d)); // 497.717f, 224.596f, 505.039f, 217.274f +path.quadTo(SkBits2Float(0x44001727), SkBits2Float(0x4351f389), SkBits2Float(0x4402ade5), SkBits2Float(0x4351f389)); // 512.362f, 209.951f, 522.717f, 209.951f +path.quadTo(SkBits2Float(0x440544a3), SkBits2Float(0x4351f389), SkBits2Float(0x44071944), SkBits2Float(0x4359460d)); // 533.072f, 209.951f, 540.395f, 217.274f +path.quadTo(SkBits2Float(0x4408ede5), SkBits2Float(0x43609891), SkBits2Float(0x4408ede5), SkBits2Float(0x436af388)); // 547.717f, 224.596f, 547.717f, 234.951f +path.close(); + SkPath path77(path); + builder.add(path77, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a06718), SkBits2Float(0x43848d47)); // 320.805f, 265.104f +path.quadTo(SkBits2Float(0x43a06718), SkBits2Float(0x4389bac3), SkBits2Float(0x439cbdd6), SkBits2Float(0x438d6405)); // 320.805f, 275.459f, 313.483f, 282.781f +path.quadTo(SkBits2Float(0x43991494), SkBits2Float(0x43910d47), SkBits2Float(0x4393e718), SkBits2Float(0x43910d47)); // 306.161f, 290.104f, 295.805f, 290.104f +path.quadTo(SkBits2Float(0x438eb99c), SkBits2Float(0x43910d47), SkBits2Float(0x438b105a), SkBits2Float(0x438d6405)); // 285.45f, 290.104f, 278.128f, 282.781f +path.quadTo(SkBits2Float(0x43876718), SkBits2Float(0x4389bac3), SkBits2Float(0x43876718), SkBits2Float(0x43848d47)); // 270.805f, 275.459f, 270.805f, 265.104f +path.quadTo(SkBits2Float(0x43876718), SkBits2Float(0x437ebf96), SkBits2Float(0x438b105a), SkBits2Float(0x43776d12)); // 270.805f, 254.748f, 278.128f, 247.426f +path.quadTo(SkBits2Float(0x438eb99c), SkBits2Float(0x43701a8e), SkBits2Float(0x4393e718), SkBits2Float(0x43701a8e)); // 285.45f, 240.104f, 295.805f, 240.104f +path.quadTo(SkBits2Float(0x43991494), SkBits2Float(0x43701a8e), SkBits2Float(0x439cbdd6), SkBits2Float(0x43776d12)); // 306.161f, 240.104f, 313.483f, 247.426f +path.quadTo(SkBits2Float(0x43a06718), SkBits2Float(0x437ebf96), SkBits2Float(0x43a06718), SkBits2Float(0x43848d47)); // 320.805f, 254.748f, 320.805f, 265.104f +path.close(); + SkPath path78(path); + builder.add(path78, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a4f721), SkBits2Float(0x439dea2f)); // 329.931f, 315.83f +path.quadTo(SkBits2Float(0x43a4f721), SkBits2Float(0x43a317ab), SkBits2Float(0x43a14ddf), SkBits2Float(0x43a6c0ed)); // 329.931f, 326.185f, 322.608f, 333.507f +path.quadTo(SkBits2Float(0x439da49d), SkBits2Float(0x43aa6a2f), SkBits2Float(0x43987721), SkBits2Float(0x43aa6a2f)); // 315.286f, 340.83f, 304.931f, 340.83f +path.quadTo(SkBits2Float(0x439349a5), SkBits2Float(0x43aa6a2f), SkBits2Float(0x438fa063), SkBits2Float(0x43a6c0ed)); // 294.575f, 340.83f, 287.253f, 333.507f +path.quadTo(SkBits2Float(0x438bf721), SkBits2Float(0x43a317ab), SkBits2Float(0x438bf721), SkBits2Float(0x439dea2f)); // 279.931f, 326.185f, 279.931f, 315.83f +path.quadTo(SkBits2Float(0x438bf721), SkBits2Float(0x4398bcb3), SkBits2Float(0x438fa063), SkBits2Float(0x43951371)); // 279.931f, 305.474f, 287.253f, 298.152f +path.quadTo(SkBits2Float(0x439349a5), SkBits2Float(0x43916a2f), SkBits2Float(0x43987721), SkBits2Float(0x43916a2f)); // 294.575f, 290.83f, 304.931f, 290.83f +path.quadTo(SkBits2Float(0x439da49d), SkBits2Float(0x43916a2f), SkBits2Float(0x43a14ddf), SkBits2Float(0x43951371)); // 315.286f, 290.83f, 322.608f, 298.152f +path.quadTo(SkBits2Float(0x43a4f721), SkBits2Float(0x4398bcb3), SkBits2Float(0x43a4f721), SkBits2Float(0x439dea2f)); // 329.931f, 305.474f, 329.931f, 315.83f +path.close(); + SkPath path79(path); + builder.add(path79, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4343f4a9), SkBits2Float(0x434a2b20)); // 195.956f, 202.168f +path.quadTo(SkBits2Float(0x4343f4a9), SkBits2Float(0x43548618), SkBits2Float(0x433ca225), SkBits2Float(0x435bd89c)); // 195.956f, 212.524f, 188.633f, 219.846f +path.quadTo(SkBits2Float(0x43354fa0), SkBits2Float(0x43632b20), SkBits2Float(0x432af4a9), SkBits2Float(0x43632b20)); // 181.311f, 227.168f, 170.956f, 227.168f +path.quadTo(SkBits2Float(0x432099b2), SkBits2Float(0x43632b20), SkBits2Float(0x4319472d), SkBits2Float(0x435bd89c)); // 160.6f, 227.168f, 153.278f, 219.846f +path.quadTo(SkBits2Float(0x4311f4a9), SkBits2Float(0x43548618), SkBits2Float(0x4311f4a9), SkBits2Float(0x434a2b20)); // 145.956f, 212.524f, 145.956f, 202.168f +path.quadTo(SkBits2Float(0x4311f4a9), SkBits2Float(0x433fd028), SkBits2Float(0x4319472d), SkBits2Float(0x43387da4)); // 145.956f, 191.813f, 153.278f, 184.491f +path.quadTo(SkBits2Float(0x432099b2), SkBits2Float(0x43312b20), SkBits2Float(0x432af4a9), SkBits2Float(0x43312b20)); // 160.6f, 177.168f, 170.956f, 177.168f +path.quadTo(SkBits2Float(0x43354fa0), SkBits2Float(0x43312b20), SkBits2Float(0x433ca225), SkBits2Float(0x43387da4)); // 181.311f, 177.168f, 188.633f, 184.491f +path.quadTo(SkBits2Float(0x4343f4a9), SkBits2Float(0x433fd028), SkBits2Float(0x4343f4a9), SkBits2Float(0x434a2b20)); // 195.956f, 191.813f, 195.956f, 202.168f +path.close(); + SkPath path80(path); + builder.add(path80, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4281a60e), SkBits2Float(0x42f78d6e)); // 64.8243f, 123.776f +path.quadTo(SkBits2Float(0x4281a60e), SkBits2Float(0x430621ae), SkBits2Float(0x4266020c), SkBits2Float(0x430d7433)); // 64.8243f, 134.132f, 57.502f, 141.454f +path.quadTo(SkBits2Float(0x4248b7fa), SkBits2Float(0x4314c6b7), SkBits2Float(0x421f4c1c), SkBits2Float(0x4314c6b7)); // 50.1797f, 148.776f, 39.8243f, 148.776f +path.quadTo(SkBits2Float(0x41ebc07c), SkBits2Float(0x4314c6b7), SkBits2Float(0x41b12c59), SkBits2Float(0x430d7433)); // 29.469f, 148.776f, 22.1467f, 141.454f +path.quadTo(SkBits2Float(0x416d306c), SkBits2Float(0x430621ae), SkBits2Float(0x416d306c), SkBits2Float(0x42f78d6e)); // 14.8243f, 134.132f, 14.8243f, 123.776f +path.quadTo(SkBits2Float(0x416d306c), SkBits2Float(0x42e2d77f), SkBits2Float(0x41b12c59), SkBits2Float(0x42d43276)); // 14.8243f, 113.421f, 22.1467f, 106.099f +path.quadTo(SkBits2Float(0x41ebc07c), SkBits2Float(0x42c58d6e), SkBits2Float(0x421f4c1c), SkBits2Float(0x42c58d6e)); // 29.469f, 98.7762f, 39.8243f, 98.7762f +path.quadTo(SkBits2Float(0x4248b7fa), SkBits2Float(0x42c58d6e), SkBits2Float(0x4266020c), SkBits2Float(0x42d43276)); // 50.1797f, 98.7762f, 57.502f, 106.099f +path.quadTo(SkBits2Float(0x4281a60e), SkBits2Float(0x42e2d77f), SkBits2Float(0x4281a60e), SkBits2Float(0x42f78d6e)); // 64.8243f, 113.421f, 64.8243f, 123.776f +path.close(); + SkPath path81(path); + builder.add(path81, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43740113), SkBits2Float(0x4363dcf0)); // 244.004f, 227.863f +path.quadTo(SkBits2Float(0x43740113), SkBits2Float(0x436e37e8), SkBits2Float(0x436cae8f), SkBits2Float(0x43758a6c)); // 244.004f, 238.218f, 236.682f, 245.541f +path.quadTo(SkBits2Float(0x43655c0a), SkBits2Float(0x437cdcf0), SkBits2Float(0x435b0113), SkBits2Float(0x437cdcf0)); // 229.36f, 252.863f, 219.004f, 252.863f +path.quadTo(SkBits2Float(0x4350a61c), SkBits2Float(0x437cdcf0), SkBits2Float(0x43495397), SkBits2Float(0x43758a6c)); // 208.649f, 252.863f, 201.327f, 245.541f +path.quadTo(SkBits2Float(0x43420113), SkBits2Float(0x436e37e8), SkBits2Float(0x43420113), SkBits2Float(0x4363dcf0)); // 194.004f, 238.218f, 194.004f, 227.863f +path.quadTo(SkBits2Float(0x43420113), SkBits2Float(0x435981f8), SkBits2Float(0x43495397), SkBits2Float(0x43522f74)); // 194.004f, 217.508f, 201.327f, 210.185f +path.quadTo(SkBits2Float(0x4350a61c), SkBits2Float(0x434adcf0), SkBits2Float(0x435b0113), SkBits2Float(0x434adcf0)); // 208.649f, 202.863f, 219.004f, 202.863f +path.quadTo(SkBits2Float(0x43655c0a), SkBits2Float(0x434adcf0), SkBits2Float(0x436cae8f), SkBits2Float(0x43522f74)); // 229.36f, 202.863f, 236.682f, 210.185f +path.quadTo(SkBits2Float(0x43740113), SkBits2Float(0x435981f8), SkBits2Float(0x43740113), SkBits2Float(0x4363dcf0)); // 244.004f, 217.508f, 244.004f, 227.863f +path.close(); + SkPath path82(path); + builder.add(path82, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43bf0464), SkBits2Float(0x431e17ca)); // 382.034f, 158.093f +path.quadTo(SkBits2Float(0x43bf0464), SkBits2Float(0x432872c2), SkBits2Float(0x43bb5b22), SkBits2Float(0x432fc546)); // 382.034f, 168.448f, 374.712f, 175.771f +path.quadTo(SkBits2Float(0x43b7b1e0), SkBits2Float(0x433717ca), SkBits2Float(0x43b28464), SkBits2Float(0x433717ca)); // 367.39f, 183.093f, 357.034f, 183.093f +path.quadTo(SkBits2Float(0x43ad56e8), SkBits2Float(0x433717ca), SkBits2Float(0x43a9ada6), SkBits2Float(0x432fc546)); // 346.679f, 183.093f, 339.357f, 175.771f +path.quadTo(SkBits2Float(0x43a60464), SkBits2Float(0x432872c2), SkBits2Float(0x43a60464), SkBits2Float(0x431e17ca)); // 332.034f, 168.448f, 332.034f, 158.093f +path.quadTo(SkBits2Float(0x43a60464), SkBits2Float(0x4313bcd2), SkBits2Float(0x43a9ada6), SkBits2Float(0x430c6a4e)); // 332.034f, 147.738f, 339.357f, 140.415f +path.quadTo(SkBits2Float(0x43ad56e8), SkBits2Float(0x430517ca), SkBits2Float(0x43b28464), SkBits2Float(0x430517ca)); // 346.679f, 133.093f, 357.034f, 133.093f +path.quadTo(SkBits2Float(0x43b7b1e0), SkBits2Float(0x430517ca), SkBits2Float(0x43bb5b22), SkBits2Float(0x430c6a4e)); // 367.39f, 133.093f, 374.712f, 140.415f +path.quadTo(SkBits2Float(0x43bf0464), SkBits2Float(0x4313bcd2), SkBits2Float(0x43bf0464), SkBits2Float(0x431e17ca)); // 382.034f, 147.738f, 382.034f, 158.093f +path.close(); + SkPath path83(path); + builder.add(path83, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a72678), SkBits2Float(0x438273e0)); // 334.301f, 260.905f +path.quadTo(SkBits2Float(0x43a72678), SkBits2Float(0x4387a15c), SkBits2Float(0x43a37d36), SkBits2Float(0x438b4a9e)); // 334.301f, 271.261f, 326.978f, 278.583f +path.quadTo(SkBits2Float(0x439fd3f4), SkBits2Float(0x438ef3e0), SkBits2Float(0x439aa678), SkBits2Float(0x438ef3e0)); // 319.656f, 285.905f, 309.301f, 285.905f +path.quadTo(SkBits2Float(0x439578fc), SkBits2Float(0x438ef3e0), SkBits2Float(0x4391cfba), SkBits2Float(0x438b4a9e)); // 298.945f, 285.905f, 291.623f, 278.583f +path.quadTo(SkBits2Float(0x438e2678), SkBits2Float(0x4387a15c), SkBits2Float(0x438e2678), SkBits2Float(0x438273e0)); // 284.301f, 271.261f, 284.301f, 260.905f +path.quadTo(SkBits2Float(0x438e2678), SkBits2Float(0x437a8cc8), SkBits2Float(0x4391cfba), SkBits2Float(0x43733a44)); // 284.301f, 250.55f, 291.623f, 243.228f +path.quadTo(SkBits2Float(0x439578fc), SkBits2Float(0x436be7c0), SkBits2Float(0x439aa678), SkBits2Float(0x436be7c0)); // 298.945f, 235.905f, 309.301f, 235.905f +path.quadTo(SkBits2Float(0x439fd3f4), SkBits2Float(0x436be7c0), SkBits2Float(0x43a37d36), SkBits2Float(0x43733a44)); // 319.656f, 235.905f, 326.978f, 243.228f +path.quadTo(SkBits2Float(0x43a72678), SkBits2Float(0x437a8cc8), SkBits2Float(0x43a72678), SkBits2Float(0x438273e0)); // 334.301f, 250.55f, 334.301f, 260.905f +path.close(); + SkPath path84(path); + builder.add(path84, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4361bf09), SkBits2Float(0x43464372)); // 225.746f, 198.263f +path.quadTo(SkBits2Float(0x4361bf09), SkBits2Float(0x43509e6a), SkBits2Float(0x435a6c85), SkBits2Float(0x4357f0ee)); // 225.746f, 208.619f, 218.424f, 215.941f +path.quadTo(SkBits2Float(0x43531a00), SkBits2Float(0x435f4372), SkBits2Float(0x4348bf09), SkBits2Float(0x435f4372)); // 211.102f, 223.263f, 200.746f, 223.263f +path.quadTo(SkBits2Float(0x433e6412), SkBits2Float(0x435f4372), SkBits2Float(0x4337118d), SkBits2Float(0x4357f0ee)); // 190.391f, 223.263f, 183.069f, 215.941f +path.quadTo(SkBits2Float(0x432fbf09), SkBits2Float(0x43509e6a), SkBits2Float(0x432fbf09), SkBits2Float(0x43464372)); // 175.746f, 208.619f, 175.746f, 198.263f +path.quadTo(SkBits2Float(0x432fbf09), SkBits2Float(0x433be87a), SkBits2Float(0x4337118d), SkBits2Float(0x433495f6)); // 175.746f, 187.908f, 183.069f, 180.586f +path.quadTo(SkBits2Float(0x433e6412), SkBits2Float(0x432d4372), SkBits2Float(0x4348bf09), SkBits2Float(0x432d4372)); // 190.391f, 173.263f, 200.746f, 173.263f +path.quadTo(SkBits2Float(0x43531a00), SkBits2Float(0x432d4372), SkBits2Float(0x435a6c85), SkBits2Float(0x433495f6)); // 211.102f, 173.263f, 218.424f, 180.586f +path.quadTo(SkBits2Float(0x4361bf09), SkBits2Float(0x433be87a), SkBits2Float(0x4361bf09), SkBits2Float(0x43464372)); // 225.746f, 187.908f, 225.746f, 198.263f +path.close(); + SkPath path85(path); + builder.add(path85, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4377220b), SkBits2Float(0x4392653c)); // 247.133f, 292.791f +path.quadTo(SkBits2Float(0x4377220b), SkBits2Float(0x439792b8), SkBits2Float(0x436fcf87), SkBits2Float(0x439b3bfa)); // 247.133f, 303.146f, 239.811f, 310.469f +path.quadTo(SkBits2Float(0x43687d02), SkBits2Float(0x439ee53c), SkBits2Float(0x435e220b), SkBits2Float(0x439ee53c)); // 232.488f, 317.791f, 222.133f, 317.791f +path.quadTo(SkBits2Float(0x4353c714), SkBits2Float(0x439ee53c), SkBits2Float(0x434c748f), SkBits2Float(0x439b3bfa)); // 211.778f, 317.791f, 204.455f, 310.469f +path.quadTo(SkBits2Float(0x4345220b), SkBits2Float(0x439792b8), SkBits2Float(0x4345220b), SkBits2Float(0x4392653c)); // 197.133f, 303.146f, 197.133f, 292.791f +path.quadTo(SkBits2Float(0x4345220b), SkBits2Float(0x438d37c0), SkBits2Float(0x434c748f), SkBits2Float(0x43898e7e)); // 197.133f, 282.436f, 204.455f, 275.113f +path.quadTo(SkBits2Float(0x4353c714), SkBits2Float(0x4385e53c), SkBits2Float(0x435e220b), SkBits2Float(0x4385e53c)); // 211.778f, 267.791f, 222.133f, 267.791f +path.quadTo(SkBits2Float(0x43687d02), SkBits2Float(0x4385e53c), SkBits2Float(0x436fcf87), SkBits2Float(0x43898e7e)); // 232.488f, 267.791f, 239.811f, 275.113f +path.quadTo(SkBits2Float(0x4377220b), SkBits2Float(0x438d37c0), SkBits2Float(0x4377220b), SkBits2Float(0x4392653c)); // 247.133f, 282.436f, 247.133f, 292.791f +path.close(); + SkPath path86(path); + builder.add(path86, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4402a250), SkBits2Float(0x4331ae72)); // 522.536f, 177.681f +path.quadTo(SkBits2Float(0x4402a250), SkBits2Float(0x433c096a), SkBits2Float(0x4400cdaf), SkBits2Float(0x43435bee)); // 522.536f, 188.037f, 515.214f, 195.359f +path.quadTo(SkBits2Float(0x43fdf21c), SkBits2Float(0x434aae72), SkBits2Float(0x43f8c4a0), SkBits2Float(0x434aae72)); // 507.891f, 202.681f, 497.536f, 202.681f +path.quadTo(SkBits2Float(0x43f39724), SkBits2Float(0x434aae72), SkBits2Float(0x43efede2), SkBits2Float(0x43435bee)); // 487.181f, 202.681f, 479.858f, 195.359f +path.quadTo(SkBits2Float(0x43ec44a0), SkBits2Float(0x433c096a), SkBits2Float(0x43ec44a0), SkBits2Float(0x4331ae72)); // 472.536f, 188.037f, 472.536f, 177.681f +path.quadTo(SkBits2Float(0x43ec44a0), SkBits2Float(0x4327537a), SkBits2Float(0x43efede2), SkBits2Float(0x432000f6)); // 472.536f, 167.326f, 479.858f, 160.004f +path.quadTo(SkBits2Float(0x43f39724), SkBits2Float(0x4318ae72), SkBits2Float(0x43f8c4a0), SkBits2Float(0x4318ae72)); // 487.181f, 152.681f, 497.536f, 152.681f +path.quadTo(SkBits2Float(0x43fdf21c), SkBits2Float(0x4318ae72), SkBits2Float(0x4400cdaf), SkBits2Float(0x432000f6)); // 507.891f, 152.681f, 515.214f, 160.004f +path.quadTo(SkBits2Float(0x4402a250), SkBits2Float(0x4327537a), SkBits2Float(0x4402a250), SkBits2Float(0x4331ae72)); // 522.536f, 167.326f, 522.536f, 177.681f +path.close(); + SkPath path87(path); + builder.add(path87, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x439cfd65), SkBits2Float(0x4331c20a)); // 313.98f, 177.758f +path.quadTo(SkBits2Float(0x439cfd65), SkBits2Float(0x433c1d02), SkBits2Float(0x43995423), SkBits2Float(0x43436f86)); // 313.98f, 188.113f, 306.657f, 195.436f +path.quadTo(SkBits2Float(0x4395aae1), SkBits2Float(0x434ac20a), SkBits2Float(0x43907d65), SkBits2Float(0x434ac20a)); // 299.335f, 202.758f, 288.98f, 202.758f +path.quadTo(SkBits2Float(0x438b4fe9), SkBits2Float(0x434ac20a), SkBits2Float(0x4387a6a7), SkBits2Float(0x43436f86)); // 278.624f, 202.758f, 271.302f, 195.436f +path.quadTo(SkBits2Float(0x4383fd65), SkBits2Float(0x433c1d02), SkBits2Float(0x4383fd65), SkBits2Float(0x4331c20a)); // 263.98f, 188.113f, 263.98f, 177.758f +path.quadTo(SkBits2Float(0x4383fd65), SkBits2Float(0x43276712), SkBits2Float(0x4387a6a7), SkBits2Float(0x4320148e)); // 263.98f, 167.403f, 271.302f, 160.08f +path.quadTo(SkBits2Float(0x438b4fe9), SkBits2Float(0x4318c20a), SkBits2Float(0x43907d65), SkBits2Float(0x4318c20a)); // 278.624f, 152.758f, 288.98f, 152.758f +path.quadTo(SkBits2Float(0x4395aae1), SkBits2Float(0x4318c20a), SkBits2Float(0x43995423), SkBits2Float(0x4320148e)); // 299.335f, 152.758f, 306.657f, 160.08f +path.quadTo(SkBits2Float(0x439cfd65), SkBits2Float(0x43276712), SkBits2Float(0x439cfd65), SkBits2Float(0x4331c20a)); // 313.98f, 167.403f, 313.98f, 177.758f +path.close(); + SkPath path88(path); + builder.add(path88, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43c6cc0f), SkBits2Float(0x430c1343)); // 397.594f, 140.075f +path.quadTo(SkBits2Float(0x43c6cc0f), SkBits2Float(0x43166e3a), SkBits2Float(0x43c322cd), SkBits2Float(0x431dc0bf)); // 397.594f, 150.431f, 390.272f, 157.753f +path.quadTo(SkBits2Float(0x43bf798b), SkBits2Float(0x43251343), SkBits2Float(0x43ba4c0f), SkBits2Float(0x43251343)); // 382.95f, 165.075f, 372.594f, 165.075f +path.quadTo(SkBits2Float(0x43b51e93), SkBits2Float(0x43251343), SkBits2Float(0x43b17551), SkBits2Float(0x431dc0bf)); // 362.239f, 165.075f, 354.917f, 157.753f +path.quadTo(SkBits2Float(0x43adcc0f), SkBits2Float(0x43166e3a), SkBits2Float(0x43adcc0f), SkBits2Float(0x430c1343)); // 347.594f, 150.431f, 347.594f, 140.075f +path.quadTo(SkBits2Float(0x43adcc0f), SkBits2Float(0x4301b84c), SkBits2Float(0x43b17551), SkBits2Float(0x42f4cb8e)); // 347.594f, 129.72f, 354.917f, 122.398f +path.quadTo(SkBits2Float(0x43b51e93), SkBits2Float(0x42e62686), SkBits2Float(0x43ba4c0f), SkBits2Float(0x42e62686)); // 362.239f, 115.075f, 372.594f, 115.075f +path.quadTo(SkBits2Float(0x43bf798b), SkBits2Float(0x42e62686), SkBits2Float(0x43c322cd), SkBits2Float(0x42f4cb8e)); // 382.95f, 115.075f, 390.272f, 122.398f +path.quadTo(SkBits2Float(0x43c6cc0f), SkBits2Float(0x4301b84c), SkBits2Float(0x43c6cc0f), SkBits2Float(0x430c1343)); // 397.594f, 129.72f, 397.594f, 140.075f +path.close(); + SkPath path89(path); + builder.add(path89, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43453a6b), SkBits2Float(0x438ed8e3)); // 197.228f, 285.694f +path.quadTo(SkBits2Float(0x43453a6b), SkBits2Float(0x4394065f), SkBits2Float(0x433de7e7), SkBits2Float(0x4397afa1)); // 197.228f, 296.05f, 189.906f, 303.372f +path.quadTo(SkBits2Float(0x43369562), SkBits2Float(0x439b58e3), SkBits2Float(0x432c3a6b), SkBits2Float(0x439b58e3)); // 182.584f, 310.694f, 172.228f, 310.694f +path.quadTo(SkBits2Float(0x4321df74), SkBits2Float(0x439b58e3), SkBits2Float(0x431a8cef), SkBits2Float(0x4397afa1)); // 161.873f, 310.694f, 154.551f, 303.372f +path.quadTo(SkBits2Float(0x43133a6b), SkBits2Float(0x4394065f), SkBits2Float(0x43133a6b), SkBits2Float(0x438ed8e3)); // 147.228f, 296.05f, 147.228f, 285.694f +path.quadTo(SkBits2Float(0x43133a6b), SkBits2Float(0x4389ab67), SkBits2Float(0x431a8cef), SkBits2Float(0x43860225)); // 147.228f, 275.339f, 154.551f, 268.017f +path.quadTo(SkBits2Float(0x4321df74), SkBits2Float(0x438258e3), SkBits2Float(0x432c3a6b), SkBits2Float(0x438258e3)); // 161.873f, 260.694f, 172.228f, 260.694f +path.quadTo(SkBits2Float(0x43369562), SkBits2Float(0x438258e3), SkBits2Float(0x433de7e7), SkBits2Float(0x43860225)); // 182.584f, 260.694f, 189.906f, 268.017f +path.quadTo(SkBits2Float(0x43453a6b), SkBits2Float(0x4389ab67), SkBits2Float(0x43453a6b), SkBits2Float(0x438ed8e3)); // 197.228f, 275.339f, 197.228f, 285.694f +path.close(); + SkPath path90(path); + builder.add(path90, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a452ad), SkBits2Float(0x434c38a8)); // 328.646f, 204.221f +path.quadTo(SkBits2Float(0x43a452ad), SkBits2Float(0x435693a0), SkBits2Float(0x43a0a96b), SkBits2Float(0x435de624)); // 328.646f, 214.577f, 321.324f, 221.899f +path.quadTo(SkBits2Float(0x439d0029), SkBits2Float(0x436538a8), SkBits2Float(0x4397d2ad), SkBits2Float(0x436538a8)); // 314.001f, 229.221f, 303.646f, 229.221f +path.quadTo(SkBits2Float(0x4392a531), SkBits2Float(0x436538a8), SkBits2Float(0x438efbef), SkBits2Float(0x435de624)); // 293.291f, 229.221f, 285.968f, 221.899f +path.quadTo(SkBits2Float(0x438b52ad), SkBits2Float(0x435693a0), SkBits2Float(0x438b52ad), SkBits2Float(0x434c38a8)); // 278.646f, 214.577f, 278.646f, 204.221f +path.quadTo(SkBits2Float(0x438b52ad), SkBits2Float(0x4341ddb0), SkBits2Float(0x438efbef), SkBits2Float(0x433a8b2c)); // 278.646f, 193.866f, 285.968f, 186.544f +path.quadTo(SkBits2Float(0x4392a531), SkBits2Float(0x433338a8), SkBits2Float(0x4397d2ad), SkBits2Float(0x433338a8)); // 293.291f, 179.221f, 303.646f, 179.221f +path.quadTo(SkBits2Float(0x439d0029), SkBits2Float(0x433338a8), SkBits2Float(0x43a0a96b), SkBits2Float(0x433a8b2c)); // 314.001f, 179.221f, 321.324f, 186.544f +path.quadTo(SkBits2Float(0x43a452ad), SkBits2Float(0x4341ddb0), SkBits2Float(0x43a452ad), SkBits2Float(0x434c38a8)); // 328.646f, 193.866f, 328.646f, 204.221f +path.close(); + SkPath path91(path); + builder.add(path91, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x44002d54), SkBits2Float(0x4339e9e8)); // 512.708f, 185.914f +path.quadTo(SkBits2Float(0x44002d54), SkBits2Float(0x434444e0), SkBits2Float(0x43fcb166), SkBits2Float(0x434b9764)); // 512.708f, 196.269f, 505.386f, 203.591f +path.quadTo(SkBits2Float(0x43f90824), SkBits2Float(0x4352e9e8), SkBits2Float(0x43f3daa8), SkBits2Float(0x4352e9e8)); // 498.064f, 210.914f, 487.708f, 210.914f +path.quadTo(SkBits2Float(0x43eead2c), SkBits2Float(0x4352e9e8), SkBits2Float(0x43eb03ea), SkBits2Float(0x434b9764)); // 477.353f, 210.914f, 470.031f, 203.591f +path.quadTo(SkBits2Float(0x43e75aa7), SkBits2Float(0x434444e0), SkBits2Float(0x43e75aa7), SkBits2Float(0x4339e9e8)); // 462.708f, 196.269f, 462.708f, 185.914f +path.quadTo(SkBits2Float(0x43e75aa7), SkBits2Float(0x432f8ef0), SkBits2Float(0x43eb03ea), SkBits2Float(0x43283c6c)); // 462.708f, 175.558f, 470.031f, 168.236f +path.quadTo(SkBits2Float(0x43eead2c), SkBits2Float(0x4320e9e8), SkBits2Float(0x43f3daa8), SkBits2Float(0x4320e9e8)); // 477.353f, 160.914f, 487.708f, 160.914f +path.quadTo(SkBits2Float(0x43f90824), SkBits2Float(0x4320e9e8), SkBits2Float(0x43fcb166), SkBits2Float(0x43283c6c)); // 498.064f, 160.914f, 505.386f, 168.236f +path.quadTo(SkBits2Float(0x44002d54), SkBits2Float(0x432f8ef0), SkBits2Float(0x44002d54), SkBits2Float(0x4339e9e8)); // 512.708f, 175.558f, 512.708f, 185.914f +path.close(); + SkPath path92(path); + builder.add(path92, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4385d99d), SkBits2Float(0x4302a8cd)); // 267.7f, 130.659f +path.quadTo(SkBits2Float(0x4385d99d), SkBits2Float(0x430d03c4), SkBits2Float(0x4382305b), SkBits2Float(0x43145649)); // 267.7f, 141.015f, 260.378f, 148.337f +path.quadTo(SkBits2Float(0x437d0e32), SkBits2Float(0x431ba8cd), SkBits2Float(0x4372b33a), SkBits2Float(0x431ba8cd)); // 253.055f, 155.659f, 242.7f, 155.659f +path.quadTo(SkBits2Float(0x43685842), SkBits2Float(0x431ba8cd), SkBits2Float(0x436105be), SkBits2Float(0x43145649)); // 232.345f, 155.659f, 225.022f, 148.337f +path.quadTo(SkBits2Float(0x4359b33a), SkBits2Float(0x430d03c4), SkBits2Float(0x4359b33a), SkBits2Float(0x4302a8cd)); // 217.7f, 141.015f, 217.7f, 130.659f +path.quadTo(SkBits2Float(0x4359b33a), SkBits2Float(0x42f09bab), SkBits2Float(0x436105be), SkBits2Float(0x42e1f6a2)); // 217.7f, 120.304f, 225.022f, 112.982f +path.quadTo(SkBits2Float(0x43685842), SkBits2Float(0x42d3519a), SkBits2Float(0x4372b33a), SkBits2Float(0x42d3519a)); // 232.345f, 105.659f, 242.7f, 105.659f +path.quadTo(SkBits2Float(0x437d0e32), SkBits2Float(0x42d3519a), SkBits2Float(0x4382305b), SkBits2Float(0x42e1f6a2)); // 253.055f, 105.659f, 260.378f, 112.982f +path.quadTo(SkBits2Float(0x4385d99d), SkBits2Float(0x42f09bab), SkBits2Float(0x4385d99d), SkBits2Float(0x4302a8cd)); // 267.7f, 120.304f, 267.7f, 130.659f +path.close(); + SkPath path93(path); + builder.add(path93, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42f92820), SkBits2Float(0x435b1722)); // 124.578f, 219.09f +path.quadTo(SkBits2Float(0x42f92820), SkBits2Float(0x4365721a), SkBits2Float(0x42ea8318), SkBits2Float(0x436cc49e)); // 124.578f, 229.446f, 117.256f, 236.768f +path.quadTo(SkBits2Float(0x42dbde0f), SkBits2Float(0x43741722), SkBits2Float(0x42c72820), SkBits2Float(0x43741722)); // 109.934f, 244.09f, 99.5784f, 244.09f +path.quadTo(SkBits2Float(0x42b27231), SkBits2Float(0x43741722), SkBits2Float(0x42a3cd28), SkBits2Float(0x436cc49e)); // 89.223f, 244.09f, 81.9007f, 236.768f +path.quadTo(SkBits2Float(0x42952820), SkBits2Float(0x4365721a), SkBits2Float(0x42952820), SkBits2Float(0x435b1722)); // 74.5784f, 229.446f, 74.5784f, 219.09f +path.quadTo(SkBits2Float(0x42952820), SkBits2Float(0x4350bc2a), SkBits2Float(0x42a3cd28), SkBits2Float(0x434969a6)); // 74.5784f, 208.735f, 81.9007f, 201.413f +path.quadTo(SkBits2Float(0x42b27231), SkBits2Float(0x43421722), SkBits2Float(0x42c72820), SkBits2Float(0x43421722)); // 89.223f, 194.09f, 99.5784f, 194.09f +path.quadTo(SkBits2Float(0x42dbde0f), SkBits2Float(0x43421722), SkBits2Float(0x42ea8318), SkBits2Float(0x434969a6)); // 109.934f, 194.09f, 117.256f, 201.413f +path.quadTo(SkBits2Float(0x42f92820), SkBits2Float(0x4350bc2a), SkBits2Float(0x42f92820), SkBits2Float(0x435b1722)); // 124.578f, 208.735f, 124.578f, 219.09f +path.close(); + SkPath path94(path); + builder.add(path94, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b70d86), SkBits2Float(0x435cf621)); // 366.106f, 220.961f +path.quadTo(SkBits2Float(0x43b70d86), SkBits2Float(0x43675118), SkBits2Float(0x43b36444), SkBits2Float(0x436ea39d)); // 366.106f, 231.317f, 358.783f, 238.639f +path.quadTo(SkBits2Float(0x43afbb02), SkBits2Float(0x4375f621), SkBits2Float(0x43aa8d86), SkBits2Float(0x4375f621)); // 351.461f, 245.961f, 341.106f, 245.961f +path.quadTo(SkBits2Float(0x43a5600a), SkBits2Float(0x4375f621), SkBits2Float(0x43a1b6c8), SkBits2Float(0x436ea39d)); // 330.75f, 245.961f, 323.428f, 238.639f +path.quadTo(SkBits2Float(0x439e0d86), SkBits2Float(0x43675118), SkBits2Float(0x439e0d86), SkBits2Float(0x435cf621)); // 316.106f, 231.317f, 316.106f, 220.961f +path.quadTo(SkBits2Float(0x439e0d86), SkBits2Float(0x43529b2a), SkBits2Float(0x43a1b6c8), SkBits2Float(0x434b48a5)); // 316.106f, 210.606f, 323.428f, 203.284f +path.quadTo(SkBits2Float(0x43a5600a), SkBits2Float(0x4343f621), SkBits2Float(0x43aa8d86), SkBits2Float(0x4343f621)); // 330.75f, 195.961f, 341.106f, 195.961f +path.quadTo(SkBits2Float(0x43afbb02), SkBits2Float(0x4343f621), SkBits2Float(0x43b36444), SkBits2Float(0x434b48a5)); // 351.461f, 195.961f, 358.783f, 203.284f +path.quadTo(SkBits2Float(0x43b70d86), SkBits2Float(0x43529b2a), SkBits2Float(0x43b70d86), SkBits2Float(0x435cf621)); // 366.106f, 210.606f, 366.106f, 220.961f +path.close(); + SkPath path95(path); + builder.add(path95, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x436d80e1), SkBits2Float(0x43885efa)); // 237.503f, 272.742f +path.quadTo(SkBits2Float(0x436d80e1), SkBits2Float(0x438d8c76), SkBits2Float(0x43662e5d), SkBits2Float(0x439135b8)); // 237.503f, 283.097f, 230.181f, 290.42f +path.quadTo(SkBits2Float(0x435edbd8), SkBits2Float(0x4394defa), SkBits2Float(0x435480e1), SkBits2Float(0x4394defa)); // 222.859f, 297.742f, 212.503f, 297.742f +path.quadTo(SkBits2Float(0x434a25ea), SkBits2Float(0x4394defa), SkBits2Float(0x4342d365), SkBits2Float(0x439135b8)); // 202.148f, 297.742f, 194.826f, 290.42f +path.quadTo(SkBits2Float(0x433b80e1), SkBits2Float(0x438d8c76), SkBits2Float(0x433b80e1), SkBits2Float(0x43885efa)); // 187.503f, 283.097f, 187.503f, 272.742f +path.quadTo(SkBits2Float(0x433b80e1), SkBits2Float(0x4383317e), SkBits2Float(0x4342d365), SkBits2Float(0x437f1078)); // 187.503f, 262.387f, 194.826f, 255.064f +path.quadTo(SkBits2Float(0x434a25ea), SkBits2Float(0x4377bdf4), SkBits2Float(0x435480e1), SkBits2Float(0x4377bdf4)); // 202.148f, 247.742f, 212.503f, 247.742f +path.quadTo(SkBits2Float(0x435edbd8), SkBits2Float(0x4377bdf4), SkBits2Float(0x43662e5d), SkBits2Float(0x437f1078)); // 222.859f, 247.742f, 230.181f, 255.064f +path.quadTo(SkBits2Float(0x436d80e1), SkBits2Float(0x4383317e), SkBits2Float(0x436d80e1), SkBits2Float(0x43885efa)); // 237.503f, 262.387f, 237.503f, 272.742f +path.close(); + SkPath path96(path); + builder.add(path96, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43e54635), SkBits2Float(0x43794ba0)); // 458.548f, 249.295f +path.quadTo(SkBits2Float(0x43e54635), SkBits2Float(0x4381d34c), SkBits2Float(0x43e19cf3), SkBits2Float(0x43857c8e)); // 458.548f, 259.651f, 451.226f, 266.973f +path.quadTo(SkBits2Float(0x43ddf3b1), SkBits2Float(0x438925d0), SkBits2Float(0x43d8c635), SkBits2Float(0x438925d0)); // 443.904f, 274.295f, 433.548f, 274.295f +path.quadTo(SkBits2Float(0x43d398b9), SkBits2Float(0x438925d0), SkBits2Float(0x43cfef77), SkBits2Float(0x43857c8e)); // 423.193f, 274.295f, 415.871f, 266.973f +path.quadTo(SkBits2Float(0x43cc4635), SkBits2Float(0x4381d34c), SkBits2Float(0x43cc4635), SkBits2Float(0x43794ba0)); // 408.548f, 259.651f, 408.548f, 249.295f +path.quadTo(SkBits2Float(0x43cc4635), SkBits2Float(0x436ef0a8), SkBits2Float(0x43cfef77), SkBits2Float(0x43679e24)); // 408.548f, 238.94f, 415.871f, 231.618f +path.quadTo(SkBits2Float(0x43d398b9), SkBits2Float(0x43604ba0), SkBits2Float(0x43d8c635), SkBits2Float(0x43604ba0)); // 423.193f, 224.295f, 433.548f, 224.295f +path.quadTo(SkBits2Float(0x43ddf3b1), SkBits2Float(0x43604ba0), SkBits2Float(0x43e19cf3), SkBits2Float(0x43679e24)); // 443.904f, 224.295f, 451.226f, 231.618f +path.quadTo(SkBits2Float(0x43e54635), SkBits2Float(0x436ef0a8), SkBits2Float(0x43e54635), SkBits2Float(0x43794ba0)); // 458.548f, 238.94f, 458.548f, 249.295f +path.close(); + SkPath path97(path); + builder.add(path97, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42596ac0), SkBits2Float(0x42f09a24)); // 54.3542f, 120.301f +path.quadTo(SkBits2Float(0x42596ac0), SkBits2Float(0x4302a809), SkBits2Float(0x423c20af), SkBits2Float(0x4309fa8e)); // 54.3542f, 130.656f, 47.0319f, 137.979f +path.quadTo(SkBits2Float(0x421ed69e), SkBits2Float(0x43114d12), SkBits2Float(0x41ead580), SkBits2Float(0x43114d12)); // 39.7096f, 145.301f, 29.3542f, 145.301f +path.quadTo(SkBits2Float(0x4197fdc4), SkBits2Float(0x43114d12), SkBits2Float(0x413ad344), SkBits2Float(0x4309fa8e)); // 18.9989f, 145.301f, 11.6766f, 137.979f +path.quadTo(SkBits2Float(0x408b5604), SkBits2Float(0x4302a809), SkBits2Float(0x408b5604), SkBits2Float(0x42f09a24)); // 4.35425f, 130.656f, 4.35425f, 120.301f +path.quadTo(SkBits2Float(0x408b5604), SkBits2Float(0x42dbe435), SkBits2Float(0x413ad344), SkBits2Float(0x42cd3f2d)); // 4.35425f, 109.946f, 11.6766f, 102.623f +path.quadTo(SkBits2Float(0x4197fdc4), SkBits2Float(0x42be9a25), SkBits2Float(0x41ead580), SkBits2Float(0x42be9a25)); // 18.9989f, 95.3011f, 29.3542f, 95.3011f +path.quadTo(SkBits2Float(0x421ed69e), SkBits2Float(0x42be9a25), SkBits2Float(0x423c20af), SkBits2Float(0x42cd3f2d)); // 39.7096f, 95.3011f, 47.0319f, 102.623f +path.quadTo(SkBits2Float(0x42596ac0), SkBits2Float(0x42dbe435), SkBits2Float(0x42596ac0), SkBits2Float(0x42f09a24)); // 54.3542f, 109.946f, 54.3542f, 120.301f +path.close(); + SkPath path98(path); + builder.add(path98, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ab48a8), SkBits2Float(0x438703b7)); // 342.568f, 270.029f +path.quadTo(SkBits2Float(0x43ab48a8), SkBits2Float(0x438c3133), SkBits2Float(0x43a79f66), SkBits2Float(0x438fda75)); // 342.568f, 280.384f, 335.245f, 287.707f +path.quadTo(SkBits2Float(0x43a3f624), SkBits2Float(0x439383b7), SkBits2Float(0x439ec8a8), SkBits2Float(0x439383b7)); // 327.923f, 295.029f, 317.568f, 295.029f +path.quadTo(SkBits2Float(0x43999b2c), SkBits2Float(0x439383b7), SkBits2Float(0x4395f1ea), SkBits2Float(0x438fda75)); // 307.212f, 295.029f, 299.89f, 287.707f +path.quadTo(SkBits2Float(0x439248a8), SkBits2Float(0x438c3133), SkBits2Float(0x439248a8), SkBits2Float(0x438703b7)); // 292.568f, 280.384f, 292.568f, 270.029f +path.quadTo(SkBits2Float(0x439248a8), SkBits2Float(0x4381d63b), SkBits2Float(0x4395f1ea), SkBits2Float(0x437c59f2)); // 292.568f, 259.674f, 299.89f, 252.351f +path.quadTo(SkBits2Float(0x43999b2c), SkBits2Float(0x4375076e), SkBits2Float(0x439ec8a8), SkBits2Float(0x4375076e)); // 307.212f, 245.029f, 317.568f, 245.029f +path.quadTo(SkBits2Float(0x43a3f624), SkBits2Float(0x4375076e), SkBits2Float(0x43a79f66), SkBits2Float(0x437c59f2)); // 327.923f, 245.029f, 335.245f, 252.351f +path.quadTo(SkBits2Float(0x43ab48a8), SkBits2Float(0x4381d63b), SkBits2Float(0x43ab48a8), SkBits2Float(0x438703b7)); // 342.568f, 259.674f, 342.568f, 270.029f +path.close(); + SkPath path99(path); + builder.add(path99, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43b3d091), SkBits2Float(0x4394a1fa)); // 359.629f, 297.265f +path.quadTo(SkBits2Float(0x43b3d091), SkBits2Float(0x4399cf76), SkBits2Float(0x43b0274f), SkBits2Float(0x439d78b8)); // 359.629f, 307.621f, 352.307f, 314.943f +path.quadTo(SkBits2Float(0x43ac7e0d), SkBits2Float(0x43a121fa), SkBits2Float(0x43a75091), SkBits2Float(0x43a121fa)); // 344.985f, 322.265f, 334.629f, 322.265f +path.quadTo(SkBits2Float(0x43a22315), SkBits2Float(0x43a121fa), SkBits2Float(0x439e79d3), SkBits2Float(0x439d78b8)); // 324.274f, 322.265f, 316.952f, 314.943f +path.quadTo(SkBits2Float(0x439ad091), SkBits2Float(0x4399cf76), SkBits2Float(0x439ad091), SkBits2Float(0x4394a1fa)); // 309.629f, 307.621f, 309.629f, 297.265f +path.quadTo(SkBits2Float(0x439ad091), SkBits2Float(0x438f747e), SkBits2Float(0x439e79d3), SkBits2Float(0x438bcb3c)); // 309.629f, 286.91f, 316.952f, 279.588f +path.quadTo(SkBits2Float(0x43a22315), SkBits2Float(0x438821fa), SkBits2Float(0x43a75091), SkBits2Float(0x438821fa)); // 324.274f, 272.265f, 334.629f, 272.265f +path.quadTo(SkBits2Float(0x43ac7e0d), SkBits2Float(0x438821fa), SkBits2Float(0x43b0274f), SkBits2Float(0x438bcb3c)); // 344.985f, 272.265f, 352.307f, 279.588f +path.quadTo(SkBits2Float(0x43b3d091), SkBits2Float(0x438f747e), SkBits2Float(0x43b3d091), SkBits2Float(0x4394a1fa)); // 359.629f, 286.91f, 359.629f, 297.265f +path.close(); + SkPath path100(path); + builder.add(path100, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42a153aa), SkBits2Float(0x4387c2b8)); // 80.6634f, 271.521f +path.quadTo(SkBits2Float(0x42a153aa), SkBits2Float(0x438cf034), SkBits2Float(0x4292aea2), SkBits2Float(0x43909976)); // 80.6634f, 281.877f, 73.3411f, 289.199f +path.quadTo(SkBits2Float(0x42840999), SkBits2Float(0x439442b8), SkBits2Float(0x425ea754), SkBits2Float(0x439442b8)); // 66.0187f, 296.521f, 55.6634f, 296.521f +path.quadTo(SkBits2Float(0x42353b76), SkBits2Float(0x439442b8), SkBits2Float(0x4217f165), SkBits2Float(0x43909976)); // 45.3081f, 296.521f, 37.9857f, 289.199f +path.quadTo(SkBits2Float(0x41f54ea8), SkBits2Float(0x438cf034), SkBits2Float(0x41f54ea8), SkBits2Float(0x4387c2b8)); // 30.6634f, 281.877f, 30.6634f, 271.521f +path.quadTo(SkBits2Float(0x41f54ea8), SkBits2Float(0x4382953c), SkBits2Float(0x4217f165), SkBits2Float(0x437dd7f4)); // 30.6634f, 261.166f, 37.9857f, 253.844f +path.quadTo(SkBits2Float(0x42353b76), SkBits2Float(0x43768570), SkBits2Float(0x425ea754), SkBits2Float(0x43768570)); // 45.3081f, 246.521f, 55.6634f, 246.521f +path.quadTo(SkBits2Float(0x42840999), SkBits2Float(0x43768570), SkBits2Float(0x4292aea2), SkBits2Float(0x437dd7f4)); // 66.0187f, 246.521f, 73.3411f, 253.844f +path.quadTo(SkBits2Float(0x42a153aa), SkBits2Float(0x4382953c), SkBits2Float(0x42a153aa), SkBits2Float(0x4387c2b8)); // 80.6634f, 261.166f, 80.6634f, 271.521f +path.close(); + SkPath path101(path); + builder.add(path101, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x436da8c1), SkBits2Float(0x434950e1)); // 237.659f, 201.316f +path.quadTo(SkBits2Float(0x436da8c1), SkBits2Float(0x4353abd8), SkBits2Float(0x4366563d), SkBits2Float(0x435afe5d)); // 237.659f, 211.671f, 230.337f, 218.994f +path.quadTo(SkBits2Float(0x435f03b8), SkBits2Float(0x436250e1), SkBits2Float(0x4354a8c1), SkBits2Float(0x436250e1)); // 223.015f, 226.316f, 212.659f, 226.316f +path.quadTo(SkBits2Float(0x434a4dca), SkBits2Float(0x436250e1), SkBits2Float(0x4342fb45), SkBits2Float(0x435afe5d)); // 202.304f, 226.316f, 194.982f, 218.994f +path.quadTo(SkBits2Float(0x433ba8c1), SkBits2Float(0x4353abd8), SkBits2Float(0x433ba8c1), SkBits2Float(0x434950e1)); // 187.659f, 211.671f, 187.659f, 201.316f +path.quadTo(SkBits2Float(0x433ba8c1), SkBits2Float(0x433ef5ea), SkBits2Float(0x4342fb45), SkBits2Float(0x4337a365)); // 187.659f, 190.961f, 194.982f, 183.638f +path.quadTo(SkBits2Float(0x434a4dca), SkBits2Float(0x433050e1), SkBits2Float(0x4354a8c1), SkBits2Float(0x433050e1)); // 202.304f, 176.316f, 212.659f, 176.316f +path.quadTo(SkBits2Float(0x435f03b8), SkBits2Float(0x433050e1), SkBits2Float(0x4366563d), SkBits2Float(0x4337a365)); // 223.015f, 176.316f, 230.337f, 183.638f +path.quadTo(SkBits2Float(0x436da8c1), SkBits2Float(0x433ef5ea), SkBits2Float(0x436da8c1), SkBits2Float(0x434950e1)); // 237.659f, 190.961f, 237.659f, 201.316f +path.close(); + SkPath path102(path); + builder.add(path102, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ba530a), SkBits2Float(0x4376baae)); // 372.649f, 246.729f +path.quadTo(SkBits2Float(0x43ba530a), SkBits2Float(0x43808ad3), SkBits2Float(0x43b6a9c8), SkBits2Float(0x43843415)); // 372.649f, 257.085f, 365.326f, 264.407f +path.quadTo(SkBits2Float(0x43b30086), SkBits2Float(0x4387dd57), SkBits2Float(0x43add30a), SkBits2Float(0x4387dd57)); // 358.004f, 271.729f, 347.649f, 271.729f +path.quadTo(SkBits2Float(0x43a8a58e), SkBits2Float(0x4387dd57), SkBits2Float(0x43a4fc4c), SkBits2Float(0x43843415)); // 337.293f, 271.729f, 329.971f, 264.407f +path.quadTo(SkBits2Float(0x43a1530a), SkBits2Float(0x43808ad3), SkBits2Float(0x43a1530a), SkBits2Float(0x4376baae)); // 322.649f, 257.085f, 322.649f, 246.729f +path.quadTo(SkBits2Float(0x43a1530a), SkBits2Float(0x436c5fb6), SkBits2Float(0x43a4fc4c), SkBits2Float(0x43650d32)); // 322.649f, 236.374f, 329.971f, 229.052f +path.quadTo(SkBits2Float(0x43a8a58e), SkBits2Float(0x435dbaae), SkBits2Float(0x43add30a), SkBits2Float(0x435dbaae)); // 337.293f, 221.729f, 347.649f, 221.729f +path.quadTo(SkBits2Float(0x43b30086), SkBits2Float(0x435dbaae), SkBits2Float(0x43b6a9c8), SkBits2Float(0x43650d32)); // 358.004f, 221.729f, 365.326f, 229.052f +path.quadTo(SkBits2Float(0x43ba530a), SkBits2Float(0x436c5fb6), SkBits2Float(0x43ba530a), SkBits2Float(0x4376baae)); // 372.649f, 236.374f, 372.649f, 246.729f +path.close(); + SkPath path103(path); + builder.add(path103, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4399286a), SkBits2Float(0x435887a5)); // 306.316f, 216.53f +path.quadTo(SkBits2Float(0x4399286a), SkBits2Float(0x4362e29c), SkBits2Float(0x43957f28), SkBits2Float(0x436a3521)); // 306.316f, 226.885f, 298.993f, 234.208f +path.quadTo(SkBits2Float(0x4391d5e6), SkBits2Float(0x437187a5), SkBits2Float(0x438ca86a), SkBits2Float(0x437187a5)); // 291.671f, 241.53f, 281.316f, 241.53f +path.quadTo(SkBits2Float(0x43877aee), SkBits2Float(0x437187a5), SkBits2Float(0x4383d1ac), SkBits2Float(0x436a3521)); // 270.96f, 241.53f, 263.638f, 234.208f +path.quadTo(SkBits2Float(0x4380286a), SkBits2Float(0x4362e29c), SkBits2Float(0x4380286a), SkBits2Float(0x435887a5)); // 256.316f, 226.885f, 256.316f, 216.53f +path.quadTo(SkBits2Float(0x4380286a), SkBits2Float(0x434e2cae), SkBits2Float(0x4383d1ac), SkBits2Float(0x4346da29)); // 256.316f, 206.175f, 263.638f, 198.852f +path.quadTo(SkBits2Float(0x43877aee), SkBits2Float(0x433f87a5), SkBits2Float(0x438ca86a), SkBits2Float(0x433f87a5)); // 270.96f, 191.53f, 281.316f, 191.53f +path.quadTo(SkBits2Float(0x4391d5e6), SkBits2Float(0x433f87a5), SkBits2Float(0x43957f28), SkBits2Float(0x4346da29)); // 291.671f, 191.53f, 298.993f, 198.852f +path.quadTo(SkBits2Float(0x4399286a), SkBits2Float(0x434e2cae), SkBits2Float(0x4399286a), SkBits2Float(0x435887a5)); // 306.316f, 206.175f, 306.316f, 216.53f +path.close(); + SkPath path104(path); + builder.add(path104, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a08755), SkBits2Float(0x43120238)); // 321.057f, 146.009f +path.quadTo(SkBits2Float(0x43a08755), SkBits2Float(0x431c5d30), SkBits2Float(0x439cde13), SkBits2Float(0x4323afb4)); // 321.057f, 156.364f, 313.735f, 163.686f +path.quadTo(SkBits2Float(0x439934d1), SkBits2Float(0x432b0238), SkBits2Float(0x43940755), SkBits2Float(0x432b0238)); // 306.413f, 171.009f, 296.057f, 171.009f +path.quadTo(SkBits2Float(0x438ed9d9), SkBits2Float(0x432b0238), SkBits2Float(0x438b3097), SkBits2Float(0x4323afb4)); // 285.702f, 171.009f, 278.38f, 163.686f +path.quadTo(SkBits2Float(0x43878755), SkBits2Float(0x431c5d30), SkBits2Float(0x43878755), SkBits2Float(0x43120238)); // 271.057f, 156.364f, 271.057f, 146.009f +path.quadTo(SkBits2Float(0x43878755), SkBits2Float(0x4307a740), SkBits2Float(0x438b3097), SkBits2Float(0x430054bc)); // 271.057f, 135.653f, 278.38f, 128.331f +path.quadTo(SkBits2Float(0x438ed9d9), SkBits2Float(0x42f20470), SkBits2Float(0x43940755), SkBits2Float(0x42f20470)); // 285.702f, 121.009f, 296.057f, 121.009f +path.quadTo(SkBits2Float(0x439934d1), SkBits2Float(0x42f20470), SkBits2Float(0x439cde13), SkBits2Float(0x430054bc)); // 306.413f, 121.009f, 313.735f, 128.331f +path.quadTo(SkBits2Float(0x43a08755), SkBits2Float(0x4307a740), SkBits2Float(0x43a08755), SkBits2Float(0x43120238)); // 321.057f, 135.653f, 321.057f, 146.009f +path.close(); + SkPath path105(path); + builder.add(path105, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43e31764), SkBits2Float(0x438e240b)); // 454.183f, 284.282f +path.quadTo(SkBits2Float(0x43e31764), SkBits2Float(0x43935187), SkBits2Float(0x43df6e22), SkBits2Float(0x4396fac9)); // 454.183f, 294.637f, 446.86f, 301.959f +path.quadTo(SkBits2Float(0x43dbc4e0), SkBits2Float(0x439aa40b), SkBits2Float(0x43d69764), SkBits2Float(0x439aa40b)); // 439.538f, 309.282f, 429.183f, 309.282f +path.quadTo(SkBits2Float(0x43d169e8), SkBits2Float(0x439aa40b), SkBits2Float(0x43cdc0a6), SkBits2Float(0x4396fac9)); // 418.827f, 309.282f, 411.505f, 301.959f +path.quadTo(SkBits2Float(0x43ca1764), SkBits2Float(0x43935187), SkBits2Float(0x43ca1764), SkBits2Float(0x438e240b)); // 404.183f, 294.637f, 404.183f, 284.282f +path.quadTo(SkBits2Float(0x43ca1764), SkBits2Float(0x4388f68f), SkBits2Float(0x43cdc0a6), SkBits2Float(0x43854d4d)); // 404.183f, 273.926f, 411.505f, 266.604f +path.quadTo(SkBits2Float(0x43d169e8), SkBits2Float(0x4381a40b), SkBits2Float(0x43d69764), SkBits2Float(0x4381a40b)); // 418.827f, 259.282f, 429.183f, 259.282f +path.quadTo(SkBits2Float(0x43dbc4e0), SkBits2Float(0x4381a40b), SkBits2Float(0x43df6e22), SkBits2Float(0x43854d4d)); // 439.538f, 259.282f, 446.86f, 266.604f +path.quadTo(SkBits2Float(0x43e31764), SkBits2Float(0x4388f68f), SkBits2Float(0x43e31764), SkBits2Float(0x438e240b)); // 454.183f, 273.926f, 454.183f, 284.282f +path.close(); + SkPath path106(path); + builder.add(path106, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43430483), SkBits2Float(0x4345764d)); // 195.018f, 197.462f +path.quadTo(SkBits2Float(0x43430483), SkBits2Float(0x434fd144), SkBits2Float(0x433bb1ff), SkBits2Float(0x435723c9)); // 195.018f, 207.817f, 187.695f, 215.14f +path.quadTo(SkBits2Float(0x43345f7a), SkBits2Float(0x435e764d), SkBits2Float(0x432a0483), SkBits2Float(0x435e764d)); // 180.373f, 222.462f, 170.018f, 222.462f +path.quadTo(SkBits2Float(0x431fa98c), SkBits2Float(0x435e764d), SkBits2Float(0x43185707), SkBits2Float(0x435723c9)); // 159.662f, 222.462f, 152.34f, 215.14f +path.quadTo(SkBits2Float(0x43110483), SkBits2Float(0x434fd144), SkBits2Float(0x43110483), SkBits2Float(0x4345764d)); // 145.018f, 207.817f, 145.018f, 197.462f +path.quadTo(SkBits2Float(0x43110483), SkBits2Float(0x433b1b56), SkBits2Float(0x43185707), SkBits2Float(0x4333c8d1)); // 145.018f, 187.107f, 152.34f, 179.784f +path.quadTo(SkBits2Float(0x431fa98c), SkBits2Float(0x432c764d), SkBits2Float(0x432a0483), SkBits2Float(0x432c764d)); // 159.662f, 172.462f, 170.018f, 172.462f +path.quadTo(SkBits2Float(0x43345f7a), SkBits2Float(0x432c764d), SkBits2Float(0x433bb1ff), SkBits2Float(0x4333c8d1)); // 180.373f, 172.462f, 187.695f, 179.784f +path.quadTo(SkBits2Float(0x43430483), SkBits2Float(0x433b1b56), SkBits2Float(0x43430483), SkBits2Float(0x4345764d)); // 195.018f, 187.107f, 195.018f, 197.462f +path.close(); + SkPath path107(path); + builder.add(path107, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x439a55b2), SkBits2Float(0x4370a1cc)); // 308.669f, 240.632f +path.quadTo(SkBits2Float(0x439a55b2), SkBits2Float(0x437afcc3), SkBits2Float(0x4396ac70), SkBits2Float(0x438127a4)); // 308.669f, 250.987f, 301.347f, 258.31f +path.quadTo(SkBits2Float(0x4393032e), SkBits2Float(0x4384d0e6), SkBits2Float(0x438dd5b2), SkBits2Float(0x4384d0e6)); // 294.025f, 265.632f, 283.669f, 265.632f +path.quadTo(SkBits2Float(0x4388a836), SkBits2Float(0x4384d0e6), SkBits2Float(0x4384fef4), SkBits2Float(0x438127a4)); // 273.314f, 265.632f, 265.992f, 258.31f +path.quadTo(SkBits2Float(0x438155b2), SkBits2Float(0x437afcc3), SkBits2Float(0x438155b2), SkBits2Float(0x4370a1cc)); // 258.669f, 250.987f, 258.669f, 240.632f +path.quadTo(SkBits2Float(0x438155b2), SkBits2Float(0x436646d5), SkBits2Float(0x4384fef4), SkBits2Float(0x435ef451)); // 258.669f, 230.277f, 265.992f, 222.954f +path.quadTo(SkBits2Float(0x4388a836), SkBits2Float(0x4357a1cd), SkBits2Float(0x438dd5b2), SkBits2Float(0x4357a1cd)); // 273.314f, 215.632f, 283.669f, 215.632f +path.quadTo(SkBits2Float(0x4393032e), SkBits2Float(0x4357a1cd), SkBits2Float(0x4396ac70), SkBits2Float(0x435ef451)); // 294.025f, 215.632f, 301.347f, 222.954f +path.quadTo(SkBits2Float(0x439a55b2), SkBits2Float(0x436646d5), SkBits2Float(0x439a55b2), SkBits2Float(0x4370a1cc)); // 308.669f, 230.277f, 308.669f, 240.632f +path.close(); + SkPath path108(path); + builder.add(path108, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42fcf02d), SkBits2Float(0x4327ee31)); // 126.469f, 167.93f +path.quadTo(SkBits2Float(0x42fcf02d), SkBits2Float(0x43324928), SkBits2Float(0x42ee4b24), SkBits2Float(0x43399bad)); // 126.469f, 178.286f, 119.147f, 185.608f +path.quadTo(SkBits2Float(0x42dfa61c), SkBits2Float(0x4340ee31), SkBits2Float(0x42caf02d), SkBits2Float(0x4340ee31)); // 111.824f, 192.93f, 101.469f, 192.93f +path.quadTo(SkBits2Float(0x42b63a3e), SkBits2Float(0x4340ee31), SkBits2Float(0x42a79536), SkBits2Float(0x43399bad)); // 91.1138f, 192.93f, 83.7914f, 185.608f +path.quadTo(SkBits2Float(0x4298f02d), SkBits2Float(0x43324928), SkBits2Float(0x4298f02d), SkBits2Float(0x4327ee31)); // 76.4691f, 178.286f, 76.4691f, 167.93f +path.quadTo(SkBits2Float(0x4298f02d), SkBits2Float(0x431d933a), SkBits2Float(0x42a79536), SkBits2Float(0x431640b5)); // 76.4691f, 157.575f, 83.7914f, 150.253f +path.quadTo(SkBits2Float(0x42b63a3e), SkBits2Float(0x430eee31), SkBits2Float(0x42caf02d), SkBits2Float(0x430eee31)); // 91.1138f, 142.93f, 101.469f, 142.93f +path.quadTo(SkBits2Float(0x42dfa61c), SkBits2Float(0x430eee31), SkBits2Float(0x42ee4b24), SkBits2Float(0x431640b5)); // 111.824f, 142.93f, 119.147f, 150.253f +path.quadTo(SkBits2Float(0x42fcf02d), SkBits2Float(0x431d933a), SkBits2Float(0x42fcf02d), SkBits2Float(0x4327ee31)); // 126.469f, 157.575f, 126.469f, 167.93f +path.close(); + SkPath path109(path); + builder.add(path109, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4408a32e), SkBits2Float(0x438aadd7)); // 546.55f, 277.358f +path.quadTo(SkBits2Float(0x4408a32e), SkBits2Float(0x438fdb53), SkBits2Float(0x4406ce8d), SkBits2Float(0x43938495)); // 546.55f, 287.713f, 539.227f, 295.036f +path.quadTo(SkBits2Float(0x4404f9ec), SkBits2Float(0x43972dd7), SkBits2Float(0x4402632e), SkBits2Float(0x43972dd7)); // 531.905f, 302.358f, 521.55f, 302.358f +path.quadTo(SkBits2Float(0x43ff98e0), SkBits2Float(0x43972dd7), SkBits2Float(0x43fbef9e), SkBits2Float(0x43938495)); // 511.194f, 302.358f, 503.872f, 295.036f +path.quadTo(SkBits2Float(0x43f8465c), SkBits2Float(0x438fdb53), SkBits2Float(0x43f8465c), SkBits2Float(0x438aadd7)); // 496.55f, 287.713f, 496.55f, 277.358f +path.quadTo(SkBits2Float(0x43f8465c), SkBits2Float(0x4385805b), SkBits2Float(0x43fbef9e), SkBits2Float(0x4381d719)); // 496.55f, 267.003f, 503.872f, 259.68f +path.quadTo(SkBits2Float(0x43ff98e0), SkBits2Float(0x437c5bae), SkBits2Float(0x4402632e), SkBits2Float(0x437c5bae)); // 511.194f, 252.358f, 521.55f, 252.358f +path.quadTo(SkBits2Float(0x4404f9ec), SkBits2Float(0x437c5bae), SkBits2Float(0x4406ce8d), SkBits2Float(0x4381d719)); // 531.905f, 252.358f, 539.227f, 259.68f +path.quadTo(SkBits2Float(0x4408a32e), SkBits2Float(0x4385805b), SkBits2Float(0x4408a32e), SkBits2Float(0x438aadd7)); // 546.55f, 267.003f, 546.55f, 277.358f +path.close(); + SkPath path110(path); + builder.add(path110, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ae6436), SkBits2Float(0x4399c25d)); // 348.783f, 307.518f +path.quadTo(SkBits2Float(0x43ae6436), SkBits2Float(0x439eefd9), SkBits2Float(0x43aabaf4), SkBits2Float(0x43a2991b)); // 348.783f, 317.874f, 341.461f, 325.196f +path.quadTo(SkBits2Float(0x43a711b2), SkBits2Float(0x43a6425d), SkBits2Float(0x43a1e436), SkBits2Float(0x43a6425d)); // 334.138f, 332.518f, 323.783f, 332.518f +path.quadTo(SkBits2Float(0x439cb6ba), SkBits2Float(0x43a6425d), SkBits2Float(0x43990d78), SkBits2Float(0x43a2991b)); // 313.428f, 332.518f, 306.105f, 325.196f +path.quadTo(SkBits2Float(0x43956436), SkBits2Float(0x439eefd9), SkBits2Float(0x43956436), SkBits2Float(0x4399c25d)); // 298.783f, 317.874f, 298.783f, 307.518f +path.quadTo(SkBits2Float(0x43956436), SkBits2Float(0x439494e1), SkBits2Float(0x43990d78), SkBits2Float(0x4390eb9f)); // 298.783f, 297.163f, 306.105f, 289.841f +path.quadTo(SkBits2Float(0x439cb6ba), SkBits2Float(0x438d425d), SkBits2Float(0x43a1e436), SkBits2Float(0x438d425d)); // 313.428f, 282.518f, 323.783f, 282.518f +path.quadTo(SkBits2Float(0x43a711b2), SkBits2Float(0x438d425d), SkBits2Float(0x43aabaf4), SkBits2Float(0x4390eb9f)); // 334.138f, 282.518f, 341.461f, 289.841f +path.quadTo(SkBits2Float(0x43ae6436), SkBits2Float(0x439494e1), SkBits2Float(0x43ae6436), SkBits2Float(0x4399c25d)); // 348.783f, 297.163f, 348.783f, 307.518f +path.close(); + SkPath path111(path); + builder.add(path111, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x437ef735), SkBits2Float(0x43a4d766)); // 254.966f, 329.683f +path.quadTo(SkBits2Float(0x437ef735), SkBits2Float(0x43aa04e2), SkBits2Float(0x4377a4b1), SkBits2Float(0x43adae24)); // 254.966f, 340.038f, 247.643f, 347.36f +path.quadTo(SkBits2Float(0x4370522c), SkBits2Float(0x43b15766), SkBits2Float(0x4365f735), SkBits2Float(0x43b15766)); // 240.321f, 354.683f, 229.966f, 354.683f +path.quadTo(SkBits2Float(0x435b9c3e), SkBits2Float(0x43b15766), SkBits2Float(0x435449b9), SkBits2Float(0x43adae24)); // 219.61f, 354.683f, 212.288f, 347.36f +path.quadTo(SkBits2Float(0x434cf735), SkBits2Float(0x43aa04e2), SkBits2Float(0x434cf735), SkBits2Float(0x43a4d766)); // 204.966f, 340.038f, 204.966f, 329.683f +path.quadTo(SkBits2Float(0x434cf735), SkBits2Float(0x439fa9ea), SkBits2Float(0x435449b9), SkBits2Float(0x439c00a8)); // 204.966f, 319.327f, 212.288f, 312.005f +path.quadTo(SkBits2Float(0x435b9c3e), SkBits2Float(0x43985766), SkBits2Float(0x4365f735), SkBits2Float(0x43985766)); // 219.61f, 304.683f, 229.966f, 304.683f +path.quadTo(SkBits2Float(0x4370522c), SkBits2Float(0x43985766), SkBits2Float(0x4377a4b1), SkBits2Float(0x439c00a8)); // 240.321f, 304.683f, 247.643f, 312.005f +path.quadTo(SkBits2Float(0x437ef735), SkBits2Float(0x439fa9ea), SkBits2Float(0x437ef735), SkBits2Float(0x43a4d766)); // 254.966f, 319.327f, 254.966f, 329.683f +path.close(); + SkPath path112(path); + builder.add(path112, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4323b1dd), SkBits2Float(0x433e57b5)); // 163.695f, 190.343f +path.quadTo(SkBits2Float(0x4323b1dd), SkBits2Float(0x4348b2ac), SkBits2Float(0x431c5f59), SkBits2Float(0x43500531)); // 163.695f, 200.698f, 156.372f, 208.02f +path.quadTo(SkBits2Float(0x43150cd4), SkBits2Float(0x435757b5), SkBits2Float(0x430ab1dd), SkBits2Float(0x435757b5)); // 149.05f, 215.343f, 138.695f, 215.343f +path.quadTo(SkBits2Float(0x430056e6), SkBits2Float(0x435757b5), SkBits2Float(0x42f208c2), SkBits2Float(0x43500531)); // 128.339f, 215.343f, 121.017f, 208.02f +path.quadTo(SkBits2Float(0x42e363ba), SkBits2Float(0x4348b2ac), SkBits2Float(0x42e363ba), SkBits2Float(0x433e57b5)); // 113.695f, 200.698f, 113.695f, 190.343f +path.quadTo(SkBits2Float(0x42e363ba), SkBits2Float(0x4333fcbe), SkBits2Float(0x42f208c2), SkBits2Float(0x432caa39)); // 113.695f, 179.987f, 121.017f, 172.665f +path.quadTo(SkBits2Float(0x430056e6), SkBits2Float(0x432557b5), SkBits2Float(0x430ab1dd), SkBits2Float(0x432557b5)); // 128.339f, 165.343f, 138.695f, 165.343f +path.quadTo(SkBits2Float(0x43150cd4), SkBits2Float(0x432557b5), SkBits2Float(0x431c5f59), SkBits2Float(0x432caa39)); // 149.05f, 165.343f, 156.372f, 172.665f +path.quadTo(SkBits2Float(0x4323b1dd), SkBits2Float(0x4333fcbe), SkBits2Float(0x4323b1dd), SkBits2Float(0x433e57b5)); // 163.695f, 179.987f, 163.695f, 190.343f +path.close(); + SkPath path113(path); + builder.add(path113, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x436e6f43), SkBits2Float(0x435d1aaa)); // 238.435f, 221.104f +path.quadTo(SkBits2Float(0x436e6f43), SkBits2Float(0x436775a2), SkBits2Float(0x43671cbf), SkBits2Float(0x436ec826)); // 238.435f, 231.46f, 231.112f, 238.782f +path.quadTo(SkBits2Float(0x435fca3a), SkBits2Float(0x43761aaa), SkBits2Float(0x43556f43), SkBits2Float(0x43761aaa)); // 223.79f, 246.104f, 213.435f, 246.104f +path.quadTo(SkBits2Float(0x434b144c), SkBits2Float(0x43761aaa), SkBits2Float(0x4343c1c7), SkBits2Float(0x436ec826)); // 203.079f, 246.104f, 195.757f, 238.782f +path.quadTo(SkBits2Float(0x433c6f43), SkBits2Float(0x436775a2), SkBits2Float(0x433c6f43), SkBits2Float(0x435d1aaa)); // 188.435f, 231.46f, 188.435f, 221.104f +path.quadTo(SkBits2Float(0x433c6f43), SkBits2Float(0x4352bfb2), SkBits2Float(0x4343c1c7), SkBits2Float(0x434b6d2e)); // 188.435f, 210.749f, 195.757f, 203.426f +path.quadTo(SkBits2Float(0x434b144c), SkBits2Float(0x43441aaa), SkBits2Float(0x43556f43), SkBits2Float(0x43441aaa)); // 203.079f, 196.104f, 213.435f, 196.104f +path.quadTo(SkBits2Float(0x435fca3a), SkBits2Float(0x43441aaa), SkBits2Float(0x43671cbf), SkBits2Float(0x434b6d2e)); // 223.79f, 196.104f, 231.112f, 203.426f +path.quadTo(SkBits2Float(0x436e6f43), SkBits2Float(0x4352bfb2), SkBits2Float(0x436e6f43), SkBits2Float(0x435d1aaa)); // 238.435f, 210.749f, 238.435f, 221.104f +path.close(); + SkPath path114(path); + builder.add(path114, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43699f20), SkBits2Float(0x43b74967)); // 233.622f, 366.573f +path.quadTo(SkBits2Float(0x43699f20), SkBits2Float(0x43bc76e3), SkBits2Float(0x43624c9c), SkBits2Float(0x43c02025)); // 233.622f, 376.929f, 226.299f, 384.251f +path.quadTo(SkBits2Float(0x435afa18), SkBits2Float(0x43c3c967), SkBits2Float(0x43509f20), SkBits2Float(0x43c3c967)); // 218.977f, 391.573f, 208.622f, 391.573f +path.quadTo(SkBits2Float(0x43464428), SkBits2Float(0x43c3c967), SkBits2Float(0x433ef1a4), SkBits2Float(0x43c02025)); // 198.266f, 391.573f, 190.944f, 384.251f +path.quadTo(SkBits2Float(0x43379f20), SkBits2Float(0x43bc76e3), SkBits2Float(0x43379f20), SkBits2Float(0x43b74967)); // 183.622f, 376.929f, 183.622f, 366.573f +path.quadTo(SkBits2Float(0x43379f20), SkBits2Float(0x43b21beb), SkBits2Float(0x433ef1a4), SkBits2Float(0x43ae72a9)); // 183.622f, 356.218f, 190.944f, 348.896f +path.quadTo(SkBits2Float(0x43464428), SkBits2Float(0x43aac967), SkBits2Float(0x43509f20), SkBits2Float(0x43aac967)); // 198.266f, 341.573f, 208.622f, 341.573f +path.quadTo(SkBits2Float(0x435afa18), SkBits2Float(0x43aac967), SkBits2Float(0x43624c9c), SkBits2Float(0x43ae72a9)); // 218.977f, 341.573f, 226.299f, 348.896f +path.quadTo(SkBits2Float(0x43699f20), SkBits2Float(0x43b21beb), SkBits2Float(0x43699f20), SkBits2Float(0x43b74967)); // 233.622f, 356.218f, 233.622f, 366.573f +path.close(); + SkPath path115(path); + builder.add(path115, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4372b5ce), SkBits2Float(0x434919ea)); // 242.71f, 201.101f +path.quadTo(SkBits2Float(0x4372b5ce), SkBits2Float(0x435374e2), SkBits2Float(0x436b634a), SkBits2Float(0x435ac766)); // 242.71f, 211.457f, 235.388f, 218.779f +path.quadTo(SkBits2Float(0x436410c6), SkBits2Float(0x436219ea), SkBits2Float(0x4359b5ce), SkBits2Float(0x436219ea)); // 228.066f, 226.101f, 217.71f, 226.101f +path.quadTo(SkBits2Float(0x434f5ad6), SkBits2Float(0x436219ea), SkBits2Float(0x43480852), SkBits2Float(0x435ac766)); // 207.355f, 226.101f, 200.033f, 218.779f +path.quadTo(SkBits2Float(0x4340b5ce), SkBits2Float(0x435374e2), SkBits2Float(0x4340b5ce), SkBits2Float(0x434919ea)); // 192.71f, 211.457f, 192.71f, 201.101f +path.quadTo(SkBits2Float(0x4340b5ce), SkBits2Float(0x433ebef2), SkBits2Float(0x43480852), SkBits2Float(0x43376c6e)); // 192.71f, 190.746f, 200.033f, 183.424f +path.quadTo(SkBits2Float(0x434f5ad6), SkBits2Float(0x433019ea), SkBits2Float(0x4359b5ce), SkBits2Float(0x433019ea)); // 207.355f, 176.101f, 217.71f, 176.101f +path.quadTo(SkBits2Float(0x436410c6), SkBits2Float(0x433019ea), SkBits2Float(0x436b634a), SkBits2Float(0x43376c6e)); // 228.066f, 176.101f, 235.388f, 183.424f +path.quadTo(SkBits2Float(0x4372b5ce), SkBits2Float(0x433ebef2), SkBits2Float(0x4372b5ce), SkBits2Float(0x434919ea)); // 242.71f, 190.746f, 242.71f, 201.101f +path.close(); + SkPath path116(path); + builder.add(path116, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43212033), SkBits2Float(0x433c0771)); // 161.126f, 188.029f +path.quadTo(SkBits2Float(0x43212033), SkBits2Float(0x43466268), SkBits2Float(0x4319cdaf), SkBits2Float(0x434db4ed)); // 161.126f, 198.384f, 153.803f, 205.707f +path.quadTo(SkBits2Float(0x43127b2a), SkBits2Float(0x43550771), SkBits2Float(0x43082033), SkBits2Float(0x43550771)); // 146.481f, 213.029f, 136.126f, 213.029f +path.quadTo(SkBits2Float(0x42fb8a77), SkBits2Float(0x43550771), SkBits2Float(0x42ece56e), SkBits2Float(0x434db4ed)); // 125.77f, 213.029f, 118.448f, 205.707f +path.quadTo(SkBits2Float(0x42de4066), SkBits2Float(0x43466268), SkBits2Float(0x42de4066), SkBits2Float(0x433c0771)); // 111.126f, 198.384f, 111.126f, 188.029f +path.quadTo(SkBits2Float(0x42de4066), SkBits2Float(0x4331ac7a), SkBits2Float(0x42ece56e), SkBits2Float(0x432a59f5)); // 111.126f, 177.674f, 118.448f, 170.351f +path.quadTo(SkBits2Float(0x42fb8a77), SkBits2Float(0x43230771), SkBits2Float(0x43082033), SkBits2Float(0x43230771)); // 125.77f, 163.029f, 136.126f, 163.029f +path.quadTo(SkBits2Float(0x43127b2a), SkBits2Float(0x43230771), SkBits2Float(0x4319cdaf), SkBits2Float(0x432a59f5)); // 146.481f, 163.029f, 153.803f, 170.351f +path.quadTo(SkBits2Float(0x43212033), SkBits2Float(0x4331ac7a), SkBits2Float(0x43212033), SkBits2Float(0x433c0771)); // 161.126f, 177.674f, 161.126f, 188.029f +path.close(); + SkPath path117(path); + builder.add(path117, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x434d1191), SkBits2Float(0x431c5cdf)); // 205.069f, 156.363f +path.quadTo(SkBits2Float(0x434d1191), SkBits2Float(0x4326b7d6), SkBits2Float(0x4345bf0d), SkBits2Float(0x432e0a5b)); // 205.069f, 166.718f, 197.746f, 174.04f +path.quadTo(SkBits2Float(0x433e6c88), SkBits2Float(0x43355cdf), SkBits2Float(0x43341191), SkBits2Float(0x43355cdf)); // 190.424f, 181.363f, 180.069f, 181.363f +path.quadTo(SkBits2Float(0x4329b69a), SkBits2Float(0x43355cdf), SkBits2Float(0x43226415), SkBits2Float(0x432e0a5b)); // 169.713f, 181.363f, 162.391f, 174.04f +path.quadTo(SkBits2Float(0x431b1191), SkBits2Float(0x4326b7d6), SkBits2Float(0x431b1191), SkBits2Float(0x431c5cdf)); // 155.069f, 166.718f, 155.069f, 156.363f +path.quadTo(SkBits2Float(0x431b1191), SkBits2Float(0x431201e8), SkBits2Float(0x43226415), SkBits2Float(0x430aaf63)); // 155.069f, 146.007f, 162.391f, 138.685f +path.quadTo(SkBits2Float(0x4329b69a), SkBits2Float(0x43035cdf), SkBits2Float(0x43341191), SkBits2Float(0x43035cdf)); // 169.713f, 131.363f, 180.069f, 131.363f +path.quadTo(SkBits2Float(0x433e6c88), SkBits2Float(0x43035cdf), SkBits2Float(0x4345bf0d), SkBits2Float(0x430aaf63)); // 190.424f, 131.363f, 197.746f, 138.685f +path.quadTo(SkBits2Float(0x434d1191), SkBits2Float(0x431201e8), SkBits2Float(0x434d1191), SkBits2Float(0x431c5cdf)); // 205.069f, 146.007f, 205.069f, 156.363f +path.close(); + SkPath path118(path); + builder.add(path118, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43f7761c), SkBits2Float(0x43ba1964)); // 494.923f, 372.198f +path.quadTo(SkBits2Float(0x43f7761c), SkBits2Float(0x43bf46e0), SkBits2Float(0x43f3ccda), SkBits2Float(0x43c2f022)); // 494.923f, 382.554f, 487.6f, 389.876f +path.quadTo(SkBits2Float(0x43f02398), SkBits2Float(0x43c69964), SkBits2Float(0x43eaf61c), SkBits2Float(0x43c69964)); // 480.278f, 397.198f, 469.923f, 397.198f +path.quadTo(SkBits2Float(0x43e5c8a0), SkBits2Float(0x43c69964), SkBits2Float(0x43e21f5e), SkBits2Float(0x43c2f022)); // 459.567f, 397.198f, 452.245f, 389.876f +path.quadTo(SkBits2Float(0x43de761c), SkBits2Float(0x43bf46e0), SkBits2Float(0x43de761c), SkBits2Float(0x43ba1964)); // 444.923f, 382.554f, 444.923f, 372.198f +path.quadTo(SkBits2Float(0x43de761c), SkBits2Float(0x43b4ebe8), SkBits2Float(0x43e21f5e), SkBits2Float(0x43b142a6)); // 444.923f, 361.843f, 452.245f, 354.521f +path.quadTo(SkBits2Float(0x43e5c8a0), SkBits2Float(0x43ad9964), SkBits2Float(0x43eaf61c), SkBits2Float(0x43ad9964)); // 459.567f, 347.198f, 469.923f, 347.198f +path.quadTo(SkBits2Float(0x43f02398), SkBits2Float(0x43ad9964), SkBits2Float(0x43f3ccda), SkBits2Float(0x43b142a6)); // 480.278f, 347.198f, 487.6f, 354.521f +path.quadTo(SkBits2Float(0x43f7761c), SkBits2Float(0x43b4ebe8), SkBits2Float(0x43f7761c), SkBits2Float(0x43ba1964)); // 494.923f, 361.843f, 494.923f, 372.198f +path.close(); + SkPath path119(path); + builder.add(path119, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4387b4f4), SkBits2Float(0x4382767e)); // 271.414f, 260.926f +path.quadTo(SkBits2Float(0x4387b4f4), SkBits2Float(0x4387a3fa), SkBits2Float(0x43840bb2), SkBits2Float(0x438b4d3c)); // 271.414f, 271.281f, 264.091f, 278.603f +path.quadTo(SkBits2Float(0x43806270), SkBits2Float(0x438ef67e), SkBits2Float(0x437669e8), SkBits2Float(0x438ef67e)); // 256.769f, 285.926f, 246.414f, 285.926f +path.quadTo(SkBits2Float(0x436c0ef1), SkBits2Float(0x438ef67e), SkBits2Float(0x4364bc6d), SkBits2Float(0x438b4d3c)); // 236.058f, 285.926f, 228.736f, 278.603f +path.quadTo(SkBits2Float(0x435d69e9), SkBits2Float(0x4387a3fa), SkBits2Float(0x435d69e9), SkBits2Float(0x4382767e)); // 221.414f, 271.281f, 221.414f, 260.926f +path.quadTo(SkBits2Float(0x435d69e9), SkBits2Float(0x437a9204), SkBits2Float(0x4364bc6d), SkBits2Float(0x43733f80)); // 221.414f, 250.57f, 228.736f, 243.248f +path.quadTo(SkBits2Float(0x436c0ef1), SkBits2Float(0x436becfc), SkBits2Float(0x437669e8), SkBits2Float(0x436becfc)); // 236.058f, 235.926f, 246.414f, 235.926f +path.quadTo(SkBits2Float(0x43806270), SkBits2Float(0x436becfc), SkBits2Float(0x43840bb2), SkBits2Float(0x43733f80)); // 256.769f, 235.926f, 264.091f, 243.248f +path.quadTo(SkBits2Float(0x4387b4f4), SkBits2Float(0x437a9204), SkBits2Float(0x4387b4f4), SkBits2Float(0x4382767e)); // 271.414f, 250.57f, 271.414f, 260.926f +path.close(); + SkPath path120(path); + builder.add(path120, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43f176b1), SkBits2Float(0x437ef3b8)); // 482.927f, 254.952f +path.quadTo(SkBits2Float(0x43f176b1), SkBits2Float(0x4384a758), SkBits2Float(0x43edcd6f), SkBits2Float(0x4388509a)); // 482.927f, 265.307f, 475.605f, 272.63f +path.quadTo(SkBits2Float(0x43ea242d), SkBits2Float(0x438bf9dc), SkBits2Float(0x43e4f6b1), SkBits2Float(0x438bf9dc)); // 468.283f, 279.952f, 457.927f, 279.952f +path.quadTo(SkBits2Float(0x43dfc935), SkBits2Float(0x438bf9dc), SkBits2Float(0x43dc1ff3), SkBits2Float(0x4388509a)); // 447.572f, 279.952f, 440.25f, 272.63f +path.quadTo(SkBits2Float(0x43d876b1), SkBits2Float(0x4384a758), SkBits2Float(0x43d876b1), SkBits2Float(0x437ef3b8)); // 432.927f, 265.307f, 432.927f, 254.952f +path.quadTo(SkBits2Float(0x43d876b1), SkBits2Float(0x437498c0), SkBits2Float(0x43dc1ff3), SkBits2Float(0x436d463c)); // 432.927f, 244.597f, 440.25f, 237.274f +path.quadTo(SkBits2Float(0x43dfc935), SkBits2Float(0x4365f3b8), SkBits2Float(0x43e4f6b1), SkBits2Float(0x4365f3b8)); // 447.572f, 229.952f, 457.927f, 229.952f +path.quadTo(SkBits2Float(0x43ea242d), SkBits2Float(0x4365f3b8), SkBits2Float(0x43edcd6f), SkBits2Float(0x436d463c)); // 468.283f, 229.952f, 475.605f, 237.274f +path.quadTo(SkBits2Float(0x43f176b1), SkBits2Float(0x437498c0), SkBits2Float(0x43f176b1), SkBits2Float(0x437ef3b8)); // 482.927f, 244.597f, 482.927f, 254.952f +path.close(); + SkPath path121(path); + builder.add(path121, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x437bd45b), SkBits2Float(0x4361cf52)); // 251.83f, 225.81f +path.quadTo(SkBits2Float(0x437bd45b), SkBits2Float(0x436c2a4a), SkBits2Float(0x437481d7), SkBits2Float(0x43737cce)); // 251.83f, 236.165f, 244.507f, 243.488f +path.quadTo(SkBits2Float(0x436d2f52), SkBits2Float(0x437acf52), SkBits2Float(0x4362d45b), SkBits2Float(0x437acf52)); // 237.185f, 250.81f, 226.83f, 250.81f +path.quadTo(SkBits2Float(0x43587964), SkBits2Float(0x437acf52), SkBits2Float(0x435126df), SkBits2Float(0x43737cce)); // 216.474f, 250.81f, 209.152f, 243.488f +path.quadTo(SkBits2Float(0x4349d45b), SkBits2Float(0x436c2a4a), SkBits2Float(0x4349d45b), SkBits2Float(0x4361cf52)); // 201.83f, 236.165f, 201.83f, 225.81f +path.quadTo(SkBits2Float(0x4349d45b), SkBits2Float(0x4357745a), SkBits2Float(0x435126df), SkBits2Float(0x435021d6)); // 201.83f, 215.454f, 209.152f, 208.132f +path.quadTo(SkBits2Float(0x43587964), SkBits2Float(0x4348cf52), SkBits2Float(0x4362d45b), SkBits2Float(0x4348cf52)); // 216.474f, 200.81f, 226.83f, 200.81f +path.quadTo(SkBits2Float(0x436d2f52), SkBits2Float(0x4348cf52), SkBits2Float(0x437481d7), SkBits2Float(0x435021d6)); // 237.185f, 200.81f, 244.507f, 208.132f +path.quadTo(SkBits2Float(0x437bd45b), SkBits2Float(0x4357745a), SkBits2Float(0x437bd45b), SkBits2Float(0x4361cf52)); // 251.83f, 215.454f, 251.83f, 225.81f +path.close(); + SkPath path122(path); + builder.add(path122, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43bb783c), SkBits2Float(0x43d20000)); // 374.939f, 420 +path.quadTo(SkBits2Float(0x43bb783c), SkBits2Float(0x43d72d7c), SkBits2Float(0x43b7cefa), SkBits2Float(0x43dad6be)); // 374.939f, 430.355f, 367.617f, 437.678f +path.quadTo(SkBits2Float(0x43b425b8), SkBits2Float(0x43de8000), SkBits2Float(0x43aef83c), SkBits2Float(0x43de8000)); // 360.295f, 445, 349.939f, 445 +path.quadTo(SkBits2Float(0x43a9cac0), SkBits2Float(0x43de8000), SkBits2Float(0x43a6217e), SkBits2Float(0x43dad6be)); // 339.584f, 445, 332.262f, 437.678f +path.quadTo(SkBits2Float(0x43a2783c), SkBits2Float(0x43d72d7c), SkBits2Float(0x43a2783c), SkBits2Float(0x43d20000)); // 324.939f, 430.355f, 324.939f, 420 +path.quadTo(SkBits2Float(0x43a2783c), SkBits2Float(0x43ccd284), SkBits2Float(0x43a6217e), SkBits2Float(0x43c92942)); // 324.939f, 409.645f, 332.262f, 402.322f +path.quadTo(SkBits2Float(0x43a9cac0), SkBits2Float(0x43c58000), SkBits2Float(0x43aef83c), SkBits2Float(0x43c58000)); // 339.584f, 395, 349.939f, 395 +path.quadTo(SkBits2Float(0x43b425b8), SkBits2Float(0x43c58000), SkBits2Float(0x43b7cefa), SkBits2Float(0x43c92942)); // 360.295f, 395, 367.617f, 402.322f +path.quadTo(SkBits2Float(0x43bb783c), SkBits2Float(0x43ccd284), SkBits2Float(0x43bb783c), SkBits2Float(0x43d20000)); // 374.939f, 409.645f, 374.939f, 420 +path.close(); + SkPath path123(path); + builder.add(path123, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ca2436), SkBits2Float(0x435899a3)); // 404.283f, 216.6f +path.quadTo(SkBits2Float(0x43ca2436), SkBits2Float(0x4362f49a), SkBits2Float(0x43c67af4), SkBits2Float(0x436a471f)); // 404.283f, 226.955f, 396.961f, 234.278f +path.quadTo(SkBits2Float(0x43c2d1b2), SkBits2Float(0x437199a3), SkBits2Float(0x43bda436), SkBits2Float(0x437199a3)); // 389.638f, 241.6f, 379.283f, 241.6f +path.quadTo(SkBits2Float(0x43b876ba), SkBits2Float(0x437199a3), SkBits2Float(0x43b4cd78), SkBits2Float(0x436a471f)); // 368.928f, 241.6f, 361.605f, 234.278f +path.quadTo(SkBits2Float(0x43b12436), SkBits2Float(0x4362f49a), SkBits2Float(0x43b12436), SkBits2Float(0x435899a3)); // 354.283f, 226.955f, 354.283f, 216.6f +path.quadTo(SkBits2Float(0x43b12436), SkBits2Float(0x434e3eac), SkBits2Float(0x43b4cd78), SkBits2Float(0x4346ec27)); // 354.283f, 206.245f, 361.605f, 198.922f +path.quadTo(SkBits2Float(0x43b876ba), SkBits2Float(0x433f99a3), SkBits2Float(0x43bda436), SkBits2Float(0x433f99a3)); // 368.928f, 191.6f, 379.283f, 191.6f +path.quadTo(SkBits2Float(0x43c2d1b2), SkBits2Float(0x433f99a3), SkBits2Float(0x43c67af4), SkBits2Float(0x4346ec27)); // 389.638f, 191.6f, 396.961f, 198.922f +path.quadTo(SkBits2Float(0x43ca2436), SkBits2Float(0x434e3eac), SkBits2Float(0x43ca2436), SkBits2Float(0x435899a3)); // 404.283f, 206.245f, 404.283f, 216.6f +path.close(); + SkPath path124(path); + builder.add(path124, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x440faed8), SkBits2Float(0x43474968)); // 574.732f, 199.287f +path.quadTo(SkBits2Float(0x440faed8), SkBits2Float(0x4351a460), SkBits2Float(0x440dda37), SkBits2Float(0x4358f6e4)); // 574.732f, 209.642f, 567.41f, 216.964f +path.quadTo(SkBits2Float(0x440c0596), SkBits2Float(0x43604968), SkBits2Float(0x44096ed8), SkBits2Float(0x43604968)); // 560.087f, 224.287f, 549.732f, 224.287f +path.quadTo(SkBits2Float(0x4406d81a), SkBits2Float(0x43604968), SkBits2Float(0x44050379), SkBits2Float(0x4358f6e4)); // 539.377f, 224.287f, 532.054f, 216.964f +path.quadTo(SkBits2Float(0x44032ed8), SkBits2Float(0x4351a460), SkBits2Float(0x44032ed8), SkBits2Float(0x43474968)); // 524.732f, 209.642f, 524.732f, 199.287f +path.quadTo(SkBits2Float(0x44032ed8), SkBits2Float(0x433cee70), SkBits2Float(0x44050379), SkBits2Float(0x43359bec)); // 524.732f, 188.931f, 532.054f, 181.609f +path.quadTo(SkBits2Float(0x4406d81a), SkBits2Float(0x432e4968), SkBits2Float(0x44096ed8), SkBits2Float(0x432e4968)); // 539.377f, 174.287f, 549.732f, 174.287f +path.quadTo(SkBits2Float(0x440c0596), SkBits2Float(0x432e4968), SkBits2Float(0x440dda37), SkBits2Float(0x43359bec)); // 560.087f, 174.287f, 567.41f, 181.609f +path.quadTo(SkBits2Float(0x440faed8), SkBits2Float(0x433cee70), SkBits2Float(0x440faed8), SkBits2Float(0x43474968)); // 574.732f, 188.931f, 574.732f, 199.287f +path.close(); + SkPath path125(path); + builder.add(path125, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x437055b3), SkBits2Float(0x438ae764)); // 240.335f, 277.808f +path.quadTo(SkBits2Float(0x437055b3), SkBits2Float(0x439014e0), SkBits2Float(0x4369032f), SkBits2Float(0x4393be22)); // 240.335f, 288.163f, 233.012f, 295.485f +path.quadTo(SkBits2Float(0x4361b0aa), SkBits2Float(0x43976764), SkBits2Float(0x435755b3), SkBits2Float(0x43976764)); // 225.69f, 302.808f, 215.335f, 302.808f +path.quadTo(SkBits2Float(0x434cfabc), SkBits2Float(0x43976764), SkBits2Float(0x4345a837), SkBits2Float(0x4393be22)); // 204.979f, 302.808f, 197.657f, 295.485f +path.quadTo(SkBits2Float(0x433e55b3), SkBits2Float(0x439014e0), SkBits2Float(0x433e55b3), SkBits2Float(0x438ae764)); // 190.335f, 288.163f, 190.335f, 277.808f +path.quadTo(SkBits2Float(0x433e55b3), SkBits2Float(0x4385b9e8), SkBits2Float(0x4345a837), SkBits2Float(0x438210a6)); // 190.335f, 267.452f, 197.657f, 260.13f +path.quadTo(SkBits2Float(0x434cfabc), SkBits2Float(0x437ccec8), SkBits2Float(0x435755b3), SkBits2Float(0x437ccec8)); // 204.979f, 252.808f, 215.335f, 252.808f +path.quadTo(SkBits2Float(0x4361b0aa), SkBits2Float(0x437ccec8), SkBits2Float(0x4369032f), SkBits2Float(0x438210a6)); // 225.69f, 252.808f, 233.012f, 260.13f +path.quadTo(SkBits2Float(0x437055b3), SkBits2Float(0x4385b9e8), SkBits2Float(0x437055b3), SkBits2Float(0x438ae764)); // 240.335f, 267.452f, 240.335f, 277.808f +path.close(); + SkPath path126(path); + builder.add(path126, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a201c9), SkBits2Float(0x43546e88)); // 324.014f, 212.432f +path.quadTo(SkBits2Float(0x43a201c9), SkBits2Float(0x435ec980), SkBits2Float(0x439e5887), SkBits2Float(0x43661c04)); // 324.014f, 222.787f, 316.692f, 230.109f +path.quadTo(SkBits2Float(0x439aaf45), SkBits2Float(0x436d6e88), SkBits2Float(0x439581c9), SkBits2Float(0x436d6e88)); // 309.369f, 237.432f, 299.014f, 237.432f +path.quadTo(SkBits2Float(0x4390544d), SkBits2Float(0x436d6e88), SkBits2Float(0x438cab0b), SkBits2Float(0x43661c04)); // 288.659f, 237.432f, 281.336f, 230.109f +path.quadTo(SkBits2Float(0x438901c9), SkBits2Float(0x435ec980), SkBits2Float(0x438901c9), SkBits2Float(0x43546e88)); // 274.014f, 222.787f, 274.014f, 212.432f +path.quadTo(SkBits2Float(0x438901c9), SkBits2Float(0x434a1390), SkBits2Float(0x438cab0b), SkBits2Float(0x4342c10c)); // 274.014f, 202.076f, 281.336f, 194.754f +path.quadTo(SkBits2Float(0x4390544d), SkBits2Float(0x433b6e88), SkBits2Float(0x439581c9), SkBits2Float(0x433b6e88)); // 288.659f, 187.432f, 299.014f, 187.432f +path.quadTo(SkBits2Float(0x439aaf45), SkBits2Float(0x433b6e88), SkBits2Float(0x439e5887), SkBits2Float(0x4342c10c)); // 309.369f, 187.432f, 316.692f, 194.754f +path.quadTo(SkBits2Float(0x43a201c9), SkBits2Float(0x434a1390), SkBits2Float(0x43a201c9), SkBits2Float(0x43546e88)); // 324.014f, 202.076f, 324.014f, 212.432f +path.close(); + SkPath path127(path); + builder.add(path127, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42d10265), SkBits2Float(0x434da766)); // 104.505f, 205.654f +path.quadTo(SkBits2Float(0x42d10265), SkBits2Float(0x4358025e), SkBits2Float(0x42c25d5c), SkBits2Float(0x435f54e2)); // 104.505f, 216.009f, 97.1823f, 223.332f +path.quadTo(SkBits2Float(0x42b3b854), SkBits2Float(0x4366a766), SkBits2Float(0x429f0265), SkBits2Float(0x4366a766)); // 89.86f, 230.654f, 79.5047f, 230.654f +path.quadTo(SkBits2Float(0x428a4c76), SkBits2Float(0x4366a766), SkBits2Float(0x42774edb), SkBits2Float(0x435f54e2)); // 69.1493f, 230.654f, 61.827f, 223.332f +path.quadTo(SkBits2Float(0x425a04ca), SkBits2Float(0x4358025e), SkBits2Float(0x425a04ca), SkBits2Float(0x434da766)); // 54.5047f, 216.009f, 54.5047f, 205.654f +path.quadTo(SkBits2Float(0x425a04ca), SkBits2Float(0x43434c6e), SkBits2Float(0x42774edb), SkBits2Float(0x433bf9ea)); // 54.5047f, 195.299f, 61.827f, 187.976f +path.quadTo(SkBits2Float(0x428a4c76), SkBits2Float(0x4334a766), SkBits2Float(0x429f0265), SkBits2Float(0x4334a766)); // 69.1493f, 180.654f, 79.5047f, 180.654f +path.quadTo(SkBits2Float(0x42b3b854), SkBits2Float(0x4334a766), SkBits2Float(0x42c25d5c), SkBits2Float(0x433bf9ea)); // 89.86f, 180.654f, 97.1823f, 187.976f +path.quadTo(SkBits2Float(0x42d10265), SkBits2Float(0x43434c6e), SkBits2Float(0x42d10265), SkBits2Float(0x434da766)); // 104.505f, 195.299f, 104.505f, 205.654f +path.close(); + SkPath path128(path); + builder.add(path128, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4396e5f4), SkBits2Float(0x432540f2)); // 301.797f, 165.254f +path.quadTo(SkBits2Float(0x4396e5f4), SkBits2Float(0x432f9bea), SkBits2Float(0x43933cb2), SkBits2Float(0x4336ee6e)); // 301.797f, 175.609f, 294.474f, 182.931f +path.quadTo(SkBits2Float(0x438f9370), SkBits2Float(0x433e40f2), SkBits2Float(0x438a65f4), SkBits2Float(0x433e40f2)); // 287.152f, 190.254f, 276.797f, 190.254f +path.quadTo(SkBits2Float(0x43853878), SkBits2Float(0x433e40f2), SkBits2Float(0x43818f36), SkBits2Float(0x4336ee6e)); // 266.441f, 190.254f, 259.119f, 182.931f +path.quadTo(SkBits2Float(0x437bcbe8), SkBits2Float(0x432f9bea), SkBits2Float(0x437bcbe8), SkBits2Float(0x432540f2)); // 251.797f, 175.609f, 251.797f, 165.254f +path.quadTo(SkBits2Float(0x437bcbe8), SkBits2Float(0x431ae5fa), SkBits2Float(0x43818f36), SkBits2Float(0x43139376)); // 251.797f, 154.898f, 259.119f, 147.576f +path.quadTo(SkBits2Float(0x43853878), SkBits2Float(0x430c40f2), SkBits2Float(0x438a65f4), SkBits2Float(0x430c40f2)); // 266.441f, 140.254f, 276.797f, 140.254f +path.quadTo(SkBits2Float(0x438f9370), SkBits2Float(0x430c40f2), SkBits2Float(0x43933cb2), SkBits2Float(0x43139376)); // 287.152f, 140.254f, 294.474f, 147.576f +path.quadTo(SkBits2Float(0x4396e5f4), SkBits2Float(0x431ae5fa), SkBits2Float(0x4396e5f4), SkBits2Float(0x432540f2)); // 301.797f, 154.898f, 301.797f, 165.254f +path.close(); + SkPath path129(path); + builder.add(path129, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43759ab0), SkBits2Float(0x43329c4b)); // 245.604f, 178.611f +path.quadTo(SkBits2Float(0x43759ab0), SkBits2Float(0x433cf742), SkBits2Float(0x436e482c), SkBits2Float(0x434449c7)); // 245.604f, 188.966f, 238.282f, 196.288f +path.quadTo(SkBits2Float(0x4366f5a8), SkBits2Float(0x434b9c4b), SkBits2Float(0x435c9ab0), SkBits2Float(0x434b9c4b)); // 230.96f, 203.611f, 220.604f, 203.611f +path.quadTo(SkBits2Float(0x43523fb8), SkBits2Float(0x434b9c4b), SkBits2Float(0x434aed34), SkBits2Float(0x434449c7)); // 210.249f, 203.611f, 202.927f, 196.288f +path.quadTo(SkBits2Float(0x43439ab0), SkBits2Float(0x433cf742), SkBits2Float(0x43439ab0), SkBits2Float(0x43329c4b)); // 195.604f, 188.966f, 195.604f, 178.611f +path.quadTo(SkBits2Float(0x43439ab0), SkBits2Float(0x43284154), SkBits2Float(0x434aed34), SkBits2Float(0x4320eecf)); // 195.604f, 168.255f, 202.927f, 160.933f +path.quadTo(SkBits2Float(0x43523fb8), SkBits2Float(0x43199c4b), SkBits2Float(0x435c9ab0), SkBits2Float(0x43199c4b)); // 210.249f, 153.611f, 220.604f, 153.611f +path.quadTo(SkBits2Float(0x4366f5a8), SkBits2Float(0x43199c4b), SkBits2Float(0x436e482c), SkBits2Float(0x4320eecf)); // 230.96f, 153.611f, 238.282f, 160.933f +path.quadTo(SkBits2Float(0x43759ab0), SkBits2Float(0x43284154), SkBits2Float(0x43759ab0), SkBits2Float(0x43329c4b)); // 245.604f, 168.255f, 245.604f, 178.611f +path.close(); + SkPath path130(path); + builder.add(path130, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43a6e3cc), SkBits2Float(0x43954ede)); // 333.78f, 298.616f +path.quadTo(SkBits2Float(0x43a6e3cc), SkBits2Float(0x439a7c5a), SkBits2Float(0x43a33a8a), SkBits2Float(0x439e259c)); // 333.78f, 308.971f, 326.457f, 316.294f +path.quadTo(SkBits2Float(0x439f9148), SkBits2Float(0x43a1cede), SkBits2Float(0x439a63cc), SkBits2Float(0x43a1cede)); // 319.135f, 323.616f, 308.78f, 323.616f +path.quadTo(SkBits2Float(0x43953650), SkBits2Float(0x43a1cede), SkBits2Float(0x43918d0e), SkBits2Float(0x439e259c)); // 298.424f, 323.616f, 291.102f, 316.294f +path.quadTo(SkBits2Float(0x438de3cc), SkBits2Float(0x439a7c5a), SkBits2Float(0x438de3cc), SkBits2Float(0x43954ede)); // 283.78f, 308.971f, 283.78f, 298.616f +path.quadTo(SkBits2Float(0x438de3cc), SkBits2Float(0x43902162), SkBits2Float(0x43918d0e), SkBits2Float(0x438c7820)); // 283.78f, 288.261f, 291.102f, 280.938f +path.quadTo(SkBits2Float(0x43953650), SkBits2Float(0x4388cede), SkBits2Float(0x439a63cc), SkBits2Float(0x4388cede)); // 298.424f, 273.616f, 308.78f, 273.616f +path.quadTo(SkBits2Float(0x439f9148), SkBits2Float(0x4388cede), SkBits2Float(0x43a33a8a), SkBits2Float(0x438c7820)); // 319.135f, 273.616f, 326.457f, 280.938f +path.quadTo(SkBits2Float(0x43a6e3cc), SkBits2Float(0x43902162), SkBits2Float(0x43a6e3cc), SkBits2Float(0x43954ede)); // 333.78f, 288.261f, 333.78f, 298.616f +path.close(); + SkPath path131(path); + builder.add(path131, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x428e400e), SkBits2Float(0x43a02b61)); // 71.1251f, 320.339f +path.quadTo(SkBits2Float(0x428e400e), SkBits2Float(0x43a558dd), SkBits2Float(0x427f360c), SkBits2Float(0x43a9021f)); // 71.1251f, 330.694f, 63.8028f, 338.017f +path.quadTo(SkBits2Float(0x4261ebfa), SkBits2Float(0x43acab61), SkBits2Float(0x4238801c), SkBits2Float(0x43acab61)); // 56.4804f, 345.339f, 46.1251f, 345.339f +path.quadTo(SkBits2Float(0x420f143e), SkBits2Float(0x43acab61), SkBits2Float(0x41e39459), SkBits2Float(0x43a9021f)); // 35.7698f, 345.339f, 28.4474f, 338.017f +path.quadTo(SkBits2Float(0x41a90036), SkBits2Float(0x43a558dd), SkBits2Float(0x41a90036), SkBits2Float(0x43a02b61)); // 21.1251f, 330.694f, 21.1251f, 320.339f +path.quadTo(SkBits2Float(0x41a90036), SkBits2Float(0x439afde5), SkBits2Float(0x41e39459), SkBits2Float(0x439754a3)); // 21.1251f, 309.984f, 28.4474f, 302.661f +path.quadTo(SkBits2Float(0x420f143e), SkBits2Float(0x4393ab61), SkBits2Float(0x4238801c), SkBits2Float(0x4393ab61)); // 35.7698f, 295.339f, 46.1251f, 295.339f +path.quadTo(SkBits2Float(0x4261ebfa), SkBits2Float(0x4393ab61), SkBits2Float(0x427f360c), SkBits2Float(0x439754a3)); // 56.4804f, 295.339f, 63.8028f, 302.661f +path.quadTo(SkBits2Float(0x428e400e), SkBits2Float(0x439afde5), SkBits2Float(0x428e400e), SkBits2Float(0x43a02b61)); // 71.1251f, 309.984f, 71.1251f, 320.339f +path.close(); + SkPath path132(path); + builder.add(path132, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4323b27c), SkBits2Float(0x4379f49c)); // 163.697f, 249.956f +path.quadTo(SkBits2Float(0x4323b27c), SkBits2Float(0x438227ca), SkBits2Float(0x431c5ff8), SkBits2Float(0x4385d10c)); // 163.697f, 260.311f, 156.375f, 267.633f +path.quadTo(SkBits2Float(0x43150d74), SkBits2Float(0x43897a4e), SkBits2Float(0x430ab27c), SkBits2Float(0x43897a4e)); // 149.053f, 274.956f, 138.697f, 274.956f +path.quadTo(SkBits2Float(0x43005784), SkBits2Float(0x43897a4e), SkBits2Float(0x42f20a00), SkBits2Float(0x4385d10c)); // 128.342f, 274.956f, 121.02f, 267.633f +path.quadTo(SkBits2Float(0x42e364f8), SkBits2Float(0x438227ca), SkBits2Float(0x42e364f8), SkBits2Float(0x4379f49c)); // 113.697f, 260.311f, 113.697f, 249.956f +path.quadTo(SkBits2Float(0x42e364f8), SkBits2Float(0x436f99a4), SkBits2Float(0x42f20a00), SkBits2Float(0x43684720)); // 113.697f, 239.6f, 121.02f, 232.278f +path.quadTo(SkBits2Float(0x43005784), SkBits2Float(0x4360f49c), SkBits2Float(0x430ab27c), SkBits2Float(0x4360f49c)); // 128.342f, 224.956f, 138.697f, 224.956f +path.quadTo(SkBits2Float(0x43150d74), SkBits2Float(0x4360f49c), SkBits2Float(0x431c5ff8), SkBits2Float(0x43684720)); // 149.053f, 224.956f, 156.375f, 232.278f +path.quadTo(SkBits2Float(0x4323b27c), SkBits2Float(0x436f99a4), SkBits2Float(0x4323b27c), SkBits2Float(0x4379f49c)); // 163.697f, 239.6f, 163.697f, 249.956f +path.close(); + SkPath path133(path); + builder.add(path133, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43629af6), SkBits2Float(0x434de1f1)); // 226.605f, 205.883f +path.quadTo(SkBits2Float(0x43629af6), SkBits2Float(0x43583ce8), SkBits2Float(0x435b4872), SkBits2Float(0x435f8f6d)); // 226.605f, 216.238f, 219.283f, 223.56f +path.quadTo(SkBits2Float(0x4353f5ee), SkBits2Float(0x4366e1f1), SkBits2Float(0x43499af6), SkBits2Float(0x4366e1f1)); // 211.961f, 230.883f, 201.605f, 230.883f +path.quadTo(SkBits2Float(0x433f3ffe), SkBits2Float(0x4366e1f1), SkBits2Float(0x4337ed7a), SkBits2Float(0x435f8f6d)); // 191.25f, 230.883f, 183.928f, 223.56f +path.quadTo(SkBits2Float(0x43309af6), SkBits2Float(0x43583ce8), SkBits2Float(0x43309af6), SkBits2Float(0x434de1f1)); // 176.605f, 216.238f, 176.605f, 205.883f +path.quadTo(SkBits2Float(0x43309af6), SkBits2Float(0x434386fa), SkBits2Float(0x4337ed7a), SkBits2Float(0x433c3475)); // 176.605f, 195.527f, 183.928f, 188.205f +path.quadTo(SkBits2Float(0x433f3ffe), SkBits2Float(0x4334e1f1), SkBits2Float(0x43499af6), SkBits2Float(0x4334e1f1)); // 191.25f, 180.883f, 201.605f, 180.883f +path.quadTo(SkBits2Float(0x4353f5ee), SkBits2Float(0x4334e1f1), SkBits2Float(0x435b4872), SkBits2Float(0x433c3475)); // 211.961f, 180.883f, 219.283f, 188.205f +path.quadTo(SkBits2Float(0x43629af6), SkBits2Float(0x434386fa), SkBits2Float(0x43629af6), SkBits2Float(0x434de1f1)); // 226.605f, 195.527f, 226.605f, 205.883f +path.close(); + SkPath path134(path); + builder.add(path134, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43969933), SkBits2Float(0x00000000)); // 301.197f, 0 +path.quadTo(SkBits2Float(0x43969933), SkBits2Float(0x4125af78), SkBits2Float(0x4392eff1), SkBits2Float(0x418d6bde)); // 301.197f, 10.3553f, 293.875f, 17.6777f +path.quadTo(SkBits2Float(0x438f46af), SkBits2Float(0x41c80000), SkBits2Float(0x438a1933), SkBits2Float(0x41c80000)); // 286.552f, 25, 276.197f, 25 +path.quadTo(SkBits2Float(0x4384ebb7), SkBits2Float(0x41c80000), SkBits2Float(0x43814275), SkBits2Float(0x418d6bde)); // 265.842f, 25, 258.519f, 17.6777f +path.quadTo(SkBits2Float(0x437b3266), SkBits2Float(0x4125af78), SkBits2Float(0x437b3266), SkBits2Float(0x00000000)); // 251.197f, 10.3553f, 251.197f, 0 +path.quadTo(SkBits2Float(0x437b3266), SkBits2Float(0xc125af78), SkBits2Float(0x43814275), SkBits2Float(0xc18d6bde)); // 251.197f, -10.3553f, 258.519f, -17.6777f +path.quadTo(SkBits2Float(0x4384ebb7), SkBits2Float(0xc1c80000), SkBits2Float(0x438a1933), SkBits2Float(0xc1c80000)); // 265.842f, -25, 276.197f, -25 +path.quadTo(SkBits2Float(0x438f46af), SkBits2Float(0xc1c80000), SkBits2Float(0x4392eff1), SkBits2Float(0xc18d6bde)); // 286.552f, -25, 293.875f, -17.6777f +path.quadTo(SkBits2Float(0x43969933), SkBits2Float(0xc125af78), SkBits2Float(0x43969933), SkBits2Float(0x00000000)); // 301.197f, -10.3553f, 301.197f, 0 +path.close(); + SkPath path135(path); + builder.add(path135, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43310d09), SkBits2Float(0x43ab2014)); // 177.051f, 342.251f +path.quadTo(SkBits2Float(0x43310d09), SkBits2Float(0x43b04d90), SkBits2Float(0x4329ba85), SkBits2Float(0x43b3f6d2)); // 177.051f, 352.606f, 169.729f, 359.928f +path.quadTo(SkBits2Float(0x43226800), SkBits2Float(0x43b7a014), SkBits2Float(0x43180d09), SkBits2Float(0x43b7a014)); // 162.406f, 367.251f, 152.051f, 367.251f +path.quadTo(SkBits2Float(0x430db212), SkBits2Float(0x43b7a014), SkBits2Float(0x43065f8d), SkBits2Float(0x43b3f6d2)); // 141.696f, 367.251f, 134.373f, 359.928f +path.quadTo(SkBits2Float(0x42fe1a12), SkBits2Float(0x43b04d90), SkBits2Float(0x42fe1a12), SkBits2Float(0x43ab2014)); // 127.051f, 352.606f, 127.051f, 342.251f +path.quadTo(SkBits2Float(0x42fe1a12), SkBits2Float(0x43a5f298), SkBits2Float(0x43065f8d), SkBits2Float(0x43a24956)); // 127.051f, 331.895f, 134.373f, 324.573f +path.quadTo(SkBits2Float(0x430db212), SkBits2Float(0x439ea014), SkBits2Float(0x43180d09), SkBits2Float(0x439ea014)); // 141.696f, 317.251f, 152.051f, 317.251f +path.quadTo(SkBits2Float(0x43226800), SkBits2Float(0x439ea014), SkBits2Float(0x4329ba85), SkBits2Float(0x43a24956)); // 162.406f, 317.251f, 169.729f, 324.573f +path.quadTo(SkBits2Float(0x43310d09), SkBits2Float(0x43a5f298), SkBits2Float(0x43310d09), SkBits2Float(0x43ab2014)); // 177.051f, 331.895f, 177.051f, 342.251f +path.close(); + SkPath path136(path); + builder.add(path136, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43c19844), SkBits2Float(0x43818fc9)); // 387.19f, 259.123f +path.quadTo(SkBits2Float(0x43c19844), SkBits2Float(0x4386bd45), SkBits2Float(0x43bdef02), SkBits2Float(0x438a6687)); // 387.19f, 269.479f, 379.867f, 276.801f +path.quadTo(SkBits2Float(0x43ba45c0), SkBits2Float(0x438e0fc9), SkBits2Float(0x43b51844), SkBits2Float(0x438e0fc9)); // 372.545f, 284.123f, 362.19f, 284.123f +path.quadTo(SkBits2Float(0x43afeac8), SkBits2Float(0x438e0fc9), SkBits2Float(0x43ac4186), SkBits2Float(0x438a6687)); // 351.834f, 284.123f, 344.512f, 276.801f +path.quadTo(SkBits2Float(0x43a89844), SkBits2Float(0x4386bd45), SkBits2Float(0x43a89844), SkBits2Float(0x43818fc9)); // 337.19f, 269.479f, 337.19f, 259.123f +path.quadTo(SkBits2Float(0x43a89844), SkBits2Float(0x4378c49a), SkBits2Float(0x43ac4186), SkBits2Float(0x43717216)); // 337.19f, 248.768f, 344.512f, 241.446f +path.quadTo(SkBits2Float(0x43afeac8), SkBits2Float(0x436a1f92), SkBits2Float(0x43b51844), SkBits2Float(0x436a1f92)); // 351.834f, 234.123f, 362.19f, 234.123f +path.quadTo(SkBits2Float(0x43ba45c0), SkBits2Float(0x436a1f92), SkBits2Float(0x43bdef02), SkBits2Float(0x43717216)); // 372.545f, 234.123f, 379.867f, 241.446f +path.quadTo(SkBits2Float(0x43c19844), SkBits2Float(0x4378c49a), SkBits2Float(0x43c19844), SkBits2Float(0x43818fc9)); // 387.19f, 248.768f, 387.19f, 259.123f +path.close(); + SkPath path137(path); + builder.add(path137, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43565ef5), SkBits2Float(0x42de6e20)); // 214.371f, 111.215f +path.quadTo(SkBits2Float(0x43565ef5), SkBits2Float(0x42f3240f), SkBits2Float(0x434f0c71), SkBits2Float(0x4300e48c)); // 214.371f, 121.57f, 207.049f, 128.893f +path.quadTo(SkBits2Float(0x4347b9ec), SkBits2Float(0x43083710), SkBits2Float(0x433d5ef5), SkBits2Float(0x43083710)); // 199.726f, 136.215f, 189.371f, 136.215f +path.quadTo(SkBits2Float(0x433303fe), SkBits2Float(0x43083710), SkBits2Float(0x432bb179), SkBits2Float(0x4300e48c)); // 179.016f, 136.215f, 171.693f, 128.893f +path.quadTo(SkBits2Float(0x43245ef5), SkBits2Float(0x42f3240f), SkBits2Float(0x43245ef5), SkBits2Float(0x42de6e20)); // 164.371f, 121.57f, 164.371f, 111.215f +path.quadTo(SkBits2Float(0x43245ef5), SkBits2Float(0x42c9b831), SkBits2Float(0x432bb179), SkBits2Float(0x42bb1329)); // 164.371f, 100.86f, 171.693f, 93.5374f +path.quadTo(SkBits2Float(0x433303fe), SkBits2Float(0x42ac6e21), SkBits2Float(0x433d5ef5), SkBits2Float(0x42ac6e21)); // 179.016f, 86.2151f, 189.371f, 86.2151f +path.quadTo(SkBits2Float(0x4347b9ec), SkBits2Float(0x42ac6e21), SkBits2Float(0x434f0c71), SkBits2Float(0x42bb1329)); // 199.726f, 86.2151f, 207.049f, 93.5374f +path.quadTo(SkBits2Float(0x43565ef5), SkBits2Float(0x42c9b831), SkBits2Float(0x43565ef5), SkBits2Float(0x42de6e20)); // 214.371f, 100.86f, 214.371f, 111.215f +path.close(); + SkPath path138(path); + builder.add(path138, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43e8a73d), SkBits2Float(0x439f6574)); // 465.307f, 318.793f +path.quadTo(SkBits2Float(0x43e8a73d), SkBits2Float(0x43a492f0), SkBits2Float(0x43e4fdfb), SkBits2Float(0x43a83c32)); // 465.307f, 329.148f, 457.984f, 336.47f +path.quadTo(SkBits2Float(0x43e154b9), SkBits2Float(0x43abe574), SkBits2Float(0x43dc273d), SkBits2Float(0x43abe574)); // 450.662f, 343.793f, 440.307f, 343.793f +path.quadTo(SkBits2Float(0x43d6f9c1), SkBits2Float(0x43abe574), SkBits2Float(0x43d3507f), SkBits2Float(0x43a83c32)); // 429.951f, 343.793f, 422.629f, 336.47f +path.quadTo(SkBits2Float(0x43cfa73d), SkBits2Float(0x43a492f0), SkBits2Float(0x43cfa73d), SkBits2Float(0x439f6574)); // 415.307f, 329.148f, 415.307f, 318.793f +path.quadTo(SkBits2Float(0x43cfa73d), SkBits2Float(0x439a37f8), SkBits2Float(0x43d3507f), SkBits2Float(0x43968eb6)); // 415.307f, 308.437f, 422.629f, 301.115f +path.quadTo(SkBits2Float(0x43d6f9c1), SkBits2Float(0x4392e574), SkBits2Float(0x43dc273d), SkBits2Float(0x4392e574)); // 429.951f, 293.793f, 440.307f, 293.793f +path.quadTo(SkBits2Float(0x43e154b9), SkBits2Float(0x4392e574), SkBits2Float(0x43e4fdfb), SkBits2Float(0x43968eb6)); // 450.662f, 293.793f, 457.984f, 301.115f +path.quadTo(SkBits2Float(0x43e8a73d), SkBits2Float(0x439a37f8), SkBits2Float(0x43e8a73d), SkBits2Float(0x439f6574)); // 465.307f, 308.437f, 465.307f, 318.793f +path.close(); + SkPath path139(path); + builder.add(path139, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43abcc05), SkBits2Float(0x42d3af00)); // 343.594f, 105.842f +path.quadTo(SkBits2Float(0x43abcc05), SkBits2Float(0x42e864ef), SkBits2Float(0x43a822c3), SkBits2Float(0x42f709f8)); // 343.594f, 116.197f, 336.272f, 123.519f +path.quadTo(SkBits2Float(0x43a47981), SkBits2Float(0x4302d780), SkBits2Float(0x439f4c05), SkBits2Float(0x4302d780)); // 328.949f, 130.842f, 318.594f, 130.842f +path.quadTo(SkBits2Float(0x439a1e89), SkBits2Float(0x4302d780), SkBits2Float(0x43967547), SkBits2Float(0x42f709f8)); // 308.239f, 130.842f, 300.916f, 123.519f +path.quadTo(SkBits2Float(0x4392cc05), SkBits2Float(0x42e864ef), SkBits2Float(0x4392cc05), SkBits2Float(0x42d3af00)); // 293.594f, 116.197f, 293.594f, 105.842f +path.quadTo(SkBits2Float(0x4392cc05), SkBits2Float(0x42bef911), SkBits2Float(0x43967547), SkBits2Float(0x42b05408)); // 293.594f, 95.4865f, 300.916f, 88.1641f +path.quadTo(SkBits2Float(0x439a1e89), SkBits2Float(0x42a1aeff), SkBits2Float(0x439f4c05), SkBits2Float(0x42a1aeff)); // 308.239f, 80.8418f, 318.594f, 80.8418f +path.quadTo(SkBits2Float(0x43a47981), SkBits2Float(0x42a1aeff), SkBits2Float(0x43a822c3), SkBits2Float(0x42b05408)); // 328.949f, 80.8418f, 336.272f, 88.1641f +path.quadTo(SkBits2Float(0x43abcc05), SkBits2Float(0x42bef911), SkBits2Float(0x43abcc05), SkBits2Float(0x42d3af00)); // 343.594f, 95.4865f, 343.594f, 105.842f +path.close(); + SkPath path140(path); + builder.add(path140, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x438e8ffa), SkBits2Float(0x438bdd2b)); // 285.125f, 279.728f +path.quadTo(SkBits2Float(0x438e8ffa), SkBits2Float(0x43910aa7), SkBits2Float(0x438ae6b8), SkBits2Float(0x4394b3e9)); // 285.125f, 290.083f, 277.802f, 297.406f +path.quadTo(SkBits2Float(0x43873d76), SkBits2Float(0x43985d2b), SkBits2Float(0x43820ffa), SkBits2Float(0x43985d2b)); // 270.48f, 304.728f, 260.125f, 304.728f +path.quadTo(SkBits2Float(0x4379c4fc), SkBits2Float(0x43985d2b), SkBits2Float(0x43727278), SkBits2Float(0x4394b3e9)); // 249.769f, 304.728f, 242.447f, 297.406f +path.quadTo(SkBits2Float(0x436b1ff4), SkBits2Float(0x43910aa7), SkBits2Float(0x436b1ff4), SkBits2Float(0x438bdd2b)); // 235.125f, 290.083f, 235.125f, 279.728f +path.quadTo(SkBits2Float(0x436b1ff4), SkBits2Float(0x4386afaf), SkBits2Float(0x43727278), SkBits2Float(0x4383066d)); // 235.125f, 269.373f, 242.447f, 262.05f +path.quadTo(SkBits2Float(0x4379c4fc), SkBits2Float(0x437eba56), SkBits2Float(0x43820ffa), SkBits2Float(0x437eba56)); // 249.769f, 254.728f, 260.125f, 254.728f +path.quadTo(SkBits2Float(0x43873d76), SkBits2Float(0x437eba56), SkBits2Float(0x438ae6b8), SkBits2Float(0x4383066d)); // 270.48f, 254.728f, 277.802f, 262.05f +path.quadTo(SkBits2Float(0x438e8ffa), SkBits2Float(0x4386afaf), SkBits2Float(0x438e8ffa), SkBits2Float(0x438bdd2b)); // 285.125f, 269.373f, 285.125f, 279.728f +path.close(); + SkPath path141(path); + builder.add(path141, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x441d8000), SkBits2Float(0x435e8072)); // 630, 222.502f +path.quadTo(SkBits2Float(0x441d8000), SkBits2Float(0x4368db6a), SkBits2Float(0x441bab5f), SkBits2Float(0x43702dee)); // 630, 232.857f, 622.678f, 240.179f +path.quadTo(SkBits2Float(0x4419d6be), SkBits2Float(0x43778072), SkBits2Float(0x44174000), SkBits2Float(0x43778072)); // 615.355f, 247.502f, 605, 247.502f +path.quadTo(SkBits2Float(0x4414a942), SkBits2Float(0x43778072), SkBits2Float(0x4412d4a1), SkBits2Float(0x43702dee)); // 594.645f, 247.502f, 587.322f, 240.179f +path.quadTo(SkBits2Float(0x44110000), SkBits2Float(0x4368db6a), SkBits2Float(0x44110000), SkBits2Float(0x435e8072)); // 580, 232.857f, 580, 222.502f +path.quadTo(SkBits2Float(0x44110000), SkBits2Float(0x4354257a), SkBits2Float(0x4412d4a1), SkBits2Float(0x434cd2f6)); // 580, 212.146f, 587.322f, 204.824f +path.quadTo(SkBits2Float(0x4414a942), SkBits2Float(0x43458072), SkBits2Float(0x44174000), SkBits2Float(0x43458072)); // 594.645f, 197.502f, 605, 197.502f +path.quadTo(SkBits2Float(0x4419d6be), SkBits2Float(0x43458072), SkBits2Float(0x441bab5f), SkBits2Float(0x434cd2f6)); // 615.355f, 197.502f, 622.678f, 204.824f +path.quadTo(SkBits2Float(0x441d8000), SkBits2Float(0x4354257a), SkBits2Float(0x441d8000), SkBits2Float(0x435e8072)); // 630, 212.146f, 630, 222.502f +path.close(); + SkPath path142(path); + builder.add(path142, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43cab007), SkBits2Float(0x4370ffc2)); // 405.375f, 240.999f +path.quadTo(SkBits2Float(0x43cab007), SkBits2Float(0x437b5aba), SkBits2Float(0x43c706c5), SkBits2Float(0x4381569f)); // 405.375f, 251.354f, 398.053f, 258.677f +path.quadTo(SkBits2Float(0x43c35d83), SkBits2Float(0x4384ffe1), SkBits2Float(0x43be3007), SkBits2Float(0x4384ffe1)); // 390.731f, 265.999f, 380.375f, 265.999f +path.quadTo(SkBits2Float(0x43b9028b), SkBits2Float(0x4384ffe1), SkBits2Float(0x43b55949), SkBits2Float(0x4381569f)); // 370.02f, 265.999f, 362.698f, 258.677f +path.quadTo(SkBits2Float(0x43b1b007), SkBits2Float(0x437b5aba), SkBits2Float(0x43b1b007), SkBits2Float(0x4370ffc2)); // 355.375f, 251.354f, 355.375f, 240.999f +path.quadTo(SkBits2Float(0x43b1b007), SkBits2Float(0x4366a4ca), SkBits2Float(0x43b55949), SkBits2Float(0x435f5246)); // 355.375f, 230.644f, 362.698f, 223.321f +path.quadTo(SkBits2Float(0x43b9028b), SkBits2Float(0x4357ffc2), SkBits2Float(0x43be3007), SkBits2Float(0x4357ffc2)); // 370.02f, 215.999f, 380.375f, 215.999f +path.quadTo(SkBits2Float(0x43c35d83), SkBits2Float(0x4357ffc2), SkBits2Float(0x43c706c5), SkBits2Float(0x435f5246)); // 390.731f, 215.999f, 398.053f, 223.321f +path.quadTo(SkBits2Float(0x43cab007), SkBits2Float(0x4366a4ca), SkBits2Float(0x43cab007), SkBits2Float(0x4370ffc2)); // 405.375f, 230.644f, 405.375f, 240.999f +path.close(); + SkPath path143(path); + builder.add(path143, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ae2f7d), SkBits2Float(0x43587ea0)); // 348.371f, 216.495f +path.quadTo(SkBits2Float(0x43ae2f7d), SkBits2Float(0x4362d998), SkBits2Float(0x43aa863b), SkBits2Float(0x436a2c1c)); // 348.371f, 226.85f, 341.049f, 234.172f +path.quadTo(SkBits2Float(0x43a6dcf9), SkBits2Float(0x43717ea0), SkBits2Float(0x43a1af7d), SkBits2Float(0x43717ea0)); // 333.726f, 241.495f, 323.371f, 241.495f +path.quadTo(SkBits2Float(0x439c8201), SkBits2Float(0x43717ea0), SkBits2Float(0x4398d8bf), SkBits2Float(0x436a2c1c)); // 313.016f, 241.495f, 305.693f, 234.172f +path.quadTo(SkBits2Float(0x43952f7d), SkBits2Float(0x4362d998), SkBits2Float(0x43952f7d), SkBits2Float(0x43587ea0)); // 298.371f, 226.85f, 298.371f, 216.495f +path.quadTo(SkBits2Float(0x43952f7d), SkBits2Float(0x434e23a8), SkBits2Float(0x4398d8bf), SkBits2Float(0x4346d124)); // 298.371f, 206.139f, 305.693f, 198.817f +path.quadTo(SkBits2Float(0x439c8201), SkBits2Float(0x433f7ea0), SkBits2Float(0x43a1af7d), SkBits2Float(0x433f7ea0)); // 313.016f, 191.495f, 323.371f, 191.495f +path.quadTo(SkBits2Float(0x43a6dcf9), SkBits2Float(0x433f7ea0), SkBits2Float(0x43aa863b), SkBits2Float(0x4346d124)); // 333.726f, 191.495f, 341.049f, 198.817f +path.quadTo(SkBits2Float(0x43ae2f7d), SkBits2Float(0x434e23a8), SkBits2Float(0x43ae2f7d), SkBits2Float(0x43587ea0)); // 348.371f, 206.139f, 348.371f, 216.495f +path.close(); + SkPath path144(path); + builder.add(path144, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43add1a9), SkBits2Float(0x436897ac)); // 347.638f, 232.592f +path.quadTo(SkBits2Float(0x43add1a9), SkBits2Float(0x4372f2a3), SkBits2Float(0x43aa2867), SkBits2Float(0x437a4527)); // 347.638f, 242.948f, 340.316f, 250.27f +path.quadTo(SkBits2Float(0x43a67f25), SkBits2Float(0x4380cbd6), SkBits2Float(0x43a151a9), SkBits2Float(0x4380cbd6)); // 332.993f, 257.592f, 322.638f, 257.592f +path.quadTo(SkBits2Float(0x439c242d), SkBits2Float(0x4380cbd6), SkBits2Float(0x43987aeb), SkBits2Float(0x437a4527)); // 312.283f, 257.592f, 304.96f, 250.27f +path.quadTo(SkBits2Float(0x4394d1a9), SkBits2Float(0x4372f2a3), SkBits2Float(0x4394d1a9), SkBits2Float(0x436897ac)); // 297.638f, 242.948f, 297.638f, 232.592f +path.quadTo(SkBits2Float(0x4394d1a9), SkBits2Float(0x435e3cb5), SkBits2Float(0x43987aeb), SkBits2Float(0x4356ea31)); // 297.638f, 222.237f, 304.96f, 214.915f +path.quadTo(SkBits2Float(0x439c242d), SkBits2Float(0x434f97ad), SkBits2Float(0x43a151a9), SkBits2Float(0x434f97ad)); // 312.283f, 207.592f, 322.638f, 207.592f +path.quadTo(SkBits2Float(0x43a67f25), SkBits2Float(0x434f97ad), SkBits2Float(0x43aa2867), SkBits2Float(0x4356ea31)); // 332.993f, 207.592f, 340.316f, 214.915f +path.quadTo(SkBits2Float(0x43add1a9), SkBits2Float(0x435e3cb5), SkBits2Float(0x43add1a9), SkBits2Float(0x436897ac)); // 347.638f, 222.237f, 347.638f, 232.592f +path.close(); + SkPath path145(path); + builder.add(path145, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43f37c5c), SkBits2Float(0x438cffd4)); // 486.972f, 281.999f +path.quadTo(SkBits2Float(0x43f37c5c), SkBits2Float(0x43922d50), SkBits2Float(0x43efd31a), SkBits2Float(0x4395d692)); // 486.972f, 292.354f, 479.649f, 299.676f +path.quadTo(SkBits2Float(0x43ec29d8), SkBits2Float(0x43997fd4), SkBits2Float(0x43e6fc5c), SkBits2Float(0x43997fd4)); // 472.327f, 306.999f, 461.972f, 306.999f +path.quadTo(SkBits2Float(0x43e1cee0), SkBits2Float(0x43997fd4), SkBits2Float(0x43de259e), SkBits2Float(0x4395d692)); // 451.616f, 306.999f, 444.294f, 299.676f +path.quadTo(SkBits2Float(0x43da7c5c), SkBits2Float(0x43922d50), SkBits2Float(0x43da7c5c), SkBits2Float(0x438cffd4)); // 436.972f, 292.354f, 436.972f, 281.999f +path.quadTo(SkBits2Float(0x43da7c5c), SkBits2Float(0x4387d258), SkBits2Float(0x43de259e), SkBits2Float(0x43842916)); // 436.972f, 271.643f, 444.294f, 264.321f +path.quadTo(SkBits2Float(0x43e1cee0), SkBits2Float(0x43807fd4), SkBits2Float(0x43e6fc5c), SkBits2Float(0x43807fd4)); // 451.616f, 256.999f, 461.972f, 256.999f +path.quadTo(SkBits2Float(0x43ec29d8), SkBits2Float(0x43807fd4), SkBits2Float(0x43efd31a), SkBits2Float(0x43842916)); // 472.327f, 256.999f, 479.649f, 264.321f +path.quadTo(SkBits2Float(0x43f37c5c), SkBits2Float(0x4387d258), SkBits2Float(0x43f37c5c), SkBits2Float(0x438cffd4)); // 486.972f, 271.643f, 486.972f, 281.999f +path.close(); + SkPath path146(path); + builder.add(path146, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x434938a6), SkBits2Float(0x439b6682)); // 201.221f, 310.801f +path.quadTo(SkBits2Float(0x434938a6), SkBits2Float(0x43a093fe), SkBits2Float(0x4341e622), SkBits2Float(0x43a43d40)); // 201.221f, 321.156f, 193.899f, 328.479f +path.quadTo(SkBits2Float(0x433a939e), SkBits2Float(0x43a7e682), SkBits2Float(0x433038a6), SkBits2Float(0x43a7e682)); // 186.577f, 335.801f, 176.221f, 335.801f +path.quadTo(SkBits2Float(0x4325ddae), SkBits2Float(0x43a7e682), SkBits2Float(0x431e8b2a), SkBits2Float(0x43a43d40)); // 165.866f, 335.801f, 158.544f, 328.479f +path.quadTo(SkBits2Float(0x431738a6), SkBits2Float(0x43a093fe), SkBits2Float(0x431738a6), SkBits2Float(0x439b6682)); // 151.221f, 321.156f, 151.221f, 310.801f +path.quadTo(SkBits2Float(0x431738a6), SkBits2Float(0x43963906), SkBits2Float(0x431e8b2a), SkBits2Float(0x43928fc4)); // 151.221f, 300.445f, 158.544f, 293.123f +path.quadTo(SkBits2Float(0x4325ddae), SkBits2Float(0x438ee682), SkBits2Float(0x433038a6), SkBits2Float(0x438ee682)); // 165.866f, 285.801f, 176.221f, 285.801f +path.quadTo(SkBits2Float(0x433a939e), SkBits2Float(0x438ee682), SkBits2Float(0x4341e622), SkBits2Float(0x43928fc4)); // 186.577f, 285.801f, 193.899f, 293.123f +path.quadTo(SkBits2Float(0x434938a6), SkBits2Float(0x43963906), SkBits2Float(0x434938a6), SkBits2Float(0x439b6682)); // 201.221f, 300.445f, 201.221f, 310.801f +path.close(); + SkPath path147(path); + builder.add(path147, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43957ad9), SkBits2Float(0x4340d6a9)); // 298.96f, 192.839f +path.quadTo(SkBits2Float(0x43957ad9), SkBits2Float(0x434b31a0), SkBits2Float(0x4391d197), SkBits2Float(0x43528425)); // 298.96f, 203.194f, 291.637f, 210.516f +path.quadTo(SkBits2Float(0x438e2855), SkBits2Float(0x4359d6a9), SkBits2Float(0x4388fad9), SkBits2Float(0x4359d6a9)); // 284.315f, 217.839f, 273.96f, 217.839f +path.quadTo(SkBits2Float(0x4383cd5d), SkBits2Float(0x4359d6a9), SkBits2Float(0x4380241b), SkBits2Float(0x43528425)); // 263.604f, 217.839f, 256.282f, 210.516f +path.quadTo(SkBits2Float(0x4378f5b2), SkBits2Float(0x434b31a0), SkBits2Float(0x4378f5b2), SkBits2Float(0x4340d6a9)); // 248.96f, 203.194f, 248.96f, 192.839f +path.quadTo(SkBits2Float(0x4378f5b2), SkBits2Float(0x43367bb2), SkBits2Float(0x4380241b), SkBits2Float(0x432f292d)); // 248.96f, 182.483f, 256.282f, 175.161f +path.quadTo(SkBits2Float(0x4383cd5d), SkBits2Float(0x4327d6a9), SkBits2Float(0x4388fad9), SkBits2Float(0x4327d6a9)); // 263.604f, 167.839f, 273.96f, 167.839f +path.quadTo(SkBits2Float(0x438e2855), SkBits2Float(0x4327d6a9), SkBits2Float(0x4391d197), SkBits2Float(0x432f292d)); // 284.315f, 167.839f, 291.637f, 175.161f +path.quadTo(SkBits2Float(0x43957ad9), SkBits2Float(0x43367bb2), SkBits2Float(0x43957ad9), SkBits2Float(0x4340d6a9)); // 298.96f, 182.483f, 298.96f, 192.839f +path.close(); + SkPath path148(path); + builder.add(path148, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4359cdc3), SkBits2Float(0x431623e6)); // 217.804f, 150.14f +path.quadTo(SkBits2Float(0x4359cdc3), SkBits2Float(0x43207ede), SkBits2Float(0x43527b3f), SkBits2Float(0x4327d162)); // 217.804f, 160.496f, 210.481f, 167.818f +path.quadTo(SkBits2Float(0x434b28ba), SkBits2Float(0x432f23e6), SkBits2Float(0x4340cdc3), SkBits2Float(0x432f23e6)); // 203.159f, 175.14f, 192.804f, 175.14f +path.quadTo(SkBits2Float(0x433672cc), SkBits2Float(0x432f23e6), SkBits2Float(0x432f2047), SkBits2Float(0x4327d162)); // 182.448f, 175.14f, 175.126f, 167.818f +path.quadTo(SkBits2Float(0x4327cdc3), SkBits2Float(0x43207ede), SkBits2Float(0x4327cdc3), SkBits2Float(0x431623e6)); // 167.804f, 160.496f, 167.804f, 150.14f +path.quadTo(SkBits2Float(0x4327cdc3), SkBits2Float(0x430bc8ee), SkBits2Float(0x432f2047), SkBits2Float(0x4304766a)); // 167.804f, 139.785f, 175.126f, 132.463f +path.quadTo(SkBits2Float(0x433672cc), SkBits2Float(0x42fa47cc), SkBits2Float(0x4340cdc3), SkBits2Float(0x42fa47cc)); // 182.448f, 125.14f, 192.804f, 125.14f +path.quadTo(SkBits2Float(0x434b28ba), SkBits2Float(0x42fa47cc), SkBits2Float(0x43527b3f), SkBits2Float(0x4304766a)); // 203.159f, 125.14f, 210.481f, 132.463f +path.quadTo(SkBits2Float(0x4359cdc3), SkBits2Float(0x430bc8ee), SkBits2Float(0x4359cdc3), SkBits2Float(0x431623e6)); // 217.804f, 139.785f, 217.804f, 150.14f +path.close(); + SkPath path149(path); + builder.add(path149, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4395d72b), SkBits2Float(0x43c5524a)); // 299.681f, 394.643f +path.quadTo(SkBits2Float(0x4395d72b), SkBits2Float(0x43ca7fc6), SkBits2Float(0x43922de9), SkBits2Float(0x43ce2908)); // 299.681f, 404.998f, 292.359f, 412.321f +path.quadTo(SkBits2Float(0x438e84a7), SkBits2Float(0x43d1d24a), SkBits2Float(0x4389572b), SkBits2Float(0x43d1d24a)); // 285.036f, 419.643f, 274.681f, 419.643f +path.quadTo(SkBits2Float(0x438429af), SkBits2Float(0x43d1d24a), SkBits2Float(0x4380806d), SkBits2Float(0x43ce2908)); // 264.326f, 419.643f, 257.003f, 412.321f +path.quadTo(SkBits2Float(0x4379ae56), SkBits2Float(0x43ca7fc6), SkBits2Float(0x4379ae56), SkBits2Float(0x43c5524a)); // 249.681f, 404.998f, 249.681f, 394.643f +path.quadTo(SkBits2Float(0x4379ae56), SkBits2Float(0x43c024ce), SkBits2Float(0x4380806d), SkBits2Float(0x43bc7b8c)); // 249.681f, 384.288f, 257.003f, 376.965f +path.quadTo(SkBits2Float(0x438429af), SkBits2Float(0x43b8d24a), SkBits2Float(0x4389572b), SkBits2Float(0x43b8d24a)); // 264.326f, 369.643f, 274.681f, 369.643f +path.quadTo(SkBits2Float(0x438e84a7), SkBits2Float(0x43b8d24a), SkBits2Float(0x43922de9), SkBits2Float(0x43bc7b8c)); // 285.036f, 369.643f, 292.359f, 376.965f +path.quadTo(SkBits2Float(0x4395d72b), SkBits2Float(0x43c024ce), SkBits2Float(0x4395d72b), SkBits2Float(0x43c5524a)); // 299.681f, 384.288f, 299.681f, 394.643f +path.close(); + SkPath path150(path); + builder.add(path150, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43884f5e), SkBits2Float(0x436c6388)); // 272.62f, 236.389f +path.quadTo(SkBits2Float(0x43884f5e), SkBits2Float(0x4376be7f), SkBits2Float(0x4384a61c), SkBits2Float(0x437e1103)); // 272.62f, 246.744f, 265.298f, 254.066f +path.quadTo(SkBits2Float(0x4380fcda), SkBits2Float(0x4382b1c4), SkBits2Float(0x43779ebc), SkBits2Float(0x4382b1c4)); // 257.975f, 261.389f, 247.62f, 261.389f +path.quadTo(SkBits2Float(0x436d43c5), SkBits2Float(0x4382b1c4), SkBits2Float(0x4365f141), SkBits2Float(0x437e1103)); // 237.265f, 261.389f, 229.942f, 254.066f +path.quadTo(SkBits2Float(0x435e9ebd), SkBits2Float(0x4376be7f), SkBits2Float(0x435e9ebd), SkBits2Float(0x436c6388)); // 222.62f, 246.744f, 222.62f, 236.389f +path.quadTo(SkBits2Float(0x435e9ebd), SkBits2Float(0x43620891), SkBits2Float(0x4365f141), SkBits2Float(0x435ab60d)); // 222.62f, 226.033f, 229.942f, 218.711f +path.quadTo(SkBits2Float(0x436d43c5), SkBits2Float(0x43536389), SkBits2Float(0x43779ebc), SkBits2Float(0x43536389)); // 237.265f, 211.389f, 247.62f, 211.389f +path.quadTo(SkBits2Float(0x4380fcda), SkBits2Float(0x43536389), SkBits2Float(0x4384a61c), SkBits2Float(0x435ab60d)); // 257.975f, 211.389f, 265.298f, 218.711f +path.quadTo(SkBits2Float(0x43884f5e), SkBits2Float(0x43620891), SkBits2Float(0x43884f5e), SkBits2Float(0x436c6388)); // 272.62f, 226.033f, 272.62f, 236.389f +path.close(); + SkPath path151(path); + builder.add(path151, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ac3331), SkBits2Float(0x4330c484)); // 344.4f, 176.768f +path.quadTo(SkBits2Float(0x43ac3331), SkBits2Float(0x433b1f7c), SkBits2Float(0x43a889ef), SkBits2Float(0x43427200)); // 344.4f, 187.123f, 337.078f, 194.445f +path.quadTo(SkBits2Float(0x43a4e0ad), SkBits2Float(0x4349c484), SkBits2Float(0x439fb331), SkBits2Float(0x4349c484)); // 329.755f, 201.768f, 319.4f, 201.768f +path.quadTo(SkBits2Float(0x439a85b5), SkBits2Float(0x4349c484), SkBits2Float(0x4396dc73), SkBits2Float(0x43427200)); // 309.045f, 201.768f, 301.722f, 194.445f +path.quadTo(SkBits2Float(0x43933331), SkBits2Float(0x433b1f7c), SkBits2Float(0x43933331), SkBits2Float(0x4330c484)); // 294.4f, 187.123f, 294.4f, 176.768f +path.quadTo(SkBits2Float(0x43933331), SkBits2Float(0x4326698c), SkBits2Float(0x4396dc73), SkBits2Float(0x431f1708)); // 294.4f, 166.412f, 301.722f, 159.09f +path.quadTo(SkBits2Float(0x439a85b5), SkBits2Float(0x4317c484), SkBits2Float(0x439fb331), SkBits2Float(0x4317c484)); // 309.045f, 151.768f, 319.4f, 151.768f +path.quadTo(SkBits2Float(0x43a4e0ad), SkBits2Float(0x4317c484), SkBits2Float(0x43a889ef), SkBits2Float(0x431f1708)); // 329.755f, 151.768f, 337.078f, 159.09f +path.quadTo(SkBits2Float(0x43ac3331), SkBits2Float(0x4326698c), SkBits2Float(0x43ac3331), SkBits2Float(0x4330c484)); // 344.4f, 166.412f, 344.4f, 176.768f +path.close(); + SkPath path152(path); + builder.add(path152, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x435659f0), SkBits2Float(0x438a1820)); // 214.351f, 276.188f +path.quadTo(SkBits2Float(0x435659f0), SkBits2Float(0x438f459c), SkBits2Float(0x434f076c), SkBits2Float(0x4392eede)); // 214.351f, 286.544f, 207.029f, 293.866f +path.quadTo(SkBits2Float(0x4347b4e8), SkBits2Float(0x43969820), SkBits2Float(0x433d59f0), SkBits2Float(0x43969820)); // 199.707f, 301.188f, 189.351f, 301.188f +path.quadTo(SkBits2Float(0x4332fef8), SkBits2Float(0x43969820), SkBits2Float(0x432bac74), SkBits2Float(0x4392eede)); // 178.996f, 301.188f, 171.674f, 293.866f +path.quadTo(SkBits2Float(0x432459f0), SkBits2Float(0x438f459c), SkBits2Float(0x432459f0), SkBits2Float(0x438a1820)); // 164.351f, 286.544f, 164.351f, 276.188f +path.quadTo(SkBits2Float(0x432459f0), SkBits2Float(0x4384eaa4), SkBits2Float(0x432bac74), SkBits2Float(0x43814162)); // 164.351f, 265.833f, 171.674f, 258.511f +path.quadTo(SkBits2Float(0x4332fef8), SkBits2Float(0x437b3040), SkBits2Float(0x433d59f0), SkBits2Float(0x437b3040)); // 178.996f, 251.188f, 189.351f, 251.188f +path.quadTo(SkBits2Float(0x4347b4e8), SkBits2Float(0x437b3040), SkBits2Float(0x434f076c), SkBits2Float(0x43814162)); // 199.707f, 251.188f, 207.029f, 258.511f +path.quadTo(SkBits2Float(0x435659f0), SkBits2Float(0x4384eaa4), SkBits2Float(0x435659f0), SkBits2Float(0x438a1820)); // 214.351f, 265.833f, 214.351f, 276.188f +path.close(); + SkPath path153(path); + builder.add(path153, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x437aa20e), SkBits2Float(0x434e714e)); // 250.633f, 206.443f +path.quadTo(SkBits2Float(0x437aa20e), SkBits2Float(0x4358cc46), SkBits2Float(0x43734f8a), SkBits2Float(0x43601eca)); // 250.633f, 216.798f, 243.311f, 224.12f +path.quadTo(SkBits2Float(0x436bfd06), SkBits2Float(0x4367714e), SkBits2Float(0x4361a20e), SkBits2Float(0x4367714e)); // 235.988f, 231.443f, 225.633f, 231.443f +path.quadTo(SkBits2Float(0x43574716), SkBits2Float(0x4367714e), SkBits2Float(0x434ff492), SkBits2Float(0x43601eca)); // 215.278f, 231.443f, 207.955f, 224.12f +path.quadTo(SkBits2Float(0x4348a20e), SkBits2Float(0x4358cc46), SkBits2Float(0x4348a20e), SkBits2Float(0x434e714e)); // 200.633f, 216.798f, 200.633f, 206.443f +path.quadTo(SkBits2Float(0x4348a20e), SkBits2Float(0x43441656), SkBits2Float(0x434ff492), SkBits2Float(0x433cc3d2)); // 200.633f, 196.087f, 207.955f, 188.765f +path.quadTo(SkBits2Float(0x43574716), SkBits2Float(0x4335714e), SkBits2Float(0x4361a20e), SkBits2Float(0x4335714e)); // 215.278f, 181.443f, 225.633f, 181.443f +path.quadTo(SkBits2Float(0x436bfd06), SkBits2Float(0x4335714e), SkBits2Float(0x43734f8a), SkBits2Float(0x433cc3d2)); // 235.988f, 181.443f, 243.311f, 188.765f +path.quadTo(SkBits2Float(0x437aa20e), SkBits2Float(0x43441656), SkBits2Float(0x437aa20e), SkBits2Float(0x434e714e)); // 250.633f, 196.087f, 250.633f, 206.443f +path.close(); + SkPath path154(path); + builder.add(path154, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43ed22e3), SkBits2Float(0x439da644)); // 474.273f, 315.299f +path.quadTo(SkBits2Float(0x43ed22e3), SkBits2Float(0x43a2d3c0), SkBits2Float(0x43e979a1), SkBits2Float(0x43a67d02)); // 474.273f, 325.654f, 466.95f, 332.977f +path.quadTo(SkBits2Float(0x43e5d05f), SkBits2Float(0x43aa2644), SkBits2Float(0x43e0a2e3), SkBits2Float(0x43aa2644)); // 459.628f, 340.299f, 449.273f, 340.299f +path.quadTo(SkBits2Float(0x43db7567), SkBits2Float(0x43aa2644), SkBits2Float(0x43d7cc25), SkBits2Float(0x43a67d02)); // 438.917f, 340.299f, 431.595f, 332.977f +path.quadTo(SkBits2Float(0x43d422e3), SkBits2Float(0x43a2d3c0), SkBits2Float(0x43d422e3), SkBits2Float(0x439da644)); // 424.273f, 325.654f, 424.273f, 315.299f +path.quadTo(SkBits2Float(0x43d422e3), SkBits2Float(0x439878c8), SkBits2Float(0x43d7cc25), SkBits2Float(0x4394cf86)); // 424.273f, 304.944f, 431.595f, 297.621f +path.quadTo(SkBits2Float(0x43db7567), SkBits2Float(0x43912644), SkBits2Float(0x43e0a2e3), SkBits2Float(0x43912644)); // 438.917f, 290.299f, 449.273f, 290.299f +path.quadTo(SkBits2Float(0x43e5d05f), SkBits2Float(0x43912644), SkBits2Float(0x43e979a1), SkBits2Float(0x4394cf86)); // 459.628f, 290.299f, 466.95f, 297.621f +path.quadTo(SkBits2Float(0x43ed22e3), SkBits2Float(0x439878c8), SkBits2Float(0x43ed22e3), SkBits2Float(0x439da644)); // 474.273f, 304.944f, 474.273f, 315.299f +path.close(); + SkPath path155(path); + builder.add(path155, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x43cc4428), SkBits2Float(0x43797560)); // 408.532f, 249.458f +path.quadTo(SkBits2Float(0x43cc4428), SkBits2Float(0x4381e82c), SkBits2Float(0x43c89ae6), SkBits2Float(0x4385916e)); // 408.532f, 259.814f, 401.21f, 267.136f +path.quadTo(SkBits2Float(0x43c4f1a4), SkBits2Float(0x43893ab0), SkBits2Float(0x43bfc428), SkBits2Float(0x43893ab0)); // 393.888f, 274.458f, 383.532f, 274.458f +path.quadTo(SkBits2Float(0x43ba96ac), SkBits2Float(0x43893ab0), SkBits2Float(0x43b6ed6a), SkBits2Float(0x4385916e)); // 373.177f, 274.458f, 365.855f, 267.136f +path.quadTo(SkBits2Float(0x43b34428), SkBits2Float(0x4381e82c), SkBits2Float(0x43b34428), SkBits2Float(0x43797560)); // 358.532f, 259.814f, 358.532f, 249.458f +path.quadTo(SkBits2Float(0x43b34428), SkBits2Float(0x436f1a69), SkBits2Float(0x43b6ed6a), SkBits2Float(0x4367c7e5)); // 358.532f, 239.103f, 365.855f, 231.781f +path.quadTo(SkBits2Float(0x43ba96ac), SkBits2Float(0x43607561), SkBits2Float(0x43bfc428), SkBits2Float(0x43607561)); // 373.177f, 224.459f, 383.532f, 224.459f +path.quadTo(SkBits2Float(0x43c4f1a4), SkBits2Float(0x43607561), SkBits2Float(0x43c89ae6), SkBits2Float(0x4367c7e5)); // 393.888f, 224.459f, 401.21f, 231.781f +path.quadTo(SkBits2Float(0x43cc4428), SkBits2Float(0x436f1a69), SkBits2Float(0x43cc4428), SkBits2Float(0x43797560)); // 408.532f, 239.103f, 408.532f, 249.458f +path.close(); + SkPath path156(path); + builder.add(path156, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x42e47b81), SkBits2Float(0x43b97683)); // 114.241f, 370.926f +path.quadTo(SkBits2Float(0x42e47b81), SkBits2Float(0x43bea3ff), SkBits2Float(0x42d5d678), SkBits2Float(0x43c24d41)); // 114.241f, 381.281f, 106.919f, 388.604f +path.quadTo(SkBits2Float(0x42c73170), SkBits2Float(0x43c5f683), SkBits2Float(0x42b27b81), SkBits2Float(0x43c5f683)); // 99.5966f, 395.926f, 89.2412f, 395.926f +path.quadTo(SkBits2Float(0x429dc592), SkBits2Float(0x43c5f683), SkBits2Float(0x428f208a), SkBits2Float(0x43c24d41)); // 78.8859f, 395.926f, 71.5636f, 388.604f +path.quadTo(SkBits2Float(0x42807b81), SkBits2Float(0x43bea3ff), SkBits2Float(0x42807b81), SkBits2Float(0x43b97683)); // 64.2412f, 381.281f, 64.2412f, 370.926f +path.quadTo(SkBits2Float(0x42807b81), SkBits2Float(0x43b44907), SkBits2Float(0x428f208a), SkBits2Float(0x43b09fc5)); // 64.2412f, 360.571f, 71.5636f, 353.248f +path.quadTo(SkBits2Float(0x429dc592), SkBits2Float(0x43acf683), SkBits2Float(0x42b27b81), SkBits2Float(0x43acf683)); // 78.8859f, 345.926f, 89.2412f, 345.926f +path.quadTo(SkBits2Float(0x42c73170), SkBits2Float(0x43acf683), SkBits2Float(0x42d5d678), SkBits2Float(0x43b09fc5)); // 99.5966f, 345.926f, 106.919f, 353.248f +path.quadTo(SkBits2Float(0x42e47b81), SkBits2Float(0x43b44907), SkBits2Float(0x42e47b81), SkBits2Float(0x43b97683)); // 114.241f, 360.571f, 114.241f, 370.926f +path.close(); + SkPath path157(path); + builder.add(path157, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x4384239e), SkBits2Float(0x42a36f30)); // 264.278f, 81.7172f +path.quadTo(SkBits2Float(0x4384239e), SkBits2Float(0x42b8251f), SkBits2Float(0x43807a5c), SkBits2Float(0x42c6ca28)); // 264.278f, 92.0725f, 256.956f, 99.3948f +path.quadTo(SkBits2Float(0x4379a234), SkBits2Float(0x42d56f30), SkBits2Float(0x436f473c), SkBits2Float(0x42d56f30)); // 249.634f, 106.717f, 239.278f, 106.717f +path.quadTo(SkBits2Float(0x4364ec44), SkBits2Float(0x42d56f30), SkBits2Float(0x435d99c0), SkBits2Float(0x42c6ca28)); // 228.923f, 106.717f, 221.601f, 99.3948f +path.quadTo(SkBits2Float(0x4356473c), SkBits2Float(0x42b8251f), SkBits2Float(0x4356473c), SkBits2Float(0x42a36f30)); // 214.278f, 92.0725f, 214.278f, 81.7172f +path.quadTo(SkBits2Float(0x4356473c), SkBits2Float(0x428eb941), SkBits2Float(0x435d99c0), SkBits2Float(0x42801438)); // 214.278f, 71.3618f, 221.601f, 64.0395f +path.quadTo(SkBits2Float(0x4364ec44), SkBits2Float(0x4262de60), SkBits2Float(0x436f473c), SkBits2Float(0x4262de60)); // 228.923f, 56.7172f, 239.278f, 56.7172f +path.quadTo(SkBits2Float(0x4379a234), SkBits2Float(0x4262de60), SkBits2Float(0x43807a5c), SkBits2Float(0x42801438)); // 249.634f, 56.7172f, 256.956f, 64.0395f +path.quadTo(SkBits2Float(0x4384239e), SkBits2Float(0x428eb941), SkBits2Float(0x4384239e), SkBits2Float(0x42a36f30)); // 264.278f, 71.3618f, 264.278f, 81.7172f +path.close(); + SkPath path158(path); + builder.add(path158, (SkPathOp) 2); + + path.reset(); + path.setFillType((SkPath::FillType) 0); +path.moveTo(SkBits2Float(0x435be541), SkBits2Float(0x43baaaf6)); // 219.896f, 373.336f +path.quadTo(SkBits2Float(0x435be541), SkBits2Float(0x43bfd872), SkBits2Float(0x435492bd), SkBits2Float(0x43c381b4)); // 219.896f, 383.691f, 212.573f, 391.013f +path.quadTo(SkBits2Float(0x434d4038), SkBits2Float(0x43c72af6), SkBits2Float(0x4342e541), SkBits2Float(0x43c72af6)); // 205.251f, 398.336f, 194.896f, 398.336f +path.quadTo(SkBits2Float(0x43388a4a), SkBits2Float(0x43c72af6), SkBits2Float(0x433137c5), SkBits2Float(0x43c381b4)); // 184.54f, 398.336f, 177.218f, 391.013f +path.quadTo(SkBits2Float(0x4329e541), SkBits2Float(0x43bfd872), SkBits2Float(0x4329e541), SkBits2Float(0x43baaaf6)); // 169.896f, 383.691f, 169.896f, 373.336f +path.quadTo(SkBits2Float(0x4329e541), SkBits2Float(0x43b57d7a), SkBits2Float(0x433137c5), SkBits2Float(0x43b1d438)); // 169.896f, 362.98f, 177.218f, 355.658f +path.quadTo(SkBits2Float(0x43388a4a), SkBits2Float(0x43ae2af6), SkBits2Float(0x4342e541), SkBits2Float(0x43ae2af6)); // 184.54f, 348.336f, 194.896f, 348.336f +path.quadTo(SkBits2Float(0x434d4038), SkBits2Float(0x43ae2af6), SkBits2Float(0x435492bd), SkBits2Float(0x43b1d438)); // 205.251f, 348.336f, 212.573f, 355.658f +path.quadTo(SkBits2Float(0x435be541), SkBits2Float(0x43b57d7a), SkBits2Float(0x435be541), SkBits2Float(0x43baaaf6)); // 219.896f, 362.98f, 219.896f, 373.336f +path.close(); + SkPath path159(path); + builder.add(path159, (SkPathOp) 2); + + builder.resolve(&path); +} + +static void (*firstTest)(skiatest::Reporter* , const char* filename) = 0; +static void (*stopTest)(skiatest::Reporter* , const char* filename) = 0; + +static struct TestDesc tests[] = { + TEST(build1_1), +}; + + +static const size_t testCount = SK_ARRAY_COUNT(tests); + +static bool runReverse = false; + +DEF_TEST(PathOpsBuildUse, reporter) { +#if DEBUG_SHOW_TEST_NAME + strncpy(DEBUG_FILENAME_STRING, "", DEBUG_FILENAME_STRING_LENGTH); +#endif + RunTestSet(reporter, tests, testCount, firstTest, NULL, stopTest, runReverse); +} diff --git a/tests/PathOpsBuilderTest.cpp b/tests/PathOpsBuilderTest.cpp new file mode 100644 index 0000000000..1eadebc550 --- /dev/null +++ b/tests/PathOpsBuilderTest.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "PathOpsTestCommon.h" +#include "Test.h" + +DEF_TEST(PathOpsBuilder, reporter) { + SkOpBuilder builder; + SkPath result; + REPORTER_ASSERT(reporter, builder.resolve(&result)); + REPORTER_ASSERT(reporter, result.isEmpty()); + + builder.add(result, kDifference_PathOp); + REPORTER_ASSERT(reporter, builder.resolve(&result)); + REPORTER_ASSERT(reporter, result.isEmpty()); + + builder.add(result, kUnion_PathOp); + REPORTER_ASSERT(reporter, builder.resolve(&result)); + REPORTER_ASSERT(reporter, result.isEmpty()); + + SkPath rectPath; + rectPath.addRect(0, 1, 2, 3, SkPath::kCW_Direction); + builder.add(rectPath, kUnion_PathOp); + REPORTER_ASSERT(reporter, builder.resolve(&result)); + bool closed; + SkPath::Direction dir; + REPORTER_ASSERT(reporter, result.isRect(NULL, &closed, &dir)); + REPORTER_ASSERT(reporter, closed); + REPORTER_ASSERT(reporter, dir == SkPath::kCW_Direction); + REPORTER_ASSERT(reporter, rectPath == result); + + rectPath.reset(); + rectPath.addRect(0, 1, 2, 3, SkPath::kCCW_Direction); + builder.add(rectPath, kUnion_PathOp); + REPORTER_ASSERT(reporter, builder.resolve(&result)); + REPORTER_ASSERT(reporter, result.isRect(NULL, &closed, &dir)); + REPORTER_ASSERT(reporter, closed); + REPORTER_ASSERT(reporter, dir == SkPath::kCCW_Direction); + REPORTER_ASSERT(reporter, rectPath == result); + + builder.add(rectPath, kDifference_PathOp); + REPORTER_ASSERT(reporter, builder.resolve(&result)); + REPORTER_ASSERT(reporter, result.isEmpty()); + + SkPath rect2, rect3; + rect2.addRect(2, 1, 4, 3, SkPath::kCW_Direction); + rect3.addRect(4, 1, 5, 3, SkPath::kCCW_Direction); + builder.add(rectPath, kUnion_PathOp); + builder.add(rect2, kUnion_PathOp); + builder.add(rect3, kUnion_PathOp); + REPORTER_ASSERT(reporter, builder.resolve(&result)); + REPORTER_ASSERT(reporter, result.isRect(NULL, &closed, &dir)); + REPORTER_ASSERT(reporter, closed); + SkRect expected; + expected.set(0, 1, 5, 3); + REPORTER_ASSERT(reporter, result.getBounds() == expected); + + SkPath circle1, circle2, circle3; + circle1.addCircle(5, 6, 4, SkPath::kCW_Direction); + circle2.addCircle(7, 4, 8, SkPath::kCCW_Direction); + circle3.addCircle(6, 5, 6, SkPath::kCW_Direction); + SkPath opCompare; + Op(circle1, circle2, kUnion_PathOp, &opCompare); + Op(opCompare, circle3, kDifference_PathOp, &opCompare); + builder.add(circle1, kUnion_PathOp); + builder.add(circle2, kUnion_PathOp); + builder.add(circle3, kDifference_PathOp); + REPORTER_ASSERT(reporter, builder.resolve(&result)); + REPORTER_ASSERT(reporter, opCompare == result); +} diff --git a/tests/PathOpsTSectDebug.h b/tests/PathOpsTSectDebug.h new file mode 100644 index 0000000000..5f8915f681 --- /dev/null +++ b/tests/PathOpsTSectDebug.h @@ -0,0 +1,84 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkPathOpsTSect.h" + +template<typename TCurve> +void SkTSect<TCurve>::dump() const { + SkDebugf("id=%d", debugID()); + const SkTSpan<TCurve>* test = fHead; + if (!test) { + SkDebugf(" (empty)"); + return; + } + do { + SkDebugf(" "); + test->dump(this); + } while ((test = test->next())); +} + +template<typename TCurve> +void SkTSect<TCurve>::dumpBoth(const SkTSect& opp) const { + dump(); + SkDebugf(" "); + opp.dump(); + SkDebugf("\n"); +} + +template<typename TCurve> +void SkTSect<TCurve>::dumpBoth(const SkTSect* opp) const { + dumpBoth(*opp); +} + +template<typename TCurve> +void SkTSect<TCurve>::dumpCurves() const { + const SkTSpan<TCurve>* test = fHead; + do { + test->fPart.dump(); + } while ((test = test->next())); +} + +#if !DEBUG_T_SECT +template<typename TCurve> +int SkTSpan<TCurve>::debugID(const SkTSect<TCurve>* sect) const { + if (!sect) { + return -1; + } + int id = 1; + const SkTSpan* test = sect->fHead; + while (test && test != this) { + ++id; + test = test->fNext; + } + return id; +} +#endif + +template<typename TCurve> +void SkTSpan<TCurve>::dumpID(const SkTSect<TCurve>* sect) const { + if (fCoinStart.isCoincident()) { + SkDebugf("%c", '*'); + } + SkDebugf("%d", debugID(sect)); + if (fCoinEnd.isCoincident()) { + SkDebugf("%c", '*'); + } +} + +template<typename TCurve> +void SkTSpan<TCurve>::dump(const SkTSect<TCurve>* sect) const { + dumpID(sect); + SkDebugf("=(%g,%g) [", fStartT, fEndT); + for (int index = 0; index < fBounded.count(); ++index) { + SkTSpan* span = fBounded[index]; + span->dumpID(sect); + if (index < fBounded.count() - 1) { + SkDebugf(","); + } + } + SkDebugf("]"); +} diff --git a/tests/PathOpsThreeWayTest.cpp b/tests/PathOpsThreeWayTest.cpp new file mode 100644 index 0000000000..15d6e54927 --- /dev/null +++ b/tests/PathOpsThreeWayTest.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "SkIntersections.h" +#include "SkTDArray.h" +#include "Test.h" + +// check intersections for consistency + +struct Curve { + int ptCount; + SkDCubic curve; // largest can hold lines / quads/ cubics +}; + +static const Curve testSet0[] = { // extracted from skpClip2 + {4, {{{134,11414}, {131.990234,11414}, {130.32666,11415.4824}, {130.042755,11417.4131}}} }, + {4, {{{130.042755,11417.4131}, {130.233124,11418.3193}, {131.037079,11419}, {132,11419}}} }, + {4, {{{132,11419}, {130.895432,11419}, {130,11418.1045}, {130,11417}}} }, +}; + +static const Curve testSet1[] = { // extracted from cubicOp85i + {4, {{{3,4}, {1,5}, {4,3}, {6,4}}} }, + {1, {{{6,4}, {3,4}}} }, + {4, {{{3,4}, {4,6}, {4,3}, {5,1}}} }, + {1, {{{5,1}, {3,4}}} }, +}; + +static const struct TestSet { + const Curve* tests; + int testCount; +} testSets[] = { + { testSet0, (int) SK_ARRAY_COUNT(testSet0) }, + { testSet1, (int) SK_ARRAY_COUNT(testSet1) }, +}; + +static const int testSetsCount = (int) SK_ARRAY_COUNT(testSets); + +static void testSetTest(skiatest::Reporter* reporter, int index) { + const TestSet& testSet = testSets[index]; + int testCount = testSet.testCount; + SkASSERT(testCount > 1); + SkTDArray<SkIntersections> combos; + for (int outer = 0; outer < testCount - 1; ++outer) { + const Curve& oTest = testSet.tests[outer]; + for (int inner = outer + 1; inner < testCount; ++inner) { + const Curve& iTest = testSet.tests[inner]; + SkIntersections* i = combos.append(); + sk_bzero(i, sizeof(SkIntersections)); + if (oTest.ptCount == 1 && iTest.ptCount == 1) { + i->intersect(*(const SkDLine*) &oTest.curve, *(const SkDLine*) &iTest.curve); + } else if (oTest.ptCount == 1 && iTest.ptCount == 4) { + i->intersect(iTest.curve, *(const SkDLine*) &oTest.curve); + } else if (oTest.ptCount == 4 && iTest.ptCount == 1) { + i->intersect(oTest.curve, *(const SkDLine*) &oTest.curve); + } else if (oTest.ptCount == 4 && iTest.ptCount == 4) { + i->intersectB(oTest.curve, iTest.curve); + } else { + SkASSERT(0); + } +// i->dump(); + } + } +} + +DEF_TEST(PathOpsThreeWay, reporter) { + for (int index = 0; index < testSetsCount; ++index) { + testSetTest(reporter, index); + reporter->bumpTestCount(); + } +} + +DEF_TEST(PathOpsThreeWayOneOff, reporter) { + int index = 1; + testSetTest(reporter, index); +} |