1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-02-01 14:22:27 +00:00

Maiko sources matching state as of 020102 prior to initial patching for Mac OSX

This commit is contained in:
Nick Briggs
2015-04-20 18:53:52 -07:00
commit de170a64d9
427 changed files with 129342 additions and 0 deletions

503
src/truecolor.c Executable file
View File

@@ -0,0 +1,503 @@
/* $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 */