mirror of
https://github.com/ctm/executor.git
synced 2024-09-25 22:56:22 +00:00
185 lines
4.9 KiB
C
185 lines
4.9 KiB
C
/* Copyright 1995, 1996, 1998 by Abacus Research and
|
|
* Development, Inc. All rights reserved.
|
|
*/
|
|
|
|
#if !defined (OMIT_RCSID_STRINGS)
|
|
char ROMlib_rcsid_splash[] =
|
|
"$Id: splash.c 88 2005-05-25 03:59:37Z ctm $";
|
|
#endif
|
|
|
|
#include "rsys/common.h"
|
|
|
|
#if defined (DISPLAY_SPLASH_SCREEN)
|
|
|
|
#include "QuickDraw.h"
|
|
#include "CQuickDraw.h"
|
|
#include "ToolboxEvent.h"
|
|
#include "OSUtil.h"
|
|
#include "MemoryMgr.h"
|
|
|
|
#include "rsys/splash.h"
|
|
#include "rsys/vdriver.h"
|
|
#include "rsys/cquick.h"
|
|
#include "rsys/slash.h"
|
|
#include "rsys/notmac.h"
|
|
#include "rsys/mman.h"
|
|
#include "rsys/region.h"
|
|
#include "rsys/srcblt.h"
|
|
#include "rsys/custom.h"
|
|
|
|
static int bpp;
|
|
static int log2_bpp;
|
|
|
|
boolean_t
|
|
splash_screen_display (boolean_t button_p, char *basename)
|
|
{
|
|
struct splash_screen_header header;
|
|
struct splash_screen_color color_buf[256];
|
|
int splash_top, splash_left;
|
|
uint8 bg_pixel;
|
|
char *p;
|
|
|
|
if (!ROMlib_splashp)
|
|
{
|
|
warning_unexpected ("no splash");
|
|
return FALSE;
|
|
}
|
|
|
|
header = *(struct splash_screen_header *) ROMlib_splashp->chars;
|
|
|
|
bpp = CL (header.bpp);
|
|
log2_bpp = CL (header.log2_bpp);
|
|
|
|
memcpy (color_buf, ROMlib_splashp->chars + CL (header.color_offset),
|
|
CL (header.color_count) * sizeof *color_buf);
|
|
|
|
bg_pixel = ((bpp == vdriver_bpp)
|
|
? header.bg_pixel
|
|
: (header.bg_pixel
|
|
? ((1 << vdriver_bpp) - 1)
|
|
: 0));
|
|
switch (vdriver_bpp)
|
|
{
|
|
case 1:
|
|
bg_pixel = bg_pixel | (bg_pixel << 1);
|
|
case 2:
|
|
bg_pixel = bg_pixel | (bg_pixel << 2);
|
|
case 4:
|
|
bg_pixel = bg_pixel | (bg_pixel << 4);
|
|
case 8:
|
|
break;
|
|
}
|
|
|
|
if (vdriver_bpp == bpp)
|
|
vdriver_set_colors (0, CL (header.color_count), (ColorSpec *) color_buf);
|
|
|
|
splash_top = (vdriver_height - SPLASH_SCREEN_HEIGHT) / 2;
|
|
splash_left = (vdriver_width - SPLASH_SCREEN_WIDTH) / 2;
|
|
|
|
/* We can't handle a splash screen bigger than the real screen yet. */
|
|
if (splash_top < 0 || splash_left < 0)
|
|
return FALSE;
|
|
|
|
{
|
|
int splash_row_bytes;
|
|
uint8 *tmp_buf;
|
|
int i;
|
|
blt_bitmap_t blank_bitmap, src_row_bitmap, screen_bitmap;
|
|
Point src_origin, dst_origin;
|
|
RgnHandle row_rgn;
|
|
|
|
#define ROWS_PER_PASS 32
|
|
|
|
p = (char *) ROMlib_splashp->chars + CL (header.splash_bits_offset);
|
|
|
|
splash_row_bytes = SPLASH_SCREEN_WIDTH >> (3 - log2_bpp);
|
|
tmp_buf = alloca (vdriver_row_bytes * ROWS_PER_PASS);
|
|
|
|
/* Set up phony bitmap for screen. */
|
|
screen_bitmap.baseAddr = (Ptr) RM (vdriver_fbuf);
|
|
screen_bitmap.rowBytes = CW (vdriver_row_bytes);
|
|
SetRect (&screen_bitmap.bounds, 0, 0, vdriver_width, ROWS_PER_PASS);
|
|
|
|
src_origin.h = src_origin.v = CWC (0);
|
|
dst_origin.h = dst_origin.v = CWC (0);
|
|
|
|
/* Set up a region for the one row in question. */
|
|
ZONE_SAVE_EXCURSION
|
|
(SysZone,
|
|
{
|
|
row_rgn = NewRgn ();
|
|
RGN_BBOX (row_rgn) = screen_bitmap.bounds;
|
|
});
|
|
|
|
/* Clear the screen if there's a border. */
|
|
if (SPLASH_SCREEN_HEIGHT != vdriver_height
|
|
|| SPLASH_SCREEN_WIDTH != vdriver_width)
|
|
{
|
|
/* Set up phony bitmap to clear screen. */
|
|
blank_bitmap.baseAddr = (Ptr) RM (tmp_buf);
|
|
blank_bitmap.rowBytes = CW (vdriver_row_bytes);
|
|
SetRect (&blank_bitmap.bounds, 0, 0, vdriver_width, ROWS_PER_PASS);
|
|
memset (tmp_buf, bg_pixel, vdriver_row_bytes * ROWS_PER_PASS);
|
|
|
|
for (i = 0; i < vdriver_height; i += ROWS_PER_PASS)
|
|
{
|
|
int num_rows;
|
|
|
|
num_rows = MIN (ROWS_PER_PASS, vdriver_height - i);
|
|
(RGN_BBOX (row_rgn)).bottom = CW (num_rows);
|
|
srcblt_rgn (row_rgn, srcCopy, vdriver_log2_bpp,
|
|
&blank_bitmap, &screen_bitmap,
|
|
&src_origin, &dst_origin, ~0, 0);
|
|
|
|
/* Move on to the next row. */
|
|
#if 0
|
|
SWAPPED_OPL (screen_bitmap.baseAddr, +,
|
|
vdriver_row_bytes * num_rows);
|
|
#else
|
|
screen_bitmap.baseAddr = RM(MR(screen_bitmap.baseAddr) +
|
|
vdriver_row_bytes * num_rows);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
/* Set up phony bitmap for src row. */
|
|
src_row_bitmap.baseAddr = (Ptr) RM (tmp_buf);
|
|
src_row_bitmap.rowBytes = CW (SPLASH_SCREEN_WIDTH
|
|
>> (3 - vdriver_log2_bpp));
|
|
SetRect (&src_row_bitmap.bounds, 0, 0, SPLASH_SCREEN_WIDTH, ROWS_PER_PASS);
|
|
RGN_BBOX (row_rgn) = src_row_bitmap.bounds;
|
|
|
|
SWAPPED_OPW (screen_bitmap.bounds.left, -, splash_left);
|
|
screen_bitmap.bounds.top = CW (-splash_top);
|
|
screen_bitmap.baseAddr = (Ptr) RM (vdriver_fbuf);
|
|
|
|
/* Actually read and display the splash screen bits. */
|
|
for (i = 0; i < SPLASH_SCREEN_HEIGHT; i += ROWS_PER_PASS)
|
|
{
|
|
int num_rows;
|
|
|
|
num_rows = MIN (ROWS_PER_PASS, SPLASH_SCREEN_HEIGHT - i);
|
|
(RGN_BBOX (row_rgn)).bottom = CW (num_rows);
|
|
|
|
memcpy (tmp_buf, p, splash_row_bytes * num_rows);
|
|
p += splash_row_bytes * num_rows;
|
|
|
|
srcblt_rgn (row_rgn, srcCopy, vdriver_log2_bpp,
|
|
&src_row_bitmap, &screen_bitmap,
|
|
&src_origin, &dst_origin, ~0, 0);
|
|
|
|
/* Move on to the next row. */
|
|
SWAPPED_OPW (screen_bitmap.bounds.top, -, num_rows);
|
|
}
|
|
|
|
DisposeRgn (row_rgn);
|
|
}
|
|
|
|
vdriver_update_screen (0, 0, vdriver_height, vdriver_width, FALSE);
|
|
vdriver_flush_display();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#endif /* DISPLAY_SPLASH_SCREEN */
|