1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-19 09:18:33 +00:00
Interlisp.maiko/src/bitblt.c
Nick Briggs 1c6277d313 Clean up usage of the native address of the I/O page and its struct typedef
The global variable holding the native address of the I/O page is spelled "IOPage"
The global variable "IOPage" is declared extern by "lspglob.h"
The structure pointed to by IOPage is named IOPAGE and is defined in "iopage.h"
If there is no direct reference to the IOPAGE struct do not include "iopage.h"
2023-02-17 17:01:27 -08:00

221 lines
6.4 KiB
C

/* $Id: bitblt.c,v 1.2 1999/01/03 02:06:47 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
*/
/************************************************************************/
/* */
/* (C) Copyright 1989-95 Venue. All Rights Reserved. */
/* Manufactured in the United States of America. */
/* */
/************************************************************************/
#include "version.h"
#include <stdio.h>
#ifdef XWINDOW
#define DISPLAYBUFFER
#endif /* XWINDOW */
#include "lispemul.h"
#include "lspglob.h"
#include "lispmap.h"
#include "adr68k.h"
#include "address.h"
#include "pilotbbt.h"
#include "display.h"
#include "bitblt.h"
#include "bb.h"
#include "bitbltdefs.h"
#include "initdspdefs.h"
#if defined(INIT)
#include "initkbddefs.h"
extern int kbd_for_makeinit;
#endif
#ifdef DOS
#include "devif.h"
extern DspInterface currentdsp;
#endif
extern int LispWindowFd;
extern int ScreenLocked;
#ifdef COLOR
extern int MonoOrColor;
#endif /* COLOR */
/*****************************************************************************/
/** **/
/** N_OP_pilotbitblt **/
/** **/
/** The Native-code compatible version of the opcode for bitblt. **/
/** **/
/** **/
/*****************************************************************************/
LispPTR N_OP_pilotbitblt(LispPTR pilot_bt_tbl, LispPTR tos)
{
PILOTBBT *pbt;
DLword *srcbase, *dstbase;
#if defined(SUNDISPLAY) || defined(DOS)
int displayflg;
#endif
int sx, dx, w, h, srcbpl, dstbpl, backwardflg;
int src_comp, op, gray, num_gray, curr_gray_line;
#ifdef INIT
/* for init, we have to initialize the pointers at the
first call to pilotbitblt or we die. If we do it
earlier we die also. We set a new flag so we don't
do it more than once which is a lose also.
I put this in an ifdef so there won't be any extra
code when making a regular LDE. */
if (!kbd_for_makeinit) {
init_keyboard(0);
kbd_for_makeinit = 1;
}
#endif
pbt = (PILOTBBT *)NativeAligned4FromLAddr(pilot_bt_tbl);
w = pbt->pbtwidth;
h = pbt->pbtheight;
if ((h <= 0) || (w <= 0)) return (pilot_bt_tbl);
dx = pbt->pbtdestbit;
sx = pbt->pbtsourcebit;
backwardflg = pbt->pbtbackward;
/* if displayflg != 0 then source or destination is DisplayBitMap */
#ifdef DOS
currentdsp->device.locked++;
#else
ScreenLocked = T;
#endif /* DOS */
#if SUNDISPLAY || DOS
displayflg = cursorin(pbt->pbtdesthi, (pbt->pbtdestlo + (dx >> 4)), w, h, backwardflg) ||
cursorin(pbt->pbtsourcehi, (pbt->pbtsourcelo + (sx >> 4)), w, h, backwardflg);
#endif /* SUNDISPLAY */
srcbase = (DLword *)NativeAligned2FromLAddr(VAG2(pbt->pbtsourcehi, pbt->pbtsourcelo));
dstbase = (DLword *)NativeAligned2FromLAddr(VAG2(pbt->pbtdesthi, pbt->pbtdestlo));
srcbpl = pbt->pbtsourcebpl;
dstbpl = pbt->pbtdestbpl;
src_comp = pbt->pbtsourcetype;
op = pbt->pbtoperation;
gray = pbt->pbtusegray;
num_gray = ((TEXTUREBBT *)pbt)->pbtgrayheightlessone + 1;
curr_gray_line = ((TEXTUREBBT *)pbt)->pbtgrayoffset;
#if DOS
if (displayflg) (currentdsp->mouse_invisible)(currentdsp, IOPage);
;
#endif /* SUNDISPLAY / DOS */
new_bitblt_code;
#if DOS
flush_display_lineregion(dx, dstbase, w, h);
if (displayflg) (currentdsp->mouse_visible)(IOPage->dlmousex, IOPage->dlmousey);
#endif /* SUNDISPLAY / DOS */
#ifdef XWINDOW
flush_display_lineregion(dx, dstbase, w, h);
#endif /* XWINDOW */
#ifdef DOS
currentdsp->device.locked--;
#else
ScreenLocked = NIL;
#endif /* DOS */
return (pilot_bt_tbl);
} /* end of N_OP_pilotbitblt */
/************************************************************************/
/* */
/* c u r s o r i n */
/* */
/* */
/* */
/************************************************************************/
#ifndef COLOR
/* for MONO only */
int cursorin(DLword addrhi, DLword addrlo, int w, int h, int backward)
{
int x, y;
if (addrhi == DISPLAY_HI) {
y = addrlo / DisplayRasterWidth;
x = (addrlo - y * DisplayRasterWidth) << 4;
} else if (addrhi == DISPLAY_HI + 1) {
y = (addrlo + DLWORDSPER_SEGMENT) / DisplayRasterWidth;
x = ((addrlo + DLWORDSPER_SEGMENT) - y * DisplayRasterWidth) << 4;
} else
return (NIL);
if (backward) y -= h;
if ((x < MOUSEXR) && (x + w > MOUSEXL) && (y < MOUSEYH) && (y + h > MOUSEYL))
return (T);
else
return (NIL);
}
#else
/* for COLOR & MONO */
int cursorin(DLword addrhi, DLword addrlo, int w, int h, int backward)
{
int x, y;
DLword *base68k;
extern int MonoOrColor;
extern int displaywidth;
extern DLword *ColorDisplayRegion68k;
if (MonoOrColor == MONO_SCREEN) { /* On MONO screen */
if (addrhi == DISPLAY_HI) {
y = addrlo / DisplayRasterWidth;
x = (addrlo - y * DisplayRasterWidth) << 4;
} else if (addrhi == DISPLAY_HI + 1) {
y = (addrlo + DLWORDSPER_SEGMENT) / DisplayRasterWidth;
x = ((addrlo + DLWORDSPER_SEGMENT) - y * DisplayRasterWidth) << 4;
} else
return (NIL);
if (backward) y -= h;
if ((x < MOUSEXR) && (x + w > MOUSEXL) && (y < MOUSEYH) && (y + h > MOUSEYL))
return (T);
else
return (NIL);
} else {
base68k = (DLword *)NativeAligned2FromLAddr(addrhi << 16 | addrlo);
if ((ColorDisplayRegion68k <= base68k) && (base68k <= COLOR_MAX_Address)) {
y = (base68k - ColorDisplayRegion68k) / displaywidth;
x = (UNSIGNED)(base68k - ColorDisplayRegion68k) - (y * displaywidth);
/* printf("cursorin: IN COLOR mx=%d my=%d x=%d y%d w=%d h=%d\n"
,*EmMouseX68K,*EmMouseY68K,x,y,w,h); */
} else
return (NIL);
if (backward) y -= h;
if ((x < MOUSEXR) && ((x + (w >> 3)) > MOUSEXL) && (y < MOUSEYH) &&
(y + h > MOUSEYL)) { /* printf("cursorin T\n"); */
return (T);
} else
return (NIL);
} /* on COLOR screen */
}
#endif /* COLOR */