20template<IntersectionTree::SplitType kSplitType>
24 : fSplitCoord(splitCoord), fLo(lo), fHi(hi) {
28 if (GetLoVal(
rect) < fSplitCoord && fLo->intersects(
rect)) {
31 if (GetHiVal(
rect) > fSplitCoord && fHi->intersects(
rect)) {
38 if (GetLoVal(
rect) < fSplitCoord) {
39 fLo = fLo->addNonIntersecting(
rect, arena);
41 if (GetHiVal(
rect) > fSplitCoord) {
42 fHi = fHi->addNonIntersecting(
rect, arena);
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);
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 {
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);
209 static_assert(kLeafNodeSize ==
sizeof(
LeafNode));
static constexpr const T & SkTPin(const T &x, const T &lo, const T &hi)
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
Node * addNonIntersecting(Rect rect, SkArenaAlloc *arena) override
static constexpr int kMaxRectsInList
bool intersects(Rect rect) override
Node * addNonIntersecting(Rect rect, SkArenaAlloc *arena) override
bool intersects(Rect rect) override
TreeNode(float splitCoord, Node *lo, Node *hi)
static AI Rect FromVals(float4 vals)
static float max(float r, float g, float b)
sk_sp< SkBlender > blender SkRect rect
static void make(SkBitmap *bitmap, SkColorType colorType, SkAlphaType alphaType, sk_sp< SkColorSpace > colorSpace)
SIT bool any(const Vec< 1, T > &x)
static SKVX_ALWAYS_INLINE Vec Load(const void *ptr)