From 335962e3fcbda8278c16f0f052af7140066af916 Mon Sep 17 00:00:00 2001 From: Adam Heinermann Date: Mon, 21 Apr 2025 00:03:37 -0700 Subject: [PATCH] feat(region): add SRgnDuplicate --- storm/Region.cpp | 23 +++++++++++++++++++++++ storm/Region.hpp | 4 +++- storm/hash/TSHashObject.hpp | 4 ++++ test/Region.cpp | 31 +++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/storm/Region.cpp b/storm/Region.cpp index d5787eb..e3d25dc 100644 --- a/storm/Region.cpp +++ b/storm/Region.cpp @@ -349,6 +349,29 @@ void SRgnDelete(HSRGN handle) { s_rgntable.Delete(handle); } +void SRgnDuplicate(HSRGN orighandle, HSRGN *handle, uint32_t reserved) { + STORM_VALIDATE_BEGIN; + STORM_VALIDATE(handle); + *handle = nullptr; + + STORM_VALIDATE(orighandle); + STORM_VALIDATE(reserved == 0); + STORM_VALIDATE_END_VOID; + + HLOCKEDRGN origlockedhandle; + auto rgn = s_rgntable.Lock(orighandle, &origlockedhandle, 0); + + if (rgn) { + HLOCKEDRGN newlockedhandle; + auto newrgn = s_rgntable.NewLock(handle, &newlockedhandle); + + *newrgn = *rgn; + + s_rgntable.Unlock(newlockedhandle); + s_rgntable.Unlock(origlockedhandle); + } +} + void SRgnGetBoundingRectf(HSRGN handle, RECTF* rect) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(handle); diff --git a/storm/Region.hpp b/storm/Region.hpp index 8f42742..1f4fea5 100644 --- a/storm/Region.hpp +++ b/storm/Region.hpp @@ -8,10 +8,12 @@ void SRgnClear(HSRGN handle); void SRgnCombineRectf(HSRGN handle, RECTF* rect, void* param, int32_t combineMode); -void SRgnCreate(HSRGN* handlePtr, uint32_t reserved); +void SRgnCreate(HSRGN* handlePtr, uint32_t reserved = 0); void SRgnDelete(HSRGN handle); +void SRgnDuplicate(HSRGN orighandle, HSRGN *handle, uint32_t reserved = 0); + void SRgnGetBoundingRectf(HSRGN handle, RECTF* rect); void SRgnGetRectsf(HSRGN handle, uint32_t* numrects, RECTF* buffer); diff --git a/storm/hash/TSHashObject.hpp b/storm/hash/TSHashObject.hpp index 4d38763..f8da9d3 100644 --- a/storm/hash/TSHashObject.hpp +++ b/storm/hash/TSHashObject.hpp @@ -12,6 +12,10 @@ class TSHashObject { TSLink m_linktoslot; TSLink m_linktofull; TKey m_key; + + TSHashObject & operator=(const TSHashObject &source) { + return *this; + } }; #endif diff --git a/test/Region.cpp b/test/Region.cpp index 8da9cf0..699ea5d 100644 --- a/test/Region.cpp +++ b/test/Region.cpp @@ -92,6 +92,37 @@ TEST_CASE("SRgnCombineRectf", "[region]") { } } +TEST_CASE("SRgnDuplicate", "[region]") { + RgnDataTest region; + + SECTION("creates an independent copy of a region") { + RECTF baseRect = { -1.0f, 1.0f, 1.0f, 2.0f }; + SRgnCombineRectf(region, &baseRect, nullptr, SRGN_OR); + + HSRGN newrgn = nullptr; + SRgnDuplicate(region, &newrgn); + + REQUIRE(newrgn != nullptr); + SRgnClear(region); + + uint32_t numrects = 1; + RECTF buffer[1]; + SRgnGetRectsf(newrgn, &numrects, buffer); + + REQUIRE(numrects == 1); + CHECK_THAT(buffer[0], MatchesRect(baseRect)); + } + + SECTION("sets handle to null when using an invalid region object") { + HSRGN inval = reinterpret_cast(1234); + + HSRGN newrgn = reinterpret_cast(12345); + SRgnDuplicate(inval, &newrgn); + + CHECK(newrgn == nullptr); + } +} + TEST_CASE("SRgnGetRectsf", "[region]") { RgnDataTest region;