mirror of
https://github.com/thunderbrewhq/squall.git
synced 2026-02-04 08:59:07 +00:00
feat(region): add SRgnIsPointInRegionf
This commit is contained in:
parent
a5c55bc803
commit
d322f579a2
3 changed files with 82 additions and 0 deletions
|
|
@ -514,3 +514,30 @@ void SRgnGetRectsf(HSRGN handle, uint32_t* numRects, RECTF* buffer) {
|
||||||
|
|
||||||
s_rgntable.Unlock(lockedHandle);
|
s_rgntable.Unlock(lockedHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t SRgnIsPointInRegionf(HSRGN handle, float x, float y) {
|
||||||
|
STORM_VALIDATE_BEGIN;
|
||||||
|
STORM_VALIDATE(handle);
|
||||||
|
STORM_VALIDATE_END;
|
||||||
|
|
||||||
|
HLOCKEDRGN lockedHandle;
|
||||||
|
auto rgn = s_rgntable.Lock(handle, &lockedHandle, 0);
|
||||||
|
if (!rgn) return 0;
|
||||||
|
|
||||||
|
int32_t result = 0;
|
||||||
|
|
||||||
|
SOURCE* sourceArray = rgn->source.Ptr();
|
||||||
|
uint32_t sourceRects = rgn->source.Count();
|
||||||
|
for (uint32_t i = 0; i < sourceRects; i++) {
|
||||||
|
if (!(sourceArray[i].flags & SF_PARAMONLY)) {
|
||||||
|
if (x >= sourceArray[i].rect.left && y >= sourceArray[i].rect.bottom &&
|
||||||
|
x < sourceArray[i].rect.right && y < sourceArray[i].rect.top) {
|
||||||
|
result = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s_rgntable.Unlock(lockedHandle);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,4 +20,7 @@ void SRgnGetRectParamsf(HSRGN handle, RECTF* rect, uint32_t* numParams, void** b
|
||||||
|
|
||||||
void SRgnGetRectsf(HSRGN handle, uint32_t* numRects, RECTF* buffer);
|
void SRgnGetRectsf(HSRGN handle, uint32_t* numRects, RECTF* buffer);
|
||||||
|
|
||||||
|
int32_t SRgnIsPointInRegionf(HSRGN handle, float x, float y);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -245,3 +245,55 @@ TEST_CASE("SRgnGetRectsf", "[region]") {
|
||||||
CHECK_THAT(buffer[0], MatchesRect(rct1));
|
CHECK_THAT(buffer[0], MatchesRect(rct1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("SRgnIsPointInRegionf", "[region]") {
|
||||||
|
RgnDataTest region;
|
||||||
|
|
||||||
|
SECTION("false if region has no rects") {
|
||||||
|
auto x = GENERATE(0.0f, 1.0f, INFINITY);
|
||||||
|
auto y = GENERATE(0.0f, -1.0f, -INFINITY);
|
||||||
|
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("false if using an invalid region object") {
|
||||||
|
HSRGN inval = reinterpret_cast<HSRGN>(1234);
|
||||||
|
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(inval, 0.0f, 0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("reports if points are inside a region") {
|
||||||
|
RECTF rct1 = { -10, -10, -1, -1 };
|
||||||
|
RECTF rct2 = { 1, 1, 5, 5 };
|
||||||
|
SRgnCombineRectf(region, &rct1, nullptr, SRGN_OR);
|
||||||
|
SRgnCombineRectf(region, &rct2, nullptr, SRGN_OR);
|
||||||
|
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 0.0f, 0.0f));
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, -11.0f, -5.0f));
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 4.0f, 6.0f));
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 1.0f, 0.0f));
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 0.0f, -1.0f));
|
||||||
|
CHECK(SRgnIsPointInRegionf(region, -10.0f, -10.0f));
|
||||||
|
CHECK(SRgnIsPointInRegionf(region, -1.1f, -1.1f));
|
||||||
|
CHECK(SRgnIsPointInRegionf(region, 3.0f, 2.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("ignores param only rects") {
|
||||||
|
RECTF rect = { -1, -1, 1, 1 };
|
||||||
|
SRgnCombineRectf(region, &rect, &rect, SRGN_PARAMONLY);
|
||||||
|
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 0.0f, 0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("excludes upper bounds of rect") {
|
||||||
|
RECTF rect = { 1, 1, 5, 5 };
|
||||||
|
SRgnCombineRectf(region, &rect, nullptr, SRGN_OR);
|
||||||
|
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 5.0f, 5.0f));
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 5.0f, 4.0f));
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 4.0f, 5.0f));
|
||||||
|
CHECK(SRgnIsPointInRegionf(region, 4.9999f, 4.9999f));
|
||||||
|
CHECK(SRgnIsPointInRegionf(region, 1.0f, 1.0f));
|
||||||
|
CHECK_FALSE(SRgnIsPointInRegionf(region, 0.9999f, 1.0f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue