diff --git a/storm/Region.cpp b/storm/Region.cpp index 1d96db2..c7d1509 100644 --- a/storm/Region.cpp +++ b/storm/Region.cpp @@ -39,7 +39,7 @@ void DeleteRect(RECTF* rect) { void FragmentSourceRectangles(TSGrowableArray* sourceArray, uint32_t firstIndex, uint32_t lastIndex, int32_t previousOverlap, const RECTF* rect, void* param, int32_t sequence) { if (firstIndex >= lastIndex) { - AddSourceRect(sourceArray, rect, param, sequence, 0x1 | (previousOverlap ? 0x2 : 0x0)); + AddSourceRect(sourceArray, rect, param, sequence, SF_ADDING | (previousOverlap ? SF_OVERLAPS : SF_NONE)); return; } @@ -53,12 +53,12 @@ void FragmentSourceRectangles(TSGrowableArray* sourceArray, uint32_t fir break; } - source->flags |= 0x2; + source->flags |= SF_OVERLAPS; overlapsExisting = 1; } if (i + 1 == lastIndex) { - AddSourceRect(sourceArray, rect, param, sequence, 0x1 | (previousOverlap ? 0x2 : 0x0)); + AddSourceRect(sourceArray, rect, param, sequence, SF_ADDING | (previousOverlap ? SF_OVERLAPS : SF_NONE)); return; } } @@ -92,7 +92,7 @@ void DeleteSourceRect(TSGrowableArray* sourceArray, uint32_t index) { DeleteRect(&source->rect); source->param = nullptr; source->sequence = -1; - source->flags = 0x0; + source->flags = SF_NONE; } void OptimizeSource(TSGrowableArray* sourceArray) { @@ -117,44 +117,27 @@ void ProcessBooleanOperation(TSGrowableArray* sourceArray, int32_t combi for (uint32_t i = 0; i < sourceArray->Count(); i++) { auto source = &(*sourceArray)[i]; + int32_t remove = 0; switch (combineMode) { - case 1: { - if ((~source->flags >> 1) & 0x1) { - DeleteSourceRect(sourceArray, i); - } - + case SRGN_AND: + remove = !(source->flags & SF_OVERLAPS); + break; + case SRGN_XOR: + remove = source->flags & SF_OVERLAPS; + break; + case SRGN_DIFF: + remove = source->flags & (SF_ADDING | SF_OVERLAPS); + break; + case SRGN_COPY: + remove = source->flags & SF_ADDING; break; } - case 3: { - if (source->flags & 0x2) { - DeleteSourceRect(sourceArray, i); - } - - break; + if (remove) { + DeleteSourceRect(sourceArray, i); } - case 4: { - if (source->flags & (0x1 | 0x2)) { - DeleteSourceRect(sourceArray, i); - } - - break; - } - - case 5: { - if (source->flags & 0x1) { - DeleteSourceRect(sourceArray, i); - } - - break; - } - - default: - break; - } - - source->flags = 0x0; + source->flags = SF_NONE; } } @@ -170,10 +153,10 @@ void SRgnCombineRectf(HSRGN handle, RECTF* rect, void* param, int32_t combineMod auto rgn = s_rgntable.Lock(handle, &lockedHandle, 0); if (rgn) { - if (combineMode == 2 || combineMode == 6) { + if (combineMode == SRGN_OR || combineMode == SRGN_PARAMONLY) { if (!IsNullRect(rect)) { rgn->sequence++; - AddSourceRect(&rgn->source, rect, param, rgn->sequence, combineMode == 6 ? 0x10000 : 0x0); + AddSourceRect(&rgn->source, rect, param, rgn->sequence, combineMode == SRGN_PARAMONLY ? SF_PARAMONLY : SF_NONE); } } else { if (!IsNullRect(rect)) { @@ -235,7 +218,7 @@ void SRgnGetBoundingRectf(HSRGN handle, RECTF* rect) { for (uint32_t i = 0; i < rgn->source.Count(); i++) { auto source = &rgn->source[i]; - if (!(source->flags & 0x10000)) { + if (!(source->flags & SF_PARAMONLY)) { rect->left = std::min(source->rect.left, rect->left); rect->bottom = std::min(source->rect.bottom, rect->bottom); rect->right = std::max(source->rect.right, rect->right); diff --git a/storm/region/RGN.hpp b/storm/region/RGN.hpp index 2958d5c..74fb4f9 100644 --- a/storm/region/RGN.hpp +++ b/storm/region/RGN.hpp @@ -6,6 +6,13 @@ #include "storm/Hash.hpp" #include +// region flgs +#define SF_NONE 0x00 +#define SF_ADDING 0x00000001 +#define SF_OVERLAPS 0x00000002 +#define SF_TEMPMASK 0x00000003 +#define SF_PARAMONLY 0x00010000 + struct SOURCE { RECTF rect; void* param; diff --git a/storm/region/Types.hpp b/storm/region/Types.hpp index 116cf30..123822a 100644 --- a/storm/region/Types.hpp +++ b/storm/region/Types.hpp @@ -15,4 +15,12 @@ struct RECTF { float top; }; +// Combine modes +#define SRGN_AND 1 +#define SRGN_OR 2 +#define SRGN_XOR 3 +#define SRGN_DIFF 4 +#define SRGN_COPY 5 +#define SRGN_PARAMONLY 6 + #endif diff --git a/test/Region.cpp b/test/Region.cpp index 31bb62e..cbd97b3 100644 --- a/test/Region.cpp +++ b/test/Region.cpp @@ -18,7 +18,7 @@ TEST_CASE("SRgnCombineRectf", "[region]") { SRgnCreate(®ion, 0); RECTF baseRect = { 0.0f, 0.0f, 1.0f, 1.0f }; - SRgnCombineRectf(region, &baseRect, nullptr, 2); + SRgnCombineRectf(region, &baseRect, nullptr, SRGN_OR); RECTF boundingRect = { 0.0f, 0.0f, 0.0f, 0.0f }; SRgnGetBoundingRectf(region, &boundingRect); @@ -36,10 +36,10 @@ TEST_CASE("SRgnCombineRectf", "[region]") { SRgnCreate(®ion, 0); RECTF baseRect = { 0.0f, 0.0f, 1.0f, 1.0f }; - SRgnCombineRectf(region, &baseRect, nullptr, 2); + SRgnCombineRectf(region, &baseRect, nullptr, SRGN_OR); RECTF newRect = { 0.0f, 0.0f, 0.0f, 0.0f }; - SRgnCombineRectf(region, &newRect, nullptr, 4); + SRgnCombineRectf(region, &newRect, nullptr, SRGN_DIFF); RECTF boundingRect = { 0.0f, 0.0f, 0.0f, 0.0f }; SRgnGetBoundingRectf(region, &boundingRect); @@ -57,10 +57,10 @@ TEST_CASE("SRgnCombineRectf", "[region]") { SRgnCreate(®ion, 0); RECTF baseRect = { 0.0f, 0.0f, 1.0f, 1.0f }; - SRgnCombineRectf(region, &baseRect, nullptr, 2); + SRgnCombineRectf(region, &baseRect, nullptr, SRGN_OR); RECTF newRect = { 0.0f, 0.0f, 1.0f, 1.0f }; - SRgnCombineRectf(region, &newRect, nullptr, 4); + SRgnCombineRectf(region, &newRect, nullptr, SRGN_DIFF); RECTF boundingRect = { 0.0f, 0.0f, 0.0f, 0.0f }; SRgnGetBoundingRectf(region, &boundingRect); @@ -78,10 +78,10 @@ TEST_CASE("SRgnCombineRectf", "[region]") { SRgnCreate(®ion, 0); RECTF baseRect = { 0.0f, 0.0f, 1.0f, 1.0f }; - SRgnCombineRectf(region, &baseRect, nullptr, 2); + SRgnCombineRectf(region, &baseRect, nullptr, SRGN_OR); RECTF newRect = { 0.0f, 1.0f, 1.0f, 1.0f }; - SRgnCombineRectf(region, &newRect, nullptr, 4); + SRgnCombineRectf(region, &newRect, nullptr, SRGN_DIFF); RECTF boundingRect = { 0.0f, 0.0f, 0.0f, 0.0f }; SRgnGetBoundingRectf(region, &boundingRect);