blob: 0b50a679558f9b1d363464259218ea59557a4dfa [file]
/*
* Copyright 2026 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_WindingHistogram_DEFINED
#define skgpu_graphite_WindingHistogram_DEFINED
#include "include/private/SkAssert.h"
#include "include/private/SkTDArray.h"
#include <cstring>
namespace skgpu::graphite {
// In SparseStrips, lines which are fully left of the viewport still contribute (coarse) winding but
// can be culled during Tiling. The WindingHistogram holds that winding so that it can be consumed
// during MakeStrips.
class WindingHistogram {
public:
WindingHistogram() = default;
WindingHistogram(int maxRows) {
this->reserve(maxRows);
}
void reserve(int maxRows) {
fWindingData.reserve(maxRows);
}
void resize(int numRows) {
fWindingData.resize(numRows);
}
void clear() {
std::memset(fWindingData.data(), 0, fWindingData.size_bytes());
}
int16_t operator[](int row) const {
SkASSERT(row >= 0 && row < fWindingData.size());
return fWindingData[row];
}
int16_t& operator[](int row) {
SkASSERT(row >= 0 && row < fWindingData.size());
return fWindingData[row];
}
SK_ALWAYS_INLINE void addWinding(int row, int16_t delta) {
SkASSERT(row >= 0 && row < fWindingData.size());
fWindingData[row] += delta;
}
SK_ALWAYS_INLINE void addWindingRange(int startRow, int endRow, int16_t delta) {
SkASSERT(startRow >= 0 && endRow <= fWindingData.size() && startRow <= endRow);
for (int r = startRow; r < endRow; ++r) {
fWindingData[r] += delta;
}
}
const SkTDArray<int16_t>& data() const { return fWindingData; }
int32_t size() const { return fWindingData.size(); }
private:
SkTDArray<int16_t> fWindingData;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_WindingHistogram_DEFINED