@@ -17,9 +17,9 @@ namespace ext
17
17
namespace TextRendering
18
18
{
19
19
20
- uint32_t TextRenderer::generateShapeMSDF (
21
- ICPUBuffer* buffer ,
22
- uint32_t bufferOffset,
20
+ void TextRenderer::generateShapeMSDF (
21
+ ICPUBuffer* bufferToFill ,
22
+ size_t * bufferOffset,
23
23
msdfgen::Shape glyph,
24
24
float32_t msdfPixelRange,
25
25
uint32_t2 msdfExtents,
@@ -29,13 +29,11 @@ uint32_t TextRenderer::generateShapeMSDF(
29
29
uint32_t glyphW = msdfExtents.x ;
30
30
uint32_t glyphH = msdfExtents.y ;
31
31
32
- uint32_t bufferSize = glyphW * glyphH * sizeof (int8_t ) * 4 ;
33
- if (buffer->getSize () + bufferOffset < bufferSize)
34
- {
35
- return 0u ;
36
- }
32
+ size_t & offset = *bufferOffset;
33
+ size_t bufferSize = glyphW * glyphH * sizeof (int8_t ) * 4 ;
34
+ assert (bufferToFill->getSize () >= bufferSize + bufferOffset);
37
35
38
- int8_t * data = reinterpret_cast <int8_t *>(buffer ->getPointer ());
36
+ int8_t * data = reinterpret_cast <int8_t *>(bufferToFill ->getPointer ());
39
37
40
38
auto floatToSNORM8 = [](const float fl) -> int8_t
41
39
{
@@ -57,14 +55,14 @@ uint32_t TextRenderer::generateShapeMSDF(
57
55
for (int x = 0 ; x < msdfExtents.y ; ++x)
58
56
{
59
57
auto pixel = msdfMap (x, msdfExtents.y - 1 - y);
60
- data[bufferOffset + (x + y * msdfExtents.x ) * 4 + 0 ] = floatToSNORM8 (pixel[0 ]);
61
- data[bufferOffset + (x + y * msdfExtents.x ) * 4 + 1 ] = floatToSNORM8 (pixel[1 ]);
62
- data[bufferOffset + (x + y * msdfExtents.x ) * 4 + 2 ] = floatToSNORM8 (pixel[2 ]);
63
- data[bufferOffset + (x + y * msdfExtents.x ) * 4 + 3 ] = floatToSNORM8 (pixel[3 ]);
58
+ data[offset + (x + y * msdfExtents.x ) * 4 + 0 ] = floatToSNORM8 (pixel[0 ]);
59
+ data[offset + (x + y * msdfExtents.x ) * 4 + 1 ] = floatToSNORM8 (pixel[1 ]);
60
+ data[offset + (x + y * msdfExtents.x ) * 4 + 2 ] = floatToSNORM8 (pixel[2 ]);
61
+ data[offset + (x + y * msdfExtents.x ) * 4 + 3 ] = floatToSNORM8 (pixel[3 ]);
64
62
}
65
63
}
66
64
67
- return bufferSize;
65
+ offset += bufferSize;
68
66
}
69
67
70
68
constexpr double FreeTypeFontScaling = 1.0 / 64.0 ;
@@ -114,7 +112,7 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t baseMSDFP
114
112
auto buffer = core::make_smart_refctd_ptr<ICPUBuffer>(bufferSize);
115
113
auto regions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<IImage::SBufferCopy>>(mipLevels);
116
114
117
- uint32_t bufferOffset = 0u ;
115
+ size_t bufferOffset = 0ull ;
118
116
for (uint32_t i = 0 ; i < mipLevels; i++)
119
117
{
120
118
// we need to generate a msdfgen per mip map, because the msdf generate call consumes the shape
@@ -163,10 +161,7 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t baseMSDFP
163
161
// We are using `baseMSDFPixelRange`, because we still need larger range for smaller mips when aa feather is relatively large.
164
162
// WARNING: HWTrilinear filtering will not give correct results.
165
163
// because now the baseMSDFPixelRange is being used for all mips as it's wrong to mix/lerp values that have different scales (pixel ranges)
166
- uint32_t result = m_textRenderer->generateShapeMSDF (buffer.get (), bufferOffset, shape, baseMSDFPixelRange, mipExtents, float32_t2 (uniformScale, uniformScale), translate);
167
- // Failing here means the buffer didn't have enough space
168
- assert (result);
169
- bufferOffset += result;
164
+ m_textRenderer->generateShapeMSDF (buffer.get (), &bufferOffset, shape, baseMSDFPixelRange, mipExtents, float32_t2 (uniformScale, uniformScale), translate);
170
165
}
171
166
assert (bufferOffset <= buffer->getCreationParams ().size );
172
167
image->setBufferAndRegions (std::move (buffer), std::move (regions));
0 commit comments