mirror of
https://github.com/Interlisp/maiko.git
synced 2026-01-17 08:33:48 +00:00
Two problems fixed: * only in the case of a software cursor is it necessary to check if the bit being altered is within the region of the display covered by the cursor, and if it is, the cursor must be hidden before operating on the screen bitmap * SDL as well as X requires modifications to the screen bitmap be flushed to the actual display.
103 lines
3.2 KiB
C
103 lines
3.2 KiB
C
/* $Id: misc7.c,v 1.2 1999/01/03 02:07:22 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"
|
|
|
|
/* misc7.c
|
|
*/
|
|
#include "adr68k.h" // for NativeAligned2FromLAddr
|
|
#include "arith.h" // for N_GETNUMBER
|
|
#include "bbtsubdefs.h" // for n_new_cursorin
|
|
#include "dbprint.h" // for DBPRINT
|
|
#include "display.h" // for in_display_segment
|
|
#include "initdspdefs.h" // for flush_display_ptrregion
|
|
#include "lispemul.h" // for LispPTR, DLword, state, BITSPER_DLWORD, ERR...
|
|
#include "lispmap.h" // for S_POSITIVE
|
|
#include "lspglob.h"
|
|
#include "lsptypes.h" // for GETWORDBASEWORD
|
|
#include "misc7defs.h" // for N_OP_misc7
|
|
|
|
|
|
/*************************************************/
|
|
/* Possible operation fields for FBITMAPBIT */
|
|
/*************************************************/
|
|
|
|
#define OP_INVERT 0 /* Invert the bit at the given location */
|
|
#define OP_ERASE 1 /* Turn the given bit off. */
|
|
#define OP_READ 2 /* Just read the bit that's there. */
|
|
#define OP_PAINT 3 /* Turn the bit on. */
|
|
|
|
extern int ScreenLocked;
|
|
|
|
/*** N_OP_misc7 -- pseudocolor or fbitmapbit ***/
|
|
LispPTR N_OP_misc7(LispPTR arg1, LispPTR arg2, LispPTR arg3, LispPTR arg4, LispPTR arg5, LispPTR arg6, LispPTR arg7, int alpha)
|
|
{
|
|
DLword *base;
|
|
int x, y, operation, heightminus1, rasterwidth, oldbit;
|
|
int offset;
|
|
DLword bmdata;
|
|
DLword bmmask;
|
|
#ifdef REALCURSOR
|
|
int displayflg;
|
|
#endif
|
|
|
|
DBPRINT(("MISC7 op with alpha byte %d.\n", alpha));
|
|
|
|
if (alpha != 1) ERROR_EXIT(arg7);
|
|
|
|
base = NativeAligned2FromLAddr(arg1);
|
|
N_GETNUMBER(arg2, x, doufn);
|
|
N_GETNUMBER(arg3, y, doufn);
|
|
N_GETNUMBER(arg4, operation, doufn);
|
|
N_GETNUMBER(arg5, heightminus1, doufn);
|
|
N_GETNUMBER(arg6, rasterwidth, doufn);
|
|
|
|
DBPRINT(("MISC7 args OK.\n"));
|
|
|
|
#ifdef REALCURSOR
|
|
displayflg = n_new_cursorin(base, x, (heightminus1 - y), 1, 1);
|
|
if (displayflg)
|
|
HideCursor();
|
|
#endif
|
|
|
|
/* Bitmaps use a positive integer coordinate system with the lower left
|
|
corner pixel at coordinate (0, 0). Storage is allocated in 16-bit words
|
|
from the upper left corner (0, h-1), with rasterwidth 16-bit words per row.
|
|
*/
|
|
offset = (rasterwidth * (heightminus1 - y)) + (x / BITSPER_DLWORD);
|
|
bmmask = (1 << (BITSPER_DLWORD - 1)) >> (x & (BITSPER_DLWORD - 1));
|
|
bmdata = GETWORDBASEWORD(base, offset);
|
|
oldbit = bmdata & bmmask;
|
|
|
|
ScreenLocked = T;
|
|
|
|
switch (operation) {
|
|
case OP_INVERT: GETWORDBASEWORD(base, offset) = bmdata ^ bmmask; break;
|
|
case OP_ERASE: GETWORDBASEWORD(base, offset) = bmdata & ~bmmask; break;
|
|
case OP_READ: break;
|
|
default: GETWORDBASEWORD(base, offset) = bmdata | bmmask;
|
|
}
|
|
|
|
|
|
#if defined(XWINDOW) || defined(SDL)
|
|
if (in_display_segment(base)) {
|
|
/* NB: base + offset doesn't need WORDPTR() wrapper */
|
|
flush_display_ptrregion(base + offset, 0, 16, 1);
|
|
}
|
|
#endif /* XWINDOW || SDL */
|
|
|
|
ScreenLocked = NIL;
|
|
DBPRINT(("FBITMAPBIT old bit = 0x%x.\n", oldbit));
|
|
return (S_POSITIVE | (oldbit ? 1 : 0));
|
|
|
|
doufn:
|
|
ERROR_EXIT(arg7);
|
|
|
|
} /* end N_OP_misc7() */
|