From 70ac380a33b7e9768108018dd0b89ca1e3d3341d Mon Sep 17 00:00:00 2001 From: TEDERIs Date: Fri, 16 Dec 2022 12:06:27 +0700 Subject: [PATCH 1/3] SVG texture lock checks --- .../logic/CClientVectorGraphicDisplay.cpp | 57 ++++++++----------- .../logic/luadefs/CLuaVectorGraphicDefs.cpp | 2 +- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp b/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp index 1625403685..c8b9c6b7a1 100644 --- a/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp +++ b/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp @@ -42,8 +42,7 @@ void CClientVectorGraphicDisplay::Render() if (HasUpdated()) { m_pVectorGraphic->OnUpdate(); - } - + } } void CClientVectorGraphicDisplay::UpdateTexture() @@ -52,46 +51,41 @@ void CClientVectorGraphicDisplay::UpdateTexture() return; Document* svgDocument = m_pVectorGraphic->GetSVGDocument(); - - if (svgDocument == nullptr) + if (!svgDocument) return; CVectorGraphicItem* pVectorGraphicItem = m_pVectorGraphic->GetRenderItem(); - if (!pVectorGraphicItem) return; IDirect3DSurface9* surface = m_pVectorGraphic->GetRenderItem()->m_pD3DRenderTargetSurface; - if (!surface) return; - IDirect3DDevice9* device = pVectorGraphicItem->m_pDevice; - - uint width = pVectorGraphicItem->m_uiSizeX; - uint height = pVectorGraphicItem->m_uiSizeY; - - Bitmap bitmap = svgDocument->renderToBitmap(width, height); + Bitmap bitmap = svgDocument->renderToBitmap(pVectorGraphicItem->m_uiSizeX, pVectorGraphicItem->m_uiSizeY); + if (!bitmap.valid()) + return; // Lock surface D3DLOCKED_RECT LockedRect; - surface->LockRect(&LockedRect, nullptr, 0); + if (SUCCEEDED(surface->LockRect(&LockedRect, nullptr, D3DLOCK_DISCARD))) + { + auto surfaceData = static_cast(LockedRect.pBits); + auto sourceData = static_cast(bitmap.data()); - auto surfaceData = static_cast(LockedRect.pBits); - auto sourceData = static_cast(bitmap.data()); + for (uint32_t y = 0; y < bitmap.height(); ++y) + { + memcpy(surfaceData, sourceData, bitmap.width() * 4); // 4 bytes per pixel - for (uint32_t y = 0; y < bitmap.height(); ++y) - { - memcpy(surfaceData, sourceData, bitmap.width() * 4); // 4 bytes per pixel + // advance row pointers + sourceData += bitmap.stride(); + surfaceData += LockedRect.Pitch; + } - // advance row pointers - sourceData += bitmap.stride(); - surfaceData += LockedRect.Pitch; + // Unlock surface + surface->UnlockRect(); } - // Unlock surface - surface->UnlockRect(); - m_bHasUpdated = false; } @@ -101,25 +95,22 @@ void CClientVectorGraphicDisplay::ClearTexture() return; CVectorGraphicItem* pVectorGraphicItem = m_pVectorGraphic->GetRenderItem(); - if (!pVectorGraphicItem) return; IDirect3DSurface9* surface = pVectorGraphicItem->m_pD3DRenderTargetSurface; - if (!surface) return; - IDirect3DDevice9* device = pVectorGraphicItem->m_pDevice; - // Lock surface D3DLOCKED_RECT LockedRect; - surface->LockRect(&LockedRect, nullptr, 0); - - device->ColorFill(surface, nullptr, D3DCOLOR_ARGB(0, 0, 0, 0)); + if (SUCCEEDED(surface->LockRect(&LockedRect, nullptr, 0))) + { + std::memset(LockedRect.pBits, 0x0, LockedRect.Pitch * pVectorGraphicItem->m_uiSurfaceSizeY); - // Unlock surface - surface->UnlockRect(); + // Unlock surface + surface->UnlockRect(); + } m_bIsCleared = true; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp index c9f6683f8f..49fc653e4d 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp @@ -126,7 +126,7 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector g_pClientGame->GetManager()->GetRenderElementManager()->CreateVectorGraphic(static_cast(size.fX), static_cast(size.fY)); if (!vectorGraphic) - return false; + return nullptr; if (pathOrRawData.has_value()) { From b71b5830b522ae0f7ac46498d8753f39e89d2c96 Mon Sep 17 00:00:00 2001 From: TEDERIs Date: Fri, 16 Dec 2022 12:14:16 +0700 Subject: [PATCH 2/3] Lock rect with D3DLOCK_DISCARD --- Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp b/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp index c8b9c6b7a1..65c957cdab 100644 --- a/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp +++ b/Client/mods/deathmatch/logic/CClientVectorGraphicDisplay.cpp @@ -104,7 +104,7 @@ void CClientVectorGraphicDisplay::ClearTexture() // Lock surface D3DLOCKED_RECT LockedRect; - if (SUCCEEDED(surface->LockRect(&LockedRect, nullptr, 0))) + if (SUCCEEDED(surface->LockRect(&LockedRect, nullptr, D3DLOCK_DISCARD))) { std::memset(LockedRect.pBits, 0x0, LockedRect.Pitch * pVectorGraphicItem->m_uiSurfaceSizeY); From c0b0bf1b5ac14cbf29116f6feab0109de865599c Mon Sep 17 00:00:00 2001 From: TEDERIs Date: Fri, 16 Dec 2022 12:36:43 +0700 Subject: [PATCH 3/3] Fix return type inconsistency --- .../mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp index 49fc653e4d..e70cfa77ae 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaVectorGraphicDefs.cpp @@ -151,7 +151,7 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector if (!didLoad) { delete vectorGraphic; - return false; + return nullptr; } } else @@ -177,7 +177,7 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector if (!didLoad) { delete vectorGraphic; - return false; + return nullptr; } } else @@ -185,7 +185,7 @@ CClientVectorGraphic* CLuaVectorGraphicDefs::SVGCreate(lua_State* luaVM, CVector delete vectorGraphic; m_pScriptDebugging->LogCustom(luaVM, SString("Unable to load SVG (invalid file path) [%s]", pathOrRawData.value().c_str())); - return false; + return nullptr; } } }