72 constexpr static float infinity = std::numeric_limits<float>::infinity();
81 fSplittableBounds = -std::numeric_limits<float>::infinity();
95 for (
int i = 0; i < fNumRects; i += 4) {
100 if (any((l < comp[0]) &
113 return this->split(arena)->addNonIntersecting(rect, arena);
115 this->appendToList(rect);
120 void appendToList(
Rect rect) {
124 fSplittableBounds =
max(fSplittableBounds, rect.vals());
125 fRectValsSum += rect.vals();
126 fLefts[i] = rect.vals()[0];
127 fTops[i] = rect.vals()[1];
128 fNegRights[i] = rect.vals()[2];
129 fNegBots[i] = rect.vals()[3];
132 Rect loadRect(
int i)
const {
133 return Rect::FromVals({fLefts[i], fTops[i], fNegRights[i], fNegBots[i]});
148 auto splittableSize = fSplittableBounds.xy() + fSplittableBounds.zw();
154 const float *loVals, *negHiVals;
158 splitCoord = (fRectValsSum.x() - fRectValsSum.z()) * (.5f/
kMaxRectsInList);
159 splitCoord =
SkTPin(splitCoord, -fSplittableBounds.z(), fSplittableBounds.x());
161 negHiVals = fNegRights;
164 splitCoord = (fRectValsSum.y() - fRectValsSum.w()) * (.5f/
kMaxRectsInList);
165 splitCoord =
SkTPin(splitCoord, -fSplittableBounds.w(), fSplittableBounds.y());
167 negHiVals = fNegBots;
174 int numCombinedRects = fNumRects;
175 float negSplitCoord = -splitCoord;
177 for (
int i = 0; i < numCombinedRects; ++i) {
179 if (loVals[i] < splitCoord) {
180 this->appendToList(rect);
182 if (negHiVals[i] < negSplitCoord) {
183 hiNode->appendToList(rect);
187 SkASSERT(0 < fNumRects && fNumRects < numCombinedRects);
188 SkASSERT(0 < hiNode->fNumRects && hiNode->fNumRects < numCombinedRects);
191 ? (
Node*)arena->
make<TreeNode<SplitType::kX>>(splitCoord,
this, hiNode)
192 : (
Node*)arena->
make<TreeNode<SplitType::kY>>(splitCoord,
this, hiNode);