aboutsummaryrefslogtreecommitdiff
path: root/source/clip.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/clip.c')
-rw-r--r--source/clip.c818
1 files changed, 403 insertions, 415 deletions
diff --git a/source/clip.c b/source/clip.c
index 7931101..1a52bea 100644
--- a/source/clip.c
+++ b/source/clip.c
@@ -23,7 +23,7 @@ struct Band
R.Left = MAX(A.Left, B.Left); \
R.Right = MIN(A.Right, B.Right);}
-static int IntCompare(const void* d1, const void* d2)
+static int32_t IntCompare(const void* d1, const void* d2)
{
if (*(uint32_t*) d1 > *(uint32_t*) d2)
return (1);
@@ -32,7 +32,7 @@ static int IntCompare(const void* d1, const void* d2)
return (0);
}
-static int BandCompare(const void* d1, const void* d2)
+static int32_t BandCompare(const void* d1, const void* d2)
{
if (((struct Band*) d1)->Left > ((struct Band*) d2)->Left)
return (1);
@@ -44,7 +44,7 @@ static int BandCompare(const void* d1, const void* d2)
void ComputeClipWindows()
{
struct ClipData* pClip = &IPPU.Clip [0];
- int c, w, i;
+ int32_t c, w, i;
// Loop around the main screen then the sub-screen.
for (c = 0; c < 2; c++, pClip++)
@@ -81,7 +81,7 @@ void ComputeClipWindows()
{
// The sub-screen is switched off, completely
// clip everything.
- int i;
+ int32_t i;
for (i = 0; i < 6; i++)
{
IPPU.Clip [1].Count [i] = 1;
@@ -95,578 +95,566 @@ void ComputeClipWindows()
}
}
+ if (w == 5 || pClip->Count [5] ||
+ (Memory.FillRAM [0x212c + c] & Memory.FillRAM [0x212e + c] & (1 << w)))
{
- if (w == 5 || pClip->Count [5] ||
+ struct Band Win1[3];
+ struct Band Win2[3];
+ uint32_t Window1Enabled = 0;
+ uint32_t Window2Enabled = 0;
+ bool invert = (w == 5 &&
+ ((c == 1 && (Memory.FillRAM [0x2130] & 0x30) == 0x10) ||
+ (c == 0 && (Memory.FillRAM [0x2130] & 0xc0) == 0x40)));
+
+ if (w == 5 ||
(Memory.FillRAM [0x212c + c] & Memory.FillRAM [0x212e + c] & (1 << w)))
{
- struct Band Win1[3];
- struct Band Win2[3];
- uint32_t Window1Enabled = 0;
- uint32_t Window2Enabled = 0;
- bool invert = (w == 5 &&
- ((c == 1 && (Memory.FillRAM [0x2130] & 0x30) == 0x10) ||
- (c == 0 && (Memory.FillRAM [0x2130] & 0xc0) == 0x40)));
-
- if (w == 5 ||
- (Memory.FillRAM [0x212c + c] & Memory.FillRAM [0x212e + c] & (1 << w)))
+ if (PPU.ClipWindow1Enable [w])
{
- if (PPU.ClipWindow1Enable [w])
+ if (!PPU.ClipWindow1Inside [w])
{
- if (!PPU.ClipWindow1Inside [w])
- {
- Win1[Window1Enabled].Left = PPU.Window1Left;
- Win1[Window1Enabled++].Right = PPU.Window1Right + 1;
- }
- else
+ Win1[Window1Enabled].Left = PPU.Window1Left;
+ Win1[Window1Enabled++].Right = PPU.Window1Right + 1;
+ }
+ else
+ {
+ if (PPU.Window1Left <= PPU.Window1Right)
{
- if (PPU.Window1Left <= PPU.Window1Right)
+ if (PPU.Window1Left > 0)
{
- if (PPU.Window1Left > 0)
- {
- Win1[Window1Enabled].Left = 0;
- Win1[Window1Enabled++].Right = PPU.Window1Left;
- }
- if (PPU.Window1Right < 255)
- {
- Win1[Window1Enabled].Left = PPU.Window1Right + 1;
- Win1[Window1Enabled++].Right = 256;
- }
- if (Window1Enabled == 0)
- {
- Win1[Window1Enabled].Left = 1;
- Win1[Window1Enabled++].Right = 0;
- }
+ Win1[Window1Enabled].Left = 0;
+ Win1[Window1Enabled++].Right = PPU.Window1Left;
}
- else
+ if (PPU.Window1Right < 255)
{
- // 'outside' a window with no range -
- // appears to be the whole screen.
- Win1[Window1Enabled].Left = 0;
+ Win1[Window1Enabled].Left = PPU.Window1Right + 1;
Win1[Window1Enabled++].Right = 256;
}
+ if (Window1Enabled == 0)
+ {
+ Win1[Window1Enabled].Left = 1;
+ Win1[Window1Enabled++].Right = 0;
+ }
}
- }
- if (PPU.ClipWindow2Enable [w])
- {
- if (!PPU.ClipWindow2Inside [w])
+ else
{
- Win2[Window2Enabled].Left = PPU.Window2Left;
- Win2[Window2Enabled++].Right = PPU.Window2Right + 1;
+ // 'outside' a window with no range -
+ // appears to be the whole screen.
+ Win1[Window1Enabled].Left = 0;
+ Win1[Window1Enabled++].Right = 256;
}
- else
+ }
+ }
+ if (PPU.ClipWindow2Enable [w])
+ {
+ if (!PPU.ClipWindow2Inside [w])
+ {
+ Win2[Window2Enabled].Left = PPU.Window2Left;
+ Win2[Window2Enabled++].Right = PPU.Window2Right + 1;
+ }
+ else
+ {
+ if (PPU.Window2Left <= PPU.Window2Right)
{
- if (PPU.Window2Left <= PPU.Window2Right)
+ if (PPU.Window2Left > 0)
{
- if (PPU.Window2Left > 0)
- {
- Win2[Window2Enabled].Left = 0;
- Win2[Window2Enabled++].Right = PPU.Window2Left;
- }
- if (PPU.Window2Right < 255)
- {
- Win2[Window2Enabled].Left = PPU.Window2Right + 1;
- Win2[Window2Enabled++].Right = 256;
- }
- if (Window2Enabled == 0)
- {
- Win2[Window2Enabled].Left = 1;
- Win2[Window2Enabled++].Right = 0;
- }
+ Win2[Window2Enabled].Left = 0;
+ Win2[Window2Enabled++].Right = PPU.Window2Left;
}
- else
+ if (PPU.Window2Right < 255)
{
- Win2[Window2Enabled].Left = 0;
+ Win2[Window2Enabled].Left = PPU.Window2Right + 1;
Win2[Window2Enabled++].Right = 256;
}
+ if (Window2Enabled == 0)
+ {
+ Win2[Window2Enabled].Left = 1;
+ Win2[Window2Enabled++].Right = 0;
+ }
+ }
+ else
+ {
+ Win2[Window2Enabled].Left = 0;
+ Win2[Window2Enabled++].Right = 256;
}
}
}
- if (Window1Enabled && Window2Enabled)
+ }
+ if (Window1Enabled && Window2Enabled)
+ {
+ // Overlap logic
+ //
+ // Each window will be in one of three states:
+ // 1. <no range> (Left > Right. One band)
+ // 2. | ---------------- | (Left >= 0, Right <= 255, Left <= Right. One band)
+ // 3. |------------ ----------| (Left1 == 0, Right1 < Left2; Left2 > Right1, Right2 == 255. Two bands)
+ struct Band Bands [6];
+ int32_t B = 0;
+ switch (PPU.ClipWindowOverlapLogic [w] ^ 1)
{
- // Overlap logic
- //
- // Each window will be in one of three states:
- // 1. <no range> (Left > Right. One band)
- // 2. | ---------------- | (Left >= 0, Right <= 255, Left <= Right. One band)
- // 3. |------------ ----------| (Left1 == 0, Right1 < Left2; Left2 > Right1, Right2 == 255. Two bands)
-
- struct Band Bands [6];
- int B = 0;
- switch (PPU.ClipWindowOverlapLogic [w] ^ 1)
+ case CLIP_OR:
+ if (Window1Enabled == 1)
{
- case CLIP_OR:
- if (Window1Enabled == 1)
+ if (BAND_EMPTY(Win1[0]))
{
- if (BAND_EMPTY(Win1[0]))
- {
- B = Window2Enabled;
- // memmove converted: Different stack allocations [Neb]
- memcpy(Bands, Win2,
- sizeof(Win2[0]) * Window2Enabled);
- }
- else
+ B = Window2Enabled;
+ // memmove converted: Different stack allocations [Neb]
+ memcpy(Bands, Win2, sizeof(Win2[0]) * Window2Enabled);
+ }
+ else
+ {
+ if (Window2Enabled == 1)
{
- if (Window2Enabled == 1)
- {
- if (BAND_EMPTY(Win2[0]))
- Bands[B++] = Win1[0];
- else
- {
- if (BANDS_INTERSECT(Win1[0], Win2[0]))
- {
- OR_BANDS(Bands[0], Win1[0], Win2[0])
- B = 1;
- }
- else
- {
- Bands[B++] = Win1[0];
- Bands[B++] = Win2[0];
- }
- }
- }
+ if (BAND_EMPTY(Win2[0]))
+ Bands[B++] = Win1[0];
else
{
if (BANDS_INTERSECT(Win1[0], Win2[0]))
{
OR_BANDS(Bands[0], Win1[0], Win2[0])
- if (BANDS_INTERSECT(Win1[0], Win2[1]))
- OR_BANDS(Bands[1], Win1[0], Win2[1])
- else
- Bands[1] = Win2[1];
B = 1;
- if (BANDS_INTERSECT(Bands[0], Bands[1]))
- OR_BANDS(Bands[0], Bands[0], Bands[1])
- else
- B = 2;
- }
- else if (BANDS_INTERSECT(Win1[0], Win2[1]))
- {
- Bands[B++] = Win2[0];
- OR_BANDS(Bands[B], Win1[0], Win2[1]);
- B++;
}
else
{
- Bands[0] = Win2[0];
- Bands[1] = Win1[0];
- Bands[2] = Win2[1];
- B = 3;
+ Bands[B++] = Win1[0];
+ Bands[B++] = Win2[0];
}
}
}
- }
- else if (Window2Enabled == 1)
- {
- if (BAND_EMPTY(Win2[0]))
- {
- // Window 2 defines an empty range - just
- // use window 1 as the clipping (which
- // could also be empty).
- B = Window1Enabled;
- // memmove converted: Different stack allocations [Neb]
- memcpy(Bands, Win1,
- sizeof(Win1[0]) * Window1Enabled);
- }
else
{
- // Window 1 has two bands and Window 2 has one.
- // Neither is an empty region.
- if (BANDS_INTERSECT(Win2[0], Win1[0]))
+ if (BANDS_INTERSECT(Win1[0], Win2[0]))
{
- OR_BANDS(Bands[0], Win2[0], Win1[0])
- if (BANDS_INTERSECT(Win2[0], Win1[1]))
- OR_BANDS(Bands[1], Win2[0], Win1[1])
- else
- Bands[1] = Win1[1];
+ OR_BANDS(Bands[0], Win1[0], Win2[0])
+ if (BANDS_INTERSECT(Win1[0], Win2[1]))
+ OR_BANDS(Bands[1], Win1[0], Win2[1])
+ else
+ Bands[1] = Win2[1];
B = 1;
if (BANDS_INTERSECT(Bands[0], Bands[1]))
OR_BANDS(Bands[0], Bands[0], Bands[1])
- else
- B = 2;
+ else
+ B = 2;
}
- else if (BANDS_INTERSECT(Win2[0], Win1[1]))
+ else if (BANDS_INTERSECT(Win1[0], Win2[1]))
{
- Bands[B++] = Win1[0];
- OR_BANDS(Bands[B], Win2[0], Win1[1]);
+ Bands[B++] = Win2[0];
+ OR_BANDS(Bands[B], Win1[0], Win2[1]);
B++;
}
else
{
- Bands[0] = Win1[0];
- Bands[1] = Win2[0];
- Bands[2] = Win1[1];
+ Bands[0] = Win2[0];
+ Bands[1] = Win1[0];
+ Bands[2] = Win2[1];
B = 3;
}
}
}
- else
+ }
+ else if (Window2Enabled == 1)
+ {
+ if (BAND_EMPTY(Win2[0]))
{
- // Both windows have two bands
- OR_BANDS(Bands[0], Win1[0], Win2[0]);
- OR_BANDS(Bands[1], Win1[1], Win2[1]);
- B = 1;
- if (BANDS_INTERSECT(Bands[0], Bands[1]))
- OR_BANDS(Bands[0], Bands[0], Bands[1])
- else
- B = 2;
+ // Window 2 defines an empty range - just
+ // use window 1 as the clipping (which
+ // could also be empty).
+ B = Window1Enabled;
+ // memmove converted: Different stack allocations [Neb]
+ memcpy(Bands, Win1, sizeof(Win1[0]) * Window1Enabled);
}
- break;
-
- case CLIP_AND:
- if (Window1Enabled == 1)
+ else
{
- // Window 1 has one band
- if (BAND_EMPTY(Win1[0]))
- Bands [B++] = Win1[0];
- else if (Window2Enabled == 1)
+ // Window 1 has two bands and Window 2 has one.
+ // Neither is an empty region.
+ if (BANDS_INTERSECT(Win2[0], Win1[0]))
{
- if (BAND_EMPTY(Win2[0]))
- Bands [B++] = Win2[0];
+ OR_BANDS(Bands[0], Win2[0], Win1[0])
+ if (BANDS_INTERSECT(Win2[0], Win1[1]))
+ OR_BANDS(Bands[1], Win2[0], Win1[1])
else
- {
- AND_BANDS(Bands[0], Win1[0], Win2[0]);
- B = 1;
- }
+ Bands[1] = Win1[1];
+ B = 1;
+ if (BANDS_INTERSECT(Bands[0], Bands[1]))
+ OR_BANDS(Bands[0], Bands[0], Bands[1])
+ else
+ B = 2;
+ }
+ else if (BANDS_INTERSECT(Win2[0], Win1[1]))
+ {
+ Bands[B++] = Win1[0];
+ OR_BANDS(Bands[B], Win2[0], Win1[1]);
+ B++;
}
else
{
- AND_BANDS(Bands[0], Win1[0], Win2[0]);
- AND_BANDS(Bands[1], Win1[0], Win2[1]);
- B = 2;
+ Bands[0] = Win1[0];
+ Bands[1] = Win2[0];
+ Bands[2] = Win1[1];
+ B = 3;
}
}
+ }
+ else
+ {
+ // Both windows have two bands
+ OR_BANDS(Bands[0], Win1[0], Win2[0]);
+ OR_BANDS(Bands[1], Win1[1], Win2[1]);
+ B = 1;
+ if (BANDS_INTERSECT(Bands[0], Bands[1]))
+ OR_BANDS(Bands[0], Bands[0], Bands[1])
+ else
+ B = 2;
+ }
+ break;
+ case CLIP_AND:
+ if (Window1Enabled == 1)
+ {
+ // Window 1 has one band
+ if (BAND_EMPTY(Win1[0]))
+ Bands [B++] = Win1[0];
else if (Window2Enabled == 1)
{
if (BAND_EMPTY(Win2[0]))
- Bands[B++] = Win2[0];
+ Bands [B++] = Win2[0];
else
{
- // Window 1 has two bands.
AND_BANDS(Bands[0], Win1[0], Win2[0]);
- AND_BANDS(Bands[1], Win1[1], Win2[0]);
- B = 2;
+ B = 1;
}
}
else
{
- // Both windows have two bands.
AND_BANDS(Bands[0], Win1[0], Win2[0]);
- AND_BANDS(Bands[1], Win1[1], Win2[1]);
+ AND_BANDS(Bands[1], Win1[0], Win2[1]);
B = 2;
- if (BANDS_INTERSECT(Win1[0], Win2[1]))
- {
- AND_BANDS(Bands[2], Win1[0], Win2[1]);
- B = 3;
- }
- else if (BANDS_INTERSECT(Win1[1], Win2[0]))
- {
- AND_BANDS(Bands[2], Win1[1], Win2[0]);
- B = 3;
- }
}
- break;
- case CLIP_XNOR:
- invert = !invert;
+ }
+ else if (Window2Enabled == 1)
+ {
+ if (BAND_EMPTY(Win2[0]))
+ Bands[B++] = Win2[0];
+ else
+ {
+ // Window 1 has two bands.
+ AND_BANDS(Bands[0], Win1[0], Win2[0]);
+ AND_BANDS(Bands[1], Win1[1], Win2[0]);
+ B = 2;
+ }
+ }
+ else
+ {
+ // Both windows have two bands.
+ AND_BANDS(Bands[0], Win1[0], Win2[0]);
+ AND_BANDS(Bands[1], Win1[1], Win2[1]);
+ B = 2;
+ if (BANDS_INTERSECT(Win1[0], Win2[1]))
+ {
+ AND_BANDS(Bands[2], Win1[0], Win2[1]);
+ B = 3;
+ }
+ else if (BANDS_INTERSECT(Win1[1], Win2[0]))
+ {
+ AND_BANDS(Bands[2], Win1[1], Win2[0]);
+ B = 3;
+ }
+ }
+ break;
+ case CLIP_XNOR:
+ invert = !invert;
// Fall...
+ case CLIP_XOR:
+ if (Window1Enabled == 1 && BAND_EMPTY(Win1[0]))
+ {
+ B = Window2Enabled;
+ // memmove converted: Different stack allocations [Neb]
+ memcpy(Bands, Win2, sizeof(Win2[0]) * Window2Enabled);
+ }
+ else if (Window2Enabled == 1 && BAND_EMPTY(Win2[0]))
+ {
+ B = Window1Enabled;
+ // memmove converted: Different stack allocations [Neb]
+ memcpy(Bands, Win1, sizeof(Win1[0]) * Window1Enabled);
+ }
+ else
+ {
+ uint32_t p = 0;
+ uint32_t points [10];
+ uint32_t i;
- case CLIP_XOR:
- if (Window1Enabled == 1 && BAND_EMPTY(Win1[0]))
+ invert = !invert;
+ // Build an array of points (window edges)
+ points [p++] = 0;
+ for (i = 0; i < Window1Enabled; i++)
{
- B = Window2Enabled;
- // memmove converted: Different stack allocations [Neb]
- memcpy(Bands, Win2,
- sizeof(Win2[0]) * Window2Enabled);
+ points [p++] = Win1[i].Left;
+ points [p++] = Win1[i].Right;
}
- else if (Window2Enabled == 1 && BAND_EMPTY(Win2[0]))
+ for (i = 0; i < Window2Enabled; i++)
{
- B = Window1Enabled;
- // memmove converted: Different stack allocations [Neb]
- memcpy(Bands, Win1,
- sizeof(Win1[0]) * Window1Enabled);
+ points [p++] = Win2[i].Left;
+ points [p++] = Win2[i].Right;
+ }
+ points [p++] = 256;
+ // Sort them
+ qsort((void*) points, p, sizeof(points [0]), IntCompare);
+ for (i = 0; i < p; i += 2)
+ {
+ if (points [i] == points [i + 1])
+ continue;
+ Bands [B].Left = points [i];
+ while (i + 2 < p && points [i + 1] == points [i + 2])
+ i += 2;
+ Bands [B++].Right = points [i + 1];
+ }
+ }
+ break;
+ }
+ if (invert)
+ {
+ int32_t b;
+ int32_t j = 0;
+ int32_t empty_band_count = 0;
+
+ // First remove all empty bands from the list.
+ for (b = 0; b < B; b++)
+ {
+ if (!BAND_EMPTY(Bands[b]))
+ {
+ if (b != j)
+ Bands[j] = Bands[b];
+ j++;
}
else
+ empty_band_count++;
+ }
+
+ if (j > 0)
+ {
+ if (j == 1)
{
- uint32_t p = 0;
- uint32_t points [10];
- uint32_t i;
+ j = 0;
+ // Easy case to deal with, so special case it.
- invert = !invert;
- // Build an array of points (window edges)
- points [p++] = 0;
- for (i = 0; i < Window1Enabled; i++)
+ if (Bands[0].Left > 0)
{
- points [p++] = Win1[i].Left;
- points [p++] = Win1[i].Right;
+ pClip->Left[j][w] = 0;
+ pClip->Right[j++][w] = Bands[0].Left + 1;
}
- for (i = 0; i < Window2Enabled; i++)
+ if (Bands[0].Right < 256)
{
- points [p++] = Win2[i].Left;
- points [p++] = Win2[i].Right;
+ pClip->Left[j][w] = Bands[0].Right;
+ pClip->Right[j++][w] = 256;
}
- points [p++] = 256;
- // Sort them
- qsort((void*) points, p, sizeof(points [0]),
- IntCompare);
- for (i = 0; i < p; i += 2)
+ if (j == 0)
{
- if (points [i] == points [i + 1])
- continue;
- Bands [B].Left = points [i];
- while (i + 2 < p &&
- points [i + 1] == points [i + 2])
- i += 2;
- Bands [B++].Right = points [i + 1];
+ pClip->Left[j][w] = 1;
+ pClip->Right[j++][w] = 0;
}
}
- break;
- }
- if (invert)
- {
- int b;
- int j = 0;
- int empty_band_count = 0;
-
- // First remove all empty bands from the list.
- for (b = 0; b < B; b++)
+ else
{
- if (!BAND_EMPTY(Bands[b]))
- {
- if (b != j)
- Bands[j] = Bands[b];
- j++;
- }
- else
- empty_band_count++;
- }
+ // Now sort the bands into order
+ B = j;
+ qsort((void*) Bands, B, sizeof(Bands [0]), BandCompare);
- if (j > 0)
- {
- if (j == 1)
+ // Now invert the area the bands cover
+ j = 0;
+ for (b = 0; b < B; b++)
{
- j = 0;
- // Easy case to deal with, so special case it.
-
- if (Bands[0].Left > 0)
+ if (b == 0 && Bands[b].Left > 0)
{
pClip->Left[j][w] = 0;
- pClip->Right[j++][w] = Bands[0].Left + 1;
+ pClip->Right[j++][w] = Bands[b].Left + 1;
}
- if (Bands[0].Right < 256)
+ else if (b == B - 1 && Bands[b].Right < 256)
{
- pClip->Left[j][w] = Bands[0].Right;
+ pClip->Left[j][w] = Bands[b].Right;
pClip->Right[j++][w] = 256;
}
- if (j == 0)
- {
- pClip->Left[j][w] = 1;
- pClip->Right[j++][w] = 0;
- }
- }
- else
- {
- // Now sort the bands into order
- B = j;
- qsort((void*) Bands, B,
- sizeof(Bands [0]), BandCompare);
-
- // Now invert the area the bands cover
- j = 0;
- for (b = 0; b < B; b++)
+ if (b < B - 1)
{
- if (b == 0 && Bands[b].Left > 0)
- {
- pClip->Left[j][w] = 0;
- pClip->Right[j++][w] = Bands[b].Left + 1;
- }
- else if (b == B - 1 && Bands[b].Right < 256)
- {
- pClip->Left[j][w] = Bands[b].Right;
- pClip->Right[j++][w] = 256;
- }
- if (b < B - 1)
- {
- pClip->Left[j][w] = Bands[b].Right;
- pClip->Right[j++][w] = Bands[b + 1].Left + 1;
- }
+ pClip->Left[j][w] = Bands[b].Right;
+ pClip->Right[j++][w] = Bands[b + 1].Left + 1;
}
}
}
- else
- {
- // Inverting a window that consisted of only
- // empty bands is the whole width of the screen.
- // Needed for Mario Kart's rear-view mirror display.
- if (empty_band_count)
- {
- pClip->Left[j][w] = 0;
- pClip->Right[j][w] = 256;
- j++;
- }
- }
- pClip->Count[w] = j;
}
else
{
- int j;
- for (j = 0; j < B; j++)
+ // Inverting a window that consisted of only
+ // empty bands is the whole width of the screen.
+ // Needed for Mario Kart's rear-view mirror display.
+ if (empty_band_count)
{
- pClip->Left[j][w] = Bands[j].Left;
- pClip->Right[j][w] = Bands[j].Right;
+ pClip->Left[j][w] = 0;
+ pClip->Right[j][w] = 256;
+ j++;
}
- pClip->Count [w] = B;
}
+ pClip->Count[w] = j;
}
else
{
- // Only one window enabled so no need to perform
- // complex overlap logic...
+ int32_t j;
+ for (j = 0; j < B; j++)
+ {
+ pClip->Left[j][w] = Bands[j].Left;
+ pClip->Right[j][w] = Bands[j].Right;
+ }
+ pClip->Count [w] = B;
+ }
+ }
+ else
+ {
+ // Only one window enabled so no need to perform
+ // complex overlap logic...
- if (Window1Enabled)
+ if (Window1Enabled)
+ {
+ if (invert)
{
- if (invert)
- {
- int j = 0;
+ int32_t j = 0;
- if (Window1Enabled == 1)
+ if (Window1Enabled == 1)
+ {
+ if (Win1[0].Left <= Win1[0].Right)
{
- if (Win1[0].Left <= Win1[0].Right)
+ if (Win1[0].Left > 0)
{
- if (Win1[0].Left > 0)
- {
- pClip->Left[j][w] = 0;
- pClip->Right[j++][w] = Win1[0].Left;
- }
- if (Win1[0].Right < 256)
- {
- pClip->Left[j][w] = Win1[0].Right;
- pClip->Right[j++][w] = 256;
- }
- if (j == 0)
- {
- pClip->Left[j][w] = 1;
- pClip->Right[j++][w] = 0;
- }
+ pClip->Left[j][w] = 0;
+ pClip->Right[j++][w] = Win1[0].Left;
}
- else
+ if (Win1[0].Right < 256)
{
- pClip->Left[j][w] = 0;
+ pClip->Left[j][w] = Win1[0].Right;
pClip->Right[j++][w] = 256;
}
+ if (j == 0)
+ {
+ pClip->Left[j][w] = 1;
+ pClip->Right[j++][w] = 0;
+ }
}
else
{
- pClip->Left [j][w] = Win1[0].Right;
- pClip->Right[j++][w] = Win1[1].Left;
+ pClip->Left[j][w] = 0;
+ pClip->Right[j++][w] = 256;
}
- pClip->Count [w] = j;
}
else
{
- uint32_t j;
- for (j = 0; j < Window1Enabled; j++)
- {
- pClip->Left [j][w] = Win1[j].Left;
- pClip->Right [j][w] = Win1[j].Right;
- }
- pClip->Count [w] = Window1Enabled;
+ pClip->Left [j][w] = Win1[0].Right;
+ pClip->Right[j++][w] = Win1[1].Left;
}
+ pClip->Count [w] = j;
}
- else if (Window2Enabled)
+ else
{
- if (invert)
+ uint32_t j;
+ for (j = 0; j < Window1Enabled; j++)
{
- int j = 0;
- if (Window2Enabled == 1)
+ pClip->Left [j][w] = Win1[j].Left;
+ pClip->Right [j][w] = Win1[j].Right;
+ }
+ pClip->Count [w] = Window1Enabled;
+ }
+ }
+ else if (Window2Enabled)
+ {
+ if (invert)
+ {
+ int32_t j = 0;
+ if (Window2Enabled == 1)
+ {
+ if (Win2[0].Left <= Win2[0].Right)
{
- if (Win2[0].Left <= Win2[0].Right)
+ if (Win2[0].Left > 0)
{
- if (Win2[0].Left > 0)
- {
- pClip->Left[j][w] = 0;
- pClip->Right[j++][w] = Win2[0].Left;
- }
- if (Win2[0].Right < 256)
- {
- pClip->Left[j][w] = Win2[0].Right;
- pClip->Right[j++][w] = 256;
- }
- if (j == 0)
- {
- pClip->Left[j][w] = 1;
- pClip->Right[j++][w] = 0;
- }
+ pClip->Left[j][w] = 0;
+ pClip->Right[j++][w] = Win2[0].Left;
}
- else
+ if (Win2[0].Right < 256)
{
- pClip->Left[j][w] = 0;
+ pClip->Left[j][w] = Win2[0].Right;
pClip->Right[j++][w] = 256;
}
+ if (j == 0)
+ {
+ pClip->Left[j][w] = 1;
+ pClip->Right[j++][w] = 0;
+ }
}
else
{
- pClip->Left [j][w] = Win2[0].Right;
- pClip->Right[j++][w] = Win2[1].Left + 1;
+ pClip->Left[j][w] = 0;
+ pClip->Right[j++][w] = 256;
}
- pClip->Count [w] = j;
}
else
{
- uint32_t j;
- for (j = 0; j < Window2Enabled; j++)
- {
- pClip->Left [j][w] = Win2[j].Left;
- pClip->Right [j][w] = Win2[j].Right;
- }
- pClip->Count [w] = Window2Enabled;
+ pClip->Left [j][w] = Win2[0].Right;
+ pClip->Right[j++][w] = Win2[1].Left + 1;
+ }
+ pClip->Count [w] = j;
+ }
+ else
+ {
+ uint32_t j;
+ for (j = 0; j < Window2Enabled; j++)
+ {
+ pClip->Left [j][w] = Win2[j].Left;
+ pClip->Right [j][w] = Win2[j].Right;
}
+ pClip->Count [w] = Window2Enabled;
}
}
+ }
- if (w != 5 && pClip->Count [5])
+ if (w != 5 && pClip->Count [5])
+ {
+ // Colour window enabled. Set the
+ // clip windows for all remaining backgrounds to be
+ // the same as the colour window.
+ if (pClip->Count [w] == 0)
{
- // Colour window enabled. Set the
- // clip windows for all remaining backgrounds to be
- // the same as the colour window.
- if (pClip->Count [w] == 0)
+ uint32_t i;
+ pClip->Count [w] = pClip->Count [5];
+ for (i = 0; i < pClip->Count [w]; i++)
{
- uint32_t i;
- pClip->Count [w] = pClip->Count [5];
- for (i = 0; i < pClip->Count [w]; i++)
- {
- pClip->Left [i][w] = pClip->Left [i][5];
- pClip->Right [i][w] = pClip->Right [i][5];
- }
+ pClip->Left [i][w] = pClip->Left [i][5];
+ pClip->Right [i][w] = pClip->Right [i][5];
}
- else
+ }
+ else
+ {
+ // Intersect the colour window with the bg's
+ // own clip window.
+ uint32_t i;
+ for (i = 0; i < pClip->Count [w]; i++)
{
- // Intersect the colour window with the bg's
- // own clip window.
- uint32_t i;
- for (i = 0; i < pClip->Count [w]; i++)
+ uint32_t j;
+ for (j = 0; j < pClip->Count [5]; j++)
{
- uint32_t j;
- for (j = 0; j < pClip->Count [5]; j++)
+ if ((pClip->Left[i][w] >= pClip->Left[j][5]
+ && pClip->Left[i][w] < pClip->Right[j][5])
+ || (pClip->Left[j][5] >= pClip->Left[i][w]
+ && pClip->Left[j][5] < pClip->Right[i][w]))
{
- if ((pClip->Left[i][w] >= pClip->Left[j][5]
- && pClip->Left[i][w] < pClip->Right[j][5])
- || (pClip->Left[j][5] >= pClip->Left[i][w]
- && pClip->Left[j][5] < pClip->Right[i][w]))
- {
- // Found an intersection!
- pClip->Left[i][w] = MAX(pClip->Left[i][w], pClip->Left[j][5]);
- pClip->Right[i][w] = MIN(pClip->Right[i][w], pClip->Right[j][5]);
- goto Clip_ok;
- }
+ // Found an intersection!
+ pClip->Left[i][w] = MAX(pClip->Left[i][w], pClip->Left[j][5]);
+ pClip->Right[i][w] = MIN(pClip->Right[i][w], pClip->Right[j][5]);
+ goto Clip_ok;
}
- // no intersection, nullify it
- pClip->Left[i][w] = 1;
- pClip->Right[i][w] = 0;
-Clip_ok:;
}
+ // no intersection, nullify it
+ pClip->Left[i][w] = 1;
+ pClip->Right[i][w] = 0;
+Clip_ok:;
}
}
- } // if (w == 5 | ...
- } // if (!Settings.DisableGraphicWindows)
- } // for (int w...
- } // for (int c...
+ }
+ } // if (w == 5 || pClip->Count [5] ...
+ } // for (w...
+ } // for (c...
}