Amiga: graphical tombstone RTG-screen fallback

amii_outrip relies on LoadRGB4/transpalette fade and raw BltBitMap
to a SMART_REFRESH window -- chipset-era idioms that do not reach
the visible display on Picasso96 or CyberGraphX screens.  On RTG
the screen stayed black and the user saw nothing between the
death messages and the high-score list.  Detect RTG by screen
size > 800x600 and fall through to genl_outrip so RTG users get
the ASCII tombstone instead.

Switch the still-graphical path to BltBitMapRastPort so the blit
goes through the layer system, and move CloseWindow(ripwin)
outside the Forbid()/Permit() pair (same fix as amii_cleanup).

Rename cmap_white/cmap_black to cmap_outline/cmap_fill -- those
variables actually hold the indices of the darkest and lightest
palette entries, used for the four offset outline strokes and
the centered fill stroke respectively; the old names were
backwards.
This commit is contained in:
Ingo Paschke
2026-05-12 15:33:29 +02:00
parent 89971a5fc9
commit 6736f878aa
+21 -11
View File
@@ -81,7 +81,7 @@ static struct NewWindow newwin = { 0, 0, 640, 200, 1, 0,
int wh; /* was local in outrip, but needed for SCALE macro */
int cmap_white, cmap_black;
int cmap_outline, cmap_fill;
void
amii_outrip(winid tmpwin, int how, time_t when)
@@ -99,6 +99,16 @@ amii_outrip(winid tmpwin, int how, time_t when)
if (!WINVERS_AMIV || HackScreen->RastPort.BitMap->Depth < 4)
goto cleanup;
/* The graphical tombstone uses raw chipset-style palette twiddling
* (LoadRGB4, transpalette fade) and BltBitMap to a SMART_REFRESH
* window. That works on the native chipset and AGA, but on RTG
* setups (Picasso96, CyberGraphX) the visible display is decoupled
* from the chipset registers and the tombstone never appears.
* Detect RTG by screen size beyond what chipset modes can reach
* and fall through to the plain ASCII tombstone instead. */
if (HackScreen->Width > 800 || HackScreen->Height > 600)
goto cleanup;
/* Use the users display size */
newwin.Height = amiIDisplay->ypix - newwin.TopEdge;
newwin.Width = amiIDisplay->xpix;
@@ -132,11 +142,11 @@ amii_outrip(winid tmpwin, int how, time_t when)
for (i = 0; i < SIZE(cols); i++)
cols[i] = cols_base[i] + xoff;
cmap_white = search_cmap(0, 0, 0);
cmap_black = search_cmap(15, 15, 15);
cmap_outline = search_cmap(0, 0, 0);
cmap_fill = search_cmap(15, 15, 15);
BltBitMap(tombimg, 0, 0, rp->BitMap, xoff, yoff, tomb_bmhd.w, tomb_bmhd.h,
0xc0, 0xff, NULL);
BltBitMapRastPort(tombimg, 0, 0, rp, xoff, yoff,
tomb_bmhd.w, tomb_bmhd.h, 0xc0);
/* Put together death description */
formatkiller(buf, sizeof buf, how, FALSE);
@@ -254,8 +264,8 @@ cleanup:
Forbid();
while (imsg = (struct IntuiMessage *) GetMsg(ripwin->UserPort))
ReplyMsg((struct Message *) imsg);
CloseWindow(ripwin);
Permit();
CloseWindow(ripwin);
}
LoadRGB4(&HackScreen->ViewPort, sysflags.amii_curmap, amii_numcolors);
@@ -279,23 +289,23 @@ tomb_text(char *p)
sprintf(buf, " %s ", p);
l = TextLength(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
SetAPen(rp, cmap_outline);
Move(rp, cols[cno] - (l / 2) - 1, tomb_line);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
SetAPen(rp, cmap_outline);
Move(rp, cols[cno] - (l / 2) + 1, tomb_line);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
SetAPen(rp, cmap_outline);
Move(rp, cols[cno] - (l / 2), tomb_line - 1);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_white);
SetAPen(rp, cmap_outline);
Move(rp, cols[cno] - (l / 2), tomb_line + 1);
Text(rp, buf, strlen(buf));
SetAPen(rp, cmap_black);
SetAPen(rp, cmap_fill);
Move(rp, cols[cno] - (l / 2), tomb_line);
Text(rp, buf, strlen(buf));
}