mirror of
https://github.com/Interlisp/maiko.git
synced 2026-03-01 09:30:56 +00:00
504 lines
13 KiB
C
Executable File
504 lines
13 KiB
C
Executable File
/* $Id: truecolor.c,v 1.2 1999/01/03 02:07:38 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
|
|
static char *id = "$Id: truecolor.c,v 1.2 1999/01/03 02:07:38 sybalsky Exp $ Copyright (C) Venue";
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
|
|
/* Manufactured in the United States of America. */
|
|
/* */
|
|
/* The contents of this file are proprietary information */
|
|
/* belonging to Venue, and are provided to you under license. */
|
|
/* They may not be further distributed or disclosed to third */
|
|
/* parties without the specific permission of Venue. */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
#include "version.h"
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <sys/mman.h>
|
|
#include <pixrect/pixrect_hs.h>
|
|
|
|
#include "lispemul.h"
|
|
#include "lsptypes.h"
|
|
#include "lspglob.h"
|
|
#include "lispmap.h"
|
|
#include "adr68k.h"
|
|
#include "arith.h"
|
|
#include "devconf.h"
|
|
|
|
#include "picture.h"
|
|
|
|
#define FALSE 0
|
|
#define TRUE !FALSE
|
|
|
|
#define COLOR_INIT 0
|
|
#define COLOR_OVERLAYREGION 1
|
|
#define COLOR_VIDEOREGION 2
|
|
#define COLOR_VIDEOINIT 3
|
|
|
|
#define IntToFixp(C, Lisp) { \
|
|
int *base; \
|
|
base = (int *) Addr68k_from_LADDR((unsigned int)Lisp); \
|
|
*base = C; \
|
|
}
|
|
|
|
|
|
extern int displaywidth
|
|
, displayheight
|
|
, DisplayRasterWidth;
|
|
extern int ScreenLocked;
|
|
extern DLword *EmCursorX68K
|
|
, *EmCursorY68K;
|
|
extern Pixrect *TrueColorFb;
|
|
extern int FrameBufferFd;
|
|
extern int Inited_Video;
|
|
|
|
int Inited_TrueColor = NIL;
|
|
|
|
int
|
|
TrueColor_Op( args )
|
|
LispPTR *args;
|
|
{
|
|
int op
|
|
, ret_value = NIL;
|
|
/*
|
|
N_GETNUMBER( args[0], op, bad_arg );
|
|
*/
|
|
op = (DLword) args[0];
|
|
|
|
switch( op ) {
|
|
case COLOR_INIT:
|
|
ret_value = TrueColor_Initialize( args[1] );
|
|
break;
|
|
case COLOR_VIDEOINIT:
|
|
ret_value = TrueColor_VideoInitialize( args[1] );
|
|
break;
|
|
case COLOR_OVERLAYREGION: {
|
|
int left
|
|
, top
|
|
, bottom
|
|
, width
|
|
, height;
|
|
if( args[1] != NIL_PTR ) {
|
|
LispPTR region
|
|
, value;
|
|
int bottom;
|
|
/* get lisp region elements */
|
|
region = args[1];
|
|
value = car( region );
|
|
N_GETNUMBER( value, left, bad_arg );
|
|
region = cdr( region );
|
|
value = car( region );
|
|
N_GETNUMBER( value, bottom, bad_arg );
|
|
region = cdr( region );
|
|
value = car( region );
|
|
N_GETNUMBER( value, width, bad_arg );
|
|
region = cdr( region );
|
|
value = car( region );
|
|
N_GETNUMBER( value, height, bad_arg );
|
|
top = displayheight - ( bottom + height );
|
|
if( args[2] == ATOM_T ) {
|
|
Overlay_Region( left, top, width, height, TRUE );
|
|
} else {
|
|
Overlay_Region( left, top, width, height, FALSE );
|
|
} /* end if( args[2] ) */
|
|
ret_value = T;
|
|
} /* end if( arg[1] ) */
|
|
} /* end case */
|
|
break;
|
|
case COLOR_VIDEOREGION: {
|
|
int left
|
|
, top
|
|
, bottom
|
|
, width
|
|
, height;
|
|
if( args[1] != NIL_PTR ) {
|
|
LispPTR region
|
|
, value;
|
|
int bottom;
|
|
/* get lisp region elements */
|
|
region = args[1];
|
|
value = car( region );
|
|
N_GETNUMBER( value, left, bad_arg );
|
|
region = cdr( region );
|
|
value = car( region );
|
|
N_GETNUMBER( value, bottom, bad_arg );
|
|
region = cdr( region );
|
|
value = car( region );
|
|
N_GETNUMBER( value, width, bad_arg );
|
|
region = cdr( region );
|
|
value = car( region );
|
|
N_GETNUMBER( value, height, bad_arg );
|
|
top = displayheight - ( bottom + height );
|
|
} else {
|
|
left = 0;
|
|
top = 0;
|
|
width = displaywidth;
|
|
height = displayheight;
|
|
} /* end if( arg[1] ) */
|
|
|
|
if( args[2] == NIL_PTR ) { /* video region clear */
|
|
cgeight_video_region( left, top, width, height, FALSE );
|
|
} else { /* video region set */
|
|
cgeight_video_region( left, top, width, height, TRUE );
|
|
} /* end if( args[2] ) */
|
|
ret_value = T;
|
|
} /* end case */
|
|
break;
|
|
defaults:
|
|
break;
|
|
} /* end switch( op ) */
|
|
|
|
bad_arg:
|
|
return( ret_value );
|
|
|
|
} /* end TrueColor_Op */
|
|
|
|
extern int Inited_Color;
|
|
extern int DisplayType;
|
|
|
|
Pixrect *OverlayCursor
|
|
, *OverlaySave;
|
|
DLword *OverlayRegion68k;
|
|
|
|
int
|
|
TrueColor_Initialize( overlay_bmbase )
|
|
LispPTR overlay_bmbase;
|
|
{
|
|
unsigned int pict
|
|
, *ret_value;
|
|
Pixrect *source;
|
|
int mmapstat
|
|
, size;
|
|
|
|
|
|
if( Inited_Color ) {
|
|
printf( "cgeight_init_color_display: 8 bits color display has already initialized.\n" );
|
|
} /* end if( Inited_Color ) */
|
|
|
|
if( Inited_TrueColor ) {
|
|
printf( "cgeight_init_color_display: 24 bits color display has already initialized.\n");
|
|
} /* end if( Inited_TrueColor ) */
|
|
|
|
if( DisplayType != SUNMEMCOLOR ) {
|
|
error( "cgeight_init_color_display: Unsupported FBreal_type %d\n",
|
|
DisplayType );
|
|
} /* end if( DisplayType ) */
|
|
|
|
OverlayRegion68k = Addr68k_from_LADDR( overlay_bmbase );
|
|
size = ( (displaywidth * displayheight/8 + (getpagesize()-1) )
|
|
& -getpagesize() );
|
|
|
|
ScreenLocked = T;
|
|
taking_mouse_down();
|
|
|
|
pict = (unsigned int)cgeight_init_color_display();
|
|
|
|
source = mem_point( displaywidth, displayheight, 1
|
|
, OverlayRegion68k );
|
|
pr_set_plane_group( TrueColorFb, PIXPG_OVERLAY_ENABLE );
|
|
pr_rop( TrueColorFb, 0, 0, displaywidth, displayheight
|
|
, PIX_SRC, source, 0, 0 );
|
|
pr_set_plane_group( TrueColorFb, PIXPG_24BIT_COLOR );
|
|
|
|
mmapstat = (int)mmap( OverlayRegion68k,
|
|
size,
|
|
PROT_READ | PROT_WRITE,
|
|
#ifdef OS4
|
|
MAP_FIXED |
|
|
#endif
|
|
MAP_SHARED,
|
|
FrameBufferFd, 0x20000 );
|
|
|
|
if( mmapstat == -1 ) {
|
|
perror( "TrueColor_Initialize: ERROR at mmap system call\n" );
|
|
exit( 0 );
|
|
} /* end if( mmapstat ) */
|
|
|
|
OverlayCursor = mem_create( 16, 16, 32 );
|
|
OverlaySave = mem_create( 16, 16, 32 );
|
|
|
|
Inited_TrueColor = TRUE;
|
|
|
|
taking_mouse_up( *EmCursorX68K, *EmCursorY68K );
|
|
overlay_mouse_up( *EmCursorX68K, *EmCursorY68K );
|
|
ScreenLocked = NIL;
|
|
|
|
ret_value = (unsigned int*)createcell68k(TYPE_FIXP);
|
|
*ret_value = pict;
|
|
return( LADDR_from_68k(ret_value) );
|
|
|
|
} /* end TrueColor_Initialize */
|
|
|
|
DLword *VideoEnableRegion68k;
|
|
|
|
int
|
|
TrueColor_VideoInitialize( videoenable_bmbase )
|
|
LispPTR videoenable_bmbase;
|
|
{
|
|
Pixrect *source;
|
|
int mmapstat
|
|
, size;
|
|
|
|
ScreenLocked = T;
|
|
|
|
clear_video_region();
|
|
Video_Initialize( FrameBufferFd );
|
|
|
|
VideoEnableRegion68k = Addr68k_from_LADDR( videoenable_bmbase );
|
|
size = ( (displaywidth * displayheight/8 + (getpagesize()-1) )
|
|
& -getpagesize() );
|
|
|
|
source = mem_point( displaywidth, displayheight, 1
|
|
, VideoEnableRegion68k );
|
|
pr_set_plane_group( TrueColorFb, PIXPG_VIDEO_ENABLE );
|
|
pr_rop( TrueColorFb, 0, 0, displaywidth, displayheight
|
|
, PIX_SRC, source, 0, 0 );
|
|
pr_set_plane_group( TrueColorFb, PIXPG_24BIT_COLOR );
|
|
|
|
mmapstat = (int)mmap( VideoEnableRegion68k,
|
|
size,
|
|
PROT_READ | PROT_WRITE,
|
|
#ifdef OS4
|
|
MAP_FIXED |
|
|
#endif
|
|
MAP_SHARED,
|
|
FrameBufferFd, 0x533000 );
|
|
|
|
if( mmapstat == -1 ) {
|
|
perror( "TrueColor_VideoInitialize: ERROR at mmap system call\n" );
|
|
exit( 0 );
|
|
} /* end if( mmapstat ) */
|
|
|
|
ScreenLocked = NIL;
|
|
return( T );
|
|
|
|
} /* TrueColor_VideoInitialize */
|
|
|
|
int
|
|
Overlay_Region( left, top, width, height, flg )
|
|
int left
|
|
, top
|
|
, width
|
|
, height
|
|
, flg;
|
|
{
|
|
ScreenLocked = T;
|
|
overlay_mouse_down();
|
|
|
|
cgeight_overlay_region( left, top, width, height
|
|
, (flg ? FALSE : TRUE) );
|
|
|
|
overlay_mouse_up( *EmCursorX68K, *EmCursorY68K );
|
|
ScreenLocked = NIL;
|
|
|
|
} /* end Overlay_Region */
|
|
|
|
#ifdef TRUECOLOR
|
|
#define TrackCursor(cx,cy) { \
|
|
*CLastUserActionCell68k = MiscStats->secondstmp; \
|
|
overlay_mouse_down(); \
|
|
taking_mouse_down(); \
|
|
taking_mouse_up(cx,cy); \
|
|
overlay_mouse_up(cx,cy); \
|
|
*EmCursorX68K= cx; \
|
|
*EmCursorY68K= cy; \
|
|
}
|
|
#endif /* TRUECOLOR */
|
|
|
|
|
|
extern Pixrect *OverlaySave
|
|
, *OverlayCursor;
|
|
|
|
overlay_mouse_up( newx, newy )
|
|
int newx
|
|
, newy;
|
|
{
|
|
pr_set_plane_group( TrueColorFb, PIXPG_OVERLAY_ENABLE );
|
|
pr_rop( TrueColorFb, newx, newy, 16, 16, PIX_SRC
|
|
, OverlaySave, 0, 0 );
|
|
pr_rop( TrueColorFb, 0, 0, 16, 16, PIX_SRC|PIX_DST
|
|
, OverlayCursor, newx, newy );
|
|
pr_set_plane_group( TrueColorFb, PIXPG_24BIT_COLOR );
|
|
|
|
} /* end overlay_mouse_up */
|
|
|
|
extern int LastCursorX
|
|
, LastCursorY;
|
|
|
|
overlay_mouse_down()
|
|
{
|
|
pr_set_plane_group( TrueColorFb, PIXPG_OVERLAY_ENABLE );
|
|
pr_rop( OverlaySave, 0, 0, 16, 16, PIX_SRC
|
|
, TrueColorFb, LastCursorX, LastCursorY );
|
|
pr_set_plane_group( TrueColorFb, PIXPG_24BIT_COLOR );
|
|
|
|
}/* end overlay_mouse_down */
|
|
|
|
truecolor_before_exit()
|
|
{
|
|
if( Inited_TrueColor ) {
|
|
{ /* fill region */
|
|
int h, w;
|
|
unsigned short *ptr;
|
|
ptr = (unsigned short*)OverlayRegion68k;
|
|
for( h = displayheight; (h--); ) {
|
|
for( w = DisplayRasterWidth; (w--); ) {
|
|
*(ptr++) = ~0;
|
|
} /* end for( w ) */
|
|
} /* end for( h ) */
|
|
}
|
|
|
|
pr_set_plane_group( TrueColorFb, PIXPG_24BIT_COLOR );
|
|
pr_rop( TrueColorFb, 0, 0, displaywidth, displayheight
|
|
, PIX_SRC | PIX_COLOR( 0xffffff ), 0, 0, 0 );
|
|
|
|
#ifdef VIDEO
|
|
if( Inited_Video ) {
|
|
{ /* clear video enable region */
|
|
int h, w;
|
|
unsigned short *ptr;
|
|
ptr = (unsigned short*)VideoEnableRegion68k;
|
|
for( h = displayheight; (h--); ) {
|
|
for( w = DisplayRasterWidth; (w--); ) {
|
|
*(ptr++) = 0xffff;
|
|
} /* end for( w ) */
|
|
} /* end for( h ) */
|
|
}
|
|
|
|
Video_Close();
|
|
|
|
} /* end if( Inited_Video ) */
|
|
#endif /* VIDEO */
|
|
|
|
|
|
pr_close( TrueColorFb );
|
|
|
|
} /* end if( Inited_TrueColor ) */
|
|
|
|
} /* truecolor_before_exit */
|
|
|
|
char *valloc();
|
|
char *HideOverlayRegion;
|
|
#ifdef VIDEO
|
|
char *HideVideoEnableRegion;
|
|
extern int Video_OnOff_Flg;
|
|
static int video_onoff;
|
|
#endif /* VIDEO */
|
|
|
|
|
|
truecolor_before_raid()
|
|
{
|
|
int size;
|
|
|
|
if( Inited_TrueColor ) {
|
|
size = ((displaywidth * displayheight / 8 + (getpagesize()-1) )
|
|
& -getpagesize());
|
|
|
|
if( (HideOverlayRegion = valloc( size )) == 0 ) {
|
|
printf( "can't valloc hide space\n" );
|
|
return( -1 );
|
|
} /* end if( HideOverlayRegion ) */
|
|
|
|
copy_region( OverlayRegion68k, HideOverlayRegion
|
|
, DisplayRasterWidth, displayheight );
|
|
|
|
{ /* fill region */
|
|
int h, w;
|
|
unsigned short *ptr;
|
|
ptr = (unsigned short*)OverlayRegion68k;
|
|
for( h = displayheight; (h--); ) {
|
|
for( w = DisplayRasterWidth; (w--); ) {
|
|
*(ptr++) = 0xffff;
|
|
} /* end for( w ) */
|
|
} /* end for( h ) */
|
|
}
|
|
} /* end if( Inited_TrueColor ) */
|
|
|
|
#ifdef VIDEO
|
|
if( Inited_Video ) {
|
|
if( ( video_onoff = Video_OnOff_Flg) ) Video_OnOff( FALSE );
|
|
if( (HideVideoEnableRegion = valloc( size )) == 0 ) {
|
|
printf( "can't valloc hide space\n" );
|
|
return( -1 );
|
|
} /* end if( HideVideoEnableRegion ) */
|
|
|
|
copy_region( VideoEnableRegion68k, HideVideoEnableRegion
|
|
, DisplayRasterWidth, displayheight );
|
|
|
|
{ /* clear video enable region */
|
|
int h, w;
|
|
unsigned short *ptr;
|
|
ptr = (unsigned short*)VideoEnableRegion68k;
|
|
for( h = displayheight; (h--); ) {
|
|
for( w = DisplayRasterWidth; (w--); ) {
|
|
*(ptr++) = 0xffff;
|
|
} /* end for( w ) */
|
|
} /* end for( h ) */
|
|
}
|
|
} /* end if( Inited_Video ) */
|
|
#endif /* VIDEO */
|
|
|
|
|
|
} /* end truecolor_before_raid */
|
|
|
|
truecolor_after_raid()
|
|
{
|
|
int size
|
|
, mmapstat;
|
|
|
|
if( Inited_TrueColor ) {
|
|
size = ((displaywidth * displayheight / 8 + (getpagesize()-1) )
|
|
& -getpagesize());
|
|
|
|
|
|
mmapstat = (int)mmap( OverlayRegion68k,
|
|
size,
|
|
PROT_READ | PROT_WRITE,
|
|
#ifdef OS4
|
|
MAP_FIXED |
|
|
#endif
|
|
MAP_SHARED,
|
|
FrameBufferFd, 0x20000 );
|
|
|
|
if( mmapstat == -1 ) {
|
|
perror( "TrueColor_Initialize: ERROR at mmap system call\n" );
|
|
exit( 0 );
|
|
} /* end if( mmapstat ) */
|
|
|
|
copy_region( HideOverlayRegion, OverlayRegion68k
|
|
, DisplayRasterWidth, displayheight );
|
|
free( HideOverlayRegion );
|
|
} /* end if( Inited_TrueColor ) */
|
|
|
|
#ifdef VIDEO
|
|
if( Inited_Video ) {
|
|
mmapstat = (int)mmap( VideoEnableRegion68k,
|
|
size,
|
|
PROT_READ | PROT_WRITE,
|
|
#ifdef OS4
|
|
MAP_FIXED |
|
|
#endif
|
|
MAP_SHARED,
|
|
FrameBufferFd, 0x533000 );
|
|
|
|
if( mmapstat == -1 ) {
|
|
perror( "TrueColor_VideoInitialize: ERROR at mmap system call\n" );
|
|
exit( 0 );
|
|
} /* end if( mmapstat ) */
|
|
|
|
copy_region( HideVideoEnableRegion, VideoEnableRegion68k
|
|
, DisplayRasterWidth, displayheight );
|
|
free( HideVideoEnableRegion );
|
|
if( video_onoff ) Video_OnOff( TRUE );
|
|
|
|
} /* end if( Inited_Video ) */
|
|
#endif /* VIDEO */
|
|
|
|
|
|
} /* end truecolor_after_raid */
|