mirror of
https://github.com/Interlisp/maiko.git
synced 2026-01-15 15:57:13 +00:00
* Remove code for unsupported Sun display configurations Initial cleanup removing all code that was #ifdef'd for SUNDISPLAY. Other SunWindows dependent code may also be removeable * prropstyle will never be defined with no SunWindows support and therefore no pixrect code * Remove code that is ifndef NOPIXRECT, since pixrects are part of the obsolete Sun windows code. There are still traces of pixrect dependent code that could be removed.
223 lines
6.4 KiB
C
223 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"
|
|
#include "iopage.h"
|
|
extern DspInterface currentdsp;
|
|
extern IOPAGE *IOPage68K;
|
|
#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,int 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 *)Addr68k_from_LADDR(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 *)Addr68k_from_LADDR(VAG2(pbt->pbtsourcehi, pbt->pbtsourcelo));
|
|
dstbase = (DLword *)Addr68k_from_LADDR(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, IOPage68K);
|
|
;
|
|
#endif /* SUNDISPLAY / DOS */
|
|
|
|
new_bitblt_code
|
|
|
|
#if DOS
|
|
flush_display_lineregion(dx, dstbase, w, h);
|
|
if (displayflg) (currentdsp->mouse_visible)(IOPage68K->dlmousex, IOPage68K->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)
|
|
{
|
|
register 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)
|
|
{
|
|
register int x, y;
|
|
register 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 *)Addr68k_from_LADDR(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 */
|