mirror of
https://github.com/whoahq/whoa.git
synced 2026-02-02 00:32:45 +03:00
fix(gx): fix buffer overruns in TEXTLINETEXTURE::WriteGeometry
This commit is contained in:
parent
1352f0ba50
commit
84b16f2aeb
@ -37,17 +37,13 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
|
|||||||
? this->m_colors.Count()
|
? this->m_colors.Count()
|
||||||
: 0;
|
: 0;
|
||||||
|
|
||||||
if (vertexOffset >= this->m_vert.Count()) {
|
// Drop shadows
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t v24 = this->m_vert.Count() - vertexOffset;
|
|
||||||
|
|
||||||
if (vertexCount >= v24) {
|
|
||||||
vertexCount = v24;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasShadow) {
|
if (hasShadow) {
|
||||||
|
if (vertexOffset < this->m_vert.Count()) {
|
||||||
|
int32_t availableVertexCount = this->m_vert.Count() - vertexOffset;
|
||||||
|
int32_t shadowVertexCount = vertexCount >= availableVertexCount ? availableVertexCount : vertexCount;
|
||||||
|
|
||||||
C3Vector shadowTranslation = {
|
C3Vector shadowTranslation = {
|
||||||
viewTranslation.x + floor(ScreenToPixelWidth(0, shadowOffset.x)),
|
viewTranslation.x + floor(ScreenToPixelWidth(0, shadowOffset.x)),
|
||||||
viewTranslation.y + floor(ScreenToPixelHeight(0, shadowOffset.y)),
|
viewTranslation.y + floor(ScreenToPixelHeight(0, shadowOffset.y)),
|
||||||
@ -56,7 +52,7 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
|
|||||||
|
|
||||||
auto color = colorCount ? this->m_colors[vertexOffset] : fontColor;
|
auto color = colorCount ? this->m_colors[vertexOffset] : fontColor;
|
||||||
|
|
||||||
for (int32_t i = 0; i < vertexCount; i++) {
|
for (int32_t i = 0; i < shadowVertexCount; i++) {
|
||||||
auto& vertex = this->m_vert[vertexOffset + i];
|
auto& vertex = this->m_vert[vertexOffset + i];
|
||||||
|
|
||||||
C3Vector p = {
|
C3Vector p = {
|
||||||
@ -79,13 +75,27 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
|
|||||||
|
|
||||||
buffer++;
|
buffer++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vertexCount -= shadowVertexCount;
|
||||||
|
if (vertexOffset + shadowVertexCount >= this->m_vert.Count()) {
|
||||||
|
vertexOffset = 0;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
vertexOffset -= this->m_vert.Count();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Characters
|
||||||
|
|
||||||
|
if (vertexCount && vertexOffset < this->m_vert.Count()) {
|
||||||
|
int32_t availableVertexCount = this->m_vert.Count() - vertexOffset;
|
||||||
|
int32_t characterVertexCount = vertexCount >= availableVertexCount ? availableVertexCount : vertexCount;
|
||||||
|
|
||||||
// if (BATCHEDRENDERFONTDESC::s_billboarded) {
|
// if (BATCHEDRENDERFONTDESC::s_billboarded) {
|
||||||
// // TODO
|
// // TODO
|
||||||
// }
|
// }
|
||||||
|
|
||||||
for (int32_t i = 0; i < vertexCount; i++) {
|
for (int32_t i = 0; i < characterVertexCount; i++) {
|
||||||
auto& vertex = this->m_vert[vertexOffset + i];
|
auto& vertex = this->m_vert[vertexOffset + i];
|
||||||
|
|
||||||
auto color = colorCount ? this->m_colors[vertexOffset + i] : fontColor;
|
auto color = colorCount ? this->m_colors[vertexOffset + i] : fontColor;
|
||||||
@ -109,6 +119,7 @@ void TEXTLINETEXTURE::WriteGeometry(CGxVertexPCT* buffer, const CImVector& fontC
|
|||||||
|
|
||||||
buffer++;
|
buffer++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CGxString* CGxString::GetNewString(int32_t linkOnList) {
|
CGxString* CGxString::GetNewString(int32_t linkOnList) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user