25void write_curve_index_buffer_base_index(VertexWriter vertexWriter,
28 int triangleCount = bufferSize / (
sizeof(uint16_t) * 3);
36 const auto* neighborInLastResolveLevel = &indexData.push_back({baseIndex,
37 (uint16_t)(baseIndex + 2),
38 (uint16_t)(baseIndex + 1)});
41 int maxResolveLevel =
SkPrevLog2(triangleCount + 1);
42 uint16_t nextIndex = baseIndex + 3;
44 for (
int resolveLevel = 2; resolveLevel <= maxResolveLevel; ++resolveLevel) {
45 SkDEBUGCODE(
auto* firstTriangleInCurrentResolveLevel = indexData.end());
46 int numOuterTrianglelsInResolveLevel = 1 << (resolveLevel - 1);
47 SkASSERT(numOuterTrianglelsInResolveLevel % 2 == 0);
48 int numTrianglePairsInResolveLevel = numOuterTrianglelsInResolveLevel >> 1;
49 for (
int i = 0;
i < numTrianglePairsInResolveLevel; ++
i) {
51 indexData.push_back({(*neighborInLastResolveLevel)[0],
53 (*neighborInLastResolveLevel)[1]});
55 indexData.push_back({(*neighborInLastResolveLevel)[1],
57 (*neighborInLastResolveLevel)[2]});
58 ++neighborInLastResolveLevel;
60 SkASSERT(neighborInLastResolveLevel == firstTriangleInCurrentResolveLevel);
62 SkASSERT(indexData.size() == triangleCount);
63 SkASSERT(nextIndex == baseIndex + triangleCount + 2);
72 int vertexCount = bufferSize /
sizeof(
SkPoint);
85 vertexWriter << (
float)0 << (
float)0;
86 vertexWriter << (
float)0 << (
float)1;
89 int maxResolveLevel =
SkPrevLog2(vertexCount - 1);
90 SkASSERT((1 << maxResolveLevel) + 1 == vertexCount);
91 for (
int resolveLevel = 1; resolveLevel <= maxResolveLevel; ++resolveLevel) {
92 int numSegmentsInResolveLevel = 1 << resolveLevel;
95 for (
int i = 1;
i < numSegmentsInResolveLevel;
i += 2) {
96 vertexWriter << (
float)resolveLevel << (
float)
i;
104 write_curve_index_buffer_base_index(std::move(vertexWriter), bufferSize, 0);
111 vertexWriter << -1.f << -1.f;
118 SkASSERT(bufferSize >=
sizeof(uint16_t) * 3);
121 vertexWriter << (uint16_t)0 << (uint16_t)1 << (uint16_t)2;
124 write_curve_index_buffer_base_index(std::move(vertexWriter),
125 bufferSize -
sizeof(uint16_t) * 3,
130 int edgeCount = bufferSize / (
sizeof(
float) * 2);
131 for (
int i = 0;
i < edgeCount; ++
i) {
132 vertexWriter << (
float)
i << (
float)-
i;
static int SkPrevLog2(uint32_t value)
SkDEBUGCODE(SK_SPI) SkThreadID SkGetThreadID()
static void WriteIndexBuffer(VertexWriter, size_t bufferSize)
static void WriteVertexBuffer(VertexWriter, size_t bufferSize)
static void WriteVertexBuffer(VertexWriter, size_t bufferSize)
static void WriteVertexBuffer(VertexWriter, size_t bufferSize)
static void WriteIndexBuffer(VertexWriter, size_t bufferSize)
static constexpr int NumCurveTrianglesAtResolveLevel(int resolveLevel)
Mark mark(size_t offset=0) const
static ArrayDesc< T > Array(const T *array, int count)