From 9ada6de6b930e5d277add99fe293de6a92c42289 Mon Sep 17 00:00:00 2001 From: Larry Masinter Date: Tue, 28 Feb 2023 05:48:41 -0800 Subject: [PATCH 01/25] Revert changes in \DRAWLINE.DISPLAY and add BIGBITMAPS to loadup & exports --- sources/ADISPLAY | 4497 -------------------------------------- sources/ADISPLAY.LCOM | Bin 70819 -> 71761 bytes sources/FILESETS | 6 +- sources/LOADUP-LISP | 19 +- sources/LOADUP-LISP.LCOM | Bin 3524 -> 3566 bytes 5 files changed, 15 insertions(+), 4507 deletions(-) diff --git a/sources/ADISPLAY b/sources/ADISPLAY index 7e3bd10d..5f25ddd2 100644 --- a/sources/ADISPLAY +++ b/sources/ADISPLAY @@ -1,4500 +1,3 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "13-Jun-2021 14:03:35"  -{DSK}kaplan>Local>medley3.5>git-medley>sources>ADISPLAY.;10 248693 - - changes to%: (FNS \DRAWLINE.DISPLAY) - (VARS ADISPLAYCOMS) - - previous date%: "15-Sep-94 17:07:04" -{DSK}kaplan>Local>medley3.5>git-medley>sources>ADISPLAY.;8) - - -(* ; " -Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2021 by Venue & Xerox Corporation. -") - -(PRETTYCOMPRINT ADISPLAYCOMS) - -(RPAQQ ADISPLAYCOMS - [(COMS (* ; "COMPILE SUPPORT") - (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) - WINDOW))) - (P (MOVD? 'NILL 'BIGBITMAPP)) - (COMS (* ; "Interlisp-D dependent stuff.") - (EXPORT (RECORDS REGION BITMAP BITMAPWORD POSITION CURSOR MOUSEEVENT SCREENREGION - SCREENPOSITION)) - (SYSRECORDS PILOTBBT \DISPLAYDATA) - (CONSTANTS (BITSPERINTEGER 32)) - (FNS \BBTCURVEPT) - (FNS CREATETEXTUREFROMBITMAP PRINTBITMAP PRINT-BITMAPS-NICELY PRINTCURSOR \WRITEBITMAP) - (P (DEFPRINT 'BITMAP 'PRINT-BITMAPS-NICELY)) - (FNS \GETINTEGERPART \CONVERTTOFRACTION) - (CONSTANTS (INTEGERBITS 12))) - [COMS (* ; - "cursor functions not on LLDISPLAY") - (FNS CURSORP CURSORBITMAP CreateCursorBitMap) - (EXPORT (MACROS CURSORBITMAP) - (CONSTANTS (HARDCURSORHEIGHT 16) - (HARDCURSORWIDTH 16)) - (DECLARE%: EVAL@COMPILE (ADDVARS (GLOBALVARS CursorBitMap] - (COMS * CARETCOMS) - (COMS (* ; "Region functions") - (FNS CREATEREGION REGIONP INTERSECTREGIONS UNIONREGIONS REGIONSINTERSECTP SUBREGIONP - EXTENDREGION EXTENDREGIONBOTTOM EXTENDREGIONLEFT EXTENDREGIONRIGHT EXTENDREGIONTOP - INSIDEP STRINGREGION)) - (COMS (* ; "line and spline drawing.") - (COMS (* ; - "Brushes and brush initialization") - (GLOBALRESOURCES \BRUSHBBT) - (FNS \BRUSHBITMAP \GETBRUSH \GETBRUSHBBT \InitCurveBrushes \BrushFromWidth) - (FNS \MAKEBRUSH.DIAGONAL \MAKEBRUSH.HORIZONTAL \MAKEBRUSH.VERTICAL - \MAKEBRUSH.SQUARE \MAKEBRUSH.ROUND) - (FNS INSTALLBRUSH) - (VARS \BrushNames) - (INITVARS (KNOWN.BRUSHES NIL) - (\BrushAList NIL)) - (RECORDS BRUSHITEM) - (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\InitCurveBrushes))) - (DECLARE%: DONTCOPY (GLOBALVARS \BrushAList KNOWN.BRUSHES))) - (* ; "Lines") - (FNS \DRAWLINE.DISPLAY RELMOVETO MOVETOUPPERLEFT) - (FNS \CLIPANDDRAWLINE \CLIPANDDRAWLINE1 \CLIPCODE \LEASTPTAT \GREATESTPTAT \DRAWLINE1 - \DRAWLINE.UFN) - (DECLARE%: DONTCOPY (MACROS .DRAWLINEX. .DRAWLINEY.)) - (* ; "Curves") - (FNS \DRAWCIRCLE.DISPLAY \DRAWARC.DISPLAY \DRAWARC.GENERIC \COMPUTE.ARC.POINTS - \DRAWELLIPSE.DISPLAY \DRAWCURVE.DISPLAY \DRAWPOINT.DISPLAY \DRAWPOLYGON.DISPLAY - \LINEWITHBRUSH) - (FNS LOADPOLY PARAMETRICSPLINE \CURVE \CURVE2 \CURVEEND \CURVESLOPE \CURVESTART - \FDIFS/FROM/DERIVS) - (DECLARE%: DONTCOPY (* ; "Used by drawcurve") - (EXPORT (RECORDS POLYNOMIAL SPLINE))) - (DECLARE%: DONTCOPY (EXPORT (MACROS HALF \FILLCIRCLEBLT)) - (MACROS \CURVEPT .SETUP.FOR.\BBTCURVEPT. \CIRCLEPTS \CURVESMOOTH)) - (FNS \FILLCIRCLE.DISPLAY \LINEBLT)) - [COMS (* ; "making and copying bitmaps") - (FNS SCREENBITMAP BITMAPP BITMAPHEIGHT BITSPERPIXEL) - (EXPORT (FILEPKGCOMS BITMAPS CURSORS)) - (DECLARE%: EVAL@COMPILE (EXPORT (ADDVARS (GLOBALVARS SCREENHEIGHT SCREENWIDTH - ScreenBitMap] - [COMS (* ; - "Display stream functions that are not needed in the primitive system") - (FNS DSPFILL INVERTW) - (FNS \DSPCOLOR.DISPLAY \DSPBACKCOLOR.DISPLAY DSPEOLFN) - (EXPORT (CONSTANTS (BLACKSHADE 65535) - (WHITESHADE 0)) - (VARS (GRAYSHADE 43605)) - (ADDVARS (GLOBALVARS GRAYSHADE))) - (MACROS DSPRUBOUTCHAR) - (FNS DSPCLEOL DSPRUBOUTCHAR \DSPMOVELR) - (COMS (* ; "for cursor") - (BITMAPS \DefaultCursor) - (FNS \CURSOR.DEFPRINT) - [DECLARE%: DONTEVAL@LOAD DOCOPY (INITVARS (DEFAULTCURSOR (CURSORCREATE - \DefaultCursor - NIL 0 15))) - (P (COND ((NULL \CURRENTCURSOR) - (SETQ \CURRENTCURSOR DEFAULTCURSOR))) - (DEFPRINT 'CURSOR '\CURSOR.DEFPRINT] - (DECLARE%: DONTCOPY (GLOBALVARS DEFAULTCURSOR] - [COMS (* ; - "stuff to interpret colors as textures which is needed even in system that don't have color.") - (FNS TEXTUREOFCOLOR \PRIMARYTEXTURE \LEVELTEXTURE INSURE.B&W.TEXTURE INSURE.RGB.COLOR - \LOOKUPCOLORNAME RGBP HLSP HLSTORGB \HLSVALUEFN) - (VARS COLORNAMES) - (GLOBALVARS COLORNAMES) - (DECLARE%: DONTCOPY (GLOBALVARS BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 - WHITESHADE16 REDTEXTURE GREENTEXTURE BLUETEXTURE)) - (UGLYVARS BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 WHITESHADE16 REDTEXTURE - GREENTEXTURE BLUETEXTURE) - (DECLARE%: DONTCOPY (* ; "Used by drawcurve") - (EXPORT (RECORDS HLS RGB] - (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) - (NLAML) - (LAMA UNIONREGIONS - INTERSECTREGIONS]) - - - -(* ; "COMPILE SUPPORT") - -(DECLARE%: EVAL@COMPILE DONTCOPY - -(FILESLOAD (LOADCOMP) - WINDOW) -) - -(MOVD? 'NILL 'BIGBITMAPP) - - - -(* ; "Interlisp-D dependent stuff.") - -(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE - -(RECORD REGION (LEFT BOTTOM WIDTH HEIGHT) - LEFT _ -16383 BOTTOM _ -16383 WIDTH _ 32767 HEIGHT _ 32767 - [ACCESSFNS ((TOP (IPLUS (fetch (REGION BOTTOM) of DATUM) - (fetch (REGION HEIGHT) of DATUM) - -1)) - (PTOP (IPLUS (fetch (REGION BOTTOM) of DATUM) - (fetch (REGION HEIGHT) of DATUM))) - (RIGHT (IPLUS (fetch (REGION LEFT) of DATUM) - (fetch (REGION WIDTH) of DATUM) - -1)) - (PRIGHT (IPLUS (fetch (REGION LEFT) of DATUM) - (fetch (REGION WIDTH) of DATUM] - [TYPE? (AND (EQLENGTH DATUM 4) - (EVERY DATUM (FUNCTION NUMBERP] - (SYSTEM)) - -(DATATYPE BITMAP ((BITMAPBASE POINTER) - (BITMAPRASTERWIDTH WORD) - (BITMAPHEIGHT WORD) - (BITMAPWIDTH WORD) - (BITMAPBITSPERPIXEL WORD)) - BITMAPBITSPERPIXEL _ 1 (BLOCKRECORD BITMAP ((BitMapHiLoc WORD) - (BitMapLoLoc WORD)) - (* ; "overlay initial pointer") - ) - (SYSTEM)) - -(BLOCKRECORD BITMAPWORD ((BITS WORD)) - (SYSTEM)) - -(RECORD POSITION (XCOORD . YCOORD) - [TYPE? (AND (LISTP DATUM) - (NUMBERP (CAR DATUM)) - (NUMBERP (CDR DATUM] - (SYSTEM)) - -(DATATYPE CURSOR (CUIMAGE CUMASK CUHOTSPOTX CUHOTSPOTY CUDATA) - [ACCESSFNS ((CUBITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) - of (fetch (CURSOR CUIMAGE) of DATUM] - (SYSTEM)) - -(RECORD MOUSEEVENT (MOUSEX MOUSEY MOUSEBUTTONS KEYBOARD MOUSETIME) - (SYSTEM)) - -(RECORD SCREENREGION (SCREEN . REGION) - (SUBRECORD REGION) - [TYPE? (AND (LISTP DATUM) - (type? SCREEN (CAR DATUM)) - (type? REGION (CDR DATUM] - (SYSTEM)) - -(RECORD SCREENPOSITION (SCREEN . POSITION) - (SUBRECORD POSITION) - [TYPE? (AND (LISTP DATUM) - (type? SCREEN (CAR DATUM)) - (type? POSITION (CDR DATUM] - (SYSTEM)) -) - -(/DECLAREDATATYPE 'BITMAP '(POINTER WORD WORD WORD WORD) - '((BITMAP 0 POINTER) - (BITMAP 2 (BITS . 15)) - (BITMAP 3 (BITS . 15)) - (BITMAP 4 (BITS . 15)) - (BITMAP 5 (BITS . 15))) - '6) - -(/DECLAREDATATYPE 'CURSOR '(POINTER POINTER POINTER POINTER POINTER) - '((CURSOR 0 POINTER) - (CURSOR 2 POINTER) - (CURSOR 4 POINTER) - (CURSOR 6 POINTER) - (CURSOR 8 POINTER)) - '10) - -(* "END EXPORTED DEFINITIONS") - -(ADDTOVAR SYSTEMRECLST - -(DATATYPE PILOTBBT ((PBTDESTLO WORD) - (PBTDESTHI WORD) - (PBTDESTBIT WORD) - (PBTDESTBPL SIGNEDWORD) - (PBTSOURCELO WORD) - (PBTSOURCEHI WORD) - (PBTSOURCEBIT WORD) - (PBTSOURCEBPL SIGNEDWORD) - (PBTWIDTH WORD) - (PBTHEIGHT WORD) - (PBTFLAGS WORD) - (NIL 5 WORD))) - -(DATATYPE \DISPLAYDATA - (DDXPOSITION DDYPOSITION DDXOFFSET DDYOFFSET DDDestination DDClippingRegion DDFONT - DDSlowPrintingCase DDWIDTHSCACHE DDOFFSETSCACHE DDCOLOR DDLINEFEED DDRightMargin - DDLeftMargin DDScroll DDOPERATION DDSOURCETYPE (DDClippingLeft WORD) - (DDClippingRight WORD) - (DDClippingBottom WORD) - (DDClippingTop WORD) - (NIL WORD) - (DDHELDFLG FLAG) - (XWINDOWHINT XPOINTER) - (DDPILOTBBT POINTER) - DDXSCALE DDYSCALE DDCHARIMAGEWIDTHS DDEOLFN DDPAGEFULLFN DDTexture DDMICAXPOS - DDMICAYPOS DDMICARIGHTMARGIN DDCHARSET (DDCHARSETASCENT WORD) - (DDCHARSETDESCENT WORD) - DDCHARHEIGHTDELTA - (DDSPACEWIDTH WORD))) -) -(DECLARE%: EVAL@COMPILE - -(RPAQQ BITSPERINTEGER 32) - - -(CONSTANTS (BITSPERINTEGER 32)) -) (DEFINEQ -(\BBTCURVEPT - [LAMBDA (X Y BBT LEFT BRUSHWIDTH LEFTMINUSBRUSH RIGHTPLUS1 NBITSRIGHTPLUS1 TOPMINUSBRUSH - DestinationBitMap BRUSHHEIGHT BOTTOMMINUSBRUSH TOP BRUSHBASE DESTINATIONBASE RASTERWIDTH - BRUSHRASTERWIDTH COLORBRUSHBASE NBITS DISPLAYDATA) - (* kbr%: "27-Aug-86 23:17") - - (* ;; "Called by \CURVEPT macro. Draws a brush point by bitblting BRUSHBM to point X,Y in DestinationBitMap. BBT is a BitBlt table where everything is already set except the source and destination addresses, width and height. In other words, only the easy stuff") - (* ; "set the width fields of the bbt") - [PROG (CLIPPEDTOP STY) - [COND - [(ILEQ Y TOPMINUSBRUSH) (* ; - "the top part of the brush is visible") - (SETQ CLIPPEDTOP (IPLUS Y BRUSHHEIGHT)) - (replace PBTSOURCE of BBT with BRUSHBASE) - (freplace PBTHEIGHT of BBT with (IMIN BRUSHHEIGHT (IDIFFERENCE Y - BOTTOMMINUSBRUSH] - (T (* ; "only the bottom is visible") - (SETQ CLIPPEDTOP TOP) - [replace PBTSOURCE of BBT with (\ADDBASE BRUSHBASE - (ITIMES BRUSHRASTERWIDTH - (SETQ STY (IDIFFERENCE - Y TOPMINUSBRUSH] - (freplace PBTHEIGHT of BBT with (IDIFFERENCE (IMIN BRUSHHEIGHT - (IDIFFERENCE Y - BOTTOMMINUSBRUSH - )) - STY] - (freplace PBTDEST of BBT with (\ADDBASE DESTINATIONBASE (ITIMES RASTERWIDTH - (\SFInvert - - DestinationBitMap - CLIPPEDTOP] - [COND - (COLORBRUSHBASE [COND - [(ILESSP X LEFT) (* ; - "only the right part of the brush is visible") - (* ; - "FOR NOW BRUTE FORCE WITH NBITS CHECK") - [freplace PBTDESTBIT of BBT with (COND - ((EQ NBITS 4) - (LLSH LEFT 2)) - (T (LLSH LEFT 3] - (freplace PBTSOURCEBIT of BBT - with (IDIFFERENCE BRUSHWIDTH - (freplace PBTWIDTH of BBT - with (COND - ((EQ NBITS 4) - (LLSH (IDIFFERENCE X LEFTMINUSBRUSH) - 2)) - (T (LLSH (IDIFFERENCE X LEFTMINUSBRUSH) - 3] - (T (* ; "left edge is visible") - [freplace PBTDESTBIT of BBT with (SETQ X - (COND - ((EQ NBITS 4) - (LLSH X 2)) - (T (LLSH X 3] - (freplace PBTSOURCEBIT of BBT with 0) - (* ; - "set width to the amount that is visible") - (freplace PBTWIDTH of BBT with (IMIN BRUSHWIDTH - (IDIFFERENCE - NBITSRIGHTPLUS1 - X] - (* ; - "if color brush is used, the ground must be cleared before the brush is put in.") - (\SETPBTFUNCTION BBT (ffetch DDSOURCETYPE of DISPLAYDATA) - 'ERASE) - (\PILOTBITBLT BBT 0) (* ; - "reset the source to point to the color bitmap.") - [COND - ((ILEQ Y TOPMINUSBRUSH) (* ; - "the top part of the brush is visible") - (freplace PBTSOURCE of BBT with COLORBRUSHBASE)) - (T (* ; "only the bottom is visible") - (freplace PBTSOURCE of BBT with (\ADDBASE COLORBRUSHBASE - (ITIMES BRUSHRASTERWIDTH - (IDIFFERENCE Y - TOPMINUSBRUSH] - (\SETPBTFUNCTION BBT (ffetch DDSOURCETYPE of DISPLAYDATA) - 'PAINT)) - (T (COND - [(ILESSP X LEFT) (* ; - "only the right part of the brush is visible") - (freplace PBTDESTBIT of BBT with LEFT) - (freplace PBTSOURCEBIT of BBT with (IDIFFERENCE BRUSHWIDTH - (freplace PBTWIDTH - of BBT - with (IDIFFERENCE X - LEFTMINUSBRUSH - ] - (T (* ; "left edge is visible") - (freplace PBTDESTBIT of BBT with X) - (freplace PBTSOURCEBIT of BBT with 0) - (* ; - "set width to the amount that is visible") - (freplace PBTWIDTH of BBT with (IMIN BRUSHWIDTH (IDIFFERENCE RIGHTPLUS1 X - ] - (\PILOTBITBLT BBT 0]) ) -(DEFINEQ - -(CREATETEXTUREFROMBITMAP - [LAMBDA (BITMAP) (* rrb "17-May-84 11:22") - - (* ;; "creates a texture object from the lower left corner of a bitmap") - - (OR (BITMAPP BITMAP) - (\ILLEGAL.ARG BITMAP)) - (PROG ((H (fetch BITMAPHEIGHT of BITMAP)) - (W (fetch BITMAPWIDTH of BITMAP)) - TEXTHEIGHT TEXTURE) - (COND - ((AND (OR (EQ W 2) - (EQ W 4)) - (OR (EQ H 2) - (EQ H 4))) (* ; - "small texture will match bitmap exactly so use integer representation.") - (SETQ TEXTURE 0) - [for X from 0 to 3 - do (for Y from 0 to 3 - do (COND - ([NOT (EQ 0 (BITMAPBIT BITMAP (IREMAINDER X W) - (IREMAINDER Y H] - (SETQ TEXTURE (LOGOR TEXTURE - (\BITMASK (IPLUS (ITIMES (IDIFFERENCE - 3 Y) - 4) - X] - (RETURN TEXTURE)) - ((AND (EQ W 16) - (ILESSP H 17)) (* ; - "if it is already 16 by n n<=16, use it.") - (RETURN BITMAP)) - (T (* ; "make a 16 bit wide one.") - (SETQ TEXTURE (BITMAPCREATE 16 (IMIN H 16))) - (for X from 0 by W to 16 - do (BITBLT BITMAP 0 0 TEXTURE X 0 W H 'INPUT 'REPLACE)) - (RETURN TEXTURE]) - -(PRINTBITMAP - [LAMBDA (BITMAP FILE) (* ; "Edited 1-Dec-86 16:24 by Pavel") - -(* ;;; "Writes a bitmap on a file such that READBITMAP will read it back in.") - - (DECLARE (LOCALVARS . T)) - (PROG ((BM BITMAP)) - (COND - ((type? BITMAP BITMAP)) - ([AND (LITATOM BITMAP) - (type? BITMAP (SETQ BM (EVALV BITMAP] (* ; - "Coerce litatoms for compatibility with original specification") - ) - (T (printout T "******** " BITMAP " is not a BITMAP." T) - (RETURN NIL))) - (printout FILE "(" .P2 (BITMAPWIDTH BM) - %, .P2 (BITMAPHEIGHT BM)) (* ; - "if the number of bits per pixel is not 1, write it out.") - (COND - ((NEQ (BITSPERPIXEL BM) - 1) - (SPACES 1 FILE) - (PRIN2 (BITSPERPIXEL BM) - FILE))) (* ; - "Enclose in list so that compile-copying works.") - (\WRITEBITMAP BM FILE) (* ; "Now write out contents.") - (PRIN1 ")" FILE]) - -(PRINT-BITMAPS-NICELY - [LAMBDA (BITMAP STREAM) (* ; "Edited 20-Mar-87 17:06 by jop") - -(* ;;; "The syntax for bitmaps is") - - (* ;; "#*(width height [bits-per-pixel])XXXXXX...") - -(* ;;; "where WIDTH and HEIGHT are the dimensions of the bitmap, BITS-PER-PIXEL can be omitted if it is equal to one, and the X's are single characters between @ and O (in ASCII), each representing four bits. There will be exactly (* (ceiling (* WIDTH BITS-PER-PIXEL) 16) 4) characters for each row of the bitmap and exactly HEIGHT rows. Note that there are no spaces allowed between the * and the (, between the ) and the first X, or anywhere inside the string of X's. Also, the character after the last X must not be of type OTHER.") - -(* ;;; "This function %"observes%" *print-length*: it truncates after printing *print-length* characters in the bitmap's representation.") - - (if (OR (NULL STREAM) - (NULL *PRINT-ARRAY*)) - then - - (* ;; "Let it be printed in the normal way, with an address.") - - NIL - else - - (* ;; "Print this bitmap in the preferred way.") - - (LET* ((WIDTH (BITMAPWIDTH BITMAP)) - (HEIGHT (BITMAPHEIGHT BITMAP)) - (BITS-PER-PIXEL (BITSPERPIXEL BITMAP)) - (BASE (fetch BITMAPBASE of BITMAP)) - (QUAD-CHARS-PER-ROW (FOLDHI (CL:* WIDTH BITS-PER-PIXEL) - 16)) - (CHARS-SO-FAR *PRINT-LENGTH*)) - (PRINTOUT STREAM "#*(" .P2 WIDTH " " .P2 HEIGHT) - (if (NEQ BITS-PER-PIXEL 1) - then (PRINTOUT STREAM " " .P2 BITS-PER-PIXEL)) - (PRINTOUT STREAM ")") - (PROG NIL - [CL:MACROLET [(ELIDE? NIL `(IF (AND CHARS-SO-FAR (EQ 0 (CL:DECF - CHARS-SO-FAR - ))) - THEN (PRINTOUT STREAM "...") - (GO OUT] - (CL:DOTIMES (ROW HEIGHT) - (CL:DOTIMES (QUAD QUAD-CHARS-PER-ROW) - (CL:WRITE-CHAR (CL:INT-CHAR (+ (LRSH (\GETBASEBYTE BASE 0) - 4) - (CL:CHAR-INT #\@))) - STREAM) - (ELIDE?) - (CL:WRITE-CHAR (CL:INT-CHAR (+ (LOGAND (\GETBASEBYTE BASE 0) - 15) - (CL:CHAR-INT #\@))) - STREAM) - (ELIDE?) - (CL:WRITE-CHAR (CL:INT-CHAR (+ (LRSH (\GETBASEBYTE BASE 1) - 4) - (CL:CHAR-INT #\@))) - STREAM) - (ELIDE?) - (CL:WRITE-CHAR (CL:INT-CHAR (+ (LOGAND (\GETBASEBYTE BASE 1) - 15) - (CL:CHAR-INT #\@))) - STREAM) - (ELIDE?) - (SETQ BASE (\ADDBASE BASE 1))))] - OUT (RETURN T]) - -(PRINTCURSOR - [LAMBDA (VAR) (* ; "Edited 2-Dec-86 14:15 by Pavel") - - (* ;; "Writes an expression that will define the cursor value of VAR") - - (PROG (CUR IMAGE MASK) - (COND - ([NOT (type? CURSOR (SETQ CUR (EVALV VAR 'PRINTCURSOR] - (printout T "******** " VAR " is not a CURSOR." T) - (RETURN NIL))) (* ; "write out defining form.") - (\CURSORBITSPERPIXEL CUR 1) - (SETQ IMAGE (fetch (CURSOR CUIMAGE) of CUR)) - (SETQ MASK (fetch (CURSOR CUMASK) of CUR)) - (PRINT `(RPAQ ,VAR (CURSORCREATE ',IMAGE ',(AND (NOT (EQ IMAGE MASK)) - MASK) - ,(fetch (CURSOR CUHOTSPOTX) of CUR) - ,(fetch (CURSOR CUHOTSPOTY) of CUR]) - -(\WRITEBITMAP - [LAMBDA (BITMAP FILE) (* ; "Edited 1-Dec-86 16:24 by Pavel") - -(* ;;; "writes the contents of a bitmap onto the currently open output file.") - - (PROG (LIM (BASE (fetch BITMAPBASE of BITMAP)) - (OFD (GETSTREAM FILE 'OUTPUT)) - (W (fetch BITMAPRASTERWIDTH of BITMAP))) - (FRPTQ (fetch BITMAPHEIGHT of BITMAP) - (TERPRI FILE) - (\BOUT OFD (CHARCODE %")) - (SETQ LIM (\ADDBASE BASE W)) - (until (EQ BASE LIM) do (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) - (LRSH (\GETBASEBYTE BASE 0) - 4))) - (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) - (LOGAND (\GETBASEBYTE BASE 0) - 15))) - (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) - (LRSH (\GETBASEBYTE BASE 1) - 4))) - (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) - (LOGAND (\GETBASEBYTE BASE 1) - 15))) - (SETQ BASE (\ADDBASE BASE 1))) - (\BOUT OFD (CHARCODE %"]) -) - -(DEFPRINT 'BITMAP 'PRINT-BITMAPS-NICELY) -(DEFINEQ - -(\GETINTEGERPART - [LAMBDA (FRACT) (* JonL " 7-May-84 02:43") - - (* ;; "gets the integer part of a fixed point number. The integer part has INTEGERBITS worth of significant bits the leftmost of which is sign.") - - (PROG [HIPART (ROUNDER (COND - ([EQ 0 (LOGAND (fetch (FIXP HINUM) of FRACT) - (CONSTANT (LLSH 1 (IDIFFERENCE BITSPERWORD (ADD1 - INTEGERBITS - ] - 0) - (T 1] - - (* ;; "assumes that the number of significant bits --- INTEGERBITS --- is less than can fit in the high order of the two words allocated for the integer.") - - (RETURN (COND - ([IGREATERP [SETQ HIPART (LRSH (fetch (FIXP HINUM) of FRACT) - (CONSTANT (IDIFFERENCE BITSPERWORD INTEGERBITS] - (CONSTANT (EXPT 2 (SUB1 INTEGERBITS] - (* ; - "the sign bit is on, make it negative.") - (IDIFFERENCE (IDIFFERENCE HIPART (CONSTANT (EXPT 2 INTEGERBITS))) - ROUNDER)) - (T (IPLUS HIPART ROUNDER]) - -(\CONVERTTOFRACTION - [LAMBDA (FLOAT) (* rmk%: " 3-JUL-82 23:29") - - (* ;; "converts a floating point number into a fixed point number with INTEGERBITS worth of integer part. Always returns a large integer so that the box can be clobbered.") - - (PROG (RESULT BOX) - (RETURN (COND - ([SMALLP (SETQ RESULT (FIX (FTIMES FLOAT (CONSTANT (FLOAT (EXPT 2 - (IDIFFERENCE - BITSPERINTEGER - INTEGERBITS] - (* ; "clobber a created box.") - (PutUnboxed (SETQ BOX (CREATECELL \FIXP)) - RESULT) - BOX) - (T RESULT]) -) -(DECLARE%: EVAL@COMPILE - -(RPAQQ INTEGERBITS 12) - - -(CONSTANTS (INTEGERBITS 12)) -) - - - -(* ; "cursor functions not on LLDISPLAY") - -(DEFINEQ - -(CURSORP - [LAMBDA (X) (* kbr%: " 5-Jul-85 17:54") - (* ; "is X a cursor?") - (type? CURSOR X]) - -(CURSORBITMAP - [LAMBDA NIL CursorBitMap]) - -(CreateCursorBitMap - [LAMBDA (ARRAY) (* rmk%: " 1-APR-82 22:20") - (* ; - "makes a bitmap out of an array of values.") - (PROG ((BM (BITMAPCREATE 16 16)) - BASE) - (SETQ BASE (ffetch BITMAPBASE of BM)) - (for I from 0 to 15 do (\PUTBASE BASE I (LOGAND (ELT ARRAY (ADD1 I)) - WORDMASK))) - (RETURN BM]) -) -(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE - -(PUTPROPS CURSORBITMAP MACRO (NIL CursorBitMap)) -) -(DECLARE%: EVAL@COMPILE - -(RPAQQ HARDCURSORHEIGHT 16) - -(RPAQQ HARDCURSORWIDTH 16) - - -(CONSTANTS (HARDCURSORHEIGHT 16) - (HARDCURSORWIDTH 16)) -) -(DECLARE%: EVAL@COMPILE - -(ADDTOVAR GLOBALVARS CursorBitMap) -) - -(* "END EXPORTED DEFINITIONS") - - -(RPAQQ CARETCOMS - ((BITMAPS \DefaultCaret) - (INITVARS (\CARET.UP NIL - - (* ;; "global. NIL if no caret showing, otherwise a CARET1 record with CURSOR, stream, x, y, and RATE (= off rate)") -) - (\CARET.DEFAULT NIL (* ; - "global = default caret to put up. An instance of CARET1 datatype") - ) - (\CARET.TIMER (SETUPTIMER 0) - (* ; "time for next caret action")) - (DEFAULTCARET (CURSORCREATE \DefaultCaret NIL 3 4)) - (DEFAULTCARETRATE 333 (* ; "default rate for flashing caret") - ) - (\CARET.ON.RATE DEFAULTCARETRATE) - (\CARET.OFF.RATE DEFAULTCARETRATE) - (\CARET.FORCED.OFF.RATE 0)) - (ADDVARS (\SYSTEMTIMERVARS \CARET.TIMER)) - (DECLARE%: DONTCOPY (RECORDS CARET1)) - (INITRECORDS CARET1) - (FNS CARET \CARET.CREATE \CARET.DOWN \CARET.FLASH? \CARET.SHOW CARETRATE \CARET.FLASH.AGAIN - \CARET.FLASH.MULTIPLE \CARET.FLASH) - (FNS \MEDW.CARET.SHOW) - (* ; "some declarations are on LLDISPLAY -- macro for \CHECKCARET and globalvar declaration for \CARET.UP") - (GLOBALVARS \CARET.DEFAULT \CARET.ON.RATE \CARET.OFF.RATE DEFAULTCARET \CARET.TIMER \CARET.UP - \CARET.FORCED.OFF.RATE) - (DECLARE%: DONTEVAL@LOAD DOCOPY (ADDVARS (TTYBACKGROUNDFNS \CARET.FLASH?))) - (FNS \AREAVISIBLE? \REGIONOVERLAPAREAP \AREAINREGIONP) - (P (CARET T)))) - -(RPAQQ \DefaultCaret #*(7 6)A@@@CH@@CH@@FL@@FL@@LF@@) - -(RPAQ? \CARET.UP NIL - (* ;; "global. NIL if no caret showing, otherwise a CARET1 record with CURSOR, stream, x, y, and RATE (= off rate)") -) - -(RPAQ? \CARET.DEFAULT NIL (* ; - "global = default caret to put up. An instance of CARET1 datatype") -) - -(RPAQ? \CARET.TIMER (SETUPTIMER 0) - (* ; "time for next caret action")) - -(RPAQ? DEFAULTCARET (CURSORCREATE \DefaultCaret NIL 3 4)) - -(RPAQ? DEFAULTCARETRATE 333 (* ; "default rate for flashing caret") -) - -(RPAQ? \CARET.ON.RATE DEFAULTCARETRATE) - -(RPAQ? \CARET.OFF.RATE DEFAULTCARETRATE) - -(RPAQ? \CARET.FORCED.OFF.RATE 0) - -(ADDTOVAR \SYSTEMTIMERVARS \CARET.TIMER) -(DECLARE%: DONTCOPY -(DECLARE%: EVAL@COMPILE - -(RECORD CARET1 (* ; - "a record that describes a SHOWING caret") - (STREAM (* ; - "the stream the caret is showing in") - STREAMX (* ; - "the X position stream relative that it was shown at") - STREAMY (* ; - "the Y position stream relative that it was shown at") - CURSOR (* ; - "the cursor bitmap + x and y that this caret represents") - RATE (* ; "the 'down rate' for this caret, in ticks. After comes down (when \CARET.TIMER expires), \CARET.TIMER will be rescheduled to put something up. This is the rate to use") - (* ; - "NEXT for threading carets together") - . NEXT)) -) -) -(DEFINEQ - -(CARET - [LAMBDA (NEWCARET) (* kbr%: " 6-Jul-85 16:13") - (* ; - "changes the 'system default' caret") - (PROG1 (COND - (\CARET.DEFAULT (* ; - "merely stored as a 'cursor' record for simplicity") - (fetch (CARET1 CURSOR) of \CARET.DEFAULT)) - (T 'OFF)) - [COND - (NEWCARET (\CHECKCARET) - (CARETRATE (CARETRATE)) (* ; "make sure the caret rate is set") - (SETQ \CARET.DEFAULT (SELECTQ NEWCARET - (T (COND - ((EQ DEFAULTCARET 'OFF) - NIL) - ((CURSORP DEFAULTCARET) - (create CARET1 - CURSOR _ DEFAULTCARET)) - (T (ERROR "DEFAULTCARET is not a cursor" - DEFAULTCARET)))) - (OFF NIL) - (COND - ((CURSORP NEWCARET) - (create CARET1 - CURSOR _ NEWCARET)) - (T (LISPERROR "ILLEGAL ARG" NEWCARET])]) - -(\CARET.CREATE - [LAMBDA (CURSOR) (* jds "11-Jul-85 19:38") - (create CARET1 - CURSOR _ (OR CURSOR DEFAULTCARET]) - -(\CARET.DOWN - [LAMBDA (STREAM INTERVAL UNLESSOCCLUDED) (* lmm " 4-May-84 18:15") - - (* ;; "take caret down if it is up. If you take it down, reschedule to put it back up in INTERVAL (or 0) --- often called thru \CHECKCARET macro") - - (COND - (\CARET.UP (COND - ([OR (NULL STREAM) - (fetch (CARET1 NEXT) of \CARET.UP) - (EQ (fetch (CARET1 STREAM) of \CARET.UP) - (COND - ((type? WINDOW STREAM) - (fetch (WINDOW DSP) of STREAM)) - (T STREAM] - [while (UNINTERRUPTABLY - [COND - ((\CARET.SHOW \CARET.UP UNLESSOCCLUDED) - (* ; - "take caret down and set global state") - (replace (CARET1 STREAM) of \CARET.UP with - NIL) - (SETQ \CARET.UP (fetch (CARET1 NEXT) of \CARET.UP])] - (SETUPTIMER (OR INTERVAL \CARET.FORCED.OFF.RATE) - \CARET.TIMER]) - -(\CARET.FLASH? - [LAMBDA (STREAM CARET ONRATE OFFRATE X Y) (* AJB "17-Jul-85 12:47") - -(* ;;; "Flashes the CARET at the ONRATE/OFFRATE at the X,Y position in the current TTY window. If CARET is NIL, uses \CARET.DEFAULT as the caret. Takes either a display stream or a textstream as the destination stream to flash the caret. The caret is not flashed on a shift-selection in a window") - - (COND - (\CARET.UP [COND - ((TIMEREXPIRED? \CARET.TIMER) - (\CARET.DOWN NIL (fetch (CARET1 RATE) of \CARET.UP) - (OR (KEYDOWNP 'LSHIFT) - (KEYDOWNP 'RSHIFT) - (KEYDOWNP 'COPY] - NIL) - ((AND (OR CARET (SETQ CARET \CARET.DEFAULT)) - (TIMEREXPIRED? \CARET.TIMER) - [OR [DISPLAYSTREAMP (OR STREAM (SETQ STREAM (TTYDISPLAYSTREAM] - (AND (IMAGESTREAMTYPEP STREAM 'TEXT) - (SETQ STREAM (WINDOWPROP (CAR (fetch (TEXTOBJ \WINDOW) of (TEXTOBJ - STREAM))) - 'DSP] - (\CARET.FLASH CARET STREAM OFFRATE (OR (KEYDOWNP 'LSHIFT) - (KEYDOWNP 'RSHIFT) - (KEYDOWNP 'COPY)) - X Y)) - - (* ;; "\CARET.DEFAULT is NIL if by default the caret is OFF --- the KEYDOWNP clause is a hack to detect whether we are doing a copy-select") - - (replace (CARET1 NEXT) of CARET with NIL)(* ; - "Since this function is displaying a new caret, destroy any chaining of multiple carets") - (SETUPTIMER (OR ONRATE \CARET.ON.RATE) - \CARET.TIMER) - T]) - -(\CARET.SHOW - [LAMBDA (CARET UNLESSOCCLUDED) (* ; "Edited 25-Feb-94 16:53 by sybalsky") - - (* ;; "GENERIC caret flasher.") - - (LET (DS) - (SETQ DS (fetch (CARET1 STREAM) of CARET)) - (WINDOWOP 'SCCARETFLASH (FETCH (WINDOW SCREEN) OF (FETCH (\DISPLAYDATA - XWINDOWHINT) - OF (FETCH (STREAM - IMAGEDATA) - OF DS))) - CARET UNLESSOCCLUDED]) - -(CARETRATE - [LAMBDA (ONRATE OFFRATE) (* lmm " 3-May-84 11:35") - - (* ;; "sets the default caret rate (s) to be ONRATE/OFFRATE in milliseconds") - - (PROG1 (COND - ((EQ \CARET.ON.RATE \CARET.OFF.RATE) - \CARET.ON.RATE) - (T (CONS \CARET.ON.RATE \CARET.OFF.RATE))) - [COND - ((OR ONRATE OFFRATE) - (SETUPTIMER 0 \CARET.TIMER) - (SETQ \CARET.ON.RATE (OR (FIXP ONRATE) - (FIX DEFAULTCARETRATE))) - (SETQ \CARET.OFF.RATE (OR (FIXP OFFRATE) - \CARET.ON.RATE])]) - -(\CARET.FLASH.AGAIN - [LAMBDA (CARET STREAM X Y) (* AJB "14-Aug-85 17:04") - (LET ((OCARET \CARET.UP)) - (COND - ([AND OCARET CARET (DISPLAYSTREAMP (OR STREAM (SETQ STREAM (TTYDISPLAYSTREAM] - (for (OC _ OCARET) by (fetch (CARET1 NEXT) of OC) - do (COND - [(NULL OC) - (RETURN (COND - ((\CARET.FLASH CARET STREAM (fetch (CARET1 RATE) - of \CARET.UP) - (OR (KEYDOWNP 'LSHIFT) - (KEYDOWNP 'RSHIFT) - (KEYDOWNP 'COPY)) - X Y) (* ; "OK, showed this one") - (OR (EQ \CARET.UP CARET) - (SHOULDNT)) - (replace (CARET1 NEXT) of CARET with OCARET] - ((EQ OC CARET) (* ; "this CARET is already showing") - (RETURN]) - -(\CARET.FLASH.MULTIPLE - [LAMBDA (STREAMS CARETS ONRATE OFFRATE) (* AJB "14-Aug-85 17:10") - (* ; - "this is probably just a template for how to flash multiple carets") - (COND - ((\CARET.FLASH? (CAR STREAMS) - (CAR CARETS) - ONRATE OFFRATE) - (for STR in (CDR STREAMS) as CARET in (CDR CARETS) - do (\CARET.FLASH.AGAIN CARET STR]) - -(\CARET.FLASH - [LAMBDA (CARET STREAM RATE UNLESSOCCLUDED X Y) (* kbr%: " 5-Jul-85 17:51") - (PROG (CURSOR ANSWER) - (SETQ CURSOR (fetch (CARET1 CURSOR) of CARET)) - (replace (CARET1 STREAM) of CARET with STREAM) - (replace (CARET1 STREAMX) of CARET with (IDIFFERENCE (OR X (DSPXPOSITION NIL - STREAM)) - (fetch (CURSOR CUHOTSPOTX) - of CURSOR))) - (replace (CARET1 STREAMY) of CARET with (IDIFFERENCE (OR Y (DSPYPOSITION NIL - STREAM)) - (fetch (CURSOR CUHOTSPOTY) - of CURSOR))) - (replace (CARET1 RATE) of CARET with (OR RATE \CARET.OFF.RATE)) - (UNINTERRUPTABLY - (COND - ((\CARET.SHOW CARET UNLESSOCCLUDED) - (SETQ \CARET.UP CARET) - (SETQ ANSWER T)))) - (RETURN ANSWER]) -) -(DEFINEQ - -(\MEDW.CARET.SHOW - [LAMBDA (SCREEN CARET UNLESSOCCLUDED) (* ; - "Edited 17-Jan-94 10:28 by sybalsky:mv:envos") - - (* ;; "MEDLEY-window-system specific version of \CARET.SHOW (vectored thru the screen). Flash the caret (by inverting its image). UNLESSOCCLUDED controls whether you bring the window to the top if the caret is under some other window.") - - (PROG (DS) - (SETQ DS (fetch (CARET1 STREAM) of CARET)) - (RETURN (PROG (DD CARETWIN CBMX CBMY CURSOR CARETBM CWX CWY CARETBMWIDTH CARETBMHEIGHT - CLIPREG CLIPVAR) - (SETQ DD (fetch (STREAM IMAGEDATA) of DS)) - (SETQ CARETWIN (WFROMDS DS)) - (SETQ CBMX 0) - (SETQ CBMY 0) - (SETQ CURSOR (fetch (CARET1 CURSOR) of CARET)) - (\CURSORBITSPERPIXEL CURSOR (BITSPERPIXEL (DSPDESTINATION NIL CARETWIN))) - (SETQ CARETBM (fetch (CURSOR CUIMAGE) of CURSOR)) - (SETQ CWX (fetch (CARET1 STREAMX) of CARET)) - (SETQ CWY (fetch (CARET1 STREAMY) of CARET)) - (SETQ CARETBMWIDTH (fetch (BITMAP BITMAPWIDTH) of CARETBM)) - (SETQ CARETBMHEIGHT (fetch (BITMAP BITMAPHEIGHT) of CARETBM)) - (* ; - "calculate how much to reduce the caret region by do to the clipping region of the window.") - (SETQ CLIPREG (fetch (\DISPLAYDATA DDClippingRegion) of DD)) - (COND - ((IGREATERP (SETQ CLIPVAR (fetch (REGION LEFT) of CLIPREG)) - CWX) - [SETQ CARETBMWIDTH (IDIFFERENCE CARETBMWIDTH (SETQ CBMX (IDIFFERENCE - CLIPVAR CWX] - (SETQ CWX CLIPVAR))) - (COND - ((IGREATERP CARETBMWIDTH (SETQ CLIPVAR (IDIFFERENCE - (IPLUS CLIPVAR (fetch - (REGION WIDTH) - of CLIPREG)) - CWX))) - (SETQ CARETBMWIDTH CLIPVAR))) - (COND - ((IGREATERP (SETQ CLIPVAR (fetch (REGION BOTTOM) of CLIPREG)) - CWY) - [SETQ CARETBMHEIGHT (IDIFFERENCE CARETBMHEIGHT (SETQ CBMY - (IDIFFERENCE CLIPVAR CWY] - (SETQ CWY CLIPVAR))) - (COND - ((IGREATERP CARETBMHEIGHT (SETQ CLIPVAR (IDIFFERENCE - (IPLUS CLIPVAR - (fetch (REGION HEIGHT) - of CLIPREG)) - CWY))) - (SETQ CARETBMHEIGHT CLIPVAR))) - - (* note the time of the next change. This must be done without creating boxes - because happens during keyboard wait.) - - (COND - ((OR (ILESSP CARETBMWIDTH 1) - (ILESSP CARETBMHEIGHT 1)) (* caret isn't within clipping - region.) - (RETURN T))) (* convert the base of the caret - location to screen coordinates.) - (SETQ CWX (\DSPTRANSFORMX CWX DD)) - (SETQ CWY (\DSPTRANSFORMY CWY DD)) - - (* having only this section uninterruptable leaves open the possibility that - the window moves or the timer is wrong but these will only mess up the display - and are low frequency events.) - - (COND - [(AND (OPENWP CARETWIN) - (\AREAVISIBLE? CARETWIN CWX CWY (IPLUS CWX (SUB1 CARETBMWIDTH)) - (IPLUS CWY (SUB1 CARETBMHEIGHT] - (UNLESSOCCLUDED (RETURN)) - (T (TOTOPW CARETWIN))) - (BITBLT CARETBM CBMX CBMY (DSPDESTINATION NIL CARETWIN) - CWX CWY CARETBMWIDTH CARETBMHEIGHT 'INPUT 'INVERT) - (RETURN T]) -) - - - -(* ; -"some declarations are on LLDISPLAY -- macro for \CHECKCARET and globalvar declaration for \CARET.UP") - -(DECLARE%: DOEVAL@COMPILE DONTCOPY - -(GLOBALVARS \CARET.DEFAULT \CARET.ON.RATE \CARET.OFF.RATE DEFAULTCARET \CARET.TIMER \CARET.UP - \CARET.FORCED.OFF.RATE) -) -(DECLARE%: DONTEVAL@LOAD DOCOPY - -(ADDTOVAR TTYBACKGROUNDFNS \CARET.FLASH?) -) -(DEFINEQ - -(\AREAVISIBLE? - [LAMBDA (WIN LFT BTM RGHT TOP) (* kbr%: "18-Feb-86 18:05") - - (* ;; "is the area whose screen limits are LFT BTM RGHT and TOP eniretly visible within WIN,") - - (PROG (WPTR) - (SETQ WPTR (fetch (SCREEN SCTOPW) of (fetch (WINDOW SCREEN) of WIN))) - (COND - ((NOT (\AREAINREGIONP (fetch (WINDOW REG) of WIN) - LFT BTM RGHT TOP)) (* ; - "if the caret region isn't completely within the window, forget it.") - (RETURN))) - LP (COND - ((EQ WPTR WIN) - (RETURN T)) - ((\REGIONOVERLAPAREAP (fetch (WINDOW REG) of WPTR) - LFT BTM RGHT TOP) - (RETURN NIL)) - ((SETQ WPTR (fetch (WINDOW NEXTW) of WPTR)) - (GO LP]) - -(\REGIONOVERLAPAREAP - [LAMBDA (REG LFT BTM RGHT TOP) (* rrb "17-Feb-86 18:50") - - (* ;; - "is there any overlap between the region REG and the area defined by left bottom right and top?") - - (NOT (OR (IGREATERP (fetch (REGION LEFT) of REG) - RGHT) - (IGREATERP LFT (fetch (REGION RIGHT) of REG)) - (IGREATERP (fetch (REGION BOTTOM) of REG) - TOP) - (IGREATERP BTM (fetch (REGION TOP) of REG]) - -(\AREAINREGIONP - [LAMBDA (REGION LFT BTM RGHT TOP) (* rrb "14-OCT-83 15:32") - (AND (IGEQ LFT (fetch LEFT of REGION)) - (IGEQ BTM (fetch BOTTOM of REGION)) - (IGEQ (fetch PRIGHT of REGION) - RGHT) - (IGEQ (fetch PTOP of REGION) - TOP]) -) - -(CARET T) - - - -(* ; "Region functions") - -(DEFINEQ - -(CREATEREGION - [LAMBDA (LEFT BOTTOM WIDTH HEIGHT) (* rrb "17-JUN-83 08:56") - (* ; "creates a region structure.") - (create REGION - LEFT _ LEFT - BOTTOM _ BOTTOM - WIDTH _ WIDTH - HEIGHT _ HEIGHT]) - -(REGIONP - [LAMBDA (X) (* rrb "29-Jun-84 18:00") - (AND (type? REGION X) - X]) - -(INTERSECTREGIONS - [LAMBDA REGIONS (* kbr%: "24-Jan-86 18:30") - - (* ;; "returns the largest region that is contained in all of REGIONS") - - (COND - ((EQ REGIONS 0) - - (* ;; "this is documented as returning a very large region. This one covers the entire FIXP range so should work for many purposes. rrb") - - (create REGION - LEFT _ (SUB1 MIN.FIXP) - BOTTOM _ (SUB1 MIN.FIXP) - WIDTH _ (PLUS (TIMES 2 MAX.FIXP) - 4) - HEIGHT _ (PLUS (TIMES 2 MAX.FIXP) - 4))) - (T (PROG (REG LFT RGHT BTTM TP) - (SETQ REG (ARG REGIONS 1)) - (SETQ LFT (fetch (REGION LEFT) of REG)) - [SETQ RGHT (SUB1 (IPLUS LFT (fetch (REGION WIDTH) of REG] - (SETQ BTTM (fetch (REGION BOTTOM) of REG)) - [SETQ TP (SUB1 (IPLUS BTTM (fetch (REGION HEIGHT) of REG] - [for I from 2 thru REGIONS do (SETQ REG (ARG REGIONS I)) - [COND - ((IGREATERP (fetch (REGION LEFT) - of REG) - LFT) - (SETQ LFT (fetch (REGION LEFT) - of REG] - [COND - ((IGREATERP (fetch (REGION BOTTOM - ) - of REG) - BTTM) - (SETQ BTTM (fetch (REGION BOTTOM - ) - of REG] - [COND - ((ILESSP (fetch (REGION RIGHT) - of REG) - RGHT) - (SETQ RGHT (fetch (REGION RIGHT) - of REG] - (COND - ((ILESSP (fetch (REGION TOP) - of REG) - TP) - (SETQ TP (fetch (REGION TOP) - of REG] - (RETURN (COND - ((AND (IGEQ RGHT LFT) - (IGEQ TP BTTM)) - (create REGION - LEFT _ LFT - BOTTOM _ BTTM - WIDTH _ (ADD1 (IDIFFERENCE RGHT LFT)) - HEIGHT _ (ADD1 (IDIFFERENCE TP BTTM]) - -(UNIONREGIONS - [LAMBDA REGIONS (* rrb "30-Dec-85 17:07") - - (* ;; "returns the smallest region that encloses all of REGIONS") - - (COND - ((EQ 0 REGIONS) - NIL) - (T (PROG (REG LFT RGHT BTTM TP) - (SETQ REG (ARG REGIONS 1)) - (SETQ LFT (fetch (REGION LEFT) of REG)) - (SETQ RGHT (fetch (REGION PRIGHT) of REG)) - (SETQ BTTM (fetch (REGION BOTTOM) of REG)) - (SETQ TP (fetch (REGION PTOP) of REG)) - [for I from 2 thru REGIONS do (SETQ REG (ARG REGIONS I)) - [COND - ((LESSP (fetch (REGION LEFT) - of REG) - LFT) - (SETQ LFT (fetch (REGION LEFT) - of REG] - [COND - ((LESSP (fetch (REGION BOTTOM) - of REG) - BTTM) - (SETQ BTTM (fetch (REGION BOTTOM - ) - of REG] - [COND - ((GREATERP (fetch (REGION PRIGHT) - of REG) - RGHT) - (SETQ RGHT (fetch (REGION PRIGHT - ) - of REG] - (COND - ((GREATERP (fetch (REGION PTOP) - of REG) - TP) - (SETQ TP (fetch (REGION PTOP) - of REG] - (RETURN (create REGION - LEFT _ LFT - BOTTOM _ BTTM - WIDTH _ (DIFFERENCE RGHT LFT) - HEIGHT _ (DIFFERENCE TP BTTM]) - -(REGIONSINTERSECTP - [LAMBDA (REGION1 REGION2) (* rrb "16-AUG-81 08:29") - - (* ;; "determines if two regions intersect") - - (NOT (OR (IGREATERP (fetch LEFT of REGION1) - (fetch RIGHT of REGION2)) - (IGREATERP (fetch LEFT of REGION2) - (fetch RIGHT of REGION1)) - (IGREATERP (fetch BOTTOM of REGION1) - (fetch TOP of REGION2)) - (IGREATERP (fetch BOTTOM of REGION2) - (fetch TOP of REGION1]) - -(SUBREGIONP - [LAMBDA (LARGEREGION SMALLREGION) (* rrb "25-JUN-82 15:09") - - (* ;; "determines if small region is a subset of large region. (SUBREGIONP '(9 0 100 100) '(0 10 100 80))") - - (AND (IGEQ (fetch LEFT of SMALLREGION) - (fetch LEFT of LARGEREGION)) - (IGEQ (fetch BOTTOM of SMALLREGION) - (fetch BOTTOM of LARGEREGION)) - (IGEQ (fetch PRIGHT of LARGEREGION) - (fetch PRIGHT of SMALLREGION)) - (IGEQ (fetch PTOP of LARGEREGION) - (fetch PTOP of SMALLREGION]) - -(EXTENDREGION - [LAMBDA (REGION INCLUDEREGION) (* rrb " 5-FEB-82 09:25") - - (* ;; "destructively extends REGION to include INCLUDEREGION") - - [COND - ((IGREATERP (fetch (REGION LEFT) of REGION) - (fetch (REGION LEFT) of INCLUDEREGION)) - (replace (REGION WIDTH) of REGION with (IDIFFERENCE (fetch (REGION PRIGHT) - of REGION) - (fetch (REGION LEFT) - of INCLUDEREGION))) - (replace (REGION LEFT) of REGION with (fetch (REGION LEFT) of - INCLUDEREGION - ] - [COND - ((IGREATERP (fetch (REGION BOTTOM) of REGION) - (fetch (REGION BOTTOM) of INCLUDEREGION)) - (replace (REGION HEIGHT) of REGION with (IDIFFERENCE (fetch (REGION PTOP) - of REGION) - (fetch (REGION BOTTOM) - of INCLUDEREGION))) - (replace (REGION BOTTOM) of REGION with (fetch (REGION BOTTOM) of - INCLUDEREGION - ] - [COND - ((IGREATERP (fetch (REGION RIGHT) of INCLUDEREGION) - (fetch (REGION RIGHT) of REGION)) - (replace (REGION WIDTH) of REGION with (ADD1 (IDIFFERENCE (fetch (REGION - RIGHT) - of INCLUDEREGION - ) - (fetch (REGION LEFT) - of REGION] - [COND - ((IGREATERP (fetch (REGION TOP) of INCLUDEREGION) - (fetch (REGION TOP) of REGION)) - (replace (REGION HEIGHT) of REGION with (ADD1 (IDIFFERENCE (fetch - (REGION TOP) - of - INCLUDEREGION - ) - (fetch (REGION BOTTOM) - of REGION] - REGION]) - -(EXTENDREGIONBOTTOM - [LAMBDA (REG NEWBOTTOM) (* rrb "29-DEC-81 10:02") - (* ; "extends a region to the bottom") - (PROG ((OLDBOTTOM (fetch (REGION BOTTOM) of REG))) - [COND - ((IGREATERP OLDBOTTOM NEWBOTTOM) - (replace (REGION BOTTOM) of REG with NEWBOTTOM) - (replace (REGION HEIGHT) of REG with (IPLUS (fetch (REGION HEIGHT) - of REG) - (IDIFFERENCE OLDBOTTOM - NEWBOTTOM] - (RETURN REG]) - -(EXTENDREGIONLEFT - [LAMBDA (REG NEWLEFT) (* rrb "29-DEC-81 09:37") - (* ; "extends a region to the left") - (PROG ((OLDLEFT (fetch (REGION LEFT) of REG))) - [COND - ((IGREATERP OLDLEFT NEWLEFT) - (replace (REGION LEFT) of REG with NEWLEFT) - (replace (REGION WIDTH) of REG with (IPLUS (fetch (REGION WIDTH) - of REG) - (IDIFFERENCE OLDLEFT NEWLEFT] - (RETURN REG]) - -(EXTENDREGIONRIGHT - [LAMBDA (REG NEWRIGHT) (* rrb "29-DEC-81 10:06") - (* ; "extends a region to the left") - (PROG ((OLDRIGHT (fetch (REGION RIGHT) of REG))) - [COND - ((ILESSP OLDRIGHT NEWRIGHT) - (replace (REGION WIDTH) of REG with (IPLUS (fetch (REGION WIDTH) - of REG) - (IDIFFERENCE NEWRIGHT OLDRIGHT] - (RETURN REG]) - -(EXTENDREGIONTOP - [LAMBDA (REG NEWTOP) (* rrb "29-DEC-81 10:07") - (* ; "extends a region to the top") - (PROG ((OLDTOP (fetch (REGION TOP) of REG))) - [COND - ((ILESSP OLDTOP NEWTOP) - (replace (REGION HEIGHT) of REG with (IPLUS (fetch (REGION HEIGHT) - of REG) - (IDIFFERENCE NEWTOP OLDTOP] - (RETURN REG]) - -(INSIDEP - [LAMBDA (REGION POSORX Y) (* rrb "18-May-84 21:04") - - (* ;; "returns T if the position X Y is inside the region REGION. If POSORX is a position, returns T if that position is inside of REGION") - - (COND - ((WINDOWP REGION) - (INSIDEP (DSPCLIPPINGREGION NIL REGION) - POSORX Y)) - (T (COND - ((AND (NUMBERP POSORX) - (NUMBERP Y)) - (INSIDE? REGION POSORX Y)) - ((POSITIONP POSORX) - (INSIDE? REGION (fetch (POSITION XCOORD) of POSORX) - (fetch (POSITION YCOORD) of POSORX))) - ((NUMBERP POSORX) - (\ILLEGAL.ARG Y)) - (T (\ILLEGAL.ARG POSORX]) - -(STRINGREGION - [LAMBDA (STR STREAM PRIN2FLG RDTBL) (* rmk%: "25-AUG-83 18:06") - - (* ;; "returns the region taken up by STR if it were printed at the current position of STREAM") - - (create REGION - LEFT _ (DSPXPOSITION NIL STREAM) - BOTTOM _ (IDIFFERENCE (DSPYPOSITION NIL STREAM) - (FONTPROP STREAM 'DESCENT)) - WIDTH _ (STRINGWIDTH STR STREAM PRIN2FLG RDTBL) - HEIGHT _ (FONTPROP STREAM 'HEIGHT]) -) - - - -(* ; "line and spline drawing.") - - - - -(* ; "Brushes and brush initialization") - -(DECLARE%: DONTCOPY -(DECLARE%: EVAL@COMPILE - -[PUTDEF '\BRUSHBBT 'RESOURCES '(NEW (create PILOTBBT] -) -) - -(/SETTOPVAL '\\BRUSHBBT.GLOBALRESOURCE NIL) -(DEFINEQ - -(\BRUSHBITMAP - [LAMBDA (BRUSHSHAPE BRUSHWIDTH) (* rrb " 9-Sep-86 16:30") - -(* ;;; -"returns the bitmap for the brush of the shape and size. See comments on \InitCurveBrushes.") - - (DECLARE (GLOBALVARS \BrushAList)) - (LET [(BRUSHES&METHOD (CDR (OR (FASSOC BRUSHSHAPE \BrushAList) - (\ILLEGAL.ARG BRUSHSHAPE] - (COND - ((NOT (GREATERP BRUSHWIDTH 0)) - - (* ;; "if brush is 0 or negative, return an empty brush. Might want to error but this would require users to handle it.") - - (BITMAPCREATE 0 0)) - [(ILESSP BRUSHWIDTH 17) (* ; - "lowest 16 brushes are stored. FIX them so ELT works.") - (ELT (fetch (BRUSHITEM BRUSHARRAY) of BRUSHES&METHOD) - (COND - ((FIXP BRUSHWIDTH)) - ((GREATERP BRUSHWIDTH 1) - (FIXR BRUSHWIDTH)) - (T 1] - [(CDR (FASSOC BRUSHWIDTH (fetch (BRUSHITEM BRUSHCACHE) of BRUSHES&METHOD] - (T - (* ;; "cache the brush bitmap. This is done so that the brush creation methods don't have to be efficient.") - - (LET ((NEWBRUSHBM (APPLY* (fetch (BRUSHITEM CREATEMETHOD) of BRUSHES&METHOD) - BRUSHWIDTH))) - (replace (BRUSHITEM BRUSHCACHE) of BRUSHES&METHOD - with (CONS (CONS BRUSHWIDTH NEWBRUSHBM) - (fetch (BRUSHITEM BRUSHCACHE) of BRUSHES&METHOD))) - NEWBRUSHBM]) - -(\GETBRUSH - [LAMBDA (BRUSH) (* rrb " 9-Sep-86 16:30") - (COND - ((type? BITMAP BRUSH) - BRUSH) - [(LISTP BRUSH) - (\BRUSHBITMAP (CAR BRUSH) - (CAR (LISTP (CDR BRUSH] - (T (\BRUSHBITMAP 'ROUND (OR BRUSH 1]) - -(\GETBRUSHBBT - [LAMBDA (BRUSHBM DISPLAYDATA BBT) (* kbr%: "18-Aug-85 12:46") - - (* ;; "Initializes BBT for the BRUSHBM and DS and returns BBT, unless the BRUSHBM is a 1-point brush, in which case it returns NIL.") - - (COND - ((AND (EQ (fetch (BITMAP BITMAPHEIGHT) of BRUSHBM) - 1) - (EQ (ffetch (BITMAP BITMAPWIDTH) of BRUSHBM) - 1) - (EQ (BITMAPBIT BRUSHBM 0 0) - 1)) (* ; - "special case of single point brush shape.") - NIL) - (T (* ; - "update as many fields in the brush bitblt table as possible from DS.") - (replace (PILOTBBT PBTDESTBPL) of BBT with (UNFOLD (fetch (BITMAP - BITMAPRASTERWIDTH - ) - of - (fetch (\DISPLAYDATA - DDDestination - ) - of DISPLAYDATA)) - BITSPERWORD)) - (freplace (PILOTBBT PBTSOURCEBPL) of BBT with (UNFOLD (ffetch (BITMAP - - BITMAPRASTERWIDTH - ) - of BRUSHBM) - BITSPERWORD)) - (freplace (PILOTBBT PBTFLAGS) of BBT with 0) - (freplace (PILOTBBT PBTDISJOINT) of BBT with T) - (\SETPBTFUNCTION BBT (ffetch (\DISPLAYDATA DDSOURCETYPE) of DISPLAYDATA) - (SELECTQ (ffetch (\DISPLAYDATA DDOPERATION) of DISPLAYDATA) - ((PAINT REPLACE) - 'PAINT) - ((INVERT ERASE) - 'ERASE) - (SHOULDNT))) - BBT]) - -(\InitCurveBrushes - [LAMBDA NIL (* ; "Edited 13-Oct-87 14:31 by jds") - - (* ;; "Set up the initial set of brush specs for curve drawing. \BrushAList is an association list from brush-shape-names to a spec which is an instance of the record BRUSHITEM.") - - (DECLARE (GLOBALVARS \BrushNames \BrushAList \SingleBitBitmap)) - (PROG (BARRAY CREATIONMETHOD) - (SETQ \SingleBitBitmap (BITMAPCREATE 1 1)) - (BITMAPBIT \SingleBitBitmap 0 0 1) - (for BRUSHNAME in \BrushNames do (SETQ BARRAY (ARRAY 16 'POINTER NIL 1)) - (SETQ CREATIONMETHOD (PACK* '\MAKEBRUSH. - BRUSHNAME)) - (SETA BARRAY 1 \SingleBitBitmap) - (for SIZE from 2 to 16 - do (SETA BARRAY SIZE (APPLY* - CREATIONMETHOD - SIZE))) - (INSTALLBRUSH BRUSHNAME CREATIONMETHOD - BARRAY]) - -(\BrushFromWidth - [LAMBDA (W) (* hdj " 5-Nov-84 16:47") - (LIST 'ROUND W]) -) -(DEFINEQ - -(\MAKEBRUSH.DIAGONAL - [LAMBDA (SIZE) (* kbr%: "18-Aug-85 12:51") - (PROG (BM) - (SETQ BM (BITMAPCREATE SIZE SIZE)) - (for X from 0 to (SUB1 SIZE) do (BITMAPBIT BM X X 1)) - (RETURN BM]) - -(\MAKEBRUSH.HORIZONTAL - [LAMBDA (SIZE) (* kbr%: "18-Aug-85 12:52") - -(* ;;; "create a brush that has a horizontal line across it halfway down") - - (PROG (BM) - (SETQ BM (BITMAPCREATE SIZE SIZE)) - (BITBLT NIL NIL NIL BM 0 (SUB1 (FOLDHI SIZE 2)) - NIL 1 'TEXTURE 'REPLACE BLACKSHADE) - (RETURN BM]) - -(\MAKEBRUSH.VERTICAL - [LAMBDA (SIZE) (* kbr%: "18-Aug-85 12:53") - (PROG (BM) - (SETQ BM (BITMAPCREATE SIZE SIZE)) - (BITBLT NIL NIL NIL BM (SUB1 (FOLDHI SIZE 2)) - 0 1 SIZE 'TEXTURE 'REPLACE BLACKSHADE) - (RETURN BM]) - -(\MAKEBRUSH.SQUARE - [LAMBDA (SIZE) (* kbr%: "18-Aug-85 13:07") - (PROG (BM) - (SETQ BM (BITMAPCREATE SIZE SIZE)) - (BITBLT NIL NIL NIL BM NIL NIL NIL NIL 'TEXTURE 'REPLACE BLACKSHADE) - (RETURN BM]) - -(\MAKEBRUSH.ROUND - [LAMBDA (SIZE) (* rrb "15-Sep-86 14:32") - (* ; - "special cased 8 so that it wouldn't have a width of 7. rrb") - (PROG (RADIUS BITMAP BASE) - (SETQ RADIUS (SUB1 (HALF SIZE))) - (SETQ BITMAP (BITMAPCREATE SIZE SIZE)) - (SETQ BASE (fetch (BITMAP BITMAPBASE) of BITMAP)) - (SELECTQ SIZE - (1 (\PUTBASE BASE 0 (MASK.1'S 15 1))) - (2 (\PUTBASE BASE 0 (MASK.1'S 14 2)) - (\PUTBASE BASE 1 (MASK.1'S 14 2))) - (3 (\PUTBASE BASE 0 (MASK.1'S 14 1)) - (\PUTBASE BASE 1 (MASK.1'S 13 3)) - (\PUTBASE BASE 2 (MASK.1'S 14 1))) - (4 (\PUTBASE BASE 0 (MASK.1'S 13 2)) - (\PUTBASE BASE 1 (MASK.1'S 12 4)) - (\PUTBASE BASE 2 (MASK.1'S 12 4)) - (\PUTBASE BASE 3 (MASK.1'S 13 2))) - (5 (\PUTBASE BASE 0 (MASK.1'S 13 1)) - (\PUTBASE BASE 1 (MASK.1'S 12 3)) - (\PUTBASE BASE 2 (MASK.1'S 11 5)) - (\PUTBASE BASE 3 (MASK.1'S 12 3)) - (\PUTBASE BASE 4 (MASK.1'S 13 1))) - (8 (\PUTBASE BASE 0 (MASK.1'S 10 4)) - (\PUTBASE BASE 1 (MASK.1'S 9 6)) - (\PUTBASE BASE 2 (MASK.1'S 8 8)) - (\PUTBASE BASE 3 (MASK.1'S 8 8)) - (\PUTBASE BASE 4 (MASK.1'S 8 8)) - (\PUTBASE BASE 5 (MASK.1'S 8 8)) - (\PUTBASE BASE 6 (MASK.1'S 9 6)) - (\PUTBASE BASE 7 (MASK.1'S 10 4))) - (FILLCIRCLE RADIUS RADIUS RADIUS BLACKSHADE (DSPCREATE BITMAP))) - (RETURN BITMAP]) -) -(DEFINEQ - -(INSTALLBRUSH - [LAMBDA (BRUSHNAME BRUSHFN BRUSHARRAY) (* kbr%: "18-Jan-86 15:27") - (DECLARE (GLOBALVARS \BrushAList)) - (PROG (OLDENTRY) - (SETQ OLDENTRY (FASSOC BRUSHNAME \BrushAList)) - (COND - (OLDENTRY (AND BRUSHARRAY (replace (BRUSHITEM BRUSHARRAY) of (CDR OLDENTRY) - with BRUSHARRAY)) - (AND BRUSHFN (replace (BRUSHITEM CREATEMETHOD) of (CDR OLDENTRY) - with BRUSHFN))) - (T [COND - ((AND BRUSHFN (NOT (ARRAYP BRUSHARRAY))) - (SETQ BRUSHARRAY (ARRAY 16 'POINTER NIL 1)) - (for X from 1 to 16 do (SETA BRUSHARRAY X (APPLY* BRUSHFN X] - (push \BrushAList (CONS BRUSHNAME (create BRUSHITEM - BRUSHARRAY _ BRUSHARRAY - CREATEMETHOD _ BRUSHFN))) - (push KNOWN.BRUSHES BRUSHNAME]) -) - -(RPAQQ \BrushNames (ROUND SQUARE DIAGONAL HORIZONTAL VERTICAL)) - -(RPAQ? KNOWN.BRUSHES NIL) - -(RPAQ? \BrushAList NIL) -(DECLARE%: EVAL@COMPILE - -(RECORD BRUSHITEM (BRUSHARRAY CREATEMETHOD . BRUSHCACHE)) -) -(DECLARE%: DONTEVAL@LOAD DOCOPY - -(\InitCurveBrushes) -) -(DECLARE%: DONTCOPY -(DECLARE%: DOEVAL@COMPILE DONTCOPY - -(GLOBALVARS \BrushAList KNOWN.BRUSHES) -) -) - - - -(* ; "Lines") - -(DEFINEQ - -(\DRAWLINE.DISPLAY - [LAMBDA (DISPLAYSTREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR DASHING) - (* ; "Edited 13-Jun-2021 14:03 by rmk:") - - (* ;; "DISPLAYSTREAM is guaranteed to be a display-stream. Draws a line from x1,y1 to x2,y2 leaving the position at x2,y2") - - (* ;; "Added handling of brushes (I think, this is actually pretty tricky).") - - (DECLARE (LOCALVARS . T)) - (SELECTQ OPERATION - (NIL (ffetch DDOPERATION of (fetch IMAGEDATA of DISPLAYSTREAM))) - ((REPLACE PAINT INVERT ERASE) - OPERATION) - (\ILLEGAL.ARG OPERATION)) - (\INSURETOPWDS DISPLAYSTREAM) (* ; - "RMK: This was only in the no-dash case, oddly") - (IF (OR DASHING (BRUSHP WIDTH)) - THEN [LET ((BRUSH (INSURE.BRUSH WIDTH))) - (if COLOR - then (replace (BRUSH BRUSHCOLOR) of BRUSH with COLOR)) - (IF (BIGBITMAPP (ffetch DDDestination of (fetch IMAGEDATA - of DISPLAYSTREAM))) - THEN (\DRAWLINE.BIGBM.DASH DISPLAYSTREAM X1 Y1 X2 Y2 BRUSH DASHING - OPERATION) - ELSE (GLOBALRESOURCES \BRUSHBBT (\LINEWITHBRUSH X1 Y1 X2 Y2 BRUSH - (\GOOD.DASHLST DASHING BRUSH) - DISPLAYSTREAM \BRUSHBBT OPERATION] - ELSEIF (BIGBITMAPP (ffetch DDDestination of (fetch IMAGEDATA of - DISPLAYSTREAM - ))) - THEN (\DRAWLINE.BIGBM.NODASH DISPLAYSTREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR) - ELSE (LET ((DD (fetch IMAGEDATA of DISPLAYSTREAM))) - (\CLIPANDDRAWLINE (\DSPTRANSFORMX (OR (FIXP X1) - (FIXR X1)) - DD) - (\DSPTRANSFORMY (OR (FIXP Y1) - (FIXR Y1)) - DD) - (\DSPTRANSFORMX (OR (FIXP X2) - (FIXR X2)) - DD) - (\DSPTRANSFORMY (OR (FIXP Y2) - (FIXR Y2)) - DD) - [COND - ((NULL WIDTH) - 1) - ((OR (FIXP WIDTH) - (FIXR WIDTH] - OPERATION - (ffetch DDDestination of DD) - (ffetch DDClippingLeft of DD) - (SUB1 (ffetch DDClippingRight of DD)) - (ffetch DDClippingBottom of DD) - (SUB1 (ffetch DDClippingTop of DD)) - DISPLAYSTREAM COLOR))) (* ; - "the generic case of MOVETO is used so that the hardcopy streams get handled as well.") - (MOVETO X2 Y2 DISPLAYSTREAM]) - -(RELMOVETO - [LAMBDA (DX DY STREAM) (* rmk%: "25-AUG-83 18:13") - (* ; "moves the position by a vector") - (DSPXPOSITION [IPLUS DX (DSPXPOSITION NIL (SETQ STREAM (\OUTSTREAMARG STREAM] - STREAM) - (DSPYPOSITION (IPLUS DY (DSPYPOSITION NIL STREAM)) - STREAM]) - -(MOVETOUPPERLEFT - [LAMBDA (STREAM REGION) (* hdj " 5-Jul-85 12:19") - - (* ;; "moves the current position to the upper left corner so that the first line of text will all appear.") - - (PROG [(ASCENT (FONTPROP (DSPFONT NIL STREAM) - 'ASCENT] - (COND - ((AND REGION (OR (type? REGION REGION) - (\ILLEGAL.ARG REGION))) - (MOVETO (fetch (REGION LEFT) of REGION) - (IDIFFERENCE (fetch (REGION PTOP) of REGION) - ASCENT) - STREAM)) - (T (MOVETO (DSPLEFTMARGIN NIL STREAM) - (IDIFFERENCE (fetch (REGION PTOP) of (DSPCLIPPINGREGION NIL STREAM)) - ASCENT) - STREAM))) - (RETURN STREAM]) -) -(DEFINEQ - -(\CLIPANDDRAWLINE - [LAMBDA (X1 Y1 X2 Y2 WIDTH OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR) - (* ; "Edited 21-Aug-91 12:15 by jds") - - (* ;; "draws a line from {X1,Y1} to {X2,Y2} clipped to region specified by LEFT RIGHT BOTTOM and TOP. This code is a transliterated version of the BCPL routine that was in chat.") - - (* ;; "assumes that the width is at least 1") - - (* ;; "DS is passed so that window can be uninterruptably brought to top.") - - (COND - ((NOT (EQ (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) - 1)) (* ; - "make adjustments in case of color.") - (SETQ COLOR (COLORNUMBERP (OR COLOR (DSPCOLOR NIL DS)) - (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP))) - (* ; "(COND ((EQ OPERATION 'ERASE) ; treat erase as AND of background (SETQ COLOR (OPPOSITECOLOR COLOR (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP)))))") - ) - (T (SETQ COLOR BLACKSHADE))) - (PROG NIL - (COND - [(EQ X1 X2) (* ; "special case of vertical line.") - [COND - ((IGREATERP WIDTH 2) - (COND - [(EQ Y1 Y2) - - (* ;; "special case. Since we don't know whether the guy is headed horizontally or vertically, put out a round brush This is a fairly infrequent case because I didn't get any bug reports on it in three years so efficiency is not a consideration.") - - (RETURN (.WHILE.TOP.DS. DS (\DRAWPOINT.DISPLAY (DSPDESTINATION NIL DS) - X1 Y1 (LIST 'ROUND WIDTH COLOR) - OPERATION] - (T (SETQ X1 (SETQ X2 (IDIFFERENCE X1 (LRSH (SUB1 WIDTH) - 1] - (PROG (MIN MAX) - (RETURN (COND - ([OR (IGREATERP X1 RIGHT) - (IGEQ LEFT (SETQ X2 (IPLUS X1 WIDTH))) - (IGREATERP (SETQ MIN (IMIN Y1 Y2)) - TOP) - (IGREATERP BOTTOM (SETQ MAX (IMAX Y1 Y2] - (* ; "outside clippingregion.") - NIL) - (T (.WHILE.TOP.DS. DS (BITBLT NIL 0 0 BITMAP (SETQ X1 (IMAX X1 LEFT)) - (SETQ MIN (IMAX MIN BOTTOM)) - (IDIFFERENCE (IMIN X2 (ADD1 RIGHT)) - X1) - (ADD1 (IDIFFERENCE (IMIN MAX TOP) - MIN)) - 'TEXTURE OPERATION COLOR] - [(EQ Y1 Y2) (* ; - "special case of horizontal line.") - [COND - ((IGREATERP WIDTH 2) - (SETQ Y1 (SETQ Y2 (IDIFFERENCE Y1 (LRSH (SUB1 WIDTH) - 1] - (PROG (MIN MAX) - (RETURN (COND - ([OR (IGREATERP Y1 TOP) - (IGEQ BOTTOM (SETQ Y2 (IPLUS Y1 WIDTH))) - (IGREATERP (SETQ MIN (IMIN X1 X2)) - RIGHT) - (IGREATERP LEFT (SETQ MAX (IMAX X1 X2] - (* ; "outside clippingregion.") - NIL) - (T (.WHILE.TOP.DS. DS (BITBLT NIL 0 0 BITMAP (SETQ MIN - (IMAX MIN LEFT)) - (SETQ Y1 (IMAX Y1 BOTTOM)) - (ADD1 (IDIFFERENCE (IMIN MAX RIGHT) - MIN)) - (IDIFFERENCE (IMIN Y2 (ADD1 TOP)) - Y1) - 'TEXTURE OPERATION COLOR] - ((EQ WIDTH 1) (* ; "special case of width 1") - (\CLIPANDDRAWLINE1 X1 Y1 X2 Y2 OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR)) - ((IGREATERP (IABS (IDIFFERENCE X1 X2)) - (IABS (IDIFFERENCE Y1 Y2))) (* ; - "slope is more horizontal, so make line grow in the positive y direction.") - [COND - ((IGREATERP WIDTH 2) - (PROG (HALFWIDTH) - (SETQ HALFWIDTH (LRSH (SUB1 WIDTH) - 1)) - (SETQ Y1 (IDIFFERENCE Y1 HALFWIDTH)) - (SETQ Y2 (IDIFFERENCE Y2 HALFWIDTH] - (for I from Y1 to (SUB1 (IPLUS Y1 WIDTH)) as J from Y2 - do (\CLIPANDDRAWLINE1 X1 I X2 J OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS - COLOR))) - (T (* ; - "slope is more vertical, so make line grow in the positive x direction.") - [COND - ((IGREATERP WIDTH 2) - (PROG (HALFWIDTH) - (SETQ HALFWIDTH (LRSH (SUB1 WIDTH) - 1)) - (SETQ X1 (IDIFFERENCE X1 HALFWIDTH)) - (SETQ X2 (IDIFFERENCE X2 HALFWIDTH] - (for I from X1 to (SUB1 (IPLUS X1 WIDTH)) as J from X2 - do (\CLIPANDDRAWLINE1 I Y1 J Y2 OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS - COLOR]) - -(\CLIPANDDRAWLINE1 - [LAMBDA (X1 Y1 X2 Y2 OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR) - (* JonL " 7-May-84 02:57") - - (* ;; "LEFT, RIGHT, BOTTOM, TOP are set to the boundaries of the clipping region") - - (* ;; "DS is passed so that window can be uninterruptably brought to top.") - - (PROG (DX DY YMOVEUP HALFDX HALFDY (BMRASTERWIDTH (fetch BITMAPRASTERWIDTH of BITMAP))) - (COND - ((IGREATERP X1 X2) (* ; - "switch points so DX is always positive.") - (SETQ HALFDX X1) - (SETQ X1 X2) - (SETQ X2 HALFDX) - (SETQ HALFDX Y1) - (SETQ Y1 Y2) - (SETQ Y2 HALFDX))) (* ; - "calculate differences and sign of Y movement.") - (SETQ HALFDX (LRSH (SETQ DX (IDIFFERENCE X2 X1)) - 1)) - (SETQ HALFDY (LRSH [SETQ DY (COND - ((IGREATERP Y2 Y1) - (SETQ YMOVEUP T) - (IDIFFERENCE Y2 Y1)) - (T (IDIFFERENCE Y1 Y2] - 1)) - (COND - ((AND (IGEQ X1 LEFT) - (IGEQ RIGHT X2) - [COND - (YMOVEUP (AND (IGEQ Y1 BOTTOM) - (IGEQ TOP Y2))) - (T (AND (IGEQ Y2 BOTTOM) - (IGEQ TOP Y1] - (EQ (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) - 1)) (* ; - "line is completely visible, fast case.") - (.WHILE.TOP.DS. DS (\DRAWLINE1 X1 (SUB1 (\SFInvert BITMAP Y1)) - DX DY DX DY (COND - ((IGREATERP DX DY) - (* ; "X is the fastest mover.") - HALFDX) - (T (* ; "y is the fastest mover.") - HALFDY)) - (COND - (YMOVEUP (* ; - "y is moving in positive direction but bits are stored inversely") - (IMINUS BMRASTERWIDTH)) - (T BMRASTERWIDTH)) - OPERATION - (fetch BITMAPBASE of BITMAP) - BMRASTERWIDTH))) - (T - (PROG ((CX1 X1) - (CY1 Y1) - (CX2 X2) - (CY2 Y2) - (CA1 (\CLIPCODE X1 Y1 LEFT RIGHT TOP BOTTOM)) - (CA2 (\CLIPCODE X2 Y2 LEFT RIGHT TOP BOTTOM))) - (* ; - "save the original points for the clipping computation.") - (* ; - "determine the sectors in which the points fall.") - CLIPLP - [COND - ((NOT (EQ 0 (LOGAND CA1 CA2))) (* ; - "line is entirely out of clipping region") - (RETURN NIL)) - ((EQ 0 (IPLUS CA1 CA2)) (* ; "line is completely visible") - - (* ;; "\SFInvert has an off by one bug that everybody else in LLDISPLAY uses to save computation so SUB1 from what you would expect.") - (* ; "reuse the variable CA1") - (RETURN - (.WHILE.TOP.DS. - DS - (SELECTQ (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) - (1 (\DRAWLINE1 CX1 (SUB1 (\SFInvert BITMAP CY1)) - (IDIFFERENCE CX2 CX1) - (COND - (YMOVEUP (IDIFFERENCE CY2 CY1)) - (T (IDIFFERENCE CY1 CY2))) - DX DY (COND - ((IGREATERP DX DY) - (* ; "X is the fastest mover.") - (IREMAINDER (IPLUS (ITIMES DY (IDIFFERENCE CX1 X1)) - HALFDX) - DX)) - (T (* ; "y is the fastest mover.") - (IREMAINDER (IPLUS [ITIMES DX - (COND - (YMOVEUP - (IDIFFERENCE CY1 Y1 - )) - (T (IDIFFERENCE - Y1 CY1] - HALFDY) - DY))) - (COND - (YMOVEUP (* ; - "y is moving in positive direction but bits are stored inversely") - (IMINUS BMRASTERWIDTH)) - (T BMRASTERWIDTH)) - OPERATION - (fetch BITMAPBASE of BITMAP) - BMRASTERWIDTH)) - ((4 8) - (\DRAWCOLORLINE1 - CX1 - (SUB1 (\SFInvert BITMAP CY1)) - (IDIFFERENCE CX2 CX1) - (COND - (YMOVEUP (IDIFFERENCE CY2 CY1)) - (T (IDIFFERENCE CY1 CY2))) - DX DY (COND - ((IGREATERP DX DY) - (* ; "X is the fastest mover.") - (IREMAINDER (IPLUS (ITIMES DY (IDIFFERENCE CX1 X1)) - HALFDX) - DX)) - (T (* ; "y is the fastest mover.") - (IREMAINDER (IPLUS [ITIMES DX - (COND - (YMOVEUP (IDIFFERENCE - CY1 Y1)) - (T (IDIFFERENCE Y1 CY1] - HALFDY) - DY))) - (COND - (YMOVEUP (* ; - "y is moving in positive direction but bits are stored inversely") - (IMINUS BMRASTERWIDTH)) - (T BMRASTERWIDTH)) - OPERATION - (fetch BITMAPBASE of BITMAP) - BMRASTERWIDTH - (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) - COLOR)) - (SHOULDNT] - [COND - ((NEQ CA1 0) - - (* ;; "now move point CX1 CY1 so that one of the coordinates is on one of the boundaries. Which boundary is done first was copied from BCPL.") - - (COND - ((IGREATERP CA1 7) (* ; "y1 less than bottom") - (* ; - "calculate the least X for which Y will be at bottom.") - [SETQ CX1 (IPLUS X1 (\LEASTPTAT DX DY (IDIFFERENCE BOTTOM Y1] - (SETQ CY1 BOTTOM)) - ((IGREATERP CA1 3) (* ; "y1 is greater than top") - [SETQ CX1 (IPLUS X1 (\LEASTPTAT DX DY (IDIFFERENCE Y1 TOP] - (SETQ CY1 TOP)) - (T (* ; "x1 is less than left") - [SETQ CY1 (COND - [YMOVEUP (IPLUS Y1 (\LEASTPTAT DY DX (IDIFFERENCE - LEFT X1] - (T (IDIFFERENCE Y1 (\LEASTPTAT DY DX (IDIFFERENCE - LEFT X1] - (SETQ CX1 LEFT))) - (SETQ CA1 (\CLIPCODE CX1 CY1 LEFT RIGHT TOP BOTTOM))) - (T (* ; - "now move point CX2 CY2 so that one of the coordinates is on one of the boundaries") - (COND - ((IGREATERP CA2 7) (* ; "y2 less than bottom") - [SETQ CX2 (IPLUS X1 (\GREATESTPTAT DX DY (IDIFFERENCE Y1 BOTTOM] - (SETQ CY2 BOTTOM)) - ((IGREATERP CA2 3) (* ; "y2 is greater than top") - [SETQ CX2 (IPLUS X1 (\GREATESTPTAT DX DY (IDIFFERENCE TOP Y1] - (SETQ CY2 TOP)) - (T (* ; "x2 is greater than right") - [SETQ CY2 (COND - [YMOVEUP (IPLUS Y1 (\GREATESTPTAT DY DX - (IDIFFERENCE RIGHT X1] - (T (IDIFFERENCE Y1 (\GREATESTPTAT DY DX - (IDIFFERENCE RIGHT X1] - (SETQ CX2 RIGHT))) - (SETQ CA2 (\CLIPCODE CX2 CY2 LEFT RIGHT TOP BOTTOM] - (GO CLIPLP]) - -(\CLIPCODE - [LAMBDA (X Y LEFT RIGHT TOP BOTTOM) (* rrb " 4-DEC-80 10:34") - - (* ;; "determines the sector code for a point wrt a region. Used to clip things quickly.") - - (* ;; "RIGHT and TOP are one past the region.") - - (COND - ((LESSP X LEFT) (* ; "falls to left of region") - (COND - ((GREATERP Y TOP) (* ; "left above") - 5) - ((LESSP Y BOTTOM) (* ; "left below") - 9) - (T (* ; "left inside") - 1))) - ((GREATERP X RIGHT) (* ; "right") - (COND - ((GREATERP Y TOP) (* ; "right above") - 6) - ((LESSP Y BOTTOM) (* ; "right below") - 10) - (T (* ; "right inside") - 2))) - ((GREATERP Y TOP) (* ; "inside top") - 4) - ((LESSP Y BOTTOM) (* ; "inside below") - 8) - (T (* ; "inside 0") - 0]) - -(\LEASTPTAT - [LAMBDA (DA DB THISB) (* rrb " 7-JAN-82 11:56") - - (* ;; "determines the smallest value in the dimension A that would give a B coordinate of THISB if a line were drawn from the point (0,0) with a slope of DA/DB.") - - (COND - ((IGREATERP DA DB) - (ADD1 (IQUOTIENT (IPLUS (IDIFFERENCE (ITIMES THISB DA) - (HALF DA)) - -1) - DB))) - (T (IQUOTIENT (IPLUS (ITIMES THISB DA) - (HALF DB)) - DB]) - -(\GREATESTPTAT - [LAMBDA (DA DB THISB) (* rrb " 7-JAN-82 14:24") - - (* ;; "determines the largest value in the dimension A that would give a B coordinate of THISB if a line were drawn from the point (0,0) with a slope of DA/DB.") - - (COND - ((IGREATERP DA DB) - (IQUOTIENT (IPLUS (IDIFFERENCE (ITIMES (ADD1 THISB) - DA) - (HALF DA)) - -1) - DB)) - (T (IQUOTIENT (IPLUS (ITIMES THISB DA) - (HALF DB)) - DB]) - -(\DRAWLINE1 - [LAMBDA (X0 Y0 XLIMIT YLIMIT DX DY CDL YINC MODE BITMAPBASE RASTERWIDTH) - (* mpl " 2-Jan-84 18:00") - - (* ;; "this was changed to interface with the opcode for line drawing. It probably be incorporated into the places it is called.") - - (* ;; "draws a line starting at X0,Y0 at a slope of DX/DY until reaching either XLIMIT or YLIMIT with an initial overflow bucket size of CDL in MODE. Arranged so that the clipping routines can determine what the exact location of the end point of the clipped line is wrt line drawing coordinates eg. amount in overflow bucket. XLIMIT and YLIMIT are the number of points to be moved in that direction.") - - (\DRAWLINE.UFN (\ADDBASE BITMAPBASE (IPLUS (ITIMES Y0 RASTERWIDTH) - (FOLDLO X0 BITSPERWORD))) - (LOGAND X0 15) - DX YINC DY (SELECTQ MODE - (INVERT 2) - (ERASE 1) - 0) - CDL - (ADD1 XLIMIT) - (ADD1 YLIMIT]) - -(\DRAWLINE.UFN - [LAMBDA (FIRSTADDR FIRSTBIT XDELTA YINCR YDELTA OPERATIONCODE INITIALBUCKET PIXELSINX PIXELSINY) - (* jds " 6-Jan-86 11:27") - - (* ;; "FIRSTADDR is the address of the word which contains the first point. FIRSTBIT is the address of the first bit in FIRSTADDR. XDELTA and YDELTA are how far the complete line has to move in X and Y respectively; both are positive quantities. YINCR is the amount the address should be incremented if the Y coordinate changes and can be either positive or negative. OPERATIONCODE is 0 for REPLACE, 1 for ERASE and 2 for INVERT. INITIALBUCKET is between 0 and the maximum of DX and DY and gives the starting amount of the bucket used to determine when to increment in the slower moving direction. PIXELSINX and PIXELSINY indicates how many pixels should be drawn in the X and Y direction.") - - (DECLARE (LOCALVARS . T)) - (PROG ((MASK (\BITMASK FIRSTBIT))) - (COND - [(IGEQ XDELTA YDELTA) (* ; "X is the fastest mover.") - (SELECTQ OPERATIONCODE - (0 (.DRAWLINEX. 'REPLACE/PAINT)) - (1 (.DRAWLINEX. 'ERASE)) - (.DRAWLINEX. 'INVERT] - (T (* ; "Y is the fastest mover.") - (SELECTQ OPERATIONCODE - (0 (.DRAWLINEY. 'REPLACE/PAINT)) - (1 (.DRAWLINEY. 'ERASE)) - (.DRAWLINEY. 'INVERT]) -) -(DECLARE%: DONTCOPY -(DECLARE%: EVAL@COMPILE - -(PUTPROPS .DRAWLINEX. MACRO [(MODE) - (bind (NY _ 0) for PT from 1 to PIXELSINX - do (* ; "main loop") - [replace (BITMAPWORD BITS) of FIRSTADDR - with (SELECTQ MODE - (INVERT (LOGXOR MASK - (fetch (BITMAPWORD - BITS) - of FIRSTADDR))) - (ERASE (LOGAND (LOGXOR MASK WORDMASK) - (fetch (BITMAPWORD - BITS) - of FIRSTADDR))) - (PROGN - (* ; - "case is PAINT or REPLACE. Legality of OPERATION has been checked by \CLIPANDDRAWLINE1") - (LOGOR MASK (fetch - (BITMAPWORD BITS) - of FIRSTADDR] - [COND - ([NOT (IGREATERP XDELTA (SETQ INITIALBUCKET - (IPLUS INITIALBUCKET YDELTA - ] - (* ; "increment in the Y direction") - (COND - ((EQ (SETQ NY (ADD1 NY)) - PIXELSINY) - (RETURN))) - (SETQ INITIALBUCKET (IDIFFERENCE INITIALBUCKET - XDELTA)) - (SETQ FIRSTADDR (\ADDBASE FIRSTADDR YINCR] - (SETQ MASK (LRSH MASK 1)) - (COND - ((EQ 0 MASK)(* ; "crossed word boundary") - (SETQ FIRSTADDR (\ADDBASE FIRSTADDR 1)) - (SETQ MASK 32768]) - -(PUTPROPS .DRAWLINEY. MACRO [(MODE) - (bind (NX _ 0) for PT from 1 to PIXELSINY - do (* ; "main loop") - [replace (BITMAPWORD BITS) of FIRSTADDR - with (SELECTQ MODE - (INVERT (LOGXOR MASK - (fetch (BITMAPWORD - BITS) - of FIRSTADDR))) - (ERASE (LOGAND (LOGXOR MASK WORDMASK) - (fetch (BITMAPWORD - BITS) - of FIRSTADDR))) - (PROGN - (* ; - "case is PAINT or REPLACE. Legality of OPERATION has been checked by \CLIPANDDRAWLINE1") - (LOGOR MASK (fetch - (BITMAPWORD BITS) - of FIRSTADDR] - [COND - ([NOT (IGREATERP YDELTA (SETQ INITIALBUCKET - (IPLUS INITIALBUCKET XDELTA - ] - (COND - ((EQ (SETQ NX (ADD1 NX)) - PIXELSINX) - (RETURN))) - (SETQ INITIALBUCKET (IDIFFERENCE INITIALBUCKET - YDELTA)) - (SETQ MASK (LRSH MASK 1)) - (COND - ((EQ 0 MASK) - (* ; "crossed word boundary") - (SETQ FIRSTADDR (\ADDBASE FIRSTADDR 1)) - (SETQ MASK 32768] - (SETQ FIRSTADDR (\ADDBASE FIRSTADDR YINCR]) -) -) - - - -(* ; "Curves") - -(DEFINEQ - -(\DRAWCIRCLE.DISPLAY - [LAMBDA (DISPLAYSTREAM CENTERX CENTERY RADIUS BRUSH DASHING) - (* kbr%: "15-Feb-86 22:24") - - (* ;; -"\DRAWCIRCLE.DISPLAY extended for color. Color is specified by either BRUSH or the DSPCOLOR of DS.") - - (DECLARE (LOCALVARS . T)) - (COND - ((OR (NOT (NUMBERP RADIUS)) - (ILESSP (SETQ RADIUS (FIXR RADIUS)) - 0)) - (\ILLEGAL.ARG RADIUS)) - ((EQ RADIUS 0) (* ; "don't draw anything.") - NIL) - (DASHING (* ; - "draw it with the arc drawing code which does dashing. Slow but effective.") - - (* ;; "the CDR removes the first point to work around a bug in curve drawing when closed and first and last points the same. AR 4623.0") - - (DRAWCURVE (CDR (\COMPUTE.ARC.POINTS CENTERX CENTERY RADIUS 0 360)) - T BRUSH DASHING DISPLAYSTREAM)) - (T (GLOBALRESOURCE \BRUSHBBT - (PROG (X Y D DestinationBitMap LEFT RIGHTPLUS1 TOP BOTTOM BRUSHWIDTH BRUSHHEIGHT - LEFTMINUSBRUSH BOTTOMMINUSBRUSH TOPMINUSBRUSH BRUSHBM DESTINATIONBASE - BRUSHBASE RASTERWIDTH BRUSHRASTERWIDTH NBITSRIGHTPLUS1 OPERATION - HEIGHTMINUS1 CX CY BBT COLOR COLORBRUSHBASE NBITS DISPLAYDATA USERFN) - (SETQ X 0) - (SETQ Y RADIUS) - (SETQ D (ITIMES 2 (IDIFFERENCE 1 RADIUS))) - (SETQ BBT \BRUSHBBT) - (SETQ DISPLAYDATA (fetch (STREAM IMAGEDATA) of DISPLAYSTREAM)) - (SETQ USERFN (AND (LITATOM BRUSH) - BRUSH)) - - (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") - - (COND - (USERFN (* ; - "if calling user fn, don't bother with set up and leave points in stream coordinates.") - (SETQ CX CENTERX) - (SETQ CY CENTERY)) - (T (.SETUP.FOR.\BBTCURVEPT.) - (SELECTQ NBITS - (1 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX (FOLDLO BRUSHWIDTH - 2)) - DISPLAYDATA))) - (4 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX - (FOLDLO (LRSH BRUSHWIDTH 2) - 2)) - DISPLAYDATA))) - (8 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX - (FOLDLO (LRSH BRUSHWIDTH 3) - 2)) - DISPLAYDATA))) - (24 (* ; - "I doubt that this will be right.") - (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX - (FOLDLO (IQUOTIENT BRUSHWIDTH 24 - ) - 2)) - DISPLAYDATA))) - (SHOULDNT)) (* ; - "take into account the brush thickness.") - (SETQ CY (\DSPTRANSFORMY (IDIFFERENCE CENTERY (FOLDLO BRUSHHEIGHT 2)) - DISPLAYDATA)) - - (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") - - (\INSURETOPWDS DISPLAYSTREAM))) - [COND - ((EQ RADIUS 1) (* ; "put a single brush down.") - (* ; - "draw the top and bottom most points.") - [COND - (USERFN (APPLY* USERFN CX CY DISPLAYSTREAM)) - (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT CX CY] - (RETURN)) - (T (* ; - "draw the top and bottom most points.") - (COND - (USERFN (APPLY* USERFN CX (IPLUS CY RADIUS) - DISPLAYSTREAM) - (APPLY* USERFN CX (IDIFFERENCE CY RADIUS) - DISPLAYSTREAM)) - (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT CX (IPLUS CY RADIUS)) - (\CURVEPT CX (IDIFFERENCE CY RADIUS] - LP (* ; - "(UNFOLD x 2) is used instead of (ITIMES x 2)") - [COND - [(IGREATERP 0 D) - (SETQ X (ADD1 X)) - (COND - ((IGREATERP (UNFOLD (IPLUS D Y) - 2) - 1) - (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) - 2) - 4)) - (SETQ Y (SUB1 Y))) - (T (SETQ D (IPLUS D (UNFOLD X 2) - 1] - ((OR (EQ 0 D) - (IGREATERP X D)) - (SETQ X (ADD1 X)) - (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) - 2) - 4)) - (SETQ Y (SUB1 Y))) - (T (SETQ D (IPLUS (IDIFFERENCE D (UNFOLD Y 2)) - 3)) - (SETQ Y (SUB1 Y] - (COND - [(EQ Y 0) - - (* ;; "left most and right most points are drawn specially so that they are not duplicated which leaves a hole in XOR mode.") - - (COND - (USERFN (APPLY* USERFN (IPLUS CX X) - CY DISPLAYSTREAM) - (APPLY* USERFN (IDIFFERENCE CX X) - CY DISPLAYSTREAM)) - (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT (IPLUS CX X) - CY) - (\CURVEPT (IDIFFERENCE CX X) - CY] - (T [COND - (USERFN (APPLY* USERFN (IPLUS CX X) - (IPLUS CY Y) - DISPLAYSTREAM) - (APPLY* USERFN (IDIFFERENCE CX X) - (IPLUS CY Y) - DISPLAYSTREAM) - (APPLY* USERFN (IPLUS CX X) - (IDIFFERENCE CY Y) - DISPLAYSTREAM) - (APPLY* USERFN (IDIFFERENCE CX X) - (IDIFFERENCE CY Y) - DISPLAYSTREAM)) - (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CIRCLEPTS CX CY X Y] - (GO LP))) - (MOVETO CENTERX CENTERY DISPLAYSTREAM) - (RETURN NIL]) - -(\DRAWARC.DISPLAY - [LAMBDA (STREAM CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING) - (* ; "draws an arc on the display") - (\DRAWARC.GENERIC STREAM CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING]) - -(\DRAWARC.GENERIC - [LAMBDA (STREAM CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING) - (* rrb " 4-Oct-85 18:23") - (* ; - "draws an arc by drawing a curve.") - (COND - ((AND (GREATERP 360 NDEGREES) - (LESSP -360 NDEGREES)) - (DRAWCURVE (\COMPUTE.ARC.POINTS CENTERX CENTERY RADIUS STARTANGLE NDEGREES) - NIL BRUSH DASHING STREAM)) - (T (* ; - "use circle drawing which could be faster") - (DRAWCIRCLE CENTERX CENTERY RADIUS BRUSH DASHING STREAM]) - -(\COMPUTE.ARC.POINTS - [LAMBDA (CENTERX CENTERY RADIUS STARTANGLE NDEGREES) (* DECLARATIONS%: FLOATING) - (* rrb "30-Oct-85 11:48") - - (* ;; "computes a list of knots that a spline goes through to make an arc") - - (PROG ((ANGLESIZE (COND - ((OR (GREATERP NDEGREES 360.0) - (GREATERP -360.0 NDEGREES)) - 360.0) - (T NDEGREES))) - ANGLEINCR) - - (* ;; "calculate an increment close to 10.0 that is exact but always have at least 5 knots and don't have more than a knot every 5 pts") - - [SETQ ANGLEINCR (FQUOTIENT ANGLESIZE - (IMIN (IMAX (ABS (FIX (FQUOTIENT ANGLESIZE 10.0))) - 5) - (PROGN (* ; - "don't have more than a knot every 5 pts") - (IMAX (ABS (FIX (QUOTIENT (TIMES RADIUS 6.3 - (QUOTIENT ANGLESIZE - 360.0)) - 4))) - 3] - - (* ;; "go from initial point to just past the last point. The just past (PLUS BETA (QUOTIENT ANGLEINCR 5.0)) picks up the case where the floating pt rounding error accumulates to be greater than the last point when it is very close to it.") - - (RETURN (for ANGLE from STARTANGLE to (PLUS STARTANGLE ANGLESIZE - (QUOTIENT ANGLEINCR 5.0)) - by ANGLEINCR collect (create POSITION - XCOORD _ [FIXR (PLUS CENTERX - (TIMES RADIUS - (COS ANGLE] - YCOORD _ (FIXR (PLUS CENTERY - (TIMES RADIUS - (SIN ANGLE]) - -(\DRAWELLIPSE.DISPLAY - [LAMBDA (DISPLAYSTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) - (* ; "Edited 12-Apr-88 23:58 by FS") - (DECLARE (LOCALVARS . T)) - - (* ;; "Draws an ellipse. At ORIENTATION 0, the semimajor axis is horizontal, the semiminor axis vertical. Orientation is positive in the counterclockwise direction. The current location in the stream is left at the center of the ellipse.") - - (PROG ((CENTERX (FIXR CENTERX)) - (CENTERY (FIXR CENTERY)) - (SEMIMINORRADIUS (FIXR SEMIMINORRADIUS)) - (SEMIMAJORRADIUS (FIXR SEMIMAJORRADIUS))) - (COND - ((OR (EQ 0 SEMIMINORRADIUS) - (EQ 0 SEMIMAJORRADIUS)) - (MOVETO CENTERX CENTERY DISPLAYSTREAM) - (RETURN))) - (COND - ((ILESSP SEMIMINORRADIUS 1) - (\ILLEGAL.ARG SEMIMINORRADIUS)) - ((ILESSP SEMIMAJORRADIUS 1) - (\ILLEGAL.ARG SEMIMAJORRADIUS)) - ((OR (NULL ORIENTATION) - (EQ SEMIMINORRADIUS SEMIMAJORRADIUS)) - (SETQ ORIENTATION 0)) - ((NULL (NUMBERP ORIENTATION)) - (\ILLEGAL.ARG ORIENTATION))) - - (* ;; "If dashing, draw it with the curve drawing code which can do dashing") - - (COND - (DASHING (\DRAWELLIPSE.GENERIC DISPLAYSTREAM CENTERX CENTERY SEMIMINORRADIUS - SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) - (RETURN))) - - (* ;; "If degenerate ellipse, attempt circumvention of Pitteway breakdown by trying spline code instead, which appears more numerically stable (see AR6502)") - - (COND - ((< 40 (/ SEMIMAJORRADIUS SEMIMINORRADIUS)) - (\DRAWELLIPSE.GENERIC DISPLAYSTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS - ORIENTATION BRUSH DASHING) - (RETURN))) - -(* ;;; "This function is the implementation of the algorithm given in 'Algorithm for drawing ellipses or hyperbolae with a digital plotter' by Pitteway appearing in Computer Journal 10: (3) Nov 1967.0 The input parameters are used to determine the ellipse equation (1/8) Ayy+ (1/8) Bxx+ (1/4) Gxy+ (1/4) Ux+ (1/4) Vy= (1/4) K which specifies a translated version of the desired ellipse. This ellipse passes through the mesh point (0,0), the initial point of the algorithm. The power of 2 factors reflect an implementation convenience.") - - (GLOBALRESOURCE \BRUSHBBT - (PROG (DestinationBitMap LEFT RIGHTPLUS1 BOTTOM TOP BOTTOMMINUSBRUSH TOPMINUSBRUSH - LEFTMINUSBRUSH DESTINATIONBASE BRUSHBASE BRUSHHEIGHT BRUSHWIDTH - RASTERWIDTH BRUSHRASTERWIDTH BRUSHBM OPERATION HEIGHTMINUS1 - (BBT \BRUSHBBT) - (cosOrientation (COS ORIENTATION)) - (sinOrientation (SIN ORIENTATION)) - (SEMIMINORRADIUSSQUARED (ITIMES SEMIMINORRADIUS SEMIMINORRADIUS)) - (SEMIMAJORRADIUSSQUARED (ITIMES SEMIMAJORRADIUS SEMIMAJORRADIUS)) - (x 0) - (y 0) - (x2 1) - x1 y1 y2 k1 k2 k3 a b d w A B G U V K CX CY yOffset CYPlusOffset - CYMinusOffset NBITSRIGHTPLUS1 COLORBRUSHBASE COLOR NBITS - (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM)) - (USERFN (AND (LITATOM BRUSH) - BRUSH))) - - (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") - - (COND - (USERFN (* ; - "if calling user fn, don't bother with set up and leave points in window coordinates.") - (SETQ CX CENTERX) - (SETQ CY CENTERY)) - (T (.SETUP.FOR.\BBTCURVEPT.) (* ; - "take into account the brush thickness.") - (SELECTQ NBITS - (1 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX (FOLDLO BRUSHWIDTH - 2)) - DISPLAYDATA))) - (4 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX - (FOLDLO (LRSH BRUSHWIDTH 2) - 2)) - DISPLAYDATA))) - (8 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX - (FOLDLO (LRSH BRUSHWIDTH 3) - 2)) - DISPLAYDATA))) - (SHOULDNT)) - (SETQ CY (\DSPTRANSFORMY (IDIFFERENCE CENTERY (FOLDLO BRUSHHEIGHT 2)) - DISPLAYDATA)) - - (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") - - (\INSURETOPWDS DISPLAYSTREAM))) - (SETQ A (FPLUS (FTIMES SEMIMAJORRADIUSSQUARED cosOrientation cosOrientation) - (FTIMES SEMIMINORRADIUSSQUARED sinOrientation sinOrientation))) - (SETQ B (LSH (FIXR (FPLUS (FTIMES SEMIMINORRADIUSSQUARED cosOrientation - cosOrientation) - (FTIMES SEMIMAJORRADIUSSQUARED sinOrientation - sinOrientation))) - 3)) - (SETQ G (FTIMES cosOrientation sinOrientation (LSH (IDIFFERENCE - SEMIMINORRADIUSSQUARED - - SEMIMAJORRADIUSSQUARED - ) - 1))) - [SETQ yOffset (FIXR (FQUOTIENT (ITIMES SEMIMINORRADIUS SEMIMAJORRADIUS) - (SQRT A] - (SETQ CYPlusOffset (IPLUS CY yOffset)) - (SETQ CYMinusOffset (IDIFFERENCE CY yOffset)) - (SETQ U (LSH (FIXR (FTIMES A (LSH yOffset 1))) - 2)) - (SETQ V (LSH (FIXR (FTIMES G yOffset)) - 2)) - (SETQ K (LSH [FIXR (FDIFFERENCE (ITIMES SEMIMINORRADIUSSQUARED - SEMIMAJORRADIUSSQUARED) - (FTIMES A (ITIMES yOffset yOffset] - 2)) - (SETQ A (LSH (FIXR A) - 3)) - (SETQ G (LSH (FIXR G) - 2)) - - (* ;; "The algorithm is incremental and iterates through the octants of a cartesian plane. The octants are labeled from 1 through 8 beginning above the positive X axis and proceeding counterclockwise. Decisions in making the incremental steps are determined according to the error term d which is updated according to the curvature terms a and b. k1, k2, and k3 are used to correct the error and curvature terms at octant boundaries. The initial values of these terms depends on the octant in which drawing begins. The initial move steps (x1,y1) and (x2,y2) also depend on the starting octant.") - - [COND - [(ILESSP (ABS U) - (ABS V)) - (SETQ x1 0) - (COND - [(MINUSP V) (* ; "start in octant 2") - (SETQ y1 1) - (SETQ y2 1) - (SETQ k1 (IMINUS A)) - (SETQ k2 (IDIFFERENCE k1 G)) - (SETQ k3 (IDIFFERENCE k2 (IPLUS B G))) - (SETQ b (IPLUS U (RSH (IPLUS A G) - 1))) - (SETQ a (IMINUS (IPLUS b V))) - (SETQ d (IPLUS b (RSH B 3) - (RSH V 1) - (IMINUS K] - (T (* ; "start in octant 7") - (SETQ y1 -1) - (SETQ y2 -1) - (SETQ k1 A) - (SETQ k2 (IDIFFERENCE k1 G)) - (SETQ k3 (IPLUS k2 B (IMINUS G))) - (SETQ b (IPLUS U (RSH (IDIFFERENCE G A) - 1))) - (SETQ a (IDIFFERENCE V b)) - (SETQ d (IPLUS b K (IMINUS (IPLUS (RSH V 1) - (RSH B 3] - (T (SETQ x1 1) - (SETQ y1 0) - (COND - [(MINUSP V) (* ; "start in octant 1") - (SETQ y2 1) - (SETQ k1 B) - (SETQ k2 (IPLUS k1 G)) - (SETQ k3 (IPLUS k2 A G)) - [SETQ b (IMINUS (IPLUS V (RSH (IPLUS B G) - 1] - (SETQ a (IDIFFERENCE U b)) - (SETQ d (IPLUS b K (IMINUS (IPLUS (RSH A 3) - (RSH U 1] - (T (* ; "start in octant 8") - (SETQ y2 -1) - (SETQ k1 (IMINUS B)) - (SETQ k2 (IPLUS k1 G)) - (SETQ k3 (IPLUS k2 G (IMINUS A))) - (SETQ b (IPLUS V (RSH (IDIFFERENCE B G) - 1))) - (SETQ a (IDIFFERENCE U b)) - (SETQ d (IPLUS b (RSH A 3) - (IMINUS (IPLUS K (RSH U 1] - - (* ;; "The ellipse equation describes an ellipse of the desired size and ORIENTATION centered at (0,0) and then dropped yOffset mesh points so that it will pass through (0,0). Thus, the intended starting point is (CX, CY+yOffset) where (CX, CY) is the center of the desired ellipse. Drawing is accomplished with point relative steps. In each octant, the error term d is used to choose between move 1 (an axis move) and move 2 (a diagonal move).") - - MOVE - [COND - ((MINUSP d) (* ; "move 1") - (SETQ x (IPLUS x x1)) - (SETQ y (IPLUS y y1)) - (SETQ b (IDIFFERENCE b k1)) - (SETQ a (IPLUS a k2)) - (SETQ d (IPLUS b d))) - (T (* ; "move 2") - (SETQ x (IPLUS x x2)) - (SETQ y (IPLUS y y2)) - (SETQ b (IDIFFERENCE b k2)) - (SETQ a (IPLUS a k3)) - (SETQ d (IDIFFERENCE d a] - (COND - ((MINUSP x) - (MOVETO CENTERX CENTERY DISPLAYSTREAM) - (RETURN NIL))) - [COND - (USERFN (APPLY* USERFN (IPLUS CX x) - (IPLUS CYPlusOffset y) - DISPLAYSTREAM) - (APPLY* USERFN (IDIFFERENCE CX x) - (IDIFFERENCE CYMinusOffset y) - DISPLAYSTREAM)) - (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT (IPLUS CX x) - (IPLUS CYPlusOffset y)) - (\CURVEPT (IDIFFERENCE CX x) - (IDIFFERENCE CYMinusOffset y] - (AND (MINUSP b) - (GO SQUARE)) - DIAGONAL - (OR (MINUSP a) - (GO MOVE)) (* ; "diagonal octant change") - (SETQ x1 (IDIFFERENCE x2 x1)) - (SETQ y1 (IDIFFERENCE y2 y1)) - (SETQ w (IDIFFERENCE (LSH k2 1) - k3)) - (SETQ k1 (IDIFFERENCE w k1)) - (SETQ k2 (IDIFFERENCE k2 k3)) - (SETQ k3 (IMINUS k3)) - [SETQ b (IPLUS b a (IMINUS (RSH (ADD1 k2) - 1] - [SETQ d (IPLUS b (RSH (IPLUS k3 4) - 3) - (IMINUS d) - (IMINUS (RSH (ADD1 a) - 1] - (SETQ a (IDIFFERENCE (RSH (ADD1 w) - 1) - a)) - (OR (MINUSP b) - (GO MOVE)) - SQUARE - (* ; "square octant change") - [COND - ((EQ 0 x1) - (SETQ x2 (IMINUS x2))) - (T (SETQ y2 (IMINUS y2] - (SETQ w (IDIFFERENCE k2 k1)) - (SETQ k1 (IMINUS k1)) - (SETQ k2 (IPLUS w k1)) - (SETQ k3 (IDIFFERENCE (LSH w 2) - k3)) - (SETQ b (IDIFFERENCE (IMINUS b) - w)) - (SETQ d (IDIFFERENCE (IDIFFERENCE b a) - d)) - (SETQ a (IDIFFERENCE (IDIFFERENCE a w) - (LSH b 1))) - (GO DIAGONAL]) - -(\DRAWCURVE.DISPLAY - [LAMBDA (DISPLAYSTREAM KNOTS CLOSED BRUSH DASHING) (* ; "Edited 9-Jan-87 16:49 by rrb") - - (* ;; "draws a spline curve with a given brush.") - - (GLOBALRESOURCE \BRUSHBBT (PROG ((BBT \BRUSHBBT) - (DASHLST (\GOOD.DASHLST DASHING BRUSH))) - (SELECTQ (LENGTH KNOTS) - (0 (* ; - "No knots => empty curve rather than error?") - NIL) - (1 (* ; - "only one knot, put down a brush shape") - (OR (type? POSITION (CAR KNOTS)) - (ERROR "bad knot" (CAR KNOTS))) - (\DRAWPOINT.DISPLAY DISPLAYSTREAM (fetch XCOORD - of - (CAR KNOTS)) - (fetch YCOORD of (CAR KNOTS)) - BRUSH)) - (2 (OR (type? POSITION (CAR KNOTS)) - (ERROR "bad knot" (CAR KNOTS))) - (OR (type? POSITION (CADR KNOTS)) - (ERROR "bad knot" (CADR KNOTS))) - (\LINEWITHBRUSH (fetch XCOORD of (CAR KNOTS)) - (fetch YCOORD of (CAR KNOTS)) - (fetch XCOORD of (CADR KNOTS)) - (fetch YCOORD of (CADR KNOTS)) - BRUSH DASHLST DISPLAYSTREAM BBT)) - (\CURVE2 (PARAMETRICSPLINE KNOTS CLOSED) - BRUSH DASHLST BBT DISPLAYSTREAM)) - (RETURN DISPLAYSTREAM]) - -(\DRAWPOINT.DISPLAY - [LAMBDA (DISPLAYSTREAM X Y BRUSH OPERATION) (* rrb "17-Sep-86 17:51") - - (* ;; "draws a brush point at position X Y") - - (* ;; "this is used in 4, 8, and 24 bit per pixel bitmaps as well. For these, it may be should call BITMAPWIDTH instead of fetching.") - - (PROG ((BRUSHBM (\GETBRUSH BRUSH))) (* ; - "SUB1 is to put extra bit of even brush on the top or left.") - (RETURN (BITBLT BRUSHBM 0 0 DISPLAYSTREAM [IDIFFERENCE X (HALF (SUB1 (fetch - (BITMAP BITMAPWIDTH) - of BRUSHBM] - [IDIFFERENCE Y (HALF (SUB1 (fetch (BITMAP BITMAPHEIGHT) of BRUSHBM] - NIL NIL NIL (SELECTQ (OR OPERATION (DSPOPERATION NIL DISPLAYSTREAM)) - (REPLACE 'PAINT) - OPERATION]) - -(\DRAWPOLYGON.DISPLAY - [LAMBDA (STREAM POINTS CLOSED BRUSH DASHING) (* ; "Edited 13-Apr-88 14:14 by FS") - - (* ;; "Somewhat less generic version of drawpolygon that calls \drawline.display. Brush must be a brush (guaranteed in DRAWPOLYGON) other users must also ensure.") - - (* ;; "This is different than drawline.generic, because drawline.display will use width argument instead of bltting brushes around. That way you can get shades, dspoperation, eventually.") - - (PROG [COLOR (PTBRUSH (COND - ((EQ (fetch (BRUSH BRUSHSHAPE) of BRUSH) - 'ROUND) - BRUSH) - (T (create BRUSH using BRUSH BRUSHSHAPE _ 'ROUND] - (SETQ COLOR (fetch (BRUSH BRUSHCOLOR) of PTBRUSH)) - (for PTAIL on POINTS while (CDR PTAIL) do (\DRAWLINE.DISPLAY - STREAM - (fetch (POSITION XCOORD) - of (CAR PTAIL)) - (ffetch (POSITION YCOORD) - of (CAR PTAIL)) - (fetch (POSITION XCOORD) - of (CADR PTAIL)) - (ffetch (POSITION YCOORD) - of (CADR PTAIL)) - (fetch (BRUSH BRUSHSIZE) - of BRUSH) - NIL COLOR DASHING) - (* ; - "put a brush between lines so it looks better. It's not mitered this way but better than not.") - (\DRAWPOINT.DISPLAY - STREAM - (fetch (POSITION XCOORD) - of (CADR POINTS)) - (fetch (POSITION YCOORD) - of (CADR POINTS)) - PTBRUSH - 'NIL) - finally (COND - ((AND CLOSED (CDDR POINTS)) (* ; "draw the closing line.") - (\DRAWLINE.DISPLAY STREAM (fetch (POSITION XCOORD) - of (CAR PTAIL)) - (ffetch (POSITION YCOORD) of (CAR PTAIL)) - (fetch (POSITION XCOORD) of (CAR POINTS)) - (ffetch (POSITION YCOORD) of (CAR POINTS)) - (fetch (BRUSH BRUSHSIZE) of BRUSH) - NIL COLOR DASHING))) - (OR (NULL (CDR POINTS)) - (\DRAWPOINT.DISPLAY STREAM (fetch (POSITION XCOORD) - of (CAR POINTS)) - (fetch (POSITION YCOORD) of (CAR POINTS)) - PTBRUSH NIL]) - -(\LINEWITHBRUSH - [LAMBDA (X1 Y1 X2 Y2 BRUSH DASHLST DISPLAYSTREAM BBT OPERATION) - (* ; "Edited 29-Oct-87 17:40 by scp") - - (* ;; "draws a line with a brush on a guaranteed display-stream DISPLAYSTREAM") - - (DECLARE (LOCALVARS . T)) - (PROG (DestinationBitMap LEFT RIGHTPLUS1 TOP BOTTOM BRUSHWIDTH BRUSHHEIGHT LEFTMINUSBRUSH - BOTTOMMINUSBRUSH TOPMINUSBRUSH BRUSHBM DESTINATIONBASE BRUSHBASE RASTERWIDTH - BRUSHRASTERWIDTH NBITSRIGHTPLUS1 HEIGHTMINUS1 COLOR COLORBRUSHBASE NBITS - HALFBRUSHWIDTH HALFBRUSHHEIGHT DX DY YINC CDL (DASHON T) - (DASHTAIL DASHLST) - (DASHCNT (CAR DASHLST)) - (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM)) - (USERFN (AND (LITATOM BRUSH) - BRUSH)) - (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM))) - - (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") - (* ; - "move the display stream position before the coordinates are clobbered.") - (COND - ((NOT USERFN) - (.SETUP.FOR.\BBTCURVEPT.) - (SELECTQ NBITS - (1 (* ; - "SUB1 is so that the extra bit goes on the top and right as it is documented as doing for lines.") - (SETQ X1 (\DSPTRANSFORMX (IDIFFERENCE X1 (SETQ HALFBRUSHWIDTH - (FOLDLO (SUB1 BRUSHWIDTH) - 2))) - DISPLAYDATA))) - (4 (SETQ X1 (\DSPTRANSFORMX (IDIFFERENCE X1 (SETQ HALFBRUSHWIDTH - (FOLDLO (LRSH (SUB1 BRUSHWIDTH) - 2) - 2))) - DISPLAYDATA))) - (8 (SETQ X1 (\DSPTRANSFORMX (IDIFFERENCE X1 (SETQ HALFBRUSHWIDTH - (FOLDLO (LRSH (SUB1 BRUSHWIDTH) - 3) - 2))) - DISPLAYDATA))) - (SHOULDNT)) - (SETQ X2 (\DSPTRANSFORMX (IDIFFERENCE X2 HALFBRUSHWIDTH) - DISPLAYDATA)) - (SETQ Y1 (\DSPTRANSFORMY (IDIFFERENCE Y1 (SETQ HALFBRUSHHEIGHT (FOLDLO (SUB1 - BRUSHHEIGHT - ) - 2))) - DISPLAYDATA)) (* ; - "take into account the brush thickness.") - (SETQ Y2 (\DSPTRANSFORMY (IDIFFERENCE Y2 HALFBRUSHHEIGHT) - DISPLAYDATA)) - - (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") - - (\INSURETOPWDS DISPLAYSTREAM))) (* ; - "arrange things so that dx is positive.") - (COND - ((IGREATERP X1 X2) (* ; "switch points") - (swap X1 X2) - (swap Y1 Y2))) - (SETQ DX (ADD1 (IDIFFERENCE X2 X1))) - [SETQ DY (ADD1 (COND - ((IGREATERP Y2 Y1) - (SETQ YINC 1) - (IDIFFERENCE Y2 Y1)) - (T (SETQ YINC -1) - (IDIFFERENCE Y1 Y2] - [SETQ CDL (HALF (COND - ((IGREATERP DX DY) (* ; - "set up the bucket so that the ends will be the same.") - (IREMAINDER DX DY)) - (T (IREMAINDER DY DX] - [COND - [USERFN (* ; - "if user function is being called, don't bother bringing window to top uninterruptably.") - (COND - ((IGEQ DX DY) (* ; "X is the fastest mover.") - (until (IGREATERP X1 X2) - do (* ; "main loop") - (COND - (DASHON (APPLY* USERFN X1 Y1 DISPLAYSTREAM))) - [COND - (DASHTAIL (* ; "do dashing.") - (COND - ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) - (SETQ DASHON (NOT DASHON)) - (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) - DASHLST)) - (SETQ DASHCNT (CAR DASHTAIL] - [COND - ((NOT (IGREATERP DX (add CDL DY))) - (add Y1 YINC) - (COND - ((COND - ((EQ YINC -1) - (ILESSP Y1 Y2)) - ((IGREATERP Y1 Y2))) - (RETURN))) - (SETQ CDL (IDIFFERENCE CDL DX] - (add X1 1))) - (T (* ; "Y is the fastest mover.") - (until (COND - ((EQ YINC -1) - (ILESSP Y1 Y2)) - ((IGREATERP Y1 Y2))) - do (* ; "main loop") - (COND - (DASHON (APPLY* USERFN X1 Y1 DISPLAYSTREAM))) - [COND - (DASHTAIL (* ; "do dashing.") - (COND - ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) - (SETQ DASHON (NOT DASHON)) - (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) - DASHLST)) - (SETQ DASHCNT (CAR DASHTAIL] - [COND - ([NOT (IGREATERP DY (SETQ CDL (IPLUS CDL DX] - (COND - ((IGREATERP (SETQ X1 (ADD1 X1)) - X2) - (RETURN))) - (SETQ CDL (IDIFFERENCE CDL DY] - (add Y1 YINC] - (T (* ; - "when we put the points down make it uninterruptable") - (.WHILE.TOP.DS. DISPLAYSTREAM - (COND - [(IGEQ DX DY) (* ; "X is the fastest mover.") - (until (IGREATERP X1 X2) - do (* ; "main loop") - (COND - (DASHON (\CURVEPT X1 Y1))) - [COND - (DASHTAIL (* ; "do dashing.") - (COND - ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) - (SETQ DASHON (NOT DASHON)) - (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) - DASHLST)) - (SETQ DASHCNT (CAR DASHTAIL] - [COND - ([NOT (IGREATERP DX (SETQ CDL (IPLUS CDL DY] - (SETQ Y1 (IPLUS Y1 YINC)) - (COND - ((COND - ((EQ YINC -1) - (ILESSP Y1 Y2)) - ((IGREATERP Y1 Y2))) - (RETURN))) - (SETQ CDL (IDIFFERENCE CDL DX] - (SETQ X1 (ADD1 X1] - (T (* ; "Y is the fastest mover.") - (until (COND - ((EQ YINC -1) - (ILESSP Y1 Y2)) - ((IGREATERP Y1 Y2))) - do (* ; "main loop") - (COND - (DASHON (\CURVEPT X1 Y1))) - [COND - (DASHTAIL (* ; "do dashing.") - (COND - ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) - (SETQ DASHON (NOT DASHON)) - (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) - DASHLST)) - (SETQ DASHCNT (CAR DASHTAIL] - [COND - ([NOT (IGREATERP DY (SETQ CDL (IPLUS CDL DX] - (COND - ((IGREATERP (SETQ X1 (ADD1 X1)) - X2) - (RETURN))) - (SETQ CDL (IDIFFERENCE CDL DY] - (SETQ Y1 (IPLUS Y1 YINC] - (RETURN NIL]) -) -(DEFINEQ - -(LOADPOLY - [LAMBDA (POLY POLYPRIME A B C D) (* hdj "13-Mar-85 18:01") - (replace (POLYNOMIAL A) of POLY with (FQUOTIENT A 6.0)) - (replace (POLYNOMIAL B) of POLY with (FQUOTIENT B 2.0)) - (replace (POLYNOMIAL C) of POLY with C) - (replace (POLYNOMIAL D) of POLY with D) - (replace (POLYNOMIAL A) of POLYPRIME with (FQUOTIENT A 2.0)) - (replace (POLYNOMIAL B) of POLYPRIME with B) - (replace (POLYNOMIAL C) of POLYPRIME with C]) - -(PARAMETRICSPLINE - [LAMBDA (KNOTS CLOSEDFLG SPLINE) (* rmk%: "30-Nov-84 17:02") - - (* ;; "KNOTS is a non-NIL list of knots, CLOSEDFLG => closed curve") - - (PROG (DX DY DDX DDY DDDX DDDY %#KNOTS A BX BY X Y SX SY A C R D2X D2Y I) - [COND - (CLOSEDFLG (* ; "Wrap around") - (push KNOTS (CAR (LAST KNOTS] - (SETQ %#KNOTS (LENGTH KNOTS)) - (SETQ DX (ARRAY %#KNOTS 0 0.0)) - (SETQ DDX (ARRAY %#KNOTS 0 0.0)) - (SETQ DDDX (ARRAY %#KNOTS 0 0.0)) - (SETQ DY (ARRAY %#KNOTS 0 0.0)) - (SETQ DDY (ARRAY %#KNOTS 0 0.0)) - (SETQ DDDY (ARRAY %#KNOTS 0 0.0)) - (SETQ X (ARRAY %#KNOTS 0 0.0)) - (SETQ Y (ARRAY %#KNOTS 0 0.0)) - (for KNOT in KNOTS as I from 1 to %#KNOTS - do (OR (type? POSITION KNOT) - (ERROR "bad knot" KNOT)) - (SETA X I (CAR KNOT)) - (SETA Y I (CDR KNOT))) - (SETQ A (ARRAY %#KNOTS 0 0.0)) - (SETQ BX (ARRAY %#KNOTS 0 0.0)) - (SETQ BY (ARRAY %#KNOTS 0 0.0)) - [COND - (CLOSEDFLG (SETQ C (ARRAY %#KNOTS 0 0.0)) - (SETQ R (ARRAY %#KNOTS 0 0.0)) - (SETQ SX (ARRAY %#KNOTS 0 0.0)) - (SETQ SY (ARRAY %#KNOTS 0 0.0] - (SETA A 1 4.0) - [for I from 2 to (IDIFFERENCE %#KNOTS 2) - do (SETA A I (FDIFFERENCE 4.0 (FQUOTIENT 1.0 (ELT A (SUB1 I] - [COND - (CLOSEDFLG (SETA C 1 1.0) - (for I from 2 to (IDIFFERENCE %#KNOTS 2) - do (SETA C I (FMINUS (FQUOTIENT (ELT C (SUB1 I)) - (ELT A (SUB1 I] - [COND - ((IGEQ %#KNOTS 3) - (COND - [CLOSEDFLG [SETA BX 1 (FTIMES 6.0 (FPLUS (ELT X 2) - (FMINUS (FTIMES 2.0 (ELT X 1))) - (ELT X (SUB1 %#KNOTS] - [SETA BY 1 (FTIMES 6.0 (FPLUS (ELT Y 2) - (FMINUS (FTIMES 2.0 (ELT Y 1))) - (ELT Y (SUB1 %#KNOTS] - [for I from 2 to (IDIFFERENCE %#KNOTS 2) - do [SETA BX I (FDIFFERENCE [FTIMES 6.0 - (FPLUS (ELT X (ADD1 I)) - (FMINUS (FTIMES 2.0 - (ELT X I))) - (ELT X (SUB1 I] - (FQUOTIENT (ELT BX (SUB1 I)) - (ELT A (SUB1 I] - (SETA BY I (FDIFFERENCE [FTIMES 6.0 - (FPLUS (ELT Y (ADD1 I)) - (FMINUS (FTIMES 2.0 - (ELT Y I))) - (ELT Y (SUB1 I] - (FQUOTIENT (ELT BY (SUB1 I)) - (ELT A (SUB1 I] - (SETA R (SUB1 %#KNOTS) - 1.0) - (SETA SX (SUB1 %#KNOTS) - 0.0) - (SETA SY (SUB1 %#KNOTS) - 0.0) - (for I from (IDIFFERENCE %#KNOTS 2) to 1 by -1 - do [SETA R I (FMINUS (FQUOTIENT (FPLUS (ELT R (ADD1 I)) - (ELT C I)) - (ELT A I] - (SETA SX I (FQUOTIENT (FDIFFERENCE (ELT BX I) - (ELT SX (ADD1 I))) - (ELT A I))) - (SETA SY I (FQUOTIENT (FDIFFERENCE (ELT BY I) - (ELT SY (ADD1 I))) - (ELT A I] - (T [SETA BX 1 (FTIMES 6.0 (FPLUS (FDIFFERENCE (ELT X 3) - (FTIMES 2.0 (ELT X 2))) - (ELT X 1] - [SETA BY 1 (FTIMES 6.0 (FPLUS (FDIFFERENCE (ELT Y 3) - (FTIMES 2.0 (ELT Y 2))) - (ELT Y 1] - (for I from 2 to (IDIFFERENCE %#KNOTS 2) - do [SETA BX I (FDIFFERENCE (FTIMES - 6.0 - (FPLUS [FDIFFERENCE (ELT X (IPLUS I 2)) - (FTIMES 2 (ELT X (ADD1 I] - (ELT X I))) - (FQUOTIENT (ELT BX (SUB1 I)) - (ELT A (SUB1 I] - (SETA BY I (FDIFFERENCE (FTIMES 6.0 - (FPLUS [FDIFFERENCE - (ELT Y (IPLUS I 2)) - (FTIMES 2 (ELT Y (ADD1 I] - (ELT Y I))) - (FQUOTIENT (ELT BY (SUB1 I)) - (ELT A (SUB1 I] - [COND - (CLOSEDFLG [SETQ D2X (FPLUS (ELT X %#KNOTS) - [FMINUS (FTIMES 2.0 (ELT X (SUB1 %#KNOTS] - (ELT X (IDIFFERENCE %#KNOTS 2] - [SETQ D2Y (FPLUS (ELT Y %#KNOTS) - [FMINUS (FTIMES 2.0 (ELT Y (SUB1 %#KNOTS] - (ELT Y (IDIFFERENCE %#KNOTS 2] - (SETA DDX (SUB1 %#KNOTS) - (FQUOTIENT (FDIFFERENCE (FDIFFERENCE (FTIMES D2X 6.0) - (ELT SX 1)) - (ELT SX (IDIFFERENCE %#KNOTS 2))) - (FPLUS (ELT R 1) - (ELT R (IDIFFERENCE %#KNOTS 2)) - 4.0))) - (SETA DDY (SUB1 %#KNOTS) - (FQUOTIENT (FDIFFERENCE (FDIFFERENCE (FTIMES D2Y 6.0) - (ELT SY 1)) - (ELT SY (IDIFFERENCE %#KNOTS 2))) - (FPLUS (ELT R 1) - (ELT R (IDIFFERENCE %#KNOTS 2)) - 4.0))) - [for I from 1 to (IDIFFERENCE %#KNOTS 2) - do [SETA DDX I (FPLUS (ELT SX I) - (FTIMES (ELT R I) - (ELT DDX (SUB1 %#KNOTS] - (SETA DDY I (FPLUS (ELT SY I) - (FTIMES (ELT R I) - (ELT DDY (SUB1 %#KNOTS] - (SETA DDX %#KNOTS (ELT DDX 1)) - (SETA DDY %#KNOTS (ELT DDY 1))) - (T (* ; "COMPUTE SECOND DERIVATIVES.") - [SETA DDX 1 (SETA DDY 1 (SETA DDX %#KNOTS (SETA DDY %#KNOTS 0.0] - (for I from (SUB1 %#KNOTS) to 2 by -1 - do [SETA DDX I (FQUOTIENT (FDIFFERENCE (ELT BX (SUB1 I)) - (ELT DDX (ADD1 I))) - (ELT A (SUB1 I] - (SETA DDY I (FQUOTIENT (FDIFFERENCE (ELT BY (SUB1 I)) - (ELT DDY (ADD1 I))) - (ELT A (SUB1 I] - [for I from 1 to (SUB1 %#KNOTS) - do (* ; "COMPUTE 1ST & 3RD DERIVATIVES") - (SETA DX I (FDIFFERENCE (FDIFFERENCE (ELT X (ADD1 I)) - (ELT X I)) - (FQUOTIENT (FPLUS (FTIMES 2 (ELT DDX I)) - (ELT DDX (ADD1 I))) - 6.0))) - (SETA DY I (FDIFFERENCE (FDIFFERENCE (ELT Y (ADD1 I)) - (ELT Y I)) - (FQUOTIENT (FPLUS (FTIMES 2 (ELT DDY I)) - (ELT DDY (ADD1 I))) - 6.0))) - (SETA DDDX I (FDIFFERENCE (ELT DDX (ADD1 I)) - (ELT DDX I))) - (SETA DDDY I (FDIFFERENCE (ELT DDY (ADD1 I)) - (ELT DDY I] - (SETQ SPLINE - (create SPLINE - %#KNOTS _ %#KNOTS - SPLINEX _ X - SPLINEY _ Y - SPLINEDX _ DX - SPLINEDY _ DY - SPLINEDDX _ DDX - SPLINEDDY _ DDY - SPLINEDDDX _ DDDX - SPLINEDDDY _ DDDY)) - (RETURN SPLINE]) - -(\CURVE - [LAMBDA (X0 Y0 X1 Y1 DX DY DDX DDY DDDX DDDY N BRUSHBM DISPLAYDATA BBT ENDING USERFN DISPLAYSTREAM) - (* rrb "30-Apr-85 12:44") - (DECLARE (LOCALVARS . T)) - - (* ;; "Puts a spline segment down. Since it calls BitBlt1 directly, it must clip to both clipping region and the size of the destination bit map.") - - (PROG (OLDX X Y OLDY DELTAX DELTAY DELTA TX TY OOLDX OOLDY) - [COND - ((NEQ N 0) - [COND - (USERFN (* ; - "if there is a user fn, stay in his coordinates.") - (SETQ OLDX X0) - (SETQ OLDY Y0)) - (T - (* ;; "SUB1 on brush size is to cause the extra bit to be in the top left direction as is documented for lines.") - - (SETQ OLDX (\DSPTRANSFORMX (IDIFFERENCE X0 (LRSH (SUB1 BRUSHWIDTH) - 1)) - DISPLAYDATA)) - (SETQ OLDY (\DSPTRANSFORMY (IDIFFERENCE Y0 (LRSH (SUB1 BRUSHHEIGHT) - 1)) - DISPLAYDATA] (* ; "draw origin point") - (\CURVESMOOTH OLDX OLDY USERFN DISPLAYSTREAM) (* ; - "convert the derivatives to fractional representation.") - - (* ;; "\CONVERTTOFRACTION always returns a large number box. This uses 0.49 because 0.5 causes rounding up.") - - (SETQ X (\CONVERTTOFRACTION (FPLUS OLDX 0.49))) - (SETQ Y (\CONVERTTOFRACTION (FPLUS OLDY 0.49))) - (SETQ DX (\CONVERTTOFRACTION DX)) - (SETQ DY (\CONVERTTOFRACTION DY)) - (SETQ DDX (\CONVERTTOFRACTION DDX)) - (SETQ DDY (\CONVERTTOFRACTION DDY)) - (SETQ DDDX (\CONVERTTOFRACTION DDDX)) - (SETQ DDDY (\CONVERTTOFRACTION DDDY)) - [for I from 1 to N do (* ; - "uses \BOXIPLUS to save box and also set the new value of the variable.") - (\BOXIPLUS X DX) - (\BOXIPLUS DX DDX) - (\BOXIPLUS DDX DDDX) - (\BOXIPLUS Y DY) - (\BOXIPLUS DY DDY) - (\BOXIPLUS DDY DDDY) - (SETQ OOLDX OLDX) - (SETQ OOLDY OLDY) - (SETQ DELTAX (IDIFFERENCE (SETQ OLDX ( - \GETINTEGERPART - X)) - OOLDX)) - (SETQ DELTAY (IDIFFERENCE (SETQ OLDY ( - \GETINTEGERPART - Y)) - OOLDY)) - (SETQ DELTA (IMAX (IABS DELTAX) - (IABS DELTAY))) - (COND - ((EQ DELTA 1) - (\CURVESMOOTH OLDX OLDY USERFN DISPLAYSTREAM)) - ) - (COND - ((IGREATERP DELTA 1) - (SETQ DELTAX (\CONVERTTOFRACTION - (FQUOTIENT DELTAX DELTA))) - (SETQ DELTAY (\CONVERTTOFRACTION - (FQUOTIENT DELTAY DELTA))) - (SETQ TX (\CONVERTTOFRACTION OOLDX)) - (SETQ TY (\CONVERTTOFRACTION OOLDY)) - (for I from 0 to DELTA - do (\CURVESMOOTH (\GETINTEGERPART - TX) - (\GETINTEGERPART TY) - USERFN DISPLAYSTREAM) - (\BOXIPLUS TX DELTAX) - (\BOXIPLUS TY DELTAY] - (* ; "draw the end point") - (COND - (USERFN (\CURVESMOOTH X1 Y1 USERFN DISPLAYSTREAM)) - (T (\CURVESMOOTH (\DSPTRANSFORMX (IDIFFERENCE X1 (LRSH (SUB1 BRUSHWIDTH) - 1)) - DISPLAYDATA) - (\DSPTRANSFORMY (IDIFFERENCE Y1 (LRSH (SUB1 BRUSHHEIGHT) - 1)) - DISPLAYDATA) - NIL DISPLAYSTREAM))) - (AND DISPLAYSTREAM (MOVETO X1 Y1 DISPLAYSTREAM] - (COND - (ENDING (\CURVESMOOTH (IPLUS \CURX \CURX (IMINUS \OLDX)) - (IPLUS \CURY \CURY (IMINUS \OLDY)) - USERFN DISPLAYSTREAM) - (\CURVESMOOTH (IPLUS \CURX \CURX (IMINUS \OLDX)) - (IPLUS \CURY \CURY (IMINUS \OLDY)) - USERFN DISPLAYSTREAM))) - (RETURN NIL]) - -(\CURVE2 - [LAMBDA (SPLINE BRUSH DASHLST BBT DISPLAYSTREAM) (* jds "26-Nov-85 12:21") - -(* ;;; "Given a spline curve, represented as a set of derivatives for each segment, draw it on DISPLAYSTREAM using the brush BRUSH, and dashing it according to DASHLST. For speed, use the bitblt table BBT.") - - (DECLARE (SPECVARS . T)) - - (* ;; "DISPLAYSTREAM is guaranteed to be a display-stream. Should declare most of these variables local but currently have the \CURVE function between here and \CURVEBBT so can't") - - (PROG (BRUSHBM DestinationBitMap OPERATION BRUSHWIDTH BRUSHHEIGHT BRUSHBASE BRUSHRASTERWIDTH LEFT - RIGHTPLUS1 TOP BOTTOM DESTINATIONBASE LEFTMINUSBRUSH BOTTOMMINUSBRUSH TOPMINUSBRUSH - RASTERWIDTH NBITSRIGHTPLUS1 HEIGHTMINUS1 COLOR COLORBRUSHBASE NBITS \CURX \CURY - \OLDX \OLDY \OLDERX \OLDERY LKNOT (DASHON T) - (DASHTAIL DASHLST) - (DASHCNT (CAR DASHLST)) - NPOINTS NSEGS POINTSPERSEG DX D2X D3X DY D2Y D3Y D1 D2 D3 X0 Y0 X1 Y1 DX DDX DDDX DY - DDY DDDY (XPOLY (create POLYNOMIAL)) - (X/PRIME/POLY (create POLYNOMIAL)) - (YPOLY (create POLYNOMIAL)) - (Y/PRIME/POLY (create POLYNOMIAL)) - (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM)) - (USERFN (AND (LITATOM BRUSH) - BRUSH))) - - (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") - - [COND - (USERFN (* ; - "if calling user fn, don't bother with set up and leave points in window coordinates.") - (\CURVESTART (ELT (fetch (SPLINE SPLINEX) of SPLINE) - 1) - (ELT (fetch (SPLINE SPLINEY) of SPLINE) - 1))) - (T (.SETUP.FOR.\BBTCURVEPT.) (* ; - "Do it interruptably here to get set up, then uninterruptably when drawing points") - (\INSURETOPWDS DISPLAYSTREAM) (* ; - "curve pts will be kept in screen coordinates, start smoothing values there.") - (\CURVESTART (\DSPTRANSFORMX (IDIFFERENCE (ELT (fetch (SPLINE SPLINEX) - of SPLINE) - 1) - (LRSH (SUB1 BRUSHWIDTH) - 1)) - DISPLAYDATA) - (\DSPTRANSFORMY (IDIFFERENCE (ELT (fetch (SPLINE SPLINEY) of SPLINE) - 1) - (LRSH (SUB1 BRUSHHEIGHT) - 1)) - DISPLAYDATA] - [bind PERSEG for KNOT from 1 to (SUB1 (fetch %#KNOTS of SPLINE)) - when (PROGN - (* ;; - "Loop thru the segments of the spline curve, drawing each in turn.") - - (SETQ X0 (ELT (fetch (SPLINE SPLINEX) of SPLINE) - KNOT)) (* ; - "Set up X0,Y0 -- the starting point of this segment") - (SETQ Y0 (ELT (fetch (SPLINE SPLINEY) of SPLINE) - KNOT)) - (SETQ X1 (ELT (fetch (SPLINE SPLINEX) of SPLINE) - (ADD1 KNOT))) (* ; "And X1,Y1 -- the ending point") - (SETQ Y1 (ELT (fetch (SPLINE SPLINEY) of SPLINE) - (ADD1 KNOT))) - (SETQ DX (ELT (fetch (SPLINE SPLINEDX) of SPLINE) - KNOT)) (* ; - "And the initial derivatives -- first") - (SETQ DY (ELT (fetch (SPLINE SPLINEDY) of SPLINE) - KNOT)) - (SETQ DDX (ELT (fetch SPLINEDDX of SPLINE) - KNOT)) (* ; "Second") - (SETQ DDY (ELT (fetch SPLINEDDY of SPLINE) - KNOT)) - (SETQ DDDX (ELT (fetch SPLINEDDDX of SPLINE) - KNOT)) (* ; "And third.") - (SETQ DDDY (ELT (fetch SPLINEDDDY of SPLINE) - KNOT)) - (SETQ NPOINTS (FOLDLO (ITIMES (IMAX (IABS (IDIFFERENCE X1 X0)) - (IABS (IDIFFERENCE Y1 Y0))) - 3) - 2)) - - (* ;; "Establish an upper bound on the number of points we'll draw while painting this segment. We know that 3/2 the maximum DX or DY is the right amount.") - - (NOT (ZEROP NPOINTS))) - do - - (* ;; "NPOINTS can be zero if a knot is duplicated in the spline curve to produce a discontinuity. Skip over zero-length segments to avoid divide-by-zero trouble") - - (* ;; "To prevent round-off errors from accumulating, we'll draw this segment as runs of no more than 64 points each -- recomputing completely at the start of each run. This is a trade off of speed and accuracy.") - - [COND - ((ILEQ NPOINTS 64) (* ; - "Fewer than 64 points to draw. Do it in one run.") - (SETQ NSEGS 1) - (SETQ POINTSPERSEG NPOINTS)) - (T (* ; - "Figure out how many runs to do it in.") - (SETQ NSEGS (FOLDLO NPOINTS 64)) - (SETQ POINTSPERSEG 64) - (SETQ NPOINTS (UNFOLD NSEGS 64] - (SETQ D1 (FQUOTIENT 1.0 NPOINTS)) (* ; - "Set up ÿ&Eÿt, ÿ&Eÿt**2 and ÿ&Eÿt**3, for computing the next point.") - (SETQ D2 (FTIMES D1 D1)) - (SETQ D3 (FTIMES D2 D1)) - (SETQ D3X (FTIMES D3 DDDX)) - (SETQ D3Y (FTIMES D3 DDDY)) - (COND - [(EQ NSEGS 1) (* ; "Just one segment to draw.") - [SETQ DX (FPLUS (FTIMES D1 DX) - (FTIMES DDX D2 0.5) - (FTIMES DDDX D3 (CONSTANT (FQUOTIENT 1.0 6.0] - (SETQ D2X (FPLUS (FTIMES D2 DDX) - (FTIMES D3 DDDX))) - [SETQ DY (FPLUS (FTIMES D1 DY) - (FTIMES D2 DDY 0.5) - (FTIMES D3 DDDY (CONSTANT (FQUOTIENT 1.0 6.0] - (SETQ D2Y (FPLUS (FTIMES D2 DDY) - (FTIMES D3 DDDY))) - (COND - (USERFN (* ; - "Draw this run of points, using the user's supplied function.") - (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y NPOINTS BRUSHBM - DISPLAYDATA BBT NIL USERFN DISPLAYSTREAM)) - (T (* ; - "Draw this run of points, using the brush.") - (.WHILE.TOP.DS. DISPLAYSTREAM - (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y NPOINTS BRUSHBM - DISPLAYDATA BBT NIL NIL DISPLAYSTREAM] - (T (* ; - "Have to do this segment in several runs.") - (SETQ PERSEG (FQUOTIENT 1.0 NSEGS)) - (LOADPOLY XPOLY X/PRIME/POLY DDDX DDX DX X0) - (LOADPOLY YPOLY Y/PRIME/POLY DDDY DDY DY Y0) - (bind (TT _ 0.0) - (DDDX/PER/SEG _ (FTIMES DDDX PERSEG)) - (DDDY/PER/SEG _ (FTIMES DDDY PERSEG)) - [D3XFACTOR _ (FTIMES D3 DDDX (CONSTANT (FQUOTIENT 1.0 6.0] - [D3YFACTOR _ (FTIMES D3 DDDY (CONSTANT (FQUOTIENT 1.0 6.0] - for I from 0 to (SUB1 NSEGS) - do - - (* ;; - "TT is the parameter, and runs from 0 to 1 as the curve segment runs from beginning to end.") - - (SETQ TT (FPLUS TT PERSEG)) - (SETQ X1 (POLYEVAL TT XPOLY 3)) - (SETQ Y1 (POLYEVAL TT YPOLY 3)) - (SETQ DX (FPLUS (FTIMES D1 DX) - (FTIMES D2 DDX 0.5) - D3XFACTOR)) - (SETQ D2X (FPLUS (FTIMES D2 DDX) - (FTIMES D3 DDDX))) - (SETQ DY (FPLUS (FTIMES D1 DY) - (FTIMES D2 DDY 0.5) - D3YFACTOR)) - (SETQ D2Y (FPLUS (FTIMES D2 DDY) - (FTIMES D3 DDDY))) - [COND - (USERFN (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y 64 BRUSHBM - DISPLAYDATA BBT NIL USERFN DISPLAYSTREAM)) - (T (.WHILE.TOP.DS. DISPLAYSTREAM - (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y 64 - BRUSHBM DISPLAYDATA BBT NIL NIL DISPLAYSTREAM] - (SETQ X0 X1) - (SETQ Y0 Y1) - (SETQ DDX (FPLUS DDX DDDX/PER/SEG)) - (SETQ DDY (FPLUS DDY DDDY/PER/SEG)) - (SETQ DX (POLYEVAL TT X/PRIME/POLY 2)) - (SETQ DY (POLYEVAL TT Y/PRIME/POLY 2] - - (* ;; "Draw the final point on the curve.") - - (COND - (USERFN (\CURVE 0 0 0 0 0 0 0 0 0 0 0 BRUSHBM DISPLAYDATA BBT T USERFN DISPLAYSTREAM - )) - (T (.WHILE.TOP.DS. DISPLAYSTREAM - (\CURVE 0 0 0 0 0 0 0 0 0 0 0 BRUSHBM DISPLAYDATA BBT T NIL DISPLAYSTREAM]) - -(\CURVEEND - [LAMBDA NIL (* rrb " 5-JAN-82 17:24") - - (* ;; "Put out the last two points, using \CURVEPT, since they were held back for smoothing.") - - (PROG ((X \CURX) - (Y \CURY) - (DX (IDIFFERENCE \CURX \OLDX)) - (DY (IDIFFERENCE \CURY \OLDY))) - (for I from 1 to 2 do (\CURVESMOOTH (SETQ X (IPLUS X DX)) - (SETQ Y (IPLUS Y DY]) - -(\CURVESLOPE - [LAMBDA (KNOTS ENDFLG) (* rrb "30-Nov-84 18:17") - - (* ;; "returns a CONS of DX DY that gives the slope of the curve thru KNOTS. If ENDFLG is NIL, it is at the beginning. If ENDFLG is T, it is at the last point.") - - (PROG (DX DY PARAMS (%#KNOTS (LENGTH KNOTS))) - (RETURN (SELECTQ %#KNOTS - ((0 1) (* ; "define slope as horizontal") - '(1 . 0)) - (2 [CONS (DIFFERENCE (fetch (POSITION XCOORD) of (CADR KNOTS)) - (fetch (POSITION XCOORD) of (CAR KNOTS))) - (DIFFERENCE (fetch (POSITION YCOORD) of (CADR KNOTS)) - (fetch (POSITION YCOORD) of (CAR KNOTS]) - (PROGN [SETQ PARAMS (COND - [ENDFLG (PARAMETRICSPLINE (REVERSE - (NLEFT KNOTS - (IMIN %#KNOTS 4] - (T (PARAMETRICSPLINE (COND - ((EQ %#KNOTS 3) - (LIST (CAR KNOTS) - (CADR KNOTS) - (CADDR KNOTS))) - (T (LIST (CAR KNOTS) - (CADR KNOTS) - (CADDR KNOTS) - (CADDDR KNOTS] - (SETQ DX (ELT (fetch (SPLINE SPLINEDX) of PARAMS) - 1)) - (SETQ DY (ELT (fetch (SPLINE SPLINEDY) of PARAMS) - 1)) - (if ENDFLG - then (CONS (MINUS DX) - (MINUS DY)) - else (CONS DX DY]) - -(\CURVESTART - [LAMBDA (X Y) (* jds "27-OCT-81 15:48") - - (* ;; "Set up the init vals for \OLDER* \OLD* \CUR*, for curve smoothing in \CURVEPT.") - - (SETQ \OLDERX X) - (SETQ \OLDX X) - (SETQ \CURX X) - (SETQ \OLDERY Y) - (SETQ \OLDY Y) - (SETQ \CURY Y]) - -(\FDIFS/FROM/DERIVS - [LAMBDA (DZ DDZ DDDZ RAD NSTEPS) (* rrb "12-MAY-81 10:59") - - (* ;; "the derivatives of the function, plus a scale factor (radius for drawing circles) See 'Spline Curve Techniques' , equations 2.18.") - - (PROG (S SS SSS) - (SETQ S (FQUOTIENT 1.0 NSTEPS)) - (SETQ SS (FTIMES S S)) - (SETQ SSS (FTIMES SS S)) - (SETQ S (FTIMES S DZ RAD)) - (SETQ SS (FTIMES SS DDZ RAD)) - (SETQ SSS (FTIMES SSS DDDZ RAD)) - (RETURN (LIST (FPLUS S (FQUOTIENT SS 2.0) - (FQUOTIENT SSS 6.0)) - (FPLUS SS SSS) - SSS]) -) -(DECLARE%: DONTCOPY -(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE - -(ARRAYRECORD POLYNOMIAL (A B C D) - (CREATE (ARRAY 4 'FLOATP)) - (SYSTEM)) - -(RECORD SPLINE (%#KNOTS SPLINEX SPLINEY SPLINEDX SPLINEDY SPLINEDDX SPLINEDDY SPLINEDDDX - SPLINEDDDY)) -) - -(* "END EXPORTED DEFINITIONS") - -) -(DECLARE%: DONTCOPY -(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE - -(PUTPROPS HALF MACRO ((X) - (LRSH X 1))) - -(PUTPROPS \FILLCIRCLEBLT MACRO (OPENLAMBDA (CX CY X Y) - (* ; - "calls bitblt twice to fill in one line of the circle.") - (\LINEBLT FCBBT (IDIFFERENCE CX X) - (IPLUS CY Y) - (IPLUS CX X) - DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP - GRAYWIDTH GRAYHEIGHT GRAYBASE NBITS) - (\LINEBLT FCBBT (IDIFFERENCE CX X) - (IDIFFERENCE CY Y) - (IPLUS CX X) - DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP - GRAYWIDTH GRAYHEIGHT GRAYBASE NBITS))) -) - -(* "END EXPORTED DEFINITIONS") - - -(DECLARE%: EVAL@COMPILE - -(PUTPROPS \CURVEPT MACRO [OPENLAMBDA (X Y) - (COND - ((OR (ILEQ X LEFTMINUSBRUSH) - (IGEQ X RIGHTPLUS1) - (ILEQ Y BOTTOMMINUSBRUSH) - (IGEQ Y TOP)) - NIL) - ((NULL BBT) - (\FBITMAPBIT DESTINATIONBASE X Y OPERATION HEIGHTMINUS1 - RASTERWIDTH)) - (T - (* ;; - "This should have been done in .SETUP.FOR.\BBTCURVEPT., under \GETBRUSHBBT.") - - (* ;; - "Its a bug here, because brushes can't use operation REPLACE.") - - (* ;; - "(\SETPBTFUNCTION BBT (ffetch DDSOURCETYPE of DISPLAYDATA) OPERATION)") - - (\BBTCURVEPT X Y BBT LEFT BRUSHWIDTH LEFTMINUSBRUSH - RIGHTPLUS1 NBITSRIGHTPLUS1 TOPMINUSBRUSH - DestinationBitMap BRUSHHEIGHT BOTTOMMINUSBRUSH TOP - BRUSHBASE DESTINATIONBASE RASTERWIDTH - BRUSHRASTERWIDTH COLORBRUSHBASE NBITS DISPLAYDATA]) - -(PUTPROPS .SETUP.FOR.\BBTCURVEPT. MACRO - [NIL (PROGN (SETQ BOTTOM (ffetch (\DISPLAYDATA DDClippingBottom) of DISPLAYDATA)) - (SETQ TOP (ffetch (\DISPLAYDATA DDClippingTop) of DISPLAYDATA)) - (SETQ RIGHTPLUS1 (ffetch (\DISPLAYDATA DDClippingRight) of DISPLAYDATA) - ) - (SETQ LEFT (ffetch (\DISPLAYDATA DDClippingLeft) of DISPLAYDATA)) - (SETQ DestinationBitMap (ffetch (\DISPLAYDATA DDDestination) of - DISPLAYDATA - )) - (SETQ OPERATION (OR OPERATION (ffetch (\DISPLAYDATA DDOPERATION) - of DISPLAYDATA))) - (SETQ NBITS (fetch (BITMAP BITMAPBITSPERPIXEL) of DestinationBitMap)) - [COND - [(NOT (EQ NBITS 1)) - (SETQ BRUSHBM (\GETCOLORBRUSH BRUSH (MAXIMUMCOLOR NBITS) - NBITS)) - [SETQ COLOR (COND - [(AND (LISTP BRUSH) - (CAR (LISTP (CDDR BRUSH] - ((DSPCOLOR NIL DISPLAYSTREAM)) - (T (MAXIMUMCOLOR NBITS] - [COND - ((EQ OPERATION 'ERASE) - (SETQ COLOR (OPPOSITECOLOR COLOR NBITS] - (SETQ COLORBRUSHBASE (fetch (BITMAP BITMAPBASE) - of (\GETCOLORBRUSH BRUSH COLOR NBITS] - (T (SETQ BRUSHBM (\GETBRUSH BRUSH] - (SETQ RASTERWIDTH (ffetch (BITMAP BITMAPRASTERWIDTH) of - DestinationBitMap - )) - (SETQ DESTINATIONBASE (ffetch (BITMAP BITMAPBASE) of DestinationBitMap) - ) - (SETQ BBT (\GETBRUSHBBT BRUSHBM DISPLAYDATA BBT)) - (SETQ BRUSHBASE (fetch (BITMAP BITMAPBASE) of BRUSHBM)) - (SETQ BRUSHRASTERWIDTH (ffetch (BITMAP BITMAPRASTERWIDTH) of BRUSHBM)) - [COND - ((NULL BBT) - (SETQ HEIGHTMINUS1 (SUB1 (ffetch (BITMAP BITMAPHEIGHT) of - DestinationBitMap - ))) - (COND - ((EQ (ffetch (\DISPLAYDATA DDOPERATION) of DISPLAYDATA) - 'INVERT) - (SETQ OPERATION 'INVERT] - (SETQ BRUSHWIDTH (ffetch (BITMAP BITMAPWIDTH) of BRUSHBM)) - (SETQ BRUSHHEIGHT (ffetch (BITMAP BITMAPHEIGHT) of BRUSHBM)) - (SETQ LEFTMINUSBRUSH (IDIFFERENCE LEFT BRUSHWIDTH)) - (SETQ BOTTOMMINUSBRUSH (IDIFFERENCE BOTTOM BRUSHHEIGHT)) - (SETQ TOPMINUSBRUSH (IDIFFERENCE TOP BRUSHHEIGHT)) - (SETQ NBITSRIGHTPLUS1 (ITIMES RIGHTPLUS1 NBITS)) - (SETQ BRUSHWIDTH (ITIMES BRUSHWIDTH NBITS]) - -(PUTPROPS \CIRCLEPTS MACRO (OPENLAMBDA (CX CY X Y) - (\CURVEPT (IPLUS CX X) - (IPLUS CY Y)) - (\CURVEPT (IDIFFERENCE CX X) - (IPLUS CY Y)) - (\CURVEPT (IPLUS CX X) - (IDIFFERENCE CY Y)) - (\CURVEPT (IDIFFERENCE CX X) - (IDIFFERENCE CY Y)))) - -(PUTPROPS \CURVESMOOTH MACRO (OPENLAMBDA (NEWX NEWY USERFN DISPLAYSTREAM) - (PROG [(DX (IABS (IDIFFERENCE NEWX \OLDX))) - (DY (IABS (IDIFFERENCE NEWY \OLDY] - (COND - ((OR (IGREATERP DX 1) - (IGREATERP DY 1)) - [COND - ((NEQ [IPLUS (ADD1 (IDIFFERENCE \OLDX \OLDERX)) - (ITIMES 3 (ADD1 (IDIFFERENCE \OLDY - \OLDERY] - 4) - [COND - (DASHON (COND - (USERFN (APPLY* USERFN \OLDX \OLDY - DISPLAYSTREAM)) - (T (.WHILE.TOP.DS. DISPLAYSTREAM - (\CURVEPT \OLDX \OLDY] - (COND - (DASHTAIL (COND - ((EQ 0 (SETQ DASHCNT - (SUB1 DASHCNT))) - (SETQ DASHON (NOT DASHON)) - (SETQ DASHTAIL - (OR (LISTP (CDR DASHTAIL)) - DASHLST)) - (SETQ DASHCNT (CAR DASHTAIL] - (SETQ \OLDERX \OLDX) - (SETQ \OLDERY \OLDY) - (SETQ \OLDX \CURX) - (SETQ \OLDY \CURY))) - (SETQ \CURX NEWX) - (SETQ \CURY NEWY)))) -) -) -(DEFINEQ - -(\FILLCIRCLE.DISPLAY - [LAMBDA (DISPLAYSTREAM CENTERX CENTERY RADIUS TEXTURE) (* kbr%: "24-Jan-86 19:12") - - (* ;; "Fill in area bounded by circle DRAWCIRCLE would draw.") - - (COND - ((OR (NOT (NUMBERP RADIUS)) - (ILESSP (SETQ RADIUS (FIXR RADIUS)) - 0)) - (\ILLEGAL.ARG RADIUS)) - (T (GLOBALRESOURCE \BRUSHBBT - (PROG (TOP BOTTOM RIGHT LEFT OPERATION DestinationBitMap DISPLAYDATA X Y D - DESTINATIONBASE RASTERWIDTH CX CY TEXTUREBM GRAYHEIGHT GRAYWIDTH GRAYBASE - NBITS FCBBT) - (SETQ DISPLAYDATA (fetch (STREAM IMAGEDATA) of DISPLAYSTREAM)) - (SETQ X 0) - (SETQ Y RADIUS) - (SETQ D (ITIMES 2 (IDIFFERENCE 1 RADIUS))) - (SETQ FCBBT \BRUSHBBT) - (SETQ LEFT (fetch (\DISPLAYDATA DDClippingLeft) of DISPLAYDATA)) - (SETQ BOTTOM (fetch (\DISPLAYDATA DDClippingBottom) of DISPLAYDATA)) - (SETQ TOP (SUB1 (fetch (\DISPLAYDATA DDClippingTop) of DISPLAYDATA))) - (SETQ RIGHT (SUB1 (fetch (\DISPLAYDATA DDClippingRight) of DISPLAYDATA - ))) - (SETQ OPERATION (fetch (\DISPLAYDATA DDOPERATION) of DISPLAYDATA)) - (SETQ DestinationBitMap (fetch (\DISPLAYDATA DDDestination) of - DISPLAYDATA - )) - (SETQ NBITS (fetch (BITMAP BITMAPBITSPERPIXEL) of DestinationBitMap)) - [SETQ TEXTUREBM (COND - ((BITMAPP TEXTURE)) - [(NOT (EQ NBITS 1))(* ; - "color case, default texture differently") - (COND - ((BITMAPP (COLORTEXTUREFROMCOLOR# - (COLORNUMBERP (OR TEXTURE - (DSPCOLOR NIL - DISPLAYSTREAM)) - NBITS T) - NBITS))) - [(AND (LISTP TEXTURE) - (BITMAPP (COLORTEXTUREFROMCOLOR# - (COLORNUMBERP (CADR TEXTURE) - NBITS) - NBITS] - (T (\ILLEGAL.ARG TEXTURE] - ((LISTP TEXTURE) (* ; - "either a color or a list of (texture color)") - (INSURE.B&W.TEXTURE TEXTURE)) - [(AND (NULL TEXTURE) - (BITMAPP (fetch (\DISPLAYDATA DDTexture) - of DISPLAYDATA] - ([OR (FIXP TEXTURE) - (AND (NULL TEXTURE) - (SETQ TEXTURE (fetch (\DISPLAYDATA DDTexture) - of DISPLAYDATA] - (* ; - "create bitmap for the texture. Could reuse a bitmap but for now this is good enough.") - (SETQ TEXTUREBM (BITMAPCREATE 16 4)) - (SETQ GRAYBASE (fetch (BITMAP BITMAPBASE) of - TEXTUREBM)) - (\PUTBASE GRAYBASE 0 (\SFReplicate (LOGAND (LRSH TEXTURE - 12) - 15))) - (\PUTBASE GRAYBASE 1 (\SFReplicate (LOGAND (LRSH TEXTURE 8 - ) - 15))) - (\PUTBASE GRAYBASE 2 (\SFReplicate (LOGAND (LRSH TEXTURE 4 - ) - 15))) - (\PUTBASE GRAYBASE 3 (\SFReplicate (LOGAND TEXTURE 15))) - TEXTUREBM) - (T (\ILLEGAL.ARG TEXTURE] - (SETQ GRAYBASE (fetch (BITMAP BITMAPBASE) of TEXTUREBM)) - (SETQ DESTINATIONBASE (fetch (BITMAP BITMAPBASE) of DestinationBitMap) - ) - (SETQ RASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of - DestinationBitMap - )) (* ; - "update as many fields in the brush bitblt table as possible from DS.") - (replace (PILOTBBT PBTFLAGS) of FCBBT with 0) - (replace (PILOTBBT PBTDESTBPL) of FCBBT with (UNFOLD RASTERWIDTH - BITSPERWORD)) - (* ; - "clear gray information. PBTSOURCEBPL is used for gray information too.") - (replace (PILOTBBT PBTSOURCEBPL) of FCBBT with 0) - (replace (PILOTBBT PBTUSEGRAY) of FCBBT with T) - [replace (PILOTBBT PBTGRAYWIDTHLESSONE) of FCBBT - with (SUB1 (SETQ GRAYWIDTH (IMIN (fetch (BITMAP BITMAPWIDTH) - of TEXTUREBM) - 16] - [replace (PILOTBBT PBTGRAYHEIGHTLESSONE) of FCBBT - with (SUB1 (SETQ GRAYHEIGHT (IMIN (fetch (BITMAP BITMAPHEIGHT) - of TEXTUREBM) - 16] - (replace (PILOTBBT PBTDISJOINT) of FCBBT with T) - (\SETPBTFUNCTION FCBBT 'TEXTURE OPERATION) - (replace (PILOTBBT PBTHEIGHT) of FCBBT with 1) - (* ; - "take into account the brush thickness.") - (SETQ CX (\DSPTRANSFORMX CENTERX DISPLAYDATA)) - (SETQ CY (\DSPTRANSFORMY CENTERY DISPLAYDATA)) - (* ; - "change Y TOP and BOTTOM to be in bitmap coordinates") - (SETQ CY (SUB1 (\SFInvert DestinationBitMap CY))) - (SETQ TOP (SUB1 (\SFInvert DestinationBitMap TOP))) - (SETQ BOTTOM (SUB1 (\SFInvert DestinationBitMap BOTTOM))) - (swap TOP BOTTOM) - (\INSURETOPWDS DISPLAYSTREAM) - - (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") - - (COND - ((EQ RADIUS 0) (* ; - "put a single point down. Use \LINEBLT to get proper texture. NIL") - (.WHILE.TOP.DS. DISPLAYSTREAM - (\LINEBLT FCBBT CX CY CX DESTINATIONBASE RASTERWIDTH LEFT RIGHT - BOTTOM TOP GRAYWIDTH GRAYHEIGHT GRAYBASE NBITS)) - (RETURN))) - LP (* ; - "(UNFOLD x 2) is used instead of (ITIMES x 2)") - [COND - [(IGREATERP 0 D) - (SETQ X (ADD1 X)) - (COND - ((IGREATERP (UNFOLD (IPLUS D Y) - 2) - 1) - (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) - 2) - 4))) - (T (SETQ D (IPLUS D (UNFOLD X 2) - 1)) (* ; "don't draw unless Y changes.") - (GO LP] - ((OR (EQ 0 D) - (IGREATERP X D)) - (SETQ X (ADD1 X)) - (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) - 2) - 4))) - (T (SETQ D (IPLUS (IDIFFERENCE D (UNFOLD Y 2)) - 3] - (COND - ((EQ Y 0) (* ; - "draw the middle line differently to avoid duplication.") - (.WHILE.TOP.DS. DISPLAYSTREAM - (\LINEBLT FCBBT (IDIFFERENCE CX X) - CY - (IPLUS CX X) - DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH - GRAYHEIGHT GRAYBASE NBITS))) - (T (.WHILE.TOP.DS. DISPLAYSTREAM (\FILLCIRCLEBLT CX CY X Y)) - (SETQ Y (SUB1 Y)) - (GO LP))) - (MOVETO CENTERX CENTERY DISPLAYSTREAM) - (RETURN NIL]) - -(\LINEBLT - [LAMBDA (BBT X Y XRIGHT DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH GRAYHEIGHT - GRAYBASE NBITS) (* kbr%: "15-Feb-86 22:08") - - (* ;; "fills in the changing fields of a bit blt tablt to draw one line of aan area.") - - (PROG NIL - (COND - ((ILESSP X LEFT) - (SETQ X LEFT))) - (COND - ((IGREATERP XRIGHT RIGHT) - (SETQ XRIGHT RIGHT))) - (COND - ((OR (IGREATERP X XRIGHT) - (IGREATERP Y TOP) - (IGREATERP BOTTOM Y)) - (RETURN))) - (replace (PILOTBBT PBTDEST) of BBT with (\ADDBASE DESTINATIONBASE - (ITIMES RASTERWIDTH Y))) - [freplace (PILOTBBT PBTSOURCE) of BBT with (\ADDBASE GRAYBASE - (freplace (PILOTBBT - PBTGRAYOFFSET) - of BBT - with (MOD Y GRAYHEIGHT - ] - (SELECTQ NBITS - (1 (freplace (PILOTBBT PBTDESTBIT) of BBT with X) - (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) - (freplace (PILOTBBT PBTWIDTH) of BBT with (ADD1 (IDIFFERENCE XRIGHT X)))) - (4 (* ; - "color case, shift x values {which are in pixels} into bit values.") - (freplace (PILOTBBT PBTDESTBIT) of BBT with (SETQ X (LLSH X 2))) - (* ; - "if TEXTURE is not a multiple of nbits wide this is probably garbage.") - (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) - (freplace (PILOTBBT PBTWIDTH) of BBT with (IDIFFERENCE - (LLSH (ADD1 XRIGHT) - 2) - X))) - (8 (* ; - "color case, shift x values {which are in pixels} into bit values.") - (freplace (PILOTBBT PBTDESTBIT) of BBT with (SETQ X (LLSH X 3))) - (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) - (freplace (PILOTBBT PBTWIDTH) of BBT with (IDIFFERENCE - (LLSH (ADD1 XRIGHT) - 3) - X))) - (24 (* ; - "color case, shift x values {which are in pixels} into bit values.") - (freplace (PILOTBBT PBTDESTBIT) of BBT with (SETQ X (ITIMES 24 X))) - (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) - (freplace (PILOTBBT PBTWIDTH) of BBT with (IDIFFERENCE - (ITIMES 24 (ADD1 XRIGHT)) - X))) - (SHOULDNT)) - (\PILOTBITBLT BBT 0]) -) - - - -(* ; "making and copying bitmaps") - -(DEFINEQ - -(SCREENBITMAP - [LAMBDA (SCREEN) (* ; "Edited 20-Feb-87 14:57 by rrb") - - (* ;; "Return bitmap destination of SCREEN.") - - (COND - ((NULL SCREEN) - ScreenBitMap) - ((type? SCREEN SCREEN) - (fetch (SCREEN SCDESTINATION) of SCREEN)) - ((WINDOWP SCREEN) - (fetch (SCREEN SCDESTINATION) of (fetch (WINDOW SCREEN) of SCREEN))) - (T (\ILLEGAL.ARG SCREEN]) - -(BITMAPP - [LAMBDA (X) (* rrb "25-JUN-82 15:21") - (* ; "is x a bitmap?") - (AND (type? BITMAP X) - X]) - -(BITMAPHEIGHT - [LAMBDA (BITMAP) (* kbr%: " 8-Jul-85 16:01") - - (* ;; "returns the height in pixels of a bitmap.") - - (COND - ((type? BITMAP BITMAP) - (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) - ((type? WINDOW BITMAP) - (WINDOWPROP BITMAP 'HEIGHT)) - (T (\ILLEGAL.ARG BITMAP]) - -(BITSPERPIXEL - [LAMBDA (BITMAP) (* ; "Edited 15-Feb-94 16:10 by nilsson") - - (* ;; "returns the height in pixels of a bitmap.") - - (COND - ((type? BITMAP BITMAP) - (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP)) - ((type? SCREEN BITMAP) - - (* ;; "Read the propper slots, not the implicit bitmap.") - - (OR (fetch (SCREEN SCDEPTH) of BITMAP) - (fetch (SCREEN SCBITSPERPIXEL) of BITMAP))) - ((type? WINDOW BITMAP) - (BITSPERPIXEL (fetch (WINDOW SCREEN) of BITMAP))) - ((ARRAYP BITMAP) (* ; - "Consider array to be a colormap.") - (SELECTQ (ARRAYSIZE BITMAP) - (256 8) - (16 4) - (LISPERROR "ILLEGAL ARG" BITMAP))) - (T (LISPERROR "ILLEGAL ARG" BITMAP]) -) -(* "FOLLOWING DEFINITIONS EXPORTED")(PUTDEF (QUOTE BITMAPS) (QUOTE FILEPKGCOMS) '[(COM - MACRO - (X (VARS . X]) -(PUTDEF (QUOTE CURSORS) (QUOTE FILEPKGCOMS) '[(COM MACRO (X (E (MAPC 'X 'PRINTCURSOR]) - -(* "END EXPORTED DEFINITIONS") - -(DECLARE%: EVAL@COMPILE -(* "FOLLOWING DEFINITIONS EXPORTED") -(ADDTOVAR GLOBALVARS SCREENHEIGHT SCREENWIDTH ScreenBitMap) - -(* "END EXPORTED DEFINITIONS") - -) - - - -(* ; "Display stream functions that are not needed in the primitive system") - -(DEFINEQ - -(DSPFILL - [LAMBDA (REGION TEXTURE OPERATION STREAM) (* kbr%: " 8-Jul-85 15:40") - - (* ;; "wipes a region of an imagestream with texture.") - - (* ;; "TEXTURE and OPERATION default to those of STREAM") - - (PROG (STRM) - (SETQ STRM (\OUTSTREAMARG STREAM)) - (OR REGION (SETQ REGION (DSPCLIPPINGREGION NIL STRM))) - (RETURN (BLTSHADE TEXTURE STRM (fetch (REGION LEFT) of REGION) - (fetch (REGION BOTTOM) of REGION) - (fetch (REGION WIDTH) of REGION) - (fetch (REGION HEIGHT) of REGION) - OPERATION]) - -(INVERTW - [LAMBDA (WIN SHADE) (* rrb "18-May-84 21:52") - - (* ;; "inverts a window and returns the window. Used in RESETFORMS.") - - (DSPFILL (DSPCLIPPINGREGION NIL WIN) - (OR SHADE BLACKSHADE) - 'INVERT WIN) - WIN]) -) -(DEFINEQ - -(\DSPCOLOR.DISPLAY - [LAMBDA (STREAM COLOR) (* ; "Edited 29-Jan-91 11:33 by matsuda") - - (* ;; "sets and returns a display stream's background color.") - - (PROG (DD COLORCELL DESTINATION BITSPERPIXEL) - (SETQ DD (\GETDISPLAYDATA STREAM)) - (SETQ COLORCELL (fetch (\DISPLAYDATA DDCOLOR) of DD)) - (SETQ DESTINATION (fetch (\DISPLAYDATA DDDestination) of DD)) - (SETQ BITSPERPIXEL (BITSPERPIXEL DESTINATION)) - (RETURN (COND - (COLOR (SETQ COLOR (COLORNUMBERP COLOR BITSPERPIXEL)) - (PROG1 (COND - (COLORCELL (PROG1 (CAR COLORCELL) - (RPLACA COLORCELL COLOR))) - (T (* ; "no color cell yet, make one.") - (replace (\DISPLAYDATA DDCOLOR) of DD - with (CONS COLOR 0)) - (MAXIMUMCOLOR BITSPERPIXEL))) - (\SFFixFont STREAM DD))) - (T (OR (CAR COLORCELL) - (MAXIMUMCOLOR BITSPERPIXEL]) - -(\DSPBACKCOLOR.DISPLAY - [LAMBDA (STREAM COLOR) (* kbr%: "25-Aug-85 18:15") - - (* ;; "sets and returns a display stream's foreground color.") - - (PROG (DD COLORCELL DESTINATION BITSPERPIXEL) - (SETQ DD (\GETDISPLAYDATA STREAM)) - (SETQ COLORCELL (fetch (\DISPLAYDATA DDCOLOR) of DD)) - (RETURN (COND - (COLOR (SETQ DESTINATION (fetch (\DISPLAYDATA DDDestination) of DD)) - (SETQ BITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) of - DESTINATION - )) - (SETQ COLOR (COLORNUMBERP COLOR BITSPERPIXEL)) - (PROG1 (COND - (COLORCELL (PROG1 (CDR COLORCELL) - (RPLACD COLORCELL COLOR))) - (T (* ; "no color cell yet, make one.") - (replace (\DISPLAYDATA DDCOLOR) of DD - with (CONS (MAXIMUMCOLOR BITSPERPIXEL) - COLOR)) - 0)) - (\SFFixFont STREAM DD))) - (T (OR (CDR COLORCELL) - 0]) - -(DSPEOLFN - [LAMBDA (EOLFN DISPLAYSTREAM) (* rrb "18-May-84 21:44") - - (* ;; "sets the end of line function for a displaystream. EOLFN will be called every EOL with the argument of the display stream. If EOLFN is 'OFF, the eolfn is cleared.") - - (PROG ((DD (\GETDISPLAYDATA DISPLAYSTREAM))) - (RETURN (PROG1 (COND - ((fetch (\DISPLAYDATA DDEOLFN) of DD)) - (T 'OFF)) - [AND EOLFN (COND - [(LITATOM EOLFN) - (replace (\DISPLAYDATA DDEOLFN) of DD - with (COND - ((EQ EOLFN 'OFF) - NIL) - (T EOLFN] - (T (\ILLEGAL.ARG EOLFN])]) -) -(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE - -(RPAQQ BLACKSHADE 65535) - -(RPAQQ WHITESHADE 0) - - -(CONSTANTS (BLACKSHADE 65535) - (WHITESHADE 0)) -) - -(RPAQQ GRAYSHADE 43605) - -(ADDTOVAR GLOBALVARS GRAYSHADE) - -(* "END EXPORTED DEFINITIONS") - -(DECLARE%: EVAL@COMPILE - -(PUTPROPS DSPRUBOUTCHAR MACRO ((DS CHAR X Y TTBL) - (\DSPMOVELR DS CHAR X Y TTBL NIL T))) -) -(DEFINEQ - -(DSPCLEOL - [LAMBDA (DISPLAYSTREAM XPOS YPOS HEIGHT) (* lmm " 3-May-84 10:31") - (\CHECKCARET DISPLAYSTREAM) - (PROG ((DD (\GETDISPLAYDATA DISPLAYSTREAM DISPLAYSTREAM))) - (RETURN (BITBLT NIL NIL NIL DISPLAYSTREAM (OR (FIXP XPOS) - (SETQ XPOS (ffetch DDLeftMargin - of DD))) - [OR (FIXP YPOS) - (IDIFFERENCE (ffetch DDYPOSITION of DD) - (FONTPROP DISPLAYSTREAM 'DESCENT] - (IMAX 0 (IDIFFERENCE (ffetch DDRightMargin of DD) - XPOS)) - (OR (FIXP HEIGHT) - (IMINUS (ffetch DDLINEFEED of DD))) - 'TEXTURE - 'REPLACE]) - -(DSPRUBOUTCHAR - [LAMBDA (STREAM CHAR X Y TTBL) (* Pavel " 6-Oct-86 22:44") - (if (DISPLAYSTREAMP CHAR) - then - - (* ;; "Some older code may use the CHAR argument first.") - - (swap STREAM CHAR) - (SETQ TTBL X) - (SETQ X) - (SETQ Y)) - (\GETDISPLAYDATA STREAM STREAM) - (\DSPMOVELR STREAM CHAR X Y TTBL NIL T]) - -(\DSPMOVELR - [LAMBDA (DS CHAR X Y TTBL RIGHTWARDSFLG ERASEFLG) (* JonL " 7-May-84 02:47") - - (* ;; "Moves the cursor 'leftwards' (or 'rightwards' if RIGHTWARDSFLG is non-null) over any main character and control or meta indicators. Returns NIL if the move can't be determined, such as trying to move left when already at the left margin. Effaces (or 'Rubs out') any bits moved over if ERASEFLG is non-null.") - - ([LAMBDA (DD) - - (* ;; - "Must do the \GETDISPLAYDATA first, since it may reset DS when it coerces to a DISPLAYSTREAM") - - (PROG [(WIDTH (\STREAMCHARWIDTH (COND - ((CHARCODEP CHAR) - CHAR) - (T (CHARCODE M))) - DS TTBL)) - (DEFAULTPOS? (AND (NULL X) - (NULL Y] - (OR ERASEFLG DEFAULTPOS? (SHOULDNT)) (* ; - "CURSORLEFT and CURSORRIGHT commands aren't allowed to start from anywhere except current spot") - - (* ;; "Note that if CHAR is not specified and DS has a variable-pitch font, then the results may be somewhat random. Smart terminal drivers thus can work well only on fixed-pitch fonts.") - - (COND - ((NULL WIDTH) - (RETURN)) - ((EQ 0 WIDTH) (* ; "Ha, what an easy case") - (RETURN T))) - (OR (FIXP X) - (SETQ X (ffetch DDXPOSITION of DD))) - (OR (FIXP Y) - (SETQ Y (ffetch DDYPOSITION of DD))) - (COND - ([COND - (RIGHTWARDSFLG (IGREATERP (add X WIDTH) - (ffetch DDRightMargin of DD))) - (T (ILESSP (add X (IMINUS WIDTH)) - (ffetch DDLeftMargin of DD] - (* ; - "If we can't do the full backup, then return NIL to signal this fact") - (RETURN))) - (\CHECKCARET DS) (* ; - "Take down the caret, if there is one, just in case we are moving over it.") - [COND - (ERASEFLG (* ; "And do the erasure if requested") - ([LAMBDA (FONT) - (PROG ((YPRIME (IDIFFERENCE Y (FONTDESCENT FONT))) - (HEIGHT (FONTHEIGHT FONT))) - (COND - ((NOT DEFAULTPOS?) - (MOVETO X Y DS) (* ; - "Backup over the bits, and 'wipe' them out.") - )) - (BITBLT NIL 0 0 DS X YPRIME WIDTH HEIGHT 'TEXTURE 'REPLACE) - (* ; "wipe out some bits") - ] - (ffetch DDFONT of DD] - (DSPXPOSITION X DS) (* ; "Now do the move.") - (RETURN T] - (\GETDISPLAYDATA DS DS]) -) - - - -(* ; "for cursor") - - -(RPAQQ \DefaultCursor #*(16 16)H@@@L@@@N@@@O@@@OH@@OL@@ON@@O@@@MH@@IH@@@L@@@L@@@F@@@F@@@C@@@C@@) -(DEFINEQ - -(\CURSOR.DEFPRINT - [LAMBDA (CURSOR STREAM) (* ; "Edited 15-Sep-94 16:13 by sybalsky") - (COND - (*PRINT-ARRAY* (PRIN1 "#,(LET(image) (CURSORCREATE (SETQ image '" STREAM) - (PRIN4 (fetch (CURSOR CUIMAGE) of CURSOR) - STREAM) - (PRIN1 ") " STREAM) - (COND - ((EQ (fetch (CURSOR CUIMAGE) of CURSOR) - (fetch (CURSOR CUMASK) of CURSOR)) - (PRIN1 " image " STREAM)) - (T (PRIN1 " '" STREAM) - (PRIN4 (fetch (CURSOR CUMASK) of CURSOR) - STREAM))) - (PRIN1 " " STREAM) - (PRIN1 (fetch (CURSOR CUHOTSPOTX) of CURSOR) - STREAM) - (PRIN1 " " STREAM) - (PRIN1 (fetch (CURSOR CUHOTSPOTY) of CURSOR) - STREAM) - (PRIN1 " " STREAM) - (PRIN1 (fetch (CURSOR CUDATA) of CURSOR) - STREAM) - (PRIN1 "))" STREAM]) -) -(DECLARE%: DONTEVAL@LOAD DOCOPY - -(RPAQ? DEFAULTCURSOR (CURSORCREATE \DefaultCursor NIL 0 15)) - - -(COND - ((NULL \CURRENTCURSOR) - (SETQ \CURRENTCURSOR DEFAULTCURSOR))) - -(DEFPRINT 'CURSOR '\CURSOR.DEFPRINT) -) -(DECLARE%: DONTCOPY -(DECLARE%: DOEVAL@COMPILE DONTCOPY - -(GLOBALVARS DEFAULTCURSOR) -) -) - - - -(* ; "stuff to interpret colors as textures which is needed even in system that don't have color.") - -(DEFINEQ - -(TEXTUREOFCOLOR - [LAMBDA (COLOR NOERRORFLG) (* rrb "30-Oct-85 19:43") - - (* ;; "returns a texture to represent a color on a black and white display") - - (PROG ((RGB (INSURE.RGB.COLOR COLOR NOERRORFLG))) - (RETURN (COND - ((NULL RGB) - NIL) - ((AND (IGREATERP (fetch (RGB RED) of RGB) - 245) - (IGREATERP (fetch (RGB GREEN) of RGB) - 245) - (IGREATERP (fetch (RGB BLUE) of RGB) - 245)) (* ; "special case white") - BLACKSHADE16) - (T (PROG [(TEX (\PRIMARYTEXTURE 'RED (fetch (RGB RED) of RGB] - (BITBLT NIL NIL NIL TEX 0 0 16 16 'TEXTURE 'PAINT - (\PRIMARYTEXTURE 'BLUE (fetch (RGB BLUE) of RGB))) - (BITBLT NIL NIL NIL TEX 0 0 16 16 'TEXTURE 'PAINT - (\PRIMARYTEXTURE 'GREEN (fetch (RGB GREEN) of RGB))) - (RETURN TEX]) - -(\PRIMARYTEXTURE - [LAMBDA (PRIMARY LEVEL) (* rrb "30-Oct-85 19:25") - - (* ;; "returns the 16x16 texture for a primary color level.") - - (PROG [(TEXTURE (BITMAPCOPY (SELECTQ PRIMARY - (RED REDTEXTURE) - (BLUE BLUETEXTURE) - (GREEN GREENTEXTURE) - (\ILLEGAL.ARG PRIMARY] - (BITBLT (\LEVELTEXTURE LEVEL) - 0 0 TEXTURE 0 0 16 16 'INPUT 'ERASE) - (RETURN TEXTURE]) - -(\LEVELTEXTURE - [LAMBDA (LEVEL) (* rrb "20-Aug-85 16:42") - - (* ;; "returns a 16x16 texture which is merged so that only light bits on both go to light with a primary color pattern to get a level primary pattern.") - - (COND - ((ILESSP LEVEL 100) - BLACKSHADE16) - ((ILESSP LEVEL 150) - DARKGRAY16) - ((ILESSP LEVEL 200) - MEDIUMGRAY16) - ((ILESSP LEVEL 245) - LIGHTGRAY16) - (T WHITESHADE16]) - -(INSURE.B&W.TEXTURE - [LAMBDA (TEXTURE NOERRORFLG) (* rrb "30-Oct-85 19:47") - - (* ;; "coerces a TEXTURE argument to a 1 bit per pixel bitmap or small number") - - (SELECTQ (TYPENAME TEXTURE) - (LITATOM (* ; "includes NIL case") - (COND - (TEXTURE (* ; "should be a color name") - (TEXTUREOFCOLOR (INSURE.RGB.COLOR TEXTURE NOERRORFLG))) - (T WHITESHADE))) - ((SMALLP FIXP) - (LOGAND TEXTURE BLACKSHADE)) - (BITMAP TEXTURE) - (LISTP (* ; - "can be a list of (TEXTURE COLOR) or a list of levels rgb or hls.") - (COND - ((TEXTUREOFCOLOR TEXTURE T)) - ((CAR TEXTURE) - (INSURE.B&W.TEXTURE (CAR TEXTURE) - NOERRORFLG)) - ((CAR (LISTP (CDR TEXTURE))) - (TEXTUREOFCOLOR (CADR TEXTURE) - NOERRORFLG)) - (T (* ; "list of form (NIL NIL)") - WHITESHADE))) - (COND - ((NULL NOERRORFLG) - (\ILLEGAL.ARG TEXTURE]) - -(INSURE.RGB.COLOR - [LAMBDA (COLOR NOERRFLG) (* rrb "30-Oct-85 19:34") - (* ; - "returns the RGB triple for a color.") - (PROG (LEVELS) - (RETURN (COND - [(FIXP COLOR) (* ; - "don't know what to do with color numbers so error") - (COND - (NOERRFLG NIL) - (T (\ILLEGAL.ARG COLOR] - [(LITATOM COLOR) - (COND - ((SETQ LEVELS (\LOOKUPCOLORNAME COLOR)) - (* ; - "recursively look up color number") - (INSURE.RGB.COLOR (CDR LEVELS) - NOERRFLG)) - (NOERRFLG NIL) - (T (ERROR "Unknown color name" COLOR] - ((HLSP COLOR) (* ; "HLS form convert to RGB") - (HLSTORGB COLOR)) - ((RGBP COLOR) (* ; "check for RGB or HLS") - COLOR) - (NOERRFLG NIL) - (T (\ILLEGAL.ARG COLOR]) - -(\LOOKUPCOLORNAME - [LAMBDA (COLORNAME) (* rrb "13-DEC-82 13:14") - - (* ;; "looks up a prospective color name. Returns a list whose CAR is the name and whose CDR is a color spec.") - - (FASSOC COLORNAME COLORNAMES]) - -(RGBP - [LAMBDA (X) (* rrb "27-OCT-82 10:15") - (* ; - "return X if it is a red green blue triple.") - (PROG (TMP) - (RETURN (AND (LISTP X) - (SMALLP (SETQ TMP (CAR X))) - (IGREATERP TMP -1) - (IGREATERP 256 TMP) - (SMALLP (SETQ TMP (CADR X))) - (IGREATERP TMP -1) - (IGREATERP 256 TMP) - (SMALLP (SETQ TMP (CADDR X))) - (IGREATERP TMP -1) - (IGREATERP 256 TMP) - X]) - -(HLSP - [LAMBDA (X) (* rrb "31-Oct-85 10:51") - - (* ;; "return T if X is a hue lightness saturation triple.") - - (AND (NUMBERP (CAR (LISTP X))) - (IGREATERP (CAR X) - -1) - (IGREATERP 361 (CAR X)) - [FLOATP (CAR (LISTP (CDR X] - [FLOATP (CAR (LISTP (CDDR X] - X]) - -(HLSTORGB - [LAMBDA (HLS) (* rrb "30-Oct-85 19:59") - - (* ;; "converts from a hue saturation lightness triple into red green blue triple. HUE is in range 0 to 360, lightness and saturation are in the range 0 to 1.0") - - (* ;; "this algorithm was taken from siggraph vol 13 number 3 August 1979: Status report on graphics standards planning committee.") - - (PROG ((H (fetch (HLS HUE) of HLS)) - (L (fetch (HLS LIGHTNESS) of HLS)) - (S (fetch (HLS SATURATION) of HLS)) - Max Min) - [SETQ Max (COND - ((FGREATERP 0.5 L) - (FTIMES L (FPLUS 1.0 S))) - (T (FDIFFERENCE (FPLUS L S) - (FTIMES L S] - (SETQ Min (FDIFFERENCE (FTIMES L 2) - Max)) - (RETURN (create RGB - RED _ (\HLSVALUEFN Min Max H) - GREEN _ (\HLSVALUEFN Min Max (IDIFFERENCE H 120)) - BLUE _ (\HLSVALUEFN Min Max (IDIFFERENCE H 240]) - -(\HLSVALUEFN - [LAMBDA (MIN MAX HUE) (* rrb "25-OCT-82 10:47") - - (* ;; "internal value function for converting from HLS to RGB.") - - [COND - ((ILESSP HUE 0) - (SETQ HUE (IPLUS HUE 360] - (FIX (FTIMES (COND - ((ILESSP HUE 60) - (FPLUS MIN (FQUOTIENT (FTIMES (FDIFFERENCE MAX MIN) - HUE) - 60))) - ((ILESSP HUE 180) - MAX) - ((ILESSP HUE 240) - (FPLUS MIN (FQUOTIENT (FTIMES (FDIFFERENCE MAX MIN) - (FDIFFERENCE 240 HUE)) - 60))) - (T MIN)) - 255]) -) - -(RPAQQ COLORNAMES - ((WHITE 255 255 255) - (CYAN 0 255 255) - (MAGENTA 255 0 255) - (YELLOW 255 255 0) - (RED 255 0 0) - (GREEN 0 255 0) - (BLUE 0 0 255) - (BLACK 0 0 0))) -(DECLARE%: DOEVAL@COMPILE DONTCOPY - -(GLOBALVARS COLORNAMES) -) -(DECLARE%: DONTCOPY -(DECLARE%: DOEVAL@COMPILE DONTCOPY - -(GLOBALVARS BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 WHITESHADE16 REDTEXTURE GREENTEXTURE - BLUETEXTURE) -) -) - -(READVARS-FROM-STRINGS '(BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 WHITESHADE16 REDTEXTURE - GREENTEXTURE BLUETEXTURE) - "({(READBITMAP)(16 16 -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%" -%"OOOO%")} {(READBITMAP)(16 16 -%"NMGG%" -%"KGMM%" -%"MNKK%" -%"GKNN%" -%"MNKK%" -%"GKNM%" -%"NMGN%" -%"KGMG%" -%"NKKM%" -%"KNNK%" -%"GGMN%" -%"MMGG%" -%"GGKM%" -%"MJOG%" -%"NOEK%" -%"KMNN%")} {(READBITMAP)(16 16 -%"JJJJ%" -%"EEEE%" -%"JJJJ%" -%"EEEE%" -%"JJJJ%" -%"EEEE%" -%"JJJJ%" -%"EEEE%" -%"JJJJ%" -%"EEEE%" -%"JJJJ%" -%"EEEE%" -%"JJJJ%" -%"EEEE%" -%"JJJJ%" -%"EEEE%")} {(READBITMAP)(16 16 -%"HBDB%" -%"BHAA%" -%"DDHD%" -%"AABH%" -%"HHDA%" -%"BBAD%" -%"DDHB%" -%"AABH%" -%"HDAD%" -%"AADA%" -%"DHBH%" -%"BBHB%" -%"HHAD%" -%"ABDA%" -%"DDHH%" -%"BABB%")} {(READBITMAP)(16 16 -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%" -%"@@@@%")} {(READBITMAP)(16 16 -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%" -%"LLLL%")} {(READBITMAP)(16 16 -%"CLCL%" -%"O@O@%" -%"LCLC%" -%"@O@O%" -%"CLCL%" -%"O@O@%" -%"LCLC%" -%"@O@O%" -%"CLCL%" -%"O@O@%" -%"LCLC%" -%"@O@O%" -%"CLCL%" -%"O@O@%" -%"LCLC%" -%"@O@O%")} {(READBITMAP)(16 16 -%"LFGA%" -%"NCCH%" -%"GAIL%" -%"CHLN%" -%"ALFG%" -%"HNCC%" -%"LGAI%" -%"NCHL%" -%"GALF%" -%"CHNC%" -%"ILGA%" -%"LNCH%" -%"FGAL%" -%"CCHN%" -%"AILG%" -%"HLNC%")}) -") -(DECLARE%: DONTCOPY -(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE - -(RECORD HLS (HUE LIGHTNESS SATURATION)) - -(RECORD RGB (RED GREEN BLUE)) -) - -(* "END EXPORTED DEFINITIONS") - -) -(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS - -(ADDTOVAR NLAMA ) - -(ADDTOVAR NLAML ) - -(ADDTOVAR LAMA UNIONREGIONS INTERSECTREGIONS) -) -(PUTPROPS ADISPLAY COPYRIGHT ("Venue & Xerox Corporation" 1982 1983 1984 1985 1986 1987 1988 1990 1991 - 1993 1994 2021)) -(DECLARE%: DONTCOPY - (FILEMAP (NIL (12479 20536 (\BBTCURVEPT 12489 . 20534)) (20537 30595 (CREATETEXTUREFROMBITMAP 20547 . -22579) (PRINTBITMAP 22581 . 23910) (PRINT-BITMAPS-NICELY 23912 . 27929) (PRINTCURSOR 27931 . 28878) ( -\WRITEBITMAP 28880 . 30593)) (30638 33184 (\GETINTEGERPART 30648 . 32191) (\CONVERTTOFRACTION 32193 . -33182)) (33321 34207 (CURSORP 33331 . 33550) (CURSORBITMAP 33552 . 33598) (CreateCursorBitMap 33600 . -34205)) (38573 48435 (CARET 38583 . 40331) (\CARET.CREATE 40333 . 40511) (\CARET.DOWN 40513 . 41966) ( -\CARET.FLASH? 41968 . 43865) (\CARET.SHOW 43867 . 44623) (CARETRATE 44625 . 45283) (\CARET.FLASH.AGAIN - 45285 . 46560) (\CARET.FLASH.MULTIPLE 46562 . 47094) (\CARET.FLASH 47096 . 48433)) (48436 53536 ( -\MEDW.CARET.SHOW 48446 . 53534)) (53900 55731 (\AREAVISIBLE? 53910 . 54832) (\REGIONOVERLAPAREAP 54834 - . 55377) (\AREAINREGIONP 55379 . 55729)) (55780 71837 (CREATEREGION 55790 . 56126) (REGIONP 56128 . -56274) (INTERSECTREGIONS 56276 . 60099) (UNIONREGIONS 60101 . 63301) (REGIONSINTERSECTP 63303 . 63911) - (SUBREGIONP 63913 . 64558) (EXTENDREGION 64560 . 67780) (EXTENDREGIONBOTTOM 67782 . 68587) ( -EXTENDREGIONLEFT 68589 . 69292) (EXTENDREGIONRIGHT 69294 . 69931) (EXTENDREGIONTOP 69933 . 70559) ( -INSIDEP 70561 . 71329) (STRINGREGION 71331 . 71835)) (72082 78471 (\BRUSHBITMAP 72092 . 73816) ( -\GETBRUSH 73818 . 74129) (\GETBRUSHBBT 74131 . 76894) (\InitCurveBrushes 76896 . 78335) ( -\BrushFromWidth 78337 . 78469)) (78472 81537 (\MAKEBRUSH.DIAGONAL 78482 . 78762) ( -\MAKEBRUSH.HORIZONTAL 78764 . 79158) (\MAKEBRUSH.VERTICAL 79160 . 79472) (\MAKEBRUSH.SQUARE 79474 . -79751) (\MAKEBRUSH.ROUND 79753 . 81535)) (81538 82650 (INSTALLBRUSH 81548 . 82648)) (83051 87935 ( -\DRAWLINE.DISPLAY 83061 . 86650) (RELMOVETO 86652 . 87039) (MOVETOUPPERLEFT 87041 . 87933)) (87936 -111678 (\CLIPANDDRAWLINE 87946 . 94515) (\CLIPANDDRAWLINE1 94517 . 106387) (\CLIPCODE 106389 . 107763) - (\LEASTPTAT 107765 . 108363) (\GREATESTPTAT 108365 . 108993) (\DRAWLINE1 108995 . 110119) ( -\DRAWLINE.UFN 110121 . 111676)) (117836 164835 (\DRAWCIRCLE.DISPLAY 117846 . 126714) (\DRAWARC.DISPLAY - 126716 . 127006) (\DRAWARC.GENERIC 127008 . 127827) (\COMPUTE.ARC.POINTS 127829 . 130330) ( -\DRAWELLIPSE.DISPLAY 130332 . 145997) (\DRAWCURVE.DISPLAY 145999 . 148368) (\DRAWPOINT.DISPLAY 148370 - . 149455) (\DRAWPOLYGON.DISPLAY 149457 . 153399) (\LINEWITHBRUSH 153401 . 164833)) (164836 198066 ( -LOADPOLY 164846 . 165406) (PARAMETRICSPLINE 165408 . 175677) (\CURVE 175679 . 182223) (\CURVE2 182225 - . 194049) (\CURVEEND 194051 . 194549) (\CURVESLOPE 194551 . 197049) (\CURVESTART 197051 . 197375) ( -\FDIFS/FROM/DERIVS 197377 . 198064)) (208033 223185 (\FILLCIRCLE.DISPLAY 208043 . 219241) (\LINEBLT -219243 . 223183)) (223229 225285 (SCREENBITMAP 223239 . 223712) (BITMAPP 223714 . 223948) ( -BITMAPHEIGHT 223950 . 224326) (BITSPERPIXEL 224328 . 225283)) (225926 226919 (DSPFILL 225936 . 226619) - (INVERTW 226621 . 226917)) (226920 230721 (\DSPCOLOR.DISPLAY 226930 . 228223) (\DSPBACKCOLOR.DISPLAY -228225 . 229754) (DSPEOLFN 229756 . 230719)) (231162 235940 (DSPCLEOL 231172 . 232118) (DSPRUBOUTCHAR -232120 . 232558) (\DSPMOVELR 232560 . 235938)) (236070 237184 (\CURSOR.DEFPRINT 236080 . 237182)) ( -237596 246218 (TEXTUREOFCOLOR 237606 . 238868) (\PRIMARYTEXTURE 238870 . 239452) (\LEVELTEXTURE 239454 - . 239955) (INSURE.B&W.TEXTURE 239957 . 241350) (INSURE.RGB.COLOR 241352 . 242832) (\LOOKUPCOLORNAME -242834 . 243104) (RGBP 243106 . 243869) (HLSP 243871 . 244246) (HLSTORGB 244248 . 245388) (\HLSVALUEFN - 245390 . 246216))))) -STOP diff --git a/sources/ADISPLAY.LCOM b/sources/ADISPLAY.LCOM index 997d6bedd810af1e163589af0848b5122d74bffe..b01836efc417c0682410755f0705b1cfd9f7d359 100644 GIT binary patch delta 2154 zcmb7FOKcle6t!KeBq^~bj+KT$!^2Ig1QE+`ex9))^4K%>Og#3pJd=b-Mrn&9(j+A) zutBu)f^OK6MwA6&!$+b*DmGRY6s5CZ<1DgZ7w@}dk*ryiJHNyURH9zY+_~@0Ip?1H z{O0?I;Xj+ zTkS1MBoc8{zwrsc|JU0rj!*wDna`6o#Uq;IIDtm#oGO(IiZNpnG%&RwRShJ`no-fE zr5q_4JKKMazB7%|m8!C!k$GcA23P)N3Y|)`VjK-Tk1oiy)liFVU0Th4z*yi%?&e>m+vE9=D2m ztj{Wv=)t5_Y>?Q&#IR~h2@JP_PYLBfbeAI*iPp=<+g6!Gy2~Th8W}lm?~w>VY_HuT zF*`eI6&+?m*??|1Vxzj@=)nY70EIajE@zC0_(nAL$D41xaQ`PwMV_>tz3F2O4FxmT z?M9B;vDJ)Y`r_DY4>GQ2>VDr+-I>h&R^X8()fx0de_&@&m~ZU9q`sI8P3^?h&eip< z+L=&0lk43~Au>2`OExq`qTXyMORpDUG(|#nVZ>`N6X@w1LX}`PpO@_Hh~MBTXZWxTE4fo% zPv~I-rb=~{-SGMs4BG8;w|4%8O(9X=6*59%y`G#jMg87-HXWD}F^_6FU8_iCS*}Wr zMO`Z^NDwiqX}YcyBt0Qj3rJuw%4_ddk$`D8NC~1Buu0_pUsXjbs3uA=G%Aq=1&$0} zWZWV?#d-lJoUP_rx<|l*1@LX$HV9%<@9GqEaaWR`Z zD?J5b0Jd?8%Wz058}n5q;YtBZY)KV3wFLnqr79UPgA@Z*3rf{Q0?(p~q?IA!SX5Qu z_{~897EsMQjN#msP)g*^CU_C3{fdTN!VAgMjFWI$EM!ZFPx2l!Ckj3@2UB*LIcURY z=Gb%09Nj}?!*ci>4=XmnZeNRC!lrCFvEmkL=qBTswgvA)Arl$S9EE&c5St5m$nQ|dSJ2%gt09QjK-MV zyec8#Y@&(rVnF2JX;--E$?#ur_u{wTmH?h~S@J%4-}gT6^L_98`g3>a!{?!Qnm1e4 z4W(o&lB>u-u_*O$vz_7?js=#_GboP)3TCOr&RTb+)oehg4HU#*$jaKs|qJ_fJ%0_ByYw9k`B>$pi^Fk)iGZZ{sZ=UkTw|?B|pD#|+ zGzE?N1}=F~6v-BNDjEM5<^L#@$lltyHpwz^;P`AhhhTBJ-d<|9kF*s4jJ}Cr!?F4pwJgO#kv{wcwkB zd&J!Q9-eBXil~=IgDU!@A2qQTIanrWu=`7FkUN}FUmp-|rK~0h_tnT?FY+b~8jnV{ zzh%9?b~LOVQrh9I)no1OwsttPdMx7jQ9@sm#VbA-i_D@7f{ImBTnkW|2d`x4RmqfP zTbeg?QvrkoDC>`HKr9;oF2{ucr;;O1;6s2I@JMPO=h8)8EmmmLk|jq2j^)62kP%h! zz|-LQ73OtUE8257f=y?@Q!PuT{RG2tfkoMn?~IO+v3TRok>LlZo6ek#OA@B6&SU^^o?J6md4O91Ph2O`20Lw@<(*OVf diff --git a/sources/FILESETS b/sources/FILESETS index 3a7290e7..fcd8fe2e 100644 --- a/sources/FILESETS +++ b/sources/FILESETS @@ -1,10 +1,10 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "11-Sep-2022 20:08:31" {DSK}larry>medley>sources>FILESETS.;2 6394 +(FILECREATED "26-Feb-2023 11:25:24" {DSK}larry>il>medley>sources>FILESETS.;2 6410 :CHANGES-TO (VARS EXPORTFILES) - :PREVIOUS-DATE "17-Oct-2021 16:06:59" {DSK}larry>medley>sources>FILESETS.;1) + :PREVIOUS-DATE "11-Sep-2022 20:08:31" {DSK}larry>il>medley>sources>FILESETS.;1) (* ; " @@ -71,7 +71,7 @@ Copyright (c) 1981-1990, 1998, 2021 by Xerox Corporation. LLCHAR LLSTK PMAP LLGC ATBL FILEIO EXTERNALFORMAT LLARITH LLFLOAT FONT LLKEY LLDISPLAY ADISPLAY AINTERRUPT RENAMEMACROS HLDISPLAY WINDOW MACROAUX ADDARITH LLFAULT LLTIMER IMAGEIO PROC XCCS PASSWORDS INTERPRESS HARDCOPY CMLARRAY LLSUBRS LLETHER PUP UFS - DTDECLARE)) + DTDECLARE BIGBITMAP)) (RPAQQ MAKEINITFILES (MAKEINIT MEM I-NEW)) diff --git a/sources/LOADUP-LISP b/sources/LOADUP-LISP index a6cacd14..a2f54a70 100644 --- a/sources/LOADUP-LISP +++ b/sources/LOADUP-LISP @@ -1,10 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) -(FILECREATED "12-Aug-2022 12:29:57" |{DSK}larry>medley>sources>LOADUP-LISP.;2| 5250 +(FILECREATED "27-Feb-2023 17:15:53" |{DSK}larry>il>medley>sources>LOADUP-LISP.;2| 5263 - :CHANGES-TO (VARS LOADUP-LISPCOMS) + :EDIT-BY "lmm" - :PREVIOUS-DATE "13-Jul-2022 14:10:00" |{DSK}larry>medley>sources>LOADUP-LISP.;1|) + :CHANGES-TO (FNS LOADUP-LISP) + + :PREVIOUS-DATE "12-Aug-2022 12:29:57" |{DSK}larry>il>medley>sources>LOADUP-LISP.;1|) (PRETTYCOMPRINT LOADUP-LISPCOMS) @@ -17,10 +19,9 @@ (DEFINEQ (LOADUP-LISP - (LAMBDA NIL (* \; "Edited 13-Jul-2022 14:09 by rmk") + (LAMBDA NIL (* \; "Edited 26-Feb-2023 12:17 by lmm") + (* \; "Edited 13-Jul-2022 14:09 by rmk") (* \; "Edited 4-Mar-2022 19:13 by larry") - (* \; "Edited 2-Mar-2022 16:31 by larry") - (* \; "Edited 28-Feb-2022 15:02 by larry") (* \; "Edited 29-Apr-2021 22:30 by rmk:") (SETQQ COMPILE.EXT LCOM) (MEDLEY-INIT-VARS) (* \; "should be set earlier") @@ -99,6 +100,10 @@ (LOADUP '(CMLSMARTARGS)) (LOADUP '(IMPLICIT-KEY-HASH CLOSURE-CACHE)) + (* |;;| " not sure what this depends on, so putting it here") + + (LOADUP '(BIGBITMAPS)) + (* |;;| "Already enabled, but this time fixes tables that weren't defined in the init") (PACKAGE-ENABLE) @@ -119,5 +124,5 @@ (GLOBALVARS MAKESYSFILENAME MEDLEY-INIT-VARS MEDLEYDIR SYSTEMINITVARS USERRECLST) ) (DECLARE\: DONTCOPY - (FILEMAP (NIL (631 5044 (LOADUP-LISP 641 . 5042))))) + (FILEMAP (NIL (654 5057 (LOADUP-LISP 664 . 5055))))) STOP diff --git a/sources/LOADUP-LISP.LCOM b/sources/LOADUP-LISP.LCOM index 79019e092fdbbe5b24c316425569692d12361ce8..8e01adf6921b2a5f9bc93bd2c7f74f25e296318e 100644 GIT binary patch delta 1058 zcmZ{i!D|yi6vjM(up9?~QZpqGWGEJ1$+1*L9WH(uNH?}zlrcJ~`(nwK6 zjP&MN8N7Qc2wucLpci`)!K>c9E8^XYFHPtK)IEHBy!V*jH#_gc%FmS-x2_YamAl&- z$q@r|TGI2SyrDuy-5K;B?Do1H80>)x%J8WZ)t=qBKj?SYd+q)GC+oXC@jY?zJQ-#| zC55R&^isZ9GKw#cRt^-e!JKBGd2STIaCdJAYPsooFg?Gzx~jsk(|*|PV0*fwpPXb8 zHLGOGuE*_=vzR+L^v}$HM@)`0nq&xhQZS&z9XHmj7AR`3-&dhzS6RKnBQ0(~rd*F; zDz12!SQ1WRdHH`=Z_j2S@g|WJ+sQ}shvB(1_#F)dOYMl8sn_CHQW4)$mk&&xfD^iw z<#8}`bbul6DisZDrCM}h=AZ=b+Q(8k>GPVcJ01S*Uz8M&~Q%fX{ zNF0$kB5_3Gh{O@ZIh(EzWCBALkt|#(@MJ&;ocRb$07!+*Ki4Kk%ayxE>E|0|VjGr=dL@dv~T3Vx!vD}K~#y$(8 zEEtrEx3gC$mTljQd=|zmtc)7@acS~ISTM1$WqTUmibED<6)+4c(&=j#z(8!q3Tw`0 z9p^AlCU$*}Hb+H}zH~<&=)H!7XwW>Tv h{j6L?{jCtx)rFC^7apU2U8tg}i!4FkcNXs^{s3615$yl~ delta 982 zcmZvZ&ubGw6vx@5Y3#NKJy?WN`&=j_=!TuyX`3vfPIjlwn%yMsZhu|W+OBOOO(ac_ zYNR(Wf(VN@@#3G*yIwqb(UW*8{snpyy!lLH2cefQ-+A-qeZIW;G4*lk)tv=Gb>7?7 zsX-|aYMF*bnFcv+v%U9dw;69iy9FBbpE_an+4Y_FUVNju(dir{ca@pLJgC}#?+uF- zEkdyWK_~ttvM1TXa2P2ZBe!Nj@l-E}WHGyEkWmWmkA@NrZY- z2Q|0CgAlwrca|Hv=Y|ct?uU7>8i81G>&v0;;6S9B`t4qGxF}{3!!isF)Uz1V$ymyn zghepHaRXsT^}rQ4QhB4KlQ7jAc^7Ps9(_(_l;k*l<rP2~#}n&7 zDFZt>&iHAwSV{_`uTu*w`8ql~&md>}Ug+~6;=vMrkU4i!8m=7+3=3 Date: Tue, 28 Feb 2023 06:50:17 -0800 Subject: [PATCH 02/25] remake ADISPLY --- sources/ADISPLAY | 4370 +++++++++++++++++++++++++++++++++++++++++ sources/ADISPLAY.LCOM | Bin 71761 -> 70835 bytes 2 files changed, 4370 insertions(+) diff --git a/sources/ADISPLAY b/sources/ADISPLAY index 5f25ddd2..2907ed81 100644 --- a/sources/ADISPLAY +++ b/sources/ADISPLAY @@ -1,3 +1,4373 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED "28-Feb-2023 06:37:11" {DSK}larry>il>medley>sources>ADISPLAY.;2 238362 + + :EDIT-BY "lmm" + + :PREVIOUS-DATE "13-Jun-2021 14:03:35" {DSK}larry>il>medley>sources>ADISPLAY.;1) + + +(* ; " +Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2021 by Venue & Xerox Corporation. +") + +(PRETTYCOMPRINT ADISPLAYCOMS) + +(RPAQQ ADISPLAYCOMS + [(COMS (* ; "COMPILE SUPPORT") + (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) + WINDOW))) + (P (MOVD? 'NILL 'BIGBITMAPP)) + (COMS (* ; "Interlisp-D dependent stuff.") + (EXPORT (RECORDS REGION BITMAP BITMAPWORD POSITION CURSOR MOUSEEVENT SCREENREGION + SCREENPOSITION)) + (SYSRECORDS PILOTBBT \DISPLAYDATA) + (CONSTANTS (BITSPERINTEGER 32)) + (FNS \BBTCURVEPT) + (FNS CREATETEXTUREFROMBITMAP PRINTBITMAP PRINT-BITMAPS-NICELY PRINTCURSOR \WRITEBITMAP) + (P (DEFPRINT 'BITMAP 'PRINT-BITMAPS-NICELY)) + (FNS \GETINTEGERPART \CONVERTTOFRACTION) + (CONSTANTS (INTEGERBITS 12))) + [COMS (* ; "cursor functions not on LLDISPLAY") + (FNS CURSORP CURSORBITMAP CreateCursorBitMap) + (EXPORT (MACROS CURSORBITMAP) + (CONSTANTS (HARDCURSORHEIGHT 16) + (HARDCURSORWIDTH 16)) + (DECLARE%: EVAL@COMPILE (ADDVARS (GLOBALVARS CursorBitMap] + (COMS * CARETCOMS) + (COMS (* ; "Region functions") + (FNS CREATEREGION REGIONP INTERSECTREGIONS UNIONREGIONS REGIONSINTERSECTP SUBREGIONP + EXTENDREGION EXTENDREGIONBOTTOM EXTENDREGIONLEFT EXTENDREGIONRIGHT EXTENDREGIONTOP + INSIDEP STRINGREGION)) + (COMS (* ; "line and spline drawing.") + (COMS (* ; "Brushes and brush initialization") + (GLOBALRESOURCES \BRUSHBBT) + (FNS \BRUSHBITMAP \GETBRUSH \GETBRUSHBBT \InitCurveBrushes \BrushFromWidth) + (FNS \MAKEBRUSH.DIAGONAL \MAKEBRUSH.HORIZONTAL \MAKEBRUSH.VERTICAL + \MAKEBRUSH.SQUARE \MAKEBRUSH.ROUND) + (FNS INSTALLBRUSH) + (VARS \BrushNames) + (INITVARS (KNOWN.BRUSHES NIL) + (\BrushAList NIL)) + (RECORDS BRUSHITEM) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\InitCurveBrushes))) + (DECLARE%: DONTCOPY (GLOBALVARS \BrushAList KNOWN.BRUSHES))) + (* ; "Lines") + (FNS \DRAWLINE.DISPLAY RELMOVETO MOVETOUPPERLEFT) + (FNS \CLIPANDDRAWLINE \CLIPANDDRAWLINE1 \CLIPCODE \LEASTPTAT \GREATESTPTAT \DRAWLINE1 + \DRAWLINE.UFN) + (DECLARE%: DONTCOPY (MACROS .DRAWLINEX. .DRAWLINEY.)) + (* ; "Curves") + (FNS \DRAWCIRCLE.DISPLAY \DRAWARC.DISPLAY \DRAWARC.GENERIC \COMPUTE.ARC.POINTS + \DRAWELLIPSE.DISPLAY \DRAWCURVE.DISPLAY \DRAWPOINT.DISPLAY \DRAWPOLYGON.DISPLAY + \LINEWITHBRUSH) + (FNS LOADPOLY PARAMETRICSPLINE \CURVE \CURVE2 \CURVEEND \CURVESLOPE \CURVESTART + \FDIFS/FROM/DERIVS) + (DECLARE%: DONTCOPY (* ; "Used by drawcurve") + (EXPORT (RECORDS POLYNOMIAL SPLINE))) + (DECLARE%: DONTCOPY (EXPORT (MACROS HALF \FILLCIRCLEBLT)) + (MACROS \CURVEPT .SETUP.FOR.\BBTCURVEPT. \CIRCLEPTS \CURVESMOOTH)) + (FNS \FILLCIRCLE.DISPLAY \LINEBLT)) + [COMS (* ; "making and copying bitmaps") + (FNS SCREENBITMAP BITMAPP BITMAPHEIGHT BITSPERPIXEL) + (EXPORT (FILEPKGCOMS BITMAPS CURSORS)) + (DECLARE%: EVAL@COMPILE (EXPORT (ADDVARS (GLOBALVARS SCREENHEIGHT SCREENWIDTH + ScreenBitMap] + [COMS (* ; + "Display stream functions that are not needed in the primitive system") + (FNS DSPFILL INVERTW) + (FNS \DSPCOLOR.DISPLAY \DSPBACKCOLOR.DISPLAY DSPEOLFN) + (EXPORT (CONSTANTS (BLACKSHADE 65535) + (WHITESHADE 0)) + (VARS (GRAYSHADE 43605)) + (ADDVARS (GLOBALVARS GRAYSHADE))) + (MACROS DSPRUBOUTCHAR) + (FNS DSPCLEOL DSPRUBOUTCHAR \DSPMOVELR) + (COMS (* ; "for cursor") + (BITMAPS \DefaultCursor) + (FNS \CURSOR.DEFPRINT) + [DECLARE%: DONTEVAL@LOAD DOCOPY (INITVARS (DEFAULTCURSOR (CURSORCREATE + \DefaultCursor + NIL 0 15))) + (P (COND ((NULL \CURRENTCURSOR) + (SETQ \CURRENTCURSOR DEFAULTCURSOR))) + (DEFPRINT 'CURSOR '\CURSOR.DEFPRINT] + (DECLARE%: DONTCOPY (GLOBALVARS DEFAULTCURSOR] + [COMS (* ; + "stuff to interpret colors as textures which is needed even in system that don't have color.") + (FNS TEXTUREOFCOLOR \PRIMARYTEXTURE \LEVELTEXTURE INSURE.B&W.TEXTURE INSURE.RGB.COLOR + \LOOKUPCOLORNAME RGBP HLSP HLSTORGB \HLSVALUEFN) + (VARS COLORNAMES) + (GLOBALVARS COLORNAMES) + (DECLARE%: DONTCOPY (GLOBALVARS BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 + WHITESHADE16 REDTEXTURE GREENTEXTURE BLUETEXTURE)) + (UGLYVARS BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 WHITESHADE16 REDTEXTURE + GREENTEXTURE BLUETEXTURE) + (DECLARE%: DONTCOPY (* ; "Used by drawcurve") + (EXPORT (RECORDS HLS RGB] + (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) + (NLAML) + (LAMA UNIONREGIONS + INTERSECTREGIONS]) + + + +(* ; "COMPILE SUPPORT") + +(DECLARE%: EVAL@COMPILE DONTCOPY + +(FILESLOAD (LOADCOMP) + WINDOW) +) + +(MOVD? 'NILL 'BIGBITMAPP) + + + +(* ; "Interlisp-D dependent stuff.") + +(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE + +(RECORD REGION (LEFT BOTTOM WIDTH HEIGHT) + LEFT _ -16383 BOTTOM _ -16383 WIDTH _ 32767 HEIGHT _ 32767 + [ACCESSFNS ((TOP (IPLUS (fetch (REGION BOTTOM) of DATUM) + (fetch (REGION HEIGHT) of DATUM) + -1)) + (PTOP (IPLUS (fetch (REGION BOTTOM) of DATUM) + (fetch (REGION HEIGHT) of DATUM))) + (RIGHT (IPLUS (fetch (REGION LEFT) of DATUM) + (fetch (REGION WIDTH) of DATUM) + -1)) + (PRIGHT (IPLUS (fetch (REGION LEFT) of DATUM) + (fetch (REGION WIDTH) of DATUM] + [TYPE? (AND (EQLENGTH DATUM 4) + (EVERY DATUM (FUNCTION NUMBERP] + (SYSTEM)) + +(DATATYPE BITMAP ((BITMAPBASE POINTER) + (BITMAPRASTERWIDTH WORD) + (BITMAPHEIGHT WORD) + (BITMAPWIDTH WORD) + (BITMAPBITSPERPIXEL WORD)) + BITMAPBITSPERPIXEL _ 1 (BLOCKRECORD BITMAP ((BitMapHiLoc WORD) + (BitMapLoLoc WORD)) + (* ; "overlay initial pointer") + ) + (SYSTEM)) + +(BLOCKRECORD BITMAPWORD ((BITS WORD)) + (SYSTEM)) + +(RECORD POSITION (XCOORD . YCOORD) + [TYPE? (AND (LISTP DATUM) + (NUMBERP (CAR DATUM)) + (NUMBERP (CDR DATUM] + (SYSTEM)) + +(DATATYPE CURSOR (CUIMAGE CUMASK CUHOTSPOTX CUHOTSPOTY CUDATA) + [ACCESSFNS ((CUBITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) + of (fetch (CURSOR CUIMAGE) of DATUM] + (SYSTEM)) + +(RECORD MOUSEEVENT (MOUSEX MOUSEY MOUSEBUTTONS KEYBOARD MOUSETIME) + (SYSTEM)) + +(RECORD SCREENREGION (SCREEN . REGION) + (SUBRECORD REGION) + [TYPE? (AND (LISTP DATUM) + (type? SCREEN (CAR DATUM)) + (type? REGION (CDR DATUM] + (SYSTEM)) + +(RECORD SCREENPOSITION (SCREEN . POSITION) + (SUBRECORD POSITION) + [TYPE? (AND (LISTP DATUM) + (type? SCREEN (CAR DATUM)) + (type? POSITION (CDR DATUM] + (SYSTEM)) +) + +(/DECLAREDATATYPE 'BITMAP '(POINTER WORD WORD WORD WORD) + '((BITMAP 0 POINTER) + (BITMAP 2 (BITS . 15)) + (BITMAP 3 (BITS . 15)) + (BITMAP 4 (BITS . 15)) + (BITMAP 5 (BITS . 15))) + '6) + +(/DECLAREDATATYPE 'CURSOR '(POINTER POINTER POINTER POINTER POINTER) + '((CURSOR 0 POINTER) + (CURSOR 2 POINTER) + (CURSOR 4 POINTER) + (CURSOR 6 POINTER) + (CURSOR 8 POINTER)) + '10) + +(* "END EXPORTED DEFINITIONS") + +(ADDTOVAR SYSTEMRECLST + +(DATATYPE PILOTBBT ((PBTDESTLO WORD) + (PBTDESTHI WORD) + (PBTDESTBIT WORD) + (PBTDESTBPL SIGNEDWORD) + (PBTSOURCELO WORD) + (PBTSOURCEHI WORD) + (PBTSOURCEBIT WORD) + (PBTSOURCEBPL SIGNEDWORD) + (PBTWIDTH WORD) + (PBTHEIGHT WORD) + (PBTFLAGS WORD) + (NIL 5 WORD))) + +(DATATYPE \DISPLAYDATA + (DDXPOSITION DDYPOSITION DDXOFFSET DDYOFFSET DDDestination DDClippingRegion DDFONT + DDSlowPrintingCase DDWIDTHSCACHE DDOFFSETSCACHE DDCOLOR DDLINEFEED DDRightMargin + DDLeftMargin DDScroll DDOPERATION DDSOURCETYPE (DDClippingLeft WORD) + (DDClippingRight WORD) + (DDClippingBottom WORD) + (DDClippingTop WORD) + (NIL WORD) + (DDHELDFLG FLAG) + (XWINDOWHINT XPOINTER) + (DDPILOTBBT POINTER) + DDXSCALE DDYSCALE DDCHARIMAGEWIDTHS DDEOLFN DDPAGEFULLFN DDTexture DDMICAXPOS + DDMICAYPOS DDMICARIGHTMARGIN DDCHARSET (DDCHARSETASCENT WORD) + (DDCHARSETDESCENT WORD) + DDCHARHEIGHTDELTA + (DDSPACEWIDTH WORD))) +) +(DECLARE%: EVAL@COMPILE + +(RPAQQ BITSPERINTEGER 32) + + +(CONSTANTS (BITSPERINTEGER 32)) +) (DEFINEQ +(\BBTCURVEPT + [LAMBDA (X Y BBT LEFT BRUSHWIDTH LEFTMINUSBRUSH RIGHTPLUS1 NBITSRIGHTPLUS1 TOPMINUSBRUSH + DestinationBitMap BRUSHHEIGHT BOTTOMMINUSBRUSH TOP BRUSHBASE DESTINATIONBASE RASTERWIDTH + BRUSHRASTERWIDTH COLORBRUSHBASE NBITS DISPLAYDATA) + (* kbr%: "27-Aug-86 23:17") + + (* ;; "Called by \CURVEPT macro. Draws a brush point by bitblting BRUSHBM to point X,Y in DestinationBitMap. BBT is a BitBlt table where everything is already set except the source and destination addresses, width and height. In other words, only the easy stuff") + (* ; "set the width fields of the bbt") + [PROG (CLIPPEDTOP STY) + [COND + [(ILEQ Y TOPMINUSBRUSH) (* ; + "the top part of the brush is visible") + (SETQ CLIPPEDTOP (IPLUS Y BRUSHHEIGHT)) + (replace PBTSOURCE of BBT with BRUSHBASE) + (freplace PBTHEIGHT of BBT with (IMIN BRUSHHEIGHT (IDIFFERENCE Y BOTTOMMINUSBRUSH] + (T (* ; "only the bottom is visible") + (SETQ CLIPPEDTOP TOP) + [replace PBTSOURCE of BBT with (\ADDBASE BRUSHBASE (ITIMES BRUSHRASTERWIDTH + (SETQ STY (IDIFFERENCE + Y TOPMINUSBRUSH] + (freplace PBTHEIGHT of BBT with (IDIFFERENCE (IMIN BRUSHHEIGHT (IDIFFERENCE Y + BOTTOMMINUSBRUSH + )) + STY] + (freplace PBTDEST of BBT with (\ADDBASE DESTINATIONBASE (ITIMES RASTERWIDTH + (\SFInvert DestinationBitMap + CLIPPEDTOP] + [COND + (COLORBRUSHBASE [COND + [(ILESSP X LEFT) (* ; + "only the right part of the brush is visible") + (* ; + "FOR NOW BRUTE FORCE WITH NBITS CHECK") + [freplace PBTDESTBIT of BBT with (COND + ((EQ NBITS 4) + (LLSH LEFT 2)) + (T (LLSH LEFT 3] + (freplace PBTSOURCEBIT of BBT + with (IDIFFERENCE BRUSHWIDTH (freplace PBTWIDTH of BBT + with (COND + ((EQ NBITS 4) + (LLSH (IDIFFERENCE X + LEFTMINUSBRUSH) + 2)) + (T (LLSH (IDIFFERENCE X + LEFTMINUSBRUSH) + 3] + (T (* ; "left edge is visible") + [freplace PBTDESTBIT of BBT with (SETQ X (COND + ((EQ NBITS 4) + (LLSH X 2)) + (T (LLSH X 3] + (freplace PBTSOURCEBIT of BBT with 0) + (* ; + "set width to the amount that is visible") + (freplace PBTWIDTH of BBT with (IMIN BRUSHWIDTH (IDIFFERENCE + NBITSRIGHTPLUS1 X + ] + (* ; + "if color brush is used, the ground must be cleared before the brush is put in.") + (\SETPBTFUNCTION BBT (ffetch DDSOURCETYPE of DISPLAYDATA) + 'ERASE) + (\PILOTBITBLT BBT 0) (* ; + "reset the source to point to the color bitmap.") + [COND + ((ILEQ Y TOPMINUSBRUSH) (* ; + "the top part of the brush is visible") + (freplace PBTSOURCE of BBT with COLORBRUSHBASE)) + (T (* ; "only the bottom is visible") + (freplace PBTSOURCE of BBT with (\ADDBASE COLORBRUSHBASE (ITIMES BRUSHRASTERWIDTH + (IDIFFERENCE + Y TOPMINUSBRUSH] + (\SETPBTFUNCTION BBT (ffetch DDSOURCETYPE of DISPLAYDATA) + 'PAINT)) + (T (COND + [(ILESSP X LEFT) (* ; + "only the right part of the brush is visible") + (freplace PBTDESTBIT of BBT with LEFT) + (freplace PBTSOURCEBIT of BBT with (IDIFFERENCE BRUSHWIDTH (freplace PBTWIDTH + of BBT + with (IDIFFERENCE X + LEFTMINUSBRUSH + ] + (T (* ; "left edge is visible") + (freplace PBTDESTBIT of BBT with X) + (freplace PBTSOURCEBIT of BBT with 0) (* ; + "set width to the amount that is visible") + (freplace PBTWIDTH of BBT with (IMIN BRUSHWIDTH (IDIFFERENCE RIGHTPLUS1 X] + (\PILOTBITBLT BBT 0]) ) +(DEFINEQ + +(CREATETEXTUREFROMBITMAP + [LAMBDA (BITMAP) (* rrb "17-May-84 11:22") + + (* ;; "creates a texture object from the lower left corner of a bitmap") + + (OR (BITMAPP BITMAP) + (\ILLEGAL.ARG BITMAP)) + (PROG ((H (fetch BITMAPHEIGHT of BITMAP)) + (W (fetch BITMAPWIDTH of BITMAP)) + TEXTHEIGHT TEXTURE) + (COND + ((AND (OR (EQ W 2) + (EQ W 4)) + (OR (EQ H 2) + (EQ H 4))) (* ; + "small texture will match bitmap exactly so use integer representation.") + (SETQ TEXTURE 0) + [for X from 0 to 3 + do (for Y from 0 to 3 + do (COND + ([NOT (EQ 0 (BITMAPBIT BITMAP (IREMAINDER X W) + (IREMAINDER Y H] + (SETQ TEXTURE (LOGOR TEXTURE (\BITMASK (IPLUS (ITIMES (IDIFFERENCE + 3 Y) + 4) + X] + (RETURN TEXTURE)) + ((AND (EQ W 16) + (ILESSP H 17)) (* ; + "if it is already 16 by n n<=16, use it.") + (RETURN BITMAP)) + (T (* ; "make a 16 bit wide one.") + (SETQ TEXTURE (BITMAPCREATE 16 (IMIN H 16))) + (for X from 0 by W to 16 do (BITBLT BITMAP 0 0 TEXTURE X 0 W H 'INPUT 'REPLACE)) + (RETURN TEXTURE]) + +(PRINTBITMAP + [LAMBDA (BITMAP FILE) (* ; "Edited 1-Dec-86 16:24 by Pavel") + +(* ;;; "Writes a bitmap on a file such that READBITMAP will read it back in.") + + (DECLARE (LOCALVARS . T)) + (PROG ((BM BITMAP)) + (COND + ((type? BITMAP BITMAP)) + ([AND (LITATOM BITMAP) + (type? BITMAP (SETQ BM (EVALV BITMAP] (* ; + "Coerce litatoms for compatibility with original specification") + ) + (T (printout T "******** " BITMAP " is not a BITMAP." T) + (RETURN NIL))) + (printout FILE "(" .P2 (BITMAPWIDTH BM) + %, .P2 (BITMAPHEIGHT BM)) (* ; + "if the number of bits per pixel is not 1, write it out.") + (COND + ((NEQ (BITSPERPIXEL BM) + 1) + (SPACES 1 FILE) + (PRIN2 (BITSPERPIXEL BM) + FILE))) (* ; + "Enclose in list so that compile-copying works.") + (\WRITEBITMAP BM FILE) (* ; "Now write out contents.") + (PRIN1 ")" FILE]) + +(PRINT-BITMAPS-NICELY + [LAMBDA (BITMAP STREAM) (* ; "Edited 20-Mar-87 17:06 by jop") + +(* ;;; "The syntax for bitmaps is") + + (* ;; "#*(width height [bits-per-pixel])XXXXXX...") + +(* ;;; "where WIDTH and HEIGHT are the dimensions of the bitmap, BITS-PER-PIXEL can be omitted if it is equal to one, and the X's are single characters between @ and O (in ASCII), each representing four bits. There will be exactly (* (ceiling (* WIDTH BITS-PER-PIXEL) 16) 4) characters for each row of the bitmap and exactly HEIGHT rows. Note that there are no spaces allowed between the * and the (, between the ) and the first X, or anywhere inside the string of X's. Also, the character after the last X must not be of type OTHER.") + +(* ;;; "This function %"observes%" *print-length*: it truncates after printing *print-length* characters in the bitmap's representation.") + + (if (OR (NULL STREAM) + (NULL *PRINT-ARRAY*)) + then + (* ;; "Let it be printed in the normal way, with an address.") + + NIL + else + (* ;; "Print this bitmap in the preferred way.") + + (LET* ((WIDTH (BITMAPWIDTH BITMAP)) + (HEIGHT (BITMAPHEIGHT BITMAP)) + (BITS-PER-PIXEL (BITSPERPIXEL BITMAP)) + (BASE (fetch BITMAPBASE of BITMAP)) + (QUAD-CHARS-PER-ROW (FOLDHI (CL:* WIDTH BITS-PER-PIXEL) + 16)) + (CHARS-SO-FAR *PRINT-LENGTH*)) + (PRINTOUT STREAM "#*(" .P2 WIDTH " " .P2 HEIGHT) + (if (NEQ BITS-PER-PIXEL 1) + then (PRINTOUT STREAM " " .P2 BITS-PER-PIXEL)) + (PRINTOUT STREAM ")") + (PROG NIL + [CL:MACROLET [(ELIDE? NIL `(IF (AND CHARS-SO-FAR (EQ 0 (CL:DECF CHARS-SO-FAR)) + ) + THEN (PRINTOUT STREAM "...") + (GO OUT] + (CL:DOTIMES (ROW HEIGHT) + (CL:DOTIMES (QUAD QUAD-CHARS-PER-ROW) + (CL:WRITE-CHAR (CL:INT-CHAR (+ (LRSH (\GETBASEBYTE BASE 0) + 4) + (CL:CHAR-INT #\@))) + STREAM) + (ELIDE?) + (CL:WRITE-CHAR (CL:INT-CHAR (+ (LOGAND (\GETBASEBYTE BASE 0) + 15) + (CL:CHAR-INT #\@))) + STREAM) + (ELIDE?) + (CL:WRITE-CHAR (CL:INT-CHAR (+ (LRSH (\GETBASEBYTE BASE 1) + 4) + (CL:CHAR-INT #\@))) + STREAM) + (ELIDE?) + (CL:WRITE-CHAR (CL:INT-CHAR (+ (LOGAND (\GETBASEBYTE BASE 1) + 15) + (CL:CHAR-INT #\@))) + STREAM) + (ELIDE?) + (SETQ BASE (\ADDBASE BASE 1))))] + OUT (RETURN T]) + +(PRINTCURSOR + [LAMBDA (VAR) (* ; "Edited 2-Dec-86 14:15 by Pavel") + + (* ;; "Writes an expression that will define the cursor value of VAR") + + (PROG (CUR IMAGE MASK) + (COND + ([NOT (type? CURSOR (SETQ CUR (EVALV VAR 'PRINTCURSOR] + (printout T "******** " VAR " is not a CURSOR." T) + (RETURN NIL))) (* ; "write out defining form.") + (\CURSORBITSPERPIXEL CUR 1) + (SETQ IMAGE (fetch (CURSOR CUIMAGE) of CUR)) + (SETQ MASK (fetch (CURSOR CUMASK) of CUR)) + (PRINT `(RPAQ (\, VAR) + (CURSORCREATE ',IMAGE ',(AND (NOT (EQ IMAGE MASK)) + MASK) + ,(fetch (CURSOR CUHOTSPOTX) + of CUR) + ,(fetch (CURSOR CUHOTSPOTY) + of CUR)))]) + +(\WRITEBITMAP + [LAMBDA (BITMAP FILE) (* ; "Edited 1-Dec-86 16:24 by Pavel") + +(* ;;; "writes the contents of a bitmap onto the currently open output file.") + + (PROG (LIM (BASE (fetch BITMAPBASE of BITMAP)) + (OFD (GETSTREAM FILE 'OUTPUT)) + (W (fetch BITMAPRASTERWIDTH of BITMAP))) + (FRPTQ (fetch BITMAPHEIGHT of BITMAP) + (TERPRI FILE) + (\BOUT OFD (CHARCODE %")) + (SETQ LIM (\ADDBASE BASE W)) + (until (EQ BASE LIM) do (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) + (LRSH (\GETBASEBYTE BASE 0) + 4))) + (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) + (LOGAND (\GETBASEBYTE BASE 0) + 15))) + (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) + (LRSH (\GETBASEBYTE BASE 1) + 4))) + (\BOUT OFD (IPLUS (SUB1 (CHARCODE A)) + (LOGAND (\GETBASEBYTE BASE 1) + 15))) + (SETQ BASE (\ADDBASE BASE 1))) + (\BOUT OFD (CHARCODE %"]) +) + +(DEFPRINT 'BITMAP 'PRINT-BITMAPS-NICELY) +(DEFINEQ + +(\GETINTEGERPART + [LAMBDA (FRACT) (* JonL " 7-May-84 02:43") + + (* ;; "gets the integer part of a fixed point number. The integer part has INTEGERBITS worth of significant bits the leftmost of which is sign.") + + (PROG [HIPART (ROUNDER (COND + ([EQ 0 (LOGAND (fetch (FIXP HINUM) of FRACT) + (CONSTANT (LLSH 1 (IDIFFERENCE BITSPERWORD (ADD1 + INTEGERBITS + ] + 0) + (T 1] + + (* ;; "assumes that the number of significant bits --- INTEGERBITS --- is less than can fit in the high order of the two words allocated for the integer.") + + (RETURN (COND + ([IGREATERP [SETQ HIPART (LRSH (fetch (FIXP HINUM) of FRACT) + (CONSTANT (IDIFFERENCE BITSPERWORD INTEGERBITS] + (CONSTANT (EXPT 2 (SUB1 INTEGERBITS] + (* ; + "the sign bit is on, make it negative.") + (IDIFFERENCE (IDIFFERENCE HIPART (CONSTANT (EXPT 2 INTEGERBITS))) + ROUNDER)) + (T (IPLUS HIPART ROUNDER]) + +(\CONVERTTOFRACTION + [LAMBDA (FLOAT) (* rmk%: " 3-JUL-82 23:29") + + (* ;; "converts a floating point number into a fixed point number with INTEGERBITS worth of integer part. Always returns a large integer so that the box can be clobbered.") + + (PROG (RESULT BOX) + (RETURN (COND + ([SMALLP (SETQ RESULT (FIX (FTIMES FLOAT (CONSTANT (FLOAT (EXPT 2 + (IDIFFERENCE + BITSPERINTEGER + INTEGERBITS] + (* ; "clobber a created box.") + (PutUnboxed (SETQ BOX (CREATECELL \FIXP)) + RESULT) + BOX) + (T RESULT]) +) +(DECLARE%: EVAL@COMPILE + +(RPAQQ INTEGERBITS 12) + + +(CONSTANTS (INTEGERBITS 12)) +) + + + +(* ; "cursor functions not on LLDISPLAY") + +(DEFINEQ + +(CURSORP + [LAMBDA (X) (* kbr%: " 5-Jul-85 17:54") + (* ; "is X a cursor?") + (type? CURSOR X]) + +(CURSORBITMAP + [LAMBDA NIL CursorBitMap]) + +(CreateCursorBitMap + [LAMBDA (ARRAY) (* rmk%: " 1-APR-82 22:20") + (* ; + "makes a bitmap out of an array of values.") + (PROG ((BM (BITMAPCREATE 16 16)) + BASE) + (SETQ BASE (ffetch BITMAPBASE of BM)) + (for I from 0 to 15 do (\PUTBASE BASE I (LOGAND (ELT ARRAY (ADD1 I)) + WORDMASK))) + (RETURN BM]) +) +(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE + +(PUTPROPS CURSORBITMAP MACRO (NIL CursorBitMap)) +) +(DECLARE%: EVAL@COMPILE + +(RPAQQ HARDCURSORHEIGHT 16) + +(RPAQQ HARDCURSORWIDTH 16) + + +(CONSTANTS (HARDCURSORHEIGHT 16) + (HARDCURSORWIDTH 16)) +) +(DECLARE%: EVAL@COMPILE + +(ADDTOVAR GLOBALVARS CursorBitMap) +) + +(* "END EXPORTED DEFINITIONS") + + +(RPAQQ CARETCOMS + ((BITMAPS \DefaultCaret) + (INITVARS (\CARET.UP NIL + + (* ;; "global. NIL if no caret showing, otherwise a CARET1 record with CURSOR, stream, x, y, and RATE (= off rate)") +) + (\CARET.DEFAULT NIL (* ; + "global = default caret to put up. An instance of CARET1 datatype") + ) + (\CARET.TIMER (SETUPTIMER 0) + (* ; "time for next caret action")) + (DEFAULTCARET (CURSORCREATE \DefaultCaret NIL 3 4)) + (DEFAULTCARETRATE 333 (* ; "default rate for flashing caret")) + (\CARET.ON.RATE DEFAULTCARETRATE) + (\CARET.OFF.RATE DEFAULTCARETRATE) + (\CARET.FORCED.OFF.RATE 0)) + (ADDVARS (\SYSTEMTIMERVARS \CARET.TIMER)) + (DECLARE%: DONTCOPY (RECORDS CARET1)) + (INITRECORDS CARET1) + (FNS CARET \CARET.CREATE \CARET.DOWN \CARET.FLASH? \CARET.SHOW CARETRATE \CARET.FLASH.AGAIN + \CARET.FLASH.MULTIPLE \CARET.FLASH) + (FNS \MEDW.CARET.SHOW) + (* ; "some declarations are on LLDISPLAY -- macro for \CHECKCARET and globalvar declaration for \CARET.UP") + (GLOBALVARS \CARET.DEFAULT \CARET.ON.RATE \CARET.OFF.RATE DEFAULTCARET \CARET.TIMER \CARET.UP + \CARET.FORCED.OFF.RATE) + (DECLARE%: DONTEVAL@LOAD DOCOPY (ADDVARS (TTYBACKGROUNDFNS \CARET.FLASH?))) + (FNS \AREAVISIBLE? \REGIONOVERLAPAREAP \AREAINREGIONP) + (P (CARET T)))) + +(RPAQQ \DefaultCaret #*(7 6)A@@@CH@@CH@@FL@@FL@@LF@@) + +(RPAQ? \CARET.UP NIL + (* ;; "global. NIL if no caret showing, otherwise a CARET1 record with CURSOR, stream, x, y, and RATE (= off rate)") +) + +(RPAQ? \CARET.DEFAULT NIL (* ; + "global = default caret to put up. An instance of CARET1 datatype") +) + +(RPAQ? \CARET.TIMER (SETUPTIMER 0) + (* ; "time for next caret action")) + +(RPAQ? DEFAULTCARET (CURSORCREATE \DefaultCaret NIL 3 4)) + +(RPAQ? DEFAULTCARETRATE 333 (* ; "default rate for flashing caret")) + +(RPAQ? \CARET.ON.RATE DEFAULTCARETRATE) + +(RPAQ? \CARET.OFF.RATE DEFAULTCARETRATE) + +(RPAQ? \CARET.FORCED.OFF.RATE 0) + +(ADDTOVAR \SYSTEMTIMERVARS \CARET.TIMER) +(DECLARE%: DONTCOPY +(DECLARE%: EVAL@COMPILE + +(RECORD CARET1 (* ; + "a record that describes a SHOWING caret") + (STREAM (* ; + "the stream the caret is showing in") + STREAMX (* ; + "the X position stream relative that it was shown at") + STREAMY (* ; + "the Y position stream relative that it was shown at") + CURSOR (* ; + "the cursor bitmap + x and y that this caret represents") + RATE (* ; "the 'down rate' for this caret, in ticks. After comes down (when \CARET.TIMER expires), \CARET.TIMER will be rescheduled to put something up. This is the rate to use") + (* ; + "NEXT for threading carets together") + . NEXT)) +) +) +(DEFINEQ + +(CARET + [LAMBDA (NEWCARET) (* kbr%: " 6-Jul-85 16:13") + (* ; + "changes the 'system default' caret") + (PROG1 (COND + (\CARET.DEFAULT (* ; + "merely stored as a 'cursor' record for simplicity") + (fetch (CARET1 CURSOR) of \CARET.DEFAULT)) + (T 'OFF)) + [COND + (NEWCARET (\CHECKCARET) + (CARETRATE (CARETRATE)) (* ; "make sure the caret rate is set") + (SETQ \CARET.DEFAULT (SELECTQ NEWCARET + (T (COND + ((EQ DEFAULTCARET 'OFF) + NIL) + ((CURSORP DEFAULTCARET) + (create CARET1 + CURSOR _ DEFAULTCARET)) + (T (ERROR "DEFAULTCARET is not a cursor" + DEFAULTCARET)))) + (OFF NIL) + (COND + ((CURSORP NEWCARET) + (create CARET1 + CURSOR _ NEWCARET)) + (T (LISPERROR "ILLEGAL ARG" NEWCARET])]) + +(\CARET.CREATE + [LAMBDA (CURSOR) (* jds "11-Jul-85 19:38") + (create CARET1 + CURSOR _ (OR CURSOR DEFAULTCARET]) + +(\CARET.DOWN + [LAMBDA (STREAM INTERVAL UNLESSOCCLUDED) (* lmm " 4-May-84 18:15") + + (* ;; "take caret down if it is up. If you take it down, reschedule to put it back up in INTERVAL (or 0) --- often called thru \CHECKCARET macro") + + (COND + (\CARET.UP (COND + ([OR (NULL STREAM) + (fetch (CARET1 NEXT) of \CARET.UP) + (EQ (fetch (CARET1 STREAM) of \CARET.UP) + (COND + ((type? WINDOW STREAM) + (fetch (WINDOW DSP) of STREAM)) + (T STREAM] + [while (UNINTERRUPTABLY + [COND + ((\CARET.SHOW \CARET.UP UNLESSOCCLUDED) + (* ; + "take caret down and set global state") + (replace (CARET1 STREAM) of \CARET.UP with NIL) + (SETQ \CARET.UP (fetch (CARET1 NEXT) of \CARET.UP])] + (SETUPTIMER (OR INTERVAL \CARET.FORCED.OFF.RATE) + \CARET.TIMER]) + +(\CARET.FLASH? + [LAMBDA (STREAM CARET ONRATE OFFRATE X Y) (* AJB "17-Jul-85 12:47") + +(* ;;; "Flashes the CARET at the ONRATE/OFFRATE at the X,Y position in the current TTY window. If CARET is NIL, uses \CARET.DEFAULT as the caret. Takes either a display stream or a textstream as the destination stream to flash the caret. The caret is not flashed on a shift-selection in a window") + + (COND + (\CARET.UP [COND + ((TIMEREXPIRED? \CARET.TIMER) + (\CARET.DOWN NIL (fetch (CARET1 RATE) of \CARET.UP) + (OR (KEYDOWNP 'LSHIFT) + (KEYDOWNP 'RSHIFT) + (KEYDOWNP 'COPY] + NIL) + ((AND (OR CARET (SETQ CARET \CARET.DEFAULT)) + (TIMEREXPIRED? \CARET.TIMER) + [OR [DISPLAYSTREAMP (OR STREAM (SETQ STREAM (TTYDISPLAYSTREAM] + (AND (IMAGESTREAMTYPEP STREAM 'TEXT) + (SETQ STREAM (WINDOWPROP (CAR (fetch (TEXTOBJ \WINDOW) of (TEXTOBJ STREAM))) + 'DSP] + (\CARET.FLASH CARET STREAM OFFRATE (OR (KEYDOWNP 'LSHIFT) + (KEYDOWNP 'RSHIFT) + (KEYDOWNP 'COPY)) + X Y)) + + (* ;; "\CARET.DEFAULT is NIL if by default the caret is OFF --- the KEYDOWNP clause is a hack to detect whether we are doing a copy-select") + + (replace (CARET1 NEXT) of CARET with NIL) (* ; + "Since this function is displaying a new caret, destroy any chaining of multiple carets") + (SETUPTIMER (OR ONRATE \CARET.ON.RATE) + \CARET.TIMER) + T]) + +(\CARET.SHOW + [LAMBDA (CARET UNLESSOCCLUDED) (* ; "Edited 25-Feb-94 16:53 by sybalsky") + + (* ;; "GENERIC caret flasher.") + + (LET (DS) + (SETQ DS (fetch (CARET1 STREAM) of CARET)) + (WINDOWOP 'SCCARETFLASH (FETCH (WINDOW SCREEN) OF (FETCH (\DISPLAYDATA XWINDOWHINT) + OF (FETCH (STREAM IMAGEDATA) + OF DS))) + CARET UNLESSOCCLUDED]) + +(CARETRATE + [LAMBDA (ONRATE OFFRATE) (* lmm " 3-May-84 11:35") + + (* ;; "sets the default caret rate (s) to be ONRATE/OFFRATE in milliseconds") + + (PROG1 (COND + ((EQ \CARET.ON.RATE \CARET.OFF.RATE) + \CARET.ON.RATE) + (T (CONS \CARET.ON.RATE \CARET.OFF.RATE))) + [COND + ((OR ONRATE OFFRATE) + (SETUPTIMER 0 \CARET.TIMER) + (SETQ \CARET.ON.RATE (OR (FIXP ONRATE) + (FIX DEFAULTCARETRATE))) + (SETQ \CARET.OFF.RATE (OR (FIXP OFFRATE) + \CARET.ON.RATE])]) + +(\CARET.FLASH.AGAIN + [LAMBDA (CARET STREAM X Y) (* AJB "14-Aug-85 17:04") + (LET ((OCARET \CARET.UP)) + (COND + ([AND OCARET CARET (DISPLAYSTREAMP (OR STREAM (SETQ STREAM (TTYDISPLAYSTREAM] + (for (OC _ OCARET) by (fetch (CARET1 NEXT) of OC) + do (COND + [(NULL OC) + (RETURN (COND + ((\CARET.FLASH CARET STREAM (fetch (CARET1 RATE) of \CARET.UP) + (OR (KEYDOWNP 'LSHIFT) + (KEYDOWNP 'RSHIFT) + (KEYDOWNP 'COPY)) + X Y) (* ; "OK, showed this one") + (OR (EQ \CARET.UP CARET) + (SHOULDNT)) + (replace (CARET1 NEXT) of CARET with OCARET] + ((EQ OC CARET) (* ; "this CARET is already showing") + (RETURN]) + +(\CARET.FLASH.MULTIPLE + [LAMBDA (STREAMS CARETS ONRATE OFFRATE) (* AJB "14-Aug-85 17:10") + (* ; + "this is probably just a template for how to flash multiple carets") + (COND + ((\CARET.FLASH? (CAR STREAMS) + (CAR CARETS) + ONRATE OFFRATE) + (for STR in (CDR STREAMS) as CARET in (CDR CARETS) do (\CARET.FLASH.AGAIN CARET STR]) + +(\CARET.FLASH + [LAMBDA (CARET STREAM RATE UNLESSOCCLUDED X Y) (* kbr%: " 5-Jul-85 17:51") + (PROG (CURSOR ANSWER) + (SETQ CURSOR (fetch (CARET1 CURSOR) of CARET)) + (replace (CARET1 STREAM) of CARET with STREAM) + (replace (CARET1 STREAMX) of CARET with (IDIFFERENCE (OR X (DSPXPOSITION NIL STREAM)) + (fetch (CURSOR CUHOTSPOTX) of CURSOR))) + (replace (CARET1 STREAMY) of CARET with (IDIFFERENCE (OR Y (DSPYPOSITION NIL STREAM)) + (fetch (CURSOR CUHOTSPOTY) of CURSOR))) + (replace (CARET1 RATE) of CARET with (OR RATE \CARET.OFF.RATE)) + (UNINTERRUPTABLY + (COND + ((\CARET.SHOW CARET UNLESSOCCLUDED) + (SETQ \CARET.UP CARET) + (SETQ ANSWER T)))) + (RETURN ANSWER]) +) +(DEFINEQ + +(\MEDW.CARET.SHOW + [LAMBDA (SCREEN CARET UNLESSOCCLUDED) (* ; + "Edited 17-Jan-94 10:28 by sybalsky:mv:envos") + + (* ;; "MEDLEY-window-system specific version of \CARET.SHOW (vectored thru the screen). Flash the caret (by inverting its image). UNLESSOCCLUDED controls whether you bring the window to the top if the caret is under some other window.") + + (PROG (DS) + (SETQ DS (fetch (CARET1 STREAM) of CARET)) + (RETURN (PROG (DD CARETWIN CBMX CBMY CURSOR CARETBM CWX CWY CARETBMWIDTH CARETBMHEIGHT + CLIPREG CLIPVAR) + (SETQ DD (fetch (STREAM IMAGEDATA) of DS)) + (SETQ CARETWIN (WFROMDS DS)) + (SETQ CBMX 0) + (SETQ CBMY 0) + (SETQ CURSOR (fetch (CARET1 CURSOR) of CARET)) + (\CURSORBITSPERPIXEL CURSOR (BITSPERPIXEL (DSPDESTINATION NIL CARETWIN))) + (SETQ CARETBM (fetch (CURSOR CUIMAGE) of CURSOR)) + (SETQ CWX (fetch (CARET1 STREAMX) of CARET)) + (SETQ CWY (fetch (CARET1 STREAMY) of CARET)) + (SETQ CARETBMWIDTH (fetch (BITMAP BITMAPWIDTH) of CARETBM)) + (SETQ CARETBMHEIGHT (fetch (BITMAP BITMAPHEIGHT) of CARETBM)) + (* ; + "calculate how much to reduce the caret region by do to the clipping region of the window.") + (SETQ CLIPREG (fetch (\DISPLAYDATA DDClippingRegion) of DD)) + (COND + ((IGREATERP (SETQ CLIPVAR (fetch (REGION LEFT) of CLIPREG)) + CWX) + [SETQ CARETBMWIDTH (IDIFFERENCE CARETBMWIDTH (SETQ CBMX (IDIFFERENCE + CLIPVAR CWX] + (SETQ CWX CLIPVAR))) + (COND + ((IGREATERP CARETBMWIDTH (SETQ CLIPVAR (IDIFFERENCE + (IPLUS CLIPVAR (fetch (REGION + WIDTH) + of CLIPREG)) + CWX))) + (SETQ CARETBMWIDTH CLIPVAR))) + (COND + ((IGREATERP (SETQ CLIPVAR (fetch (REGION BOTTOM) of CLIPREG)) + CWY) + [SETQ CARETBMHEIGHT (IDIFFERENCE CARETBMHEIGHT (SETQ CBMY + (IDIFFERENCE CLIPVAR CWY] + (SETQ CWY CLIPVAR))) + (COND + ((IGREATERP CARETBMHEIGHT (SETQ CLIPVAR (IDIFFERENCE + (IPLUS CLIPVAR + (fetch (REGION HEIGHT) + of CLIPREG)) + CWY))) + (SETQ CARETBMHEIGHT CLIPVAR))) + + (* note the time of the next change. This must be done without creating boxes + because happens during keyboard wait.) + + (COND + ((OR (ILESSP CARETBMWIDTH 1) + (ILESSP CARETBMHEIGHT 1)) (* caret isn't within clipping region.) + (RETURN T))) (* convert the base of the caret + location to screen coordinates.) + (SETQ CWX (\DSPTRANSFORMX CWX DD)) + (SETQ CWY (\DSPTRANSFORMY CWY DD)) + + (* having only this section uninterruptable leaves open the possibility that the + window moves or the timer is wrong but these will only mess up the display and + are low frequency events.) + + (COND + [(AND (OPENWP CARETWIN) + (\AREAVISIBLE? CARETWIN CWX CWY (IPLUS CWX (SUB1 CARETBMWIDTH)) + (IPLUS CWY (SUB1 CARETBMHEIGHT] + (UNLESSOCCLUDED (RETURN)) + (T (TOTOPW CARETWIN))) + (BITBLT CARETBM CBMX CBMY (DSPDESTINATION NIL CARETWIN) + CWX CWY CARETBMWIDTH CARETBMHEIGHT 'INPUT 'INVERT) + (RETURN T]) +) + + + +(* ; +"some declarations are on LLDISPLAY -- macro for \CHECKCARET and globalvar declaration for \CARET.UP") + +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS \CARET.DEFAULT \CARET.ON.RATE \CARET.OFF.RATE DEFAULTCARET \CARET.TIMER \CARET.UP + \CARET.FORCED.OFF.RATE) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY + +(ADDTOVAR TTYBACKGROUNDFNS \CARET.FLASH?) +) +(DEFINEQ + +(\AREAVISIBLE? + [LAMBDA (WIN LFT BTM RGHT TOP) (* kbr%: "18-Feb-86 18:05") + + (* ;; "is the area whose screen limits are LFT BTM RGHT and TOP eniretly visible within WIN,") + + (PROG (WPTR) + (SETQ WPTR (fetch (SCREEN SCTOPW) of (fetch (WINDOW SCREEN) of WIN))) + (COND + ((NOT (\AREAINREGIONP (fetch (WINDOW REG) of WIN) + LFT BTM RGHT TOP)) (* ; + "if the caret region isn't completely within the window, forget it.") + (RETURN))) + LP (COND + ((EQ WPTR WIN) + (RETURN T)) + ((\REGIONOVERLAPAREAP (fetch (WINDOW REG) of WPTR) + LFT BTM RGHT TOP) + (RETURN NIL)) + ((SETQ WPTR (fetch (WINDOW NEXTW) of WPTR)) + (GO LP]) + +(\REGIONOVERLAPAREAP + [LAMBDA (REG LFT BTM RGHT TOP) (* rrb "17-Feb-86 18:50") + + (* ;; + "is there any overlap between the region REG and the area defined by left bottom right and top?") + + (NOT (OR (IGREATERP (fetch (REGION LEFT) of REG) + RGHT) + (IGREATERP LFT (fetch (REGION RIGHT) of REG)) + (IGREATERP (fetch (REGION BOTTOM) of REG) + TOP) + (IGREATERP BTM (fetch (REGION TOP) of REG]) + +(\AREAINREGIONP + [LAMBDA (REGION LFT BTM RGHT TOP) (* rrb "14-OCT-83 15:32") + (AND (IGEQ LFT (fetch LEFT of REGION)) + (IGEQ BTM (fetch BOTTOM of REGION)) + (IGEQ (fetch PRIGHT of REGION) + RGHT) + (IGEQ (fetch PTOP of REGION) + TOP]) +) + +(CARET T) + + + +(* ; "Region functions") + +(DEFINEQ + +(CREATEREGION + [LAMBDA (LEFT BOTTOM WIDTH HEIGHT) (* rrb "17-JUN-83 08:56") + (* ; "creates a region structure.") + (create REGION + LEFT _ LEFT + BOTTOM _ BOTTOM + WIDTH _ WIDTH + HEIGHT _ HEIGHT]) + +(REGIONP + [LAMBDA (X) (* rrb "29-Jun-84 18:00") + (AND (type? REGION X) + X]) + +(INTERSECTREGIONS + [LAMBDA REGIONS (* kbr%: "24-Jan-86 18:30") + + (* ;; "returns the largest region that is contained in all of REGIONS") + + (COND + ((EQ REGIONS 0) + + (* ;; "this is documented as returning a very large region. This one covers the entire FIXP range so should work for many purposes. rrb") + + (create REGION + LEFT _ (SUB1 MIN.FIXP) + BOTTOM _ (SUB1 MIN.FIXP) + WIDTH _ (PLUS (TIMES 2 MAX.FIXP) + 4) + HEIGHT _ (PLUS (TIMES 2 MAX.FIXP) + 4))) + (T (PROG (REG LFT RGHT BTTM TP) + (SETQ REG (ARG REGIONS 1)) + (SETQ LFT (fetch (REGION LEFT) of REG)) + [SETQ RGHT (SUB1 (IPLUS LFT (fetch (REGION WIDTH) of REG] + (SETQ BTTM (fetch (REGION BOTTOM) of REG)) + [SETQ TP (SUB1 (IPLUS BTTM (fetch (REGION HEIGHT) of REG] + [for I from 2 thru REGIONS do (SETQ REG (ARG REGIONS I)) + [COND + ((IGREATERP (fetch (REGION LEFT) of REG) + LFT) + (SETQ LFT (fetch (REGION LEFT) of REG] + [COND + ((IGREATERP (fetch (REGION BOTTOM) of REG) + BTTM) + (SETQ BTTM (fetch (REGION BOTTOM) of REG] + [COND + ((ILESSP (fetch (REGION RIGHT) of REG) + RGHT) + (SETQ RGHT (fetch (REGION RIGHT) of REG] + (COND + ((ILESSP (fetch (REGION TOP) of REG) + TP) + (SETQ TP (fetch (REGION TOP) of REG] + (RETURN (COND + ((AND (IGEQ RGHT LFT) + (IGEQ TP BTTM)) + (create REGION + LEFT _ LFT + BOTTOM _ BTTM + WIDTH _ (ADD1 (IDIFFERENCE RGHT LFT)) + HEIGHT _ (ADD1 (IDIFFERENCE TP BTTM]) + +(UNIONREGIONS + [LAMBDA REGIONS (* rrb "30-Dec-85 17:07") + + (* ;; "returns the smallest region that encloses all of REGIONS") + + (COND + ((EQ 0 REGIONS) + NIL) + (T (PROG (REG LFT RGHT BTTM TP) + (SETQ REG (ARG REGIONS 1)) + (SETQ LFT (fetch (REGION LEFT) of REG)) + (SETQ RGHT (fetch (REGION PRIGHT) of REG)) + (SETQ BTTM (fetch (REGION BOTTOM) of REG)) + (SETQ TP (fetch (REGION PTOP) of REG)) + [for I from 2 thru REGIONS do (SETQ REG (ARG REGIONS I)) + [COND + ((LESSP (fetch (REGION LEFT) of REG) + LFT) + (SETQ LFT (fetch (REGION LEFT) of REG] + [COND + ((LESSP (fetch (REGION BOTTOM) of REG) + BTTM) + (SETQ BTTM (fetch (REGION BOTTOM) of REG] + [COND + ((GREATERP (fetch (REGION PRIGHT) of REG) + RGHT) + (SETQ RGHT (fetch (REGION PRIGHT) of REG] + (COND + ((GREATERP (fetch (REGION PTOP) of REG) + TP) + (SETQ TP (fetch (REGION PTOP) of REG] + (RETURN (create REGION + LEFT _ LFT + BOTTOM _ BTTM + WIDTH _ (DIFFERENCE RGHT LFT) + HEIGHT _ (DIFFERENCE TP BTTM]) + +(REGIONSINTERSECTP + [LAMBDA (REGION1 REGION2) (* rrb "16-AUG-81 08:29") + + (* ;; "determines if two regions intersect") + + (NOT (OR (IGREATERP (fetch LEFT of REGION1) + (fetch RIGHT of REGION2)) + (IGREATERP (fetch LEFT of REGION2) + (fetch RIGHT of REGION1)) + (IGREATERP (fetch BOTTOM of REGION1) + (fetch TOP of REGION2)) + (IGREATERP (fetch BOTTOM of REGION2) + (fetch TOP of REGION1]) + +(SUBREGIONP + [LAMBDA (LARGEREGION SMALLREGION) (* rrb "25-JUN-82 15:09") + + (* ;; "determines if small region is a subset of large region. (SUBREGIONP '(9 0 100 100) '(0 10 100 80))") + + (AND (IGEQ (fetch LEFT of SMALLREGION) + (fetch LEFT of LARGEREGION)) + (IGEQ (fetch BOTTOM of SMALLREGION) + (fetch BOTTOM of LARGEREGION)) + (IGEQ (fetch PRIGHT of LARGEREGION) + (fetch PRIGHT of SMALLREGION)) + (IGEQ (fetch PTOP of LARGEREGION) + (fetch PTOP of SMALLREGION]) + +(EXTENDREGION + [LAMBDA (REGION INCLUDEREGION) (* rrb " 5-FEB-82 09:25") + + (* ;; "destructively extends REGION to include INCLUDEREGION") + + [COND + ((IGREATERP (fetch (REGION LEFT) of REGION) + (fetch (REGION LEFT) of INCLUDEREGION)) + (replace (REGION WIDTH) of REGION with (IDIFFERENCE (fetch (REGION PRIGHT) of REGION) + (fetch (REGION LEFT) of INCLUDEREGION))) + (replace (REGION LEFT) of REGION with (fetch (REGION LEFT) of INCLUDEREGION] + [COND + ((IGREATERP (fetch (REGION BOTTOM) of REGION) + (fetch (REGION BOTTOM) of INCLUDEREGION)) + (replace (REGION HEIGHT) of REGION with (IDIFFERENCE (fetch (REGION PTOP) of REGION) + (fetch (REGION BOTTOM) of INCLUDEREGION))) + (replace (REGION BOTTOM) of REGION with (fetch (REGION BOTTOM) of INCLUDEREGION] + [COND + ((IGREATERP (fetch (REGION RIGHT) of INCLUDEREGION) + (fetch (REGION RIGHT) of REGION)) + (replace (REGION WIDTH) of REGION with (ADD1 (IDIFFERENCE (fetch (REGION RIGHT) of + INCLUDEREGION + ) + (fetch (REGION LEFT) of REGION] + [COND + ((IGREATERP (fetch (REGION TOP) of INCLUDEREGION) + (fetch (REGION TOP) of REGION)) + (replace (REGION HEIGHT) of REGION with (ADD1 (IDIFFERENCE (fetch (REGION TOP) of + INCLUDEREGION + ) + (fetch (REGION BOTTOM) of REGION] + REGION]) + +(EXTENDREGIONBOTTOM + [LAMBDA (REG NEWBOTTOM) (* rrb "29-DEC-81 10:02") + (* ; "extends a region to the bottom") + (PROG ((OLDBOTTOM (fetch (REGION BOTTOM) of REG))) + [COND + ((IGREATERP OLDBOTTOM NEWBOTTOM) + (replace (REGION BOTTOM) of REG with NEWBOTTOM) + (replace (REGION HEIGHT) of REG with (IPLUS (fetch (REGION HEIGHT) of REG) + (IDIFFERENCE OLDBOTTOM NEWBOTTOM] + (RETURN REG]) + +(EXTENDREGIONLEFT + [LAMBDA (REG NEWLEFT) (* rrb "29-DEC-81 09:37") + (* ; "extends a region to the left") + (PROG ((OLDLEFT (fetch (REGION LEFT) of REG))) + [COND + ((IGREATERP OLDLEFT NEWLEFT) + (replace (REGION LEFT) of REG with NEWLEFT) + (replace (REGION WIDTH) of REG with (IPLUS (fetch (REGION WIDTH) of REG) + (IDIFFERENCE OLDLEFT NEWLEFT] + (RETURN REG]) + +(EXTENDREGIONRIGHT + [LAMBDA (REG NEWRIGHT) (* rrb "29-DEC-81 10:06") + (* ; "extends a region to the left") + (PROG ((OLDRIGHT (fetch (REGION RIGHT) of REG))) + [COND + ((ILESSP OLDRIGHT NEWRIGHT) + (replace (REGION WIDTH) of REG with (IPLUS (fetch (REGION WIDTH) of REG) + (IDIFFERENCE NEWRIGHT OLDRIGHT] + (RETURN REG]) + +(EXTENDREGIONTOP + [LAMBDA (REG NEWTOP) (* rrb "29-DEC-81 10:07") + (* ; "extends a region to the top") + (PROG ((OLDTOP (fetch (REGION TOP) of REG))) + [COND + ((ILESSP OLDTOP NEWTOP) + (replace (REGION HEIGHT) of REG with (IPLUS (fetch (REGION HEIGHT) of REG) + (IDIFFERENCE NEWTOP OLDTOP] + (RETURN REG]) + +(INSIDEP + [LAMBDA (REGION POSORX Y) (* rrb "18-May-84 21:04") + + (* ;; "returns T if the position X Y is inside the region REGION. If POSORX is a position, returns T if that position is inside of REGION") + + (COND + ((WINDOWP REGION) + (INSIDEP (DSPCLIPPINGREGION NIL REGION) + POSORX Y)) + (T (COND + ((AND (NUMBERP POSORX) + (NUMBERP Y)) + (INSIDE? REGION POSORX Y)) + ((POSITIONP POSORX) + (INSIDE? REGION (fetch (POSITION XCOORD) of POSORX) + (fetch (POSITION YCOORD) of POSORX))) + ((NUMBERP POSORX) + (\ILLEGAL.ARG Y)) + (T (\ILLEGAL.ARG POSORX]) + +(STRINGREGION + [LAMBDA (STR STREAM PRIN2FLG RDTBL) (* rmk%: "25-AUG-83 18:06") + + (* ;; "returns the region taken up by STR if it were printed at the current position of STREAM") + + (create REGION + LEFT _ (DSPXPOSITION NIL STREAM) + BOTTOM _ (IDIFFERENCE (DSPYPOSITION NIL STREAM) + (FONTPROP STREAM 'DESCENT)) + WIDTH _ (STRINGWIDTH STR STREAM PRIN2FLG RDTBL) + HEIGHT _ (FONTPROP STREAM 'HEIGHT]) +) + + + +(* ; "line and spline drawing.") + + + + +(* ; "Brushes and brush initialization") + +(DECLARE%: DONTCOPY +(DECLARE%: EVAL@COMPILE + +[PUTDEF '\BRUSHBBT 'RESOURCES '(NEW (create PILOTBBT] +) +) + +(/SETTOPVAL '\\BRUSHBBT.GLOBALRESOURCE NIL) +(DEFINEQ + +(\BRUSHBITMAP + [LAMBDA (BRUSHSHAPE BRUSHWIDTH) (* rrb " 9-Sep-86 16:30") + +(* ;;; "returns the bitmap for the brush of the shape and size. See comments on \InitCurveBrushes.") + + (DECLARE (GLOBALVARS \BrushAList)) + (LET [(BRUSHES&METHOD (CDR (OR (FASSOC BRUSHSHAPE \BrushAList) + (\ILLEGAL.ARG BRUSHSHAPE] + (COND + ((NOT (GREATERP BRUSHWIDTH 0)) + + (* ;; "if brush is 0 or negative, return an empty brush. Might want to error but this would require users to handle it.") + + (BITMAPCREATE 0 0)) + [(ILESSP BRUSHWIDTH 17) (* ; + "lowest 16 brushes are stored. FIX them so ELT works.") + (ELT (fetch (BRUSHITEM BRUSHARRAY) of BRUSHES&METHOD) + (COND + ((FIXP BRUSHWIDTH)) + ((GREATERP BRUSHWIDTH 1) + (FIXR BRUSHWIDTH)) + (T 1] + [(CDR (FASSOC BRUSHWIDTH (fetch (BRUSHITEM BRUSHCACHE) of BRUSHES&METHOD] + (T + (* ;; "cache the brush bitmap. This is done so that the brush creation methods don't have to be efficient.") + + (LET ((NEWBRUSHBM (APPLY* (fetch (BRUSHITEM CREATEMETHOD) of BRUSHES&METHOD) + BRUSHWIDTH))) + (replace (BRUSHITEM BRUSHCACHE) of BRUSHES&METHOD + with (CONS (CONS BRUSHWIDTH NEWBRUSHBM) + (fetch (BRUSHITEM BRUSHCACHE) of BRUSHES&METHOD))) + NEWBRUSHBM]) + +(\GETBRUSH + [LAMBDA (BRUSH) (* rrb " 9-Sep-86 16:30") + (COND + ((type? BITMAP BRUSH) + BRUSH) + [(LISTP BRUSH) + (\BRUSHBITMAP (CAR BRUSH) + (CAR (LISTP (CDR BRUSH] + (T (\BRUSHBITMAP 'ROUND (OR BRUSH 1]) + +(\GETBRUSHBBT + [LAMBDA (BRUSHBM DISPLAYDATA BBT) (* kbr%: "18-Aug-85 12:46") + + (* ;; "Initializes BBT for the BRUSHBM and DS and returns BBT, unless the BRUSHBM is a 1-point brush, in which case it returns NIL.") + + (COND + ((AND (EQ (fetch (BITMAP BITMAPHEIGHT) of BRUSHBM) + 1) + (EQ (ffetch (BITMAP BITMAPWIDTH) of BRUSHBM) + 1) + (EQ (BITMAPBIT BRUSHBM 0 0) + 1)) (* ; + "special case of single point brush shape.") + NIL) + (T (* ; + "update as many fields in the brush bitblt table as possible from DS.") + (replace (PILOTBBT PBTDESTBPL) of BBT with (UNFOLD (fetch (BITMAP BITMAPRASTERWIDTH) + of (fetch (\DISPLAYDATA DDDestination + ) of DISPLAYDATA)) + BITSPERWORD)) + (freplace (PILOTBBT PBTSOURCEBPL) of BBT with (UNFOLD (ffetch (BITMAP BITMAPRASTERWIDTH) + of BRUSHBM) + BITSPERWORD)) + (freplace (PILOTBBT PBTFLAGS) of BBT with 0) + (freplace (PILOTBBT PBTDISJOINT) of BBT with T) + (\SETPBTFUNCTION BBT (ffetch (\DISPLAYDATA DDSOURCETYPE) of DISPLAYDATA) + (SELECTQ (ffetch (\DISPLAYDATA DDOPERATION) of DISPLAYDATA) + ((PAINT REPLACE) + 'PAINT) + ((INVERT ERASE) + 'ERASE) + (SHOULDNT))) + BBT]) + +(\InitCurveBrushes + [LAMBDA NIL (* ; "Edited 13-Oct-87 14:31 by jds") + + (* ;; "Set up the initial set of brush specs for curve drawing. \BrushAList is an association list from brush-shape-names to a spec which is an instance of the record BRUSHITEM.") + + (DECLARE (GLOBALVARS \BrushNames \BrushAList \SingleBitBitmap)) + (PROG (BARRAY CREATIONMETHOD) + (SETQ \SingleBitBitmap (BITMAPCREATE 1 1)) + (BITMAPBIT \SingleBitBitmap 0 0 1) + (for BRUSHNAME in \BrushNames do (SETQ BARRAY (ARRAY 16 'POINTER NIL 1)) + (SETQ CREATIONMETHOD (PACK* '\MAKEBRUSH. BRUSHNAME)) + (SETA BARRAY 1 \SingleBitBitmap) + (for SIZE from 2 to 16 + do (SETA BARRAY SIZE (APPLY* CREATIONMETHOD SIZE))) + (INSTALLBRUSH BRUSHNAME CREATIONMETHOD BARRAY]) + +(\BrushFromWidth + [LAMBDA (W) (* hdj " 5-Nov-84 16:47") + (LIST 'ROUND W]) +) +(DEFINEQ + +(\MAKEBRUSH.DIAGONAL + [LAMBDA (SIZE) (* kbr%: "18-Aug-85 12:51") + (PROG (BM) + (SETQ BM (BITMAPCREATE SIZE SIZE)) + (for X from 0 to (SUB1 SIZE) do (BITMAPBIT BM X X 1)) + (RETURN BM]) + +(\MAKEBRUSH.HORIZONTAL + [LAMBDA (SIZE) (* kbr%: "18-Aug-85 12:52") + +(* ;;; "create a brush that has a horizontal line across it halfway down") + + (PROG (BM) + (SETQ BM (BITMAPCREATE SIZE SIZE)) + (BITBLT NIL NIL NIL BM 0 (SUB1 (FOLDHI SIZE 2)) + NIL 1 'TEXTURE 'REPLACE BLACKSHADE) + (RETURN BM]) + +(\MAKEBRUSH.VERTICAL + [LAMBDA (SIZE) (* kbr%: "18-Aug-85 12:53") + (PROG (BM) + (SETQ BM (BITMAPCREATE SIZE SIZE)) + (BITBLT NIL NIL NIL BM (SUB1 (FOLDHI SIZE 2)) + 0 1 SIZE 'TEXTURE 'REPLACE BLACKSHADE) + (RETURN BM]) + +(\MAKEBRUSH.SQUARE + [LAMBDA (SIZE) (* kbr%: "18-Aug-85 13:07") + (PROG (BM) + (SETQ BM (BITMAPCREATE SIZE SIZE)) + (BITBLT NIL NIL NIL BM NIL NIL NIL NIL 'TEXTURE 'REPLACE BLACKSHADE) + (RETURN BM]) + +(\MAKEBRUSH.ROUND + [LAMBDA (SIZE) (* rrb "15-Sep-86 14:32") + (* ; + "special cased 8 so that it wouldn't have a width of 7. rrb") + (PROG (RADIUS BITMAP BASE) + (SETQ RADIUS (SUB1 (HALF SIZE))) + (SETQ BITMAP (BITMAPCREATE SIZE SIZE)) + (SETQ BASE (fetch (BITMAP BITMAPBASE) of BITMAP)) + (SELECTQ SIZE + (1 (\PUTBASE BASE 0 (MASK.1'S 15 1))) + (2 (\PUTBASE BASE 0 (MASK.1'S 14 2)) + (\PUTBASE BASE 1 (MASK.1'S 14 2))) + (3 (\PUTBASE BASE 0 (MASK.1'S 14 1)) + (\PUTBASE BASE 1 (MASK.1'S 13 3)) + (\PUTBASE BASE 2 (MASK.1'S 14 1))) + (4 (\PUTBASE BASE 0 (MASK.1'S 13 2)) + (\PUTBASE BASE 1 (MASK.1'S 12 4)) + (\PUTBASE BASE 2 (MASK.1'S 12 4)) + (\PUTBASE BASE 3 (MASK.1'S 13 2))) + (5 (\PUTBASE BASE 0 (MASK.1'S 13 1)) + (\PUTBASE BASE 1 (MASK.1'S 12 3)) + (\PUTBASE BASE 2 (MASK.1'S 11 5)) + (\PUTBASE BASE 3 (MASK.1'S 12 3)) + (\PUTBASE BASE 4 (MASK.1'S 13 1))) + (8 (\PUTBASE BASE 0 (MASK.1'S 10 4)) + (\PUTBASE BASE 1 (MASK.1'S 9 6)) + (\PUTBASE BASE 2 (MASK.1'S 8 8)) + (\PUTBASE BASE 3 (MASK.1'S 8 8)) + (\PUTBASE BASE 4 (MASK.1'S 8 8)) + (\PUTBASE BASE 5 (MASK.1'S 8 8)) + (\PUTBASE BASE 6 (MASK.1'S 9 6)) + (\PUTBASE BASE 7 (MASK.1'S 10 4))) + (FILLCIRCLE RADIUS RADIUS RADIUS BLACKSHADE (DSPCREATE BITMAP))) + (RETURN BITMAP]) +) +(DEFINEQ + +(INSTALLBRUSH + [LAMBDA (BRUSHNAME BRUSHFN BRUSHARRAY) (* kbr%: "18-Jan-86 15:27") + (DECLARE (GLOBALVARS \BrushAList)) + (PROG (OLDENTRY) + (SETQ OLDENTRY (FASSOC BRUSHNAME \BrushAList)) + (COND + (OLDENTRY (AND BRUSHARRAY (replace (BRUSHITEM BRUSHARRAY) of (CDR OLDENTRY) with + BRUSHARRAY + )) + (AND BRUSHFN (replace (BRUSHITEM CREATEMETHOD) of (CDR OLDENTRY) with BRUSHFN))) + (T [COND + ((AND BRUSHFN (NOT (ARRAYP BRUSHARRAY))) + (SETQ BRUSHARRAY (ARRAY 16 'POINTER NIL 1)) + (for X from 1 to 16 do (SETA BRUSHARRAY X (APPLY* BRUSHFN X] + (push \BrushAList (CONS BRUSHNAME (create BRUSHITEM + BRUSHARRAY _ BRUSHARRAY + CREATEMETHOD _ BRUSHFN))) + (push KNOWN.BRUSHES BRUSHNAME]) +) + +(RPAQQ \BrushNames (ROUND SQUARE DIAGONAL HORIZONTAL VERTICAL)) + +(RPAQ? KNOWN.BRUSHES NIL) + +(RPAQ? \BrushAList NIL) +(DECLARE%: EVAL@COMPILE + +(RECORD BRUSHITEM (BRUSHARRAY CREATEMETHOD . BRUSHCACHE)) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY + +(\InitCurveBrushes) +) +(DECLARE%: DONTCOPY +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS \BrushAList KNOWN.BRUSHES) +) +) + + + +(* ; "Lines") + +(DEFINEQ + +(\DRAWLINE.DISPLAY + [LAMBDA (DISPLAYSTREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR DASHING) + (* ; "Edited 13-Jun-2021 14:03 by rmk:") + + (* ;; "DISPLAYSTREAM is guaranteed to be a display-stream. Draws a line from x1,y1 to x2,y2 leaving the position at x2,y2") + + (* ;; "Added handling of brushes (I think, this is actually pretty tricky).") + + (DECLARE (LOCALVARS . T)) + (SELECTQ OPERATION + (NIL (ffetch DDOPERATION of (fetch IMAGEDATA of DISPLAYSTREAM))) + ((REPLACE PAINT INVERT ERASE) + OPERATION) + (\ILLEGAL.ARG OPERATION)) + (\INSURETOPWDS DISPLAYSTREAM) (* ; + "RMK: This was only in the no-dash case, oddly") + (IF (OR DASHING (BRUSHP WIDTH)) + THEN [LET ((BRUSH (INSURE.BRUSH WIDTH))) + (if COLOR + then (replace (BRUSH BRUSHCOLOR) of BRUSH with COLOR)) + (IF (BIGBITMAPP (ffetch DDDestination of (fetch IMAGEDATA of DISPLAYSTREAM))) + THEN (\DRAWLINE.BIGBM.DASH DISPLAYSTREAM X1 Y1 X2 Y2 BRUSH DASHING OPERATION) + ELSE (GLOBALRESOURCES \BRUSHBBT (\LINEWITHBRUSH X1 Y1 X2 Y2 BRUSH + (\GOOD.DASHLST DASHING BRUSH) + DISPLAYSTREAM \BRUSHBBT OPERATION] + ELSEIF (BIGBITMAPP (ffetch DDDestination of (fetch IMAGEDATA of DISPLAYSTREAM))) + THEN (\DRAWLINE.BIGBM.NODASH DISPLAYSTREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR) + ELSE (LET ((DD (fetch IMAGEDATA of DISPLAYSTREAM))) + (\CLIPANDDRAWLINE (\DSPTRANSFORMX (OR (FIXP X1) + (FIXR X1)) + DD) + (\DSPTRANSFORMY (OR (FIXP Y1) + (FIXR Y1)) + DD) + (\DSPTRANSFORMX (OR (FIXP X2) + (FIXR X2)) + DD) + (\DSPTRANSFORMY (OR (FIXP Y2) + (FIXR Y2)) + DD) + [COND + ((NULL WIDTH) + 1) + ((OR (FIXP WIDTH) + (FIXR WIDTH] + OPERATION + (ffetch DDDestination of DD) + (ffetch DDClippingLeft of DD) + (SUB1 (ffetch DDClippingRight of DD)) + (ffetch DDClippingBottom of DD) + (SUB1 (ffetch DDClippingTop of DD)) + DISPLAYSTREAM COLOR))) (* ; + "the generic case of MOVETO is used so that the hardcopy streams get handled as well.") + (MOVETO X2 Y2 DISPLAYSTREAM]) + +(RELMOVETO + [LAMBDA (DX DY STREAM) (* rmk%: "25-AUG-83 18:13") + (* ; "moves the position by a vector") + (DSPXPOSITION [IPLUS DX (DSPXPOSITION NIL (SETQ STREAM (\OUTSTREAMARG STREAM] + STREAM) + (DSPYPOSITION (IPLUS DY (DSPYPOSITION NIL STREAM)) + STREAM]) + +(MOVETOUPPERLEFT + [LAMBDA (STREAM REGION) (* hdj " 5-Jul-85 12:19") + + (* ;; "moves the current position to the upper left corner so that the first line of text will all appear.") + + (PROG [(ASCENT (FONTPROP (DSPFONT NIL STREAM) + 'ASCENT] + (COND + ((AND REGION (OR (type? REGION REGION) + (\ILLEGAL.ARG REGION))) + (MOVETO (fetch (REGION LEFT) of REGION) + (IDIFFERENCE (fetch (REGION PTOP) of REGION) + ASCENT) + STREAM)) + (T (MOVETO (DSPLEFTMARGIN NIL STREAM) + (IDIFFERENCE (fetch (REGION PTOP) of (DSPCLIPPINGREGION NIL STREAM)) + ASCENT) + STREAM))) + (RETURN STREAM]) +) +(DEFINEQ + +(\CLIPANDDRAWLINE + [LAMBDA (X1 Y1 X2 Y2 WIDTH OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR) + (* ; "Edited 21-Aug-91 12:15 by jds") + + (* ;; "draws a line from {X1,Y1} to {X2,Y2} clipped to region specified by LEFT RIGHT BOTTOM and TOP. This code is a transliterated version of the BCPL routine that was in chat.") + + (* ;; "assumes that the width is at least 1") + + (* ;; "DS is passed so that window can be uninterruptably brought to top.") + + (COND + ((NOT (EQ (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) + 1)) (* ; + "make adjustments in case of color.") + (SETQ COLOR (COLORNUMBERP (OR COLOR (DSPCOLOR NIL DS)) + (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP))) + (* ; "(COND ((EQ OPERATION 'ERASE) ; treat erase as AND of background (SETQ COLOR (OPPOSITECOLOR COLOR (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP)))))") + ) + (T (SETQ COLOR BLACKSHADE))) + (PROG NIL + (COND + [(EQ X1 X2) (* ; "special case of vertical line.") + [COND + ((IGREATERP WIDTH 2) + (COND + [(EQ Y1 Y2) + + (* ;; "special case. Since we don't know whether the guy is headed horizontally or vertically, put out a round brush This is a fairly infrequent case because I didn't get any bug reports on it in three years so efficiency is not a consideration.") + + (RETURN (.WHILE.TOP.DS. DS (\DRAWPOINT.DISPLAY (DSPDESTINATION NIL DS) + X1 Y1 (LIST 'ROUND WIDTH COLOR) + OPERATION] + (T (SETQ X1 (SETQ X2 (IDIFFERENCE X1 (LRSH (SUB1 WIDTH) + 1] + (PROG (MIN MAX) + (RETURN (COND + ([OR (IGREATERP X1 RIGHT) + (IGEQ LEFT (SETQ X2 (IPLUS X1 WIDTH))) + (IGREATERP (SETQ MIN (IMIN Y1 Y2)) + TOP) + (IGREATERP BOTTOM (SETQ MAX (IMAX Y1 Y2] + (* ; "outside clippingregion.") + NIL) + (T (.WHILE.TOP.DS. DS (BITBLT NIL 0 0 BITMAP (SETQ X1 (IMAX X1 LEFT)) + (SETQ MIN (IMAX MIN BOTTOM)) + (IDIFFERENCE (IMIN X2 (ADD1 RIGHT)) + X1) + (ADD1 (IDIFFERENCE (IMIN MAX TOP) + MIN)) + 'TEXTURE OPERATION COLOR] + [(EQ Y1 Y2) (* ; "special case of horizontal line.") + [COND + ((IGREATERP WIDTH 2) + (SETQ Y1 (SETQ Y2 (IDIFFERENCE Y1 (LRSH (SUB1 WIDTH) + 1] + (PROG (MIN MAX) + (RETURN (COND + ([OR (IGREATERP Y1 TOP) + (IGEQ BOTTOM (SETQ Y2 (IPLUS Y1 WIDTH))) + (IGREATERP (SETQ MIN (IMIN X1 X2)) + RIGHT) + (IGREATERP LEFT (SETQ MAX (IMAX X1 X2] + (* ; "outside clippingregion.") + NIL) + (T (.WHILE.TOP.DS. DS (BITBLT NIL 0 0 BITMAP (SETQ MIN + (IMAX MIN LEFT)) + (SETQ Y1 (IMAX Y1 BOTTOM)) + (ADD1 (IDIFFERENCE (IMIN MAX RIGHT) + MIN)) + (IDIFFERENCE (IMIN Y2 (ADD1 TOP)) + Y1) + 'TEXTURE OPERATION COLOR] + ((EQ WIDTH 1) (* ; "special case of width 1") + (\CLIPANDDRAWLINE1 X1 Y1 X2 Y2 OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR)) + ((IGREATERP (IABS (IDIFFERENCE X1 X2)) + (IABS (IDIFFERENCE Y1 Y2))) (* ; + "slope is more horizontal, so make line grow in the positive y direction.") + [COND + ((IGREATERP WIDTH 2) + (PROG (HALFWIDTH) + (SETQ HALFWIDTH (LRSH (SUB1 WIDTH) + 1)) + (SETQ Y1 (IDIFFERENCE Y1 HALFWIDTH)) + (SETQ Y2 (IDIFFERENCE Y2 HALFWIDTH] + (for I from Y1 to (SUB1 (IPLUS Y1 WIDTH)) as J from Y2 + do (\CLIPANDDRAWLINE1 X1 I X2 J OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR))) + (T (* ; + "slope is more vertical, so make line grow in the positive x direction.") + [COND + ((IGREATERP WIDTH 2) + (PROG (HALFWIDTH) + (SETQ HALFWIDTH (LRSH (SUB1 WIDTH) + 1)) + (SETQ X1 (IDIFFERENCE X1 HALFWIDTH)) + (SETQ X2 (IDIFFERENCE X2 HALFWIDTH] + (for I from X1 to (SUB1 (IPLUS X1 WIDTH)) as J from X2 + do (\CLIPANDDRAWLINE1 I Y1 J Y2 OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR]) + +(\CLIPANDDRAWLINE1 + [LAMBDA (X1 Y1 X2 Y2 OPERATION BITMAP LEFT RIGHT BOTTOM TOP DS COLOR) + (* JonL " 7-May-84 02:57") + + (* ;; "LEFT, RIGHT, BOTTOM, TOP are set to the boundaries of the clipping region") + + (* ;; "DS is passed so that window can be uninterruptably brought to top.") + + (PROG (DX DY YMOVEUP HALFDX HALFDY (BMRASTERWIDTH (fetch BITMAPRASTERWIDTH of BITMAP))) + (COND + ((IGREATERP X1 X2) (* ; + "switch points so DX is always positive.") + (SETQ HALFDX X1) + (SETQ X1 X2) + (SETQ X2 HALFDX) + (SETQ HALFDX Y1) + (SETQ Y1 Y2) + (SETQ Y2 HALFDX))) (* ; + "calculate differences and sign of Y movement.") + (SETQ HALFDX (LRSH (SETQ DX (IDIFFERENCE X2 X1)) + 1)) + (SETQ HALFDY (LRSH [SETQ DY (COND + ((IGREATERP Y2 Y1) + (SETQ YMOVEUP T) + (IDIFFERENCE Y2 Y1)) + (T (IDIFFERENCE Y1 Y2] + 1)) + (COND + ((AND (IGEQ X1 LEFT) + (IGEQ RIGHT X2) + [COND + (YMOVEUP (AND (IGEQ Y1 BOTTOM) + (IGEQ TOP Y2))) + (T (AND (IGEQ Y2 BOTTOM) + (IGEQ TOP Y1] + (EQ (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) + 1)) (* ; + "line is completely visible, fast case.") + (.WHILE.TOP.DS. DS (\DRAWLINE1 X1 (SUB1 (\SFInvert BITMAP Y1)) + DX DY DX DY (COND + ((IGREATERP DX DY) + (* ; "X is the fastest mover.") + HALFDX) + (T (* ; "y is the fastest mover.") + HALFDY)) + (COND + (YMOVEUP (* ; + "y is moving in positive direction but bits are stored inversely") + (IMINUS BMRASTERWIDTH)) + (T BMRASTERWIDTH)) + OPERATION + (fetch BITMAPBASE of BITMAP) + BMRASTERWIDTH))) + (T + (PROG ((CX1 X1) + (CY1 Y1) + (CX2 X2) + (CY2 Y2) + (CA1 (\CLIPCODE X1 Y1 LEFT RIGHT TOP BOTTOM)) + (CA2 (\CLIPCODE X2 Y2 LEFT RIGHT TOP BOTTOM))) + (* ; + "save the original points for the clipping computation.") + (* ; + "determine the sectors in which the points fall.") + CLIPLP + [COND + ((NOT (EQ 0 (LOGAND CA1 CA2))) (* ; + "line is entirely out of clipping region") + (RETURN NIL)) + ((EQ 0 (IPLUS CA1 CA2)) (* ; "line is completely visible") + + (* ;; "\SFInvert has an off by one bug that everybody else in LLDISPLAY uses to save computation so SUB1 from what you would expect.") + (* ; "reuse the variable CA1") + (RETURN + (.WHILE.TOP.DS. + DS + (SELECTQ (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) + (1 (\DRAWLINE1 CX1 (SUB1 (\SFInvert BITMAP CY1)) + (IDIFFERENCE CX2 CX1) + (COND + (YMOVEUP (IDIFFERENCE CY2 CY1)) + (T (IDIFFERENCE CY1 CY2))) + DX DY (COND + ((IGREATERP DX DY) + (* ; "X is the fastest mover.") + (IREMAINDER (IPLUS (ITIMES DY (IDIFFERENCE CX1 X1)) + HALFDX) + DX)) + (T (* ; "y is the fastest mover.") + (IREMAINDER (IPLUS [ITIMES DX + (COND + (YMOVEUP + (IDIFFERENCE CY1 Y1 + )) + (T (IDIFFERENCE + Y1 CY1] + HALFDY) + DY))) + (COND + (YMOVEUP (* ; + "y is moving in positive direction but bits are stored inversely") + (IMINUS BMRASTERWIDTH)) + (T BMRASTERWIDTH)) + OPERATION + (fetch BITMAPBASE of BITMAP) + BMRASTERWIDTH)) + ((4 8) + (\DRAWCOLORLINE1 + CX1 + (SUB1 (\SFInvert BITMAP CY1)) + (IDIFFERENCE CX2 CX1) + (COND + (YMOVEUP (IDIFFERENCE CY2 CY1)) + (T (IDIFFERENCE CY1 CY2))) + DX DY (COND + ((IGREATERP DX DY) + (* ; "X is the fastest mover.") + (IREMAINDER (IPLUS (ITIMES DY (IDIFFERENCE CX1 X1)) + HALFDX) + DX)) + (T (* ; "y is the fastest mover.") + (IREMAINDER (IPLUS [ITIMES DX + (COND + (YMOVEUP (IDIFFERENCE + CY1 Y1)) + (T (IDIFFERENCE Y1 CY1] + HALFDY) + DY))) + (COND + (YMOVEUP (* ; + "y is moving in positive direction but bits are stored inversely") + (IMINUS BMRASTERWIDTH)) + (T BMRASTERWIDTH)) + OPERATION + (fetch BITMAPBASE of BITMAP) + BMRASTERWIDTH + (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP) + COLOR)) + (SHOULDNT] + [COND + ((NEQ CA1 0) + + (* ;; "now move point CX1 CY1 so that one of the coordinates is on one of the boundaries. Which boundary is done first was copied from BCPL.") + + (COND + ((IGREATERP CA1 7) (* ; "y1 less than bottom") + (* ; + "calculate the least X for which Y will be at bottom.") + [SETQ CX1 (IPLUS X1 (\LEASTPTAT DX DY (IDIFFERENCE BOTTOM Y1] + (SETQ CY1 BOTTOM)) + ((IGREATERP CA1 3) (* ; "y1 is greater than top") + [SETQ CX1 (IPLUS X1 (\LEASTPTAT DX DY (IDIFFERENCE Y1 TOP] + (SETQ CY1 TOP)) + (T (* ; "x1 is less than left") + [SETQ CY1 (COND + [YMOVEUP (IPLUS Y1 (\LEASTPTAT DY DX (IDIFFERENCE LEFT X1] + (T (IDIFFERENCE Y1 (\LEASTPTAT DY DX (IDIFFERENCE LEFT X1] + (SETQ CX1 LEFT))) + (SETQ CA1 (\CLIPCODE CX1 CY1 LEFT RIGHT TOP BOTTOM))) + (T (* ; + "now move point CX2 CY2 so that one of the coordinates is on one of the boundaries") + (COND + ((IGREATERP CA2 7) (* ; "y2 less than bottom") + [SETQ CX2 (IPLUS X1 (\GREATESTPTAT DX DY (IDIFFERENCE Y1 BOTTOM] + (SETQ CY2 BOTTOM)) + ((IGREATERP CA2 3) (* ; "y2 is greater than top") + [SETQ CX2 (IPLUS X1 (\GREATESTPTAT DX DY (IDIFFERENCE TOP Y1] + (SETQ CY2 TOP)) + (T (* ; "x2 is greater than right") + [SETQ CY2 (COND + [YMOVEUP (IPLUS Y1 (\GREATESTPTAT DY DX (IDIFFERENCE + RIGHT X1] + (T (IDIFFERENCE Y1 (\GREATESTPTAT DY DX (IDIFFERENCE + RIGHT X1] + (SETQ CX2 RIGHT))) + (SETQ CA2 (\CLIPCODE CX2 CY2 LEFT RIGHT TOP BOTTOM] + (GO CLIPLP]) + +(\CLIPCODE + [LAMBDA (X Y LEFT RIGHT TOP BOTTOM) (* rrb " 4-DEC-80 10:34") + + (* ;; "determines the sector code for a point wrt a region. Used to clip things quickly.") + + (* ;; "RIGHT and TOP are one past the region.") + + (COND + ((LESSP X LEFT) (* ; "falls to left of region") + (COND + ((GREATERP Y TOP) (* ; "left above") + 5) + ((LESSP Y BOTTOM) (* ; "left below") + 9) + (T (* ; "left inside") + 1))) + ((GREATERP X RIGHT) (* ; "right") + (COND + ((GREATERP Y TOP) (* ; "right above") + 6) + ((LESSP Y BOTTOM) (* ; "right below") + 10) + (T (* ; "right inside") + 2))) + ((GREATERP Y TOP) (* ; "inside top") + 4) + ((LESSP Y BOTTOM) (* ; "inside below") + 8) + (T (* ; "inside 0") + 0]) + +(\LEASTPTAT + [LAMBDA (DA DB THISB) (* rrb " 7-JAN-82 11:56") + + (* ;; "determines the smallest value in the dimension A that would give a B coordinate of THISB if a line were drawn from the point (0,0) with a slope of DA/DB.") + + (COND + ((IGREATERP DA DB) + (ADD1 (IQUOTIENT (IPLUS (IDIFFERENCE (ITIMES THISB DA) + (HALF DA)) + -1) + DB))) + (T (IQUOTIENT (IPLUS (ITIMES THISB DA) + (HALF DB)) + DB]) + +(\GREATESTPTAT + [LAMBDA (DA DB THISB) (* rrb " 7-JAN-82 14:24") + + (* ;; "determines the largest value in the dimension A that would give a B coordinate of THISB if a line were drawn from the point (0,0) with a slope of DA/DB.") + + (COND + ((IGREATERP DA DB) + (IQUOTIENT (IPLUS (IDIFFERENCE (ITIMES (ADD1 THISB) + DA) + (HALF DA)) + -1) + DB)) + (T (IQUOTIENT (IPLUS (ITIMES THISB DA) + (HALF DB)) + DB]) + +(\DRAWLINE1 + [LAMBDA (X0 Y0 XLIMIT YLIMIT DX DY CDL YINC MODE BITMAPBASE RASTERWIDTH) + (* mpl " 2-Jan-84 18:00") + + (* ;; "this was changed to interface with the opcode for line drawing. It probably be incorporated into the places it is called.") + + (* ;; "draws a line starting at X0,Y0 at a slope of DX/DY until reaching either XLIMIT or YLIMIT with an initial overflow bucket size of CDL in MODE. Arranged so that the clipping routines can determine what the exact location of the end point of the clipped line is wrt line drawing coordinates eg. amount in overflow bucket. XLIMIT and YLIMIT are the number of points to be moved in that direction.") + + (\DRAWLINE.UFN (\ADDBASE BITMAPBASE (IPLUS (ITIMES Y0 RASTERWIDTH) + (FOLDLO X0 BITSPERWORD))) + (LOGAND X0 15) + DX YINC DY (SELECTQ MODE + (INVERT 2) + (ERASE 1) + 0) + CDL + (ADD1 XLIMIT) + (ADD1 YLIMIT]) + +(\DRAWLINE.UFN + [LAMBDA (FIRSTADDR FIRSTBIT XDELTA YINCR YDELTA OPERATIONCODE INITIALBUCKET PIXELSINX PIXELSINY) + (* jds " 6-Jan-86 11:27") + + (* ;; "FIRSTADDR is the address of the word which contains the first point. FIRSTBIT is the address of the first bit in FIRSTADDR. XDELTA and YDELTA are how far the complete line has to move in X and Y respectively; both are positive quantities. YINCR is the amount the address should be incremented if the Y coordinate changes and can be either positive or negative. OPERATIONCODE is 0 for REPLACE, 1 for ERASE and 2 for INVERT. INITIALBUCKET is between 0 and the maximum of DX and DY and gives the starting amount of the bucket used to determine when to increment in the slower moving direction. PIXELSINX and PIXELSINY indicates how many pixels should be drawn in the X and Y direction.") + + (DECLARE (LOCALVARS . T)) + (PROG ((MASK (\BITMASK FIRSTBIT))) + (COND + [(IGEQ XDELTA YDELTA) (* ; "X is the fastest mover.") + (SELECTQ OPERATIONCODE + (0 (.DRAWLINEX. 'REPLACE/PAINT)) + (1 (.DRAWLINEX. 'ERASE)) + (.DRAWLINEX. 'INVERT] + (T (* ; "Y is the fastest mover.") + (SELECTQ OPERATIONCODE + (0 (.DRAWLINEY. 'REPLACE/PAINT)) + (1 (.DRAWLINEY. 'ERASE)) + (.DRAWLINEY. 'INVERT]) +) +(DECLARE%: DONTCOPY +(DECLARE%: EVAL@COMPILE + +(PUTPROPS .DRAWLINEX. MACRO [(MODE) + (bind (NY _ 0) for PT from 1 to PIXELSINX + do (* ; "main loop") + [replace (BITMAPWORD BITS) of FIRSTADDR + with (SELECTQ MODE + (INVERT (LOGXOR MASK (fetch (BITMAPWORD BITS) + of FIRSTADDR))) + (ERASE (LOGAND (LOGXOR MASK WORDMASK) + (fetch (BITMAPWORD BITS) of FIRSTADDR))) + (PROGN (* ; + "case is PAINT or REPLACE. Legality of OPERATION has been checked by \CLIPANDDRAWLINE1") + (LOGOR MASK (fetch (BITMAPWORD BITS) + of FIRSTADDR] + [COND + ([NOT (IGREATERP XDELTA (SETQ INITIALBUCKET (IPLUS + INITIALBUCKET + YDELTA] + (* ; "increment in the Y direction") + (COND + ((EQ (SETQ NY (ADD1 NY)) + PIXELSINY) + (RETURN))) + (SETQ INITIALBUCKET (IDIFFERENCE INITIALBUCKET XDELTA)) + (SETQ FIRSTADDR (\ADDBASE FIRSTADDR YINCR] + (SETQ MASK (LRSH MASK 1)) + (COND + ((EQ 0 MASK) (* ; "crossed word boundary") + (SETQ FIRSTADDR (\ADDBASE FIRSTADDR 1)) + (SETQ MASK 32768]) + +(PUTPROPS .DRAWLINEY. MACRO [(MODE) + (bind (NX _ 0) for PT from 1 to PIXELSINY + do (* ; "main loop") + [replace (BITMAPWORD BITS) of FIRSTADDR + with (SELECTQ MODE + (INVERT (LOGXOR MASK (fetch (BITMAPWORD BITS) + of FIRSTADDR))) + (ERASE (LOGAND (LOGXOR MASK WORDMASK) + (fetch (BITMAPWORD BITS) of FIRSTADDR))) + (PROGN (* ; + "case is PAINT or REPLACE. Legality of OPERATION has been checked by \CLIPANDDRAWLINE1") + (LOGOR MASK (fetch (BITMAPWORD BITS) + of FIRSTADDR] + [COND + ([NOT (IGREATERP YDELTA (SETQ INITIALBUCKET (IPLUS + INITIALBUCKET + XDELTA] + (COND + ((EQ (SETQ NX (ADD1 NX)) + PIXELSINX) + (RETURN))) + (SETQ INITIALBUCKET (IDIFFERENCE INITIALBUCKET YDELTA)) + (SETQ MASK (LRSH MASK 1)) + (COND + ((EQ 0 MASK) (* ; "crossed word boundary") + (SETQ FIRSTADDR (\ADDBASE FIRSTADDR 1)) + (SETQ MASK 32768] + (SETQ FIRSTADDR (\ADDBASE FIRSTADDR YINCR]) +) +) + + + +(* ; "Curves") + +(DEFINEQ + +(\DRAWCIRCLE.DISPLAY + [LAMBDA (DISPLAYSTREAM CENTERX CENTERY RADIUS BRUSH DASHING) + (* kbr%: "15-Feb-86 22:24") + + (* ;; + "\DRAWCIRCLE.DISPLAY extended for color. Color is specified by either BRUSH or the DSPCOLOR of DS.") + + (DECLARE (LOCALVARS . T)) + (COND + ((OR (NOT (NUMBERP RADIUS)) + (ILESSP (SETQ RADIUS (FIXR RADIUS)) + 0)) + (\ILLEGAL.ARG RADIUS)) + ((EQ RADIUS 0) (* ; "don't draw anything.") + NIL) + (DASHING (* ; + "draw it with the arc drawing code which does dashing. Slow but effective.") + + (* ;; "the CDR removes the first point to work around a bug in curve drawing when closed and first and last points the same. AR 4623.0") + + (DRAWCURVE (CDR (\COMPUTE.ARC.POINTS CENTERX CENTERY RADIUS 0 360)) + T BRUSH DASHING DISPLAYSTREAM)) + (T (GLOBALRESOURCE \BRUSHBBT + (PROG (X Y D DestinationBitMap LEFT RIGHTPLUS1 TOP BOTTOM BRUSHWIDTH BRUSHHEIGHT + LEFTMINUSBRUSH BOTTOMMINUSBRUSH TOPMINUSBRUSH BRUSHBM DESTINATIONBASE + BRUSHBASE RASTERWIDTH BRUSHRASTERWIDTH NBITSRIGHTPLUS1 OPERATION + HEIGHTMINUS1 CX CY BBT COLOR COLORBRUSHBASE NBITS DISPLAYDATA USERFN) + (SETQ X 0) + (SETQ Y RADIUS) + (SETQ D (ITIMES 2 (IDIFFERENCE 1 RADIUS))) + (SETQ BBT \BRUSHBBT) + (SETQ DISPLAYDATA (fetch (STREAM IMAGEDATA) of DISPLAYSTREAM)) + (SETQ USERFN (AND (LITATOM BRUSH) + BRUSH)) + + (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") + + (COND + (USERFN (* ; + "if calling user fn, don't bother with set up and leave points in stream coordinates.") + (SETQ CX CENTERX) + (SETQ CY CENTERY)) + (T (.SETUP.FOR.\BBTCURVEPT.) + (SELECTQ NBITS + (1 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX (FOLDLO BRUSHWIDTH + 2)) + DISPLAYDATA))) + (4 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX + (FOLDLO (LRSH BRUSHWIDTH 2) + 2)) + DISPLAYDATA))) + (8 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX + (FOLDLO (LRSH BRUSHWIDTH 3) + 2)) + DISPLAYDATA))) + (24 (* ; "I doubt that this will be right.") + (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX + (FOLDLO (IQUOTIENT BRUSHWIDTH 24 + ) + 2)) + DISPLAYDATA))) + (SHOULDNT)) (* ; + "take into account the brush thickness.") + (SETQ CY (\DSPTRANSFORMY (IDIFFERENCE CENTERY (FOLDLO BRUSHHEIGHT 2)) + DISPLAYDATA)) + + (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") + + (\INSURETOPWDS DISPLAYSTREAM))) + [COND + ((EQ RADIUS 1) (* ; "put a single brush down.") + (* ; + "draw the top and bottom most points.") + [COND + (USERFN (APPLY* USERFN CX CY DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT CX CY] + (RETURN)) + (T (* ; + "draw the top and bottom most points.") + (COND + (USERFN (APPLY* USERFN CX (IPLUS CY RADIUS) + DISPLAYSTREAM) + (APPLY* USERFN CX (IDIFFERENCE CY RADIUS) + DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT CX (IPLUS CY RADIUS)) + (\CURVEPT CX (IDIFFERENCE CY RADIUS] + LP (* ; + "(UNFOLD x 2) is used instead of (ITIMES x 2)") + [COND + [(IGREATERP 0 D) + (SETQ X (ADD1 X)) + (COND + ((IGREATERP (UNFOLD (IPLUS D Y) + 2) + 1) + (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) + 2) + 4)) + (SETQ Y (SUB1 Y))) + (T (SETQ D (IPLUS D (UNFOLD X 2) + 1] + ((OR (EQ 0 D) + (IGREATERP X D)) + (SETQ X (ADD1 X)) + (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) + 2) + 4)) + (SETQ Y (SUB1 Y))) + (T (SETQ D (IPLUS (IDIFFERENCE D (UNFOLD Y 2)) + 3)) + (SETQ Y (SUB1 Y] + (COND + [(EQ Y 0) + + (* ;; "left most and right most points are drawn specially so that they are not duplicated which leaves a hole in XOR mode.") + + (COND + (USERFN (APPLY* USERFN (IPLUS CX X) + CY DISPLAYSTREAM) + (APPLY* USERFN (IDIFFERENCE CX X) + CY DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT (IPLUS CX X) + CY) + (\CURVEPT (IDIFFERENCE CX X) + CY] + (T [COND + (USERFN (APPLY* USERFN (IPLUS CX X) + (IPLUS CY Y) + DISPLAYSTREAM) + (APPLY* USERFN (IDIFFERENCE CX X) + (IPLUS CY Y) + DISPLAYSTREAM) + (APPLY* USERFN (IPLUS CX X) + (IDIFFERENCE CY Y) + DISPLAYSTREAM) + (APPLY* USERFN (IDIFFERENCE CX X) + (IDIFFERENCE CY Y) + DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CIRCLEPTS CX CY X Y] + (GO LP))) + (MOVETO CENTERX CENTERY DISPLAYSTREAM) + (RETURN NIL]) + +(\DRAWARC.DISPLAY + [LAMBDA (STREAM CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING) + (* ; "draws an arc on the display") + (\DRAWARC.GENERIC STREAM CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING]) + +(\DRAWARC.GENERIC + [LAMBDA (STREAM CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING) + (* rrb " 4-Oct-85 18:23") + (* ; "draws an arc by drawing a curve.") + (COND + ((AND (GREATERP 360 NDEGREES) + (LESSP -360 NDEGREES)) + (DRAWCURVE (\COMPUTE.ARC.POINTS CENTERX CENTERY RADIUS STARTANGLE NDEGREES) + NIL BRUSH DASHING STREAM)) + (T (* ; + "use circle drawing which could be faster") + (DRAWCIRCLE CENTERX CENTERY RADIUS BRUSH DASHING STREAM]) + +(\COMPUTE.ARC.POINTS + [LAMBDA (CENTERX CENTERY RADIUS STARTANGLE NDEGREES) (* DECLARATIONS%: FLOATING) + (* rrb "30-Oct-85 11:48") + + (* ;; "computes a list of knots that a spline goes through to make an arc") + + (PROG ((ANGLESIZE (COND + ((OR (GREATERP NDEGREES 360.0) + (GREATERP -360.0 NDEGREES)) + 360.0) + (T NDEGREES))) + ANGLEINCR) + + (* ;; "calculate an increment close to 10.0 that is exact but always have at least 5 knots and don't have more than a knot every 5 pts") + + [SETQ ANGLEINCR (FQUOTIENT ANGLESIZE + (IMIN (IMAX (ABS (FIX (FQUOTIENT ANGLESIZE 10.0))) + 5) + (PROGN (* ; + "don't have more than a knot every 5 pts") + (IMAX (ABS (FIX (QUOTIENT (TIMES RADIUS 6.3 + (QUOTIENT ANGLESIZE + 360.0)) + 4))) + 3] + + (* ;; "go from initial point to just past the last point. The just past (PLUS BETA (QUOTIENT ANGLEINCR 5.0)) picks up the case where the floating pt rounding error accumulates to be greater than the last point when it is very close to it.") + + (RETURN (for ANGLE from STARTANGLE to (PLUS STARTANGLE ANGLESIZE (QUOTIENT ANGLEINCR 5.0)) + by ANGLEINCR collect (create POSITION + XCOORD _ [FIXR (PLUS CENTERX (TIMES RADIUS + (COS ANGLE] + YCOORD _ (FIXR (PLUS CENTERY (TIMES RADIUS + (SIN ANGLE]) + +(\DRAWELLIPSE.DISPLAY + [LAMBDA (DISPLAYSTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) + (* ; "Edited 12-Apr-88 23:58 by FS") + (DECLARE (LOCALVARS . T)) + + (* ;; "Draws an ellipse. At ORIENTATION 0, the semimajor axis is horizontal, the semiminor axis vertical. Orientation is positive in the counterclockwise direction. The current location in the stream is left at the center of the ellipse.") + + (PROG ((CENTERX (FIXR CENTERX)) + (CENTERY (FIXR CENTERY)) + (SEMIMINORRADIUS (FIXR SEMIMINORRADIUS)) + (SEMIMAJORRADIUS (FIXR SEMIMAJORRADIUS))) + (COND + ((OR (EQ 0 SEMIMINORRADIUS) + (EQ 0 SEMIMAJORRADIUS)) + (MOVETO CENTERX CENTERY DISPLAYSTREAM) + (RETURN))) + (COND + ((ILESSP SEMIMINORRADIUS 1) + (\ILLEGAL.ARG SEMIMINORRADIUS)) + ((ILESSP SEMIMAJORRADIUS 1) + (\ILLEGAL.ARG SEMIMAJORRADIUS)) + ((OR (NULL ORIENTATION) + (EQ SEMIMINORRADIUS SEMIMAJORRADIUS)) + (SETQ ORIENTATION 0)) + ((NULL (NUMBERP ORIENTATION)) + (\ILLEGAL.ARG ORIENTATION))) + + (* ;; "If dashing, draw it with the curve drawing code which can do dashing") + + (COND + (DASHING (\DRAWELLIPSE.GENERIC DISPLAYSTREAM CENTERX CENTERY SEMIMINORRADIUS + SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) + (RETURN))) + + (* ;; "If degenerate ellipse, attempt circumvention of Pitteway breakdown by trying spline code instead, which appears more numerically stable (see AR6502)") + + (COND + ((< 40 (/ SEMIMAJORRADIUS SEMIMINORRADIUS)) + (\DRAWELLIPSE.GENERIC DISPLAYSTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS + ORIENTATION BRUSH DASHING) + (RETURN))) + +(* ;;; "This function is the implementation of the algorithm given in 'Algorithm for drawing ellipses or hyperbolae with a digital plotter' by Pitteway appearing in Computer Journal 10: (3) Nov 1967.0 The input parameters are used to determine the ellipse equation (1/8) Ayy+ (1/8) Bxx+ (1/4) Gxy+ (1/4) Ux+ (1/4) Vy= (1/4) K which specifies a translated version of the desired ellipse. This ellipse passes through the mesh point (0,0), the initial point of the algorithm. The power of 2 factors reflect an implementation convenience.") + + (GLOBALRESOURCE \BRUSHBBT + (PROG (DestinationBitMap LEFT RIGHTPLUS1 BOTTOM TOP BOTTOMMINUSBRUSH TOPMINUSBRUSH + LEFTMINUSBRUSH DESTINATIONBASE BRUSHBASE BRUSHHEIGHT BRUSHWIDTH + RASTERWIDTH BRUSHRASTERWIDTH BRUSHBM OPERATION HEIGHTMINUS1 + (BBT \BRUSHBBT) + (cosOrientation (COS ORIENTATION)) + (sinOrientation (SIN ORIENTATION)) + (SEMIMINORRADIUSSQUARED (ITIMES SEMIMINORRADIUS SEMIMINORRADIUS)) + (SEMIMAJORRADIUSSQUARED (ITIMES SEMIMAJORRADIUS SEMIMAJORRADIUS)) + (x 0) + (y 0) + (x2 1) + x1 y1 y2 k1 k2 k3 a b d w A B G U V K CX CY yOffset CYPlusOffset + CYMinusOffset NBITSRIGHTPLUS1 COLORBRUSHBASE COLOR NBITS + (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM)) + (USERFN (AND (LITATOM BRUSH) + BRUSH))) + + (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") + + (COND + (USERFN (* ; + "if calling user fn, don't bother with set up and leave points in window coordinates.") + (SETQ CX CENTERX) + (SETQ CY CENTERY)) + (T (.SETUP.FOR.\BBTCURVEPT.) (* ; + "take into account the brush thickness.") + (SELECTQ NBITS + (1 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX (FOLDLO BRUSHWIDTH + 2)) + DISPLAYDATA))) + (4 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX + (FOLDLO (LRSH BRUSHWIDTH 2) + 2)) + DISPLAYDATA))) + (8 (SETQ CX (\DSPTRANSFORMX (IDIFFERENCE CENTERX + (FOLDLO (LRSH BRUSHWIDTH 3) + 2)) + DISPLAYDATA))) + (SHOULDNT)) + (SETQ CY (\DSPTRANSFORMY (IDIFFERENCE CENTERY (FOLDLO BRUSHHEIGHT 2)) + DISPLAYDATA)) + + (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") + + (\INSURETOPWDS DISPLAYSTREAM))) + (SETQ A (FPLUS (FTIMES SEMIMAJORRADIUSSQUARED cosOrientation cosOrientation) + (FTIMES SEMIMINORRADIUSSQUARED sinOrientation sinOrientation))) + (SETQ B (LSH (FIXR (FPLUS (FTIMES SEMIMINORRADIUSSQUARED cosOrientation + cosOrientation) + (FTIMES SEMIMAJORRADIUSSQUARED sinOrientation + sinOrientation))) + 3)) + (SETQ G (FTIMES cosOrientation sinOrientation (LSH (IDIFFERENCE + SEMIMINORRADIUSSQUARED + + SEMIMAJORRADIUSSQUARED + ) + 1))) + [SETQ yOffset (FIXR (FQUOTIENT (ITIMES SEMIMINORRADIUS SEMIMAJORRADIUS) + (SQRT A] + (SETQ CYPlusOffset (IPLUS CY yOffset)) + (SETQ CYMinusOffset (IDIFFERENCE CY yOffset)) + (SETQ U (LSH (FIXR (FTIMES A (LSH yOffset 1))) + 2)) + (SETQ V (LSH (FIXR (FTIMES G yOffset)) + 2)) + (SETQ K (LSH [FIXR (FDIFFERENCE (ITIMES SEMIMINORRADIUSSQUARED + SEMIMAJORRADIUSSQUARED) + (FTIMES A (ITIMES yOffset yOffset] + 2)) + (SETQ A (LSH (FIXR A) + 3)) + (SETQ G (LSH (FIXR G) + 2)) + + (* ;; "The algorithm is incremental and iterates through the octants of a cartesian plane. The octants are labeled from 1 through 8 beginning above the positive X axis and proceeding counterclockwise. Decisions in making the incremental steps are determined according to the error term d which is updated according to the curvature terms a and b. k1, k2, and k3 are used to correct the error and curvature terms at octant boundaries. The initial values of these terms depends on the octant in which drawing begins. The initial move steps (x1,y1) and (x2,y2) also depend on the starting octant.") + + [COND + [(ILESSP (ABS U) + (ABS V)) + (SETQ x1 0) + (COND + [(MINUSP V) (* ; "start in octant 2") + (SETQ y1 1) + (SETQ y2 1) + (SETQ k1 (IMINUS A)) + (SETQ k2 (IDIFFERENCE k1 G)) + (SETQ k3 (IDIFFERENCE k2 (IPLUS B G))) + (SETQ b (IPLUS U (RSH (IPLUS A G) + 1))) + (SETQ a (IMINUS (IPLUS b V))) + (SETQ d (IPLUS b (RSH B 3) + (RSH V 1) + (IMINUS K] + (T (* ; "start in octant 7") + (SETQ y1 -1) + (SETQ y2 -1) + (SETQ k1 A) + (SETQ k2 (IDIFFERENCE k1 G)) + (SETQ k3 (IPLUS k2 B (IMINUS G))) + (SETQ b (IPLUS U (RSH (IDIFFERENCE G A) + 1))) + (SETQ a (IDIFFERENCE V b)) + (SETQ d (IPLUS b K (IMINUS (IPLUS (RSH V 1) + (RSH B 3] + (T (SETQ x1 1) + (SETQ y1 0) + (COND + [(MINUSP V) (* ; "start in octant 1") + (SETQ y2 1) + (SETQ k1 B) + (SETQ k2 (IPLUS k1 G)) + (SETQ k3 (IPLUS k2 A G)) + [SETQ b (IMINUS (IPLUS V (RSH (IPLUS B G) + 1] + (SETQ a (IDIFFERENCE U b)) + (SETQ d (IPLUS b K (IMINUS (IPLUS (RSH A 3) + (RSH U 1] + (T (* ; "start in octant 8") + (SETQ y2 -1) + (SETQ k1 (IMINUS B)) + (SETQ k2 (IPLUS k1 G)) + (SETQ k3 (IPLUS k2 G (IMINUS A))) + (SETQ b (IPLUS V (RSH (IDIFFERENCE B G) + 1))) + (SETQ a (IDIFFERENCE U b)) + (SETQ d (IPLUS b (RSH A 3) + (IMINUS (IPLUS K (RSH U 1] + + (* ;; "The ellipse equation describes an ellipse of the desired size and ORIENTATION centered at (0,0) and then dropped yOffset mesh points so that it will pass through (0,0). Thus, the intended starting point is (CX, CY+yOffset) where (CX, CY) is the center of the desired ellipse. Drawing is accomplished with point relative steps. In each octant, the error term d is used to choose between move 1 (an axis move) and move 2 (a diagonal move).") + + MOVE + [COND + ((MINUSP d) (* ; "move 1") + (SETQ x (IPLUS x x1)) + (SETQ y (IPLUS y y1)) + (SETQ b (IDIFFERENCE b k1)) + (SETQ a (IPLUS a k2)) + (SETQ d (IPLUS b d))) + (T (* ; "move 2") + (SETQ x (IPLUS x x2)) + (SETQ y (IPLUS y y2)) + (SETQ b (IDIFFERENCE b k2)) + (SETQ a (IPLUS a k3)) + (SETQ d (IDIFFERENCE d a] + (COND + ((MINUSP x) + (MOVETO CENTERX CENTERY DISPLAYSTREAM) + (RETURN NIL))) + [COND + (USERFN (APPLY* USERFN (IPLUS CX x) + (IPLUS CYPlusOffset y) + DISPLAYSTREAM) + (APPLY* USERFN (IDIFFERENCE CX x) + (IDIFFERENCE CYMinusOffset y) + DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM (\CURVEPT (IPLUS CX x) + (IPLUS CYPlusOffset y)) + (\CURVEPT (IDIFFERENCE CX x) + (IDIFFERENCE CYMinusOffset y] + (AND (MINUSP b) + (GO SQUARE)) + DIAGONAL + (OR (MINUSP a) + (GO MOVE)) (* ; "diagonal octant change") + (SETQ x1 (IDIFFERENCE x2 x1)) + (SETQ y1 (IDIFFERENCE y2 y1)) + (SETQ w (IDIFFERENCE (LSH k2 1) + k3)) + (SETQ k1 (IDIFFERENCE w k1)) + (SETQ k2 (IDIFFERENCE k2 k3)) + (SETQ k3 (IMINUS k3)) + [SETQ b (IPLUS b a (IMINUS (RSH (ADD1 k2) + 1] + [SETQ d (IPLUS b (RSH (IPLUS k3 4) + 3) + (IMINUS d) + (IMINUS (RSH (ADD1 a) + 1] + (SETQ a (IDIFFERENCE (RSH (ADD1 w) + 1) + a)) + (OR (MINUSP b) + (GO MOVE)) + SQUARE + (* ; "square octant change") + [COND + ((EQ 0 x1) + (SETQ x2 (IMINUS x2))) + (T (SETQ y2 (IMINUS y2] + (SETQ w (IDIFFERENCE k2 k1)) + (SETQ k1 (IMINUS k1)) + (SETQ k2 (IPLUS w k1)) + (SETQ k3 (IDIFFERENCE (LSH w 2) + k3)) + (SETQ b (IDIFFERENCE (IMINUS b) + w)) + (SETQ d (IDIFFERENCE (IDIFFERENCE b a) + d)) + (SETQ a (IDIFFERENCE (IDIFFERENCE a w) + (LSH b 1))) + (GO DIAGONAL]) + +(\DRAWCURVE.DISPLAY + [LAMBDA (DISPLAYSTREAM KNOTS CLOSED BRUSH DASHING) (* ; "Edited 9-Jan-87 16:49 by rrb") + + (* ;; "draws a spline curve with a given brush.") + + (GLOBALRESOURCE \BRUSHBBT (PROG ((BBT \BRUSHBBT) + (DASHLST (\GOOD.DASHLST DASHING BRUSH))) + (SELECTQ (LENGTH KNOTS) + (0 (* ; + "No knots => empty curve rather than error?") + NIL) + (1 (* ; + "only one knot, put down a brush shape") + (OR (type? POSITION (CAR KNOTS)) + (ERROR "bad knot" (CAR KNOTS))) + (\DRAWPOINT.DISPLAY DISPLAYSTREAM (fetch XCOORD + of (CAR KNOTS)) + (fetch YCOORD of (CAR KNOTS)) + BRUSH)) + (2 (OR (type? POSITION (CAR KNOTS)) + (ERROR "bad knot" (CAR KNOTS))) + (OR (type? POSITION (CADR KNOTS)) + (ERROR "bad knot" (CADR KNOTS))) + (\LINEWITHBRUSH (fetch XCOORD of (CAR KNOTS)) + (fetch YCOORD of (CAR KNOTS)) + (fetch XCOORD of (CADR KNOTS)) + (fetch YCOORD of (CADR KNOTS)) + BRUSH DASHLST DISPLAYSTREAM BBT)) + (\CURVE2 (PARAMETRICSPLINE KNOTS CLOSED) + BRUSH DASHLST BBT DISPLAYSTREAM)) + (RETURN DISPLAYSTREAM]) + +(\DRAWPOINT.DISPLAY + [LAMBDA (DISPLAYSTREAM X Y BRUSH OPERATION) (* rrb "17-Sep-86 17:51") + + (* ;; "draws a brush point at position X Y") + + (* ;; "this is used in 4, 8, and 24 bit per pixel bitmaps as well. For these, it may be should call BITMAPWIDTH instead of fetching.") + + (PROG ((BRUSHBM (\GETBRUSH BRUSH))) (* ; + "SUB1 is to put extra bit of even brush on the top or left.") + (RETURN (BITBLT BRUSHBM 0 0 DISPLAYSTREAM [IDIFFERENCE X (HALF (SUB1 (fetch (BITMAP + BITMAPWIDTH + ) + of BRUSHBM] + [IDIFFERENCE Y (HALF (SUB1 (fetch (BITMAP BITMAPHEIGHT) of BRUSHBM] + NIL NIL NIL (SELECTQ (OR OPERATION (DSPOPERATION NIL DISPLAYSTREAM)) + (REPLACE 'PAINT) + OPERATION]) + +(\DRAWPOLYGON.DISPLAY + [LAMBDA (STREAM POINTS CLOSED BRUSH DASHING) (* ; "Edited 13-Apr-88 14:14 by FS") + + (* ;; "Somewhat less generic version of drawpolygon that calls \drawline.display. Brush must be a brush (guaranteed in DRAWPOLYGON) other users must also ensure.") + + (* ;; "This is different than drawline.generic, because drawline.display will use width argument instead of bltting brushes around. That way you can get shades, dspoperation, eventually.") + + (PROG [COLOR (PTBRUSH (COND + ((EQ (fetch (BRUSH BRUSHSHAPE) of BRUSH) + 'ROUND) + BRUSH) + (T (create BRUSH using BRUSH BRUSHSHAPE _ 'ROUND] + (SETQ COLOR (fetch (BRUSH BRUSHCOLOR) of PTBRUSH)) + (for PTAIL on POINTS while (CDR PTAIL) do (\DRAWLINE.DISPLAY STREAM (fetch (POSITION XCOORD + ) + of (CAR PTAIL)) + (ffetch (POSITION YCOORD) + of (CAR PTAIL)) + (fetch (POSITION XCOORD) + of (CADR PTAIL)) + (ffetch (POSITION YCOORD) + of (CADR PTAIL)) + (fetch (BRUSH BRUSHSIZE) of BRUSH) + NIL COLOR DASHING) + (* ; + "put a brush between lines so it looks better. It's not mitered this way but better than not.") + (\DRAWPOINT.DISPLAY STREAM (fetch (POSITION + XCOORD) + of (CADR POINTS)) + (fetch (POSITION YCOORD) + of (CADR POINTS)) + PTBRUSH + 'NIL) + finally (COND + ((AND CLOSED (CDDR POINTS)) (* ; "draw the closing line.") + (\DRAWLINE.DISPLAY STREAM (fetch (POSITION XCOORD) of (CAR PTAIL)) + (ffetch (POSITION YCOORD) of (CAR PTAIL)) + (fetch (POSITION XCOORD) of (CAR POINTS)) + (ffetch (POSITION YCOORD) of (CAR POINTS)) + (fetch (BRUSH BRUSHSIZE) of BRUSH) + NIL COLOR DASHING))) + (OR (NULL (CDR POINTS)) + (\DRAWPOINT.DISPLAY STREAM (fetch (POSITION XCOORD) of (CAR POINTS)) + (fetch (POSITION YCOORD) of (CAR POINTS)) + PTBRUSH NIL]) + +(\LINEWITHBRUSH + [LAMBDA (X1 Y1 X2 Y2 BRUSH DASHLST DISPLAYSTREAM BBT OPERATION) + (* ; "Edited 29-Oct-87 17:40 by scp") + + (* ;; "draws a line with a brush on a guaranteed display-stream DISPLAYSTREAM") + + (DECLARE (LOCALVARS . T)) + (PROG (DestinationBitMap LEFT RIGHTPLUS1 TOP BOTTOM BRUSHWIDTH BRUSHHEIGHT LEFTMINUSBRUSH + BOTTOMMINUSBRUSH TOPMINUSBRUSH BRUSHBM DESTINATIONBASE BRUSHBASE RASTERWIDTH + BRUSHRASTERWIDTH NBITSRIGHTPLUS1 HEIGHTMINUS1 COLOR COLORBRUSHBASE NBITS + HALFBRUSHWIDTH HALFBRUSHHEIGHT DX DY YINC CDL (DASHON T) + (DASHTAIL DASHLST) + (DASHCNT (CAR DASHLST)) + (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM)) + (USERFN (AND (LITATOM BRUSH) + BRUSH)) + (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM))) + + (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") + (* ; + "move the display stream position before the coordinates are clobbered.") + (COND + ((NOT USERFN) + (.SETUP.FOR.\BBTCURVEPT.) + (SELECTQ NBITS + (1 (* ; + "SUB1 is so that the extra bit goes on the top and right as it is documented as doing for lines.") + (SETQ X1 (\DSPTRANSFORMX (IDIFFERENCE X1 (SETQ HALFBRUSHWIDTH + (FOLDLO (SUB1 BRUSHWIDTH) + 2))) + DISPLAYDATA))) + (4 (SETQ X1 (\DSPTRANSFORMX (IDIFFERENCE X1 (SETQ HALFBRUSHWIDTH + (FOLDLO (LRSH (SUB1 BRUSHWIDTH) + 2) + 2))) + DISPLAYDATA))) + (8 (SETQ X1 (\DSPTRANSFORMX (IDIFFERENCE X1 (SETQ HALFBRUSHWIDTH + (FOLDLO (LRSH (SUB1 BRUSHWIDTH) + 3) + 2))) + DISPLAYDATA))) + (SHOULDNT)) + (SETQ X2 (\DSPTRANSFORMX (IDIFFERENCE X2 HALFBRUSHWIDTH) + DISPLAYDATA)) + (SETQ Y1 (\DSPTRANSFORMY (IDIFFERENCE Y1 (SETQ HALFBRUSHHEIGHT (FOLDLO (SUB1 + BRUSHHEIGHT + ) + 2))) + DISPLAYDATA)) (* ; + "take into account the brush thickness.") + (SETQ Y2 (\DSPTRANSFORMY (IDIFFERENCE Y2 HALFBRUSHHEIGHT) + DISPLAYDATA)) + + (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") + + (\INSURETOPWDS DISPLAYSTREAM))) (* ; + "arrange things so that dx is positive.") + (COND + ((IGREATERP X1 X2) (* ; "switch points") + (swap X1 X2) + (swap Y1 Y2))) + (SETQ DX (ADD1 (IDIFFERENCE X2 X1))) + [SETQ DY (ADD1 (COND + ((IGREATERP Y2 Y1) + (SETQ YINC 1) + (IDIFFERENCE Y2 Y1)) + (T (SETQ YINC -1) + (IDIFFERENCE Y1 Y2] + [SETQ CDL (HALF (COND + ((IGREATERP DX DY) (* ; + "set up the bucket so that the ends will be the same.") + (IREMAINDER DX DY)) + (T (IREMAINDER DY DX] + [COND + [USERFN (* ; + "if user function is being called, don't bother bringing window to top uninterruptably.") + (COND + ((IGEQ DX DY) (* ; "X is the fastest mover.") + (until (IGREATERP X1 X2) + do (* ; "main loop") + (COND + (DASHON (APPLY* USERFN X1 Y1 DISPLAYSTREAM))) + [COND + (DASHTAIL (* ; "do dashing.") + (COND + ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) + (SETQ DASHON (NOT DASHON)) + (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) + DASHLST)) + (SETQ DASHCNT (CAR DASHTAIL] + [COND + ((NOT (IGREATERP DX (add CDL DY))) + (add Y1 YINC) + (COND + ((COND + ((EQ YINC -1) + (ILESSP Y1 Y2)) + ((IGREATERP Y1 Y2))) + (RETURN))) + (SETQ CDL (IDIFFERENCE CDL DX] + (add X1 1))) + (T (* ; "Y is the fastest mover.") + (until (COND + ((EQ YINC -1) + (ILESSP Y1 Y2)) + ((IGREATERP Y1 Y2))) + do (* ; "main loop") + (COND + (DASHON (APPLY* USERFN X1 Y1 DISPLAYSTREAM))) + [COND + (DASHTAIL (* ; "do dashing.") + (COND + ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) + (SETQ DASHON (NOT DASHON)) + (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) + DASHLST)) + (SETQ DASHCNT (CAR DASHTAIL] + [COND + ([NOT (IGREATERP DY (SETQ CDL (IPLUS CDL DX] + (COND + ((IGREATERP (SETQ X1 (ADD1 X1)) + X2) + (RETURN))) + (SETQ CDL (IDIFFERENCE CDL DY] + (add Y1 YINC] + (T (* ; + "when we put the points down make it uninterruptable") + (.WHILE.TOP.DS. DISPLAYSTREAM + (COND + [(IGEQ DX DY) (* ; "X is the fastest mover.") + (until (IGREATERP X1 X2) + do (* ; "main loop") + (COND + (DASHON (\CURVEPT X1 Y1))) + [COND + (DASHTAIL (* ; "do dashing.") + (COND + ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) + (SETQ DASHON (NOT DASHON)) + (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) + DASHLST)) + (SETQ DASHCNT (CAR DASHTAIL] + [COND + ([NOT (IGREATERP DX (SETQ CDL (IPLUS CDL DY] + (SETQ Y1 (IPLUS Y1 YINC)) + (COND + ((COND + ((EQ YINC -1) + (ILESSP Y1 Y2)) + ((IGREATERP Y1 Y2))) + (RETURN))) + (SETQ CDL (IDIFFERENCE CDL DX] + (SETQ X1 (ADD1 X1] + (T (* ; "Y is the fastest mover.") + (until (COND + ((EQ YINC -1) + (ILESSP Y1 Y2)) + ((IGREATERP Y1 Y2))) + do (* ; "main loop") + (COND + (DASHON (\CURVEPT X1 Y1))) + [COND + (DASHTAIL (* ; "do dashing.") + (COND + ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) + (SETQ DASHON (NOT DASHON)) + (SETQ DASHTAIL (OR (LISTP (CDR DASHTAIL)) + DASHLST)) + (SETQ DASHCNT (CAR DASHTAIL] + [COND + ([NOT (IGREATERP DY (SETQ CDL (IPLUS CDL DX] + (COND + ((IGREATERP (SETQ X1 (ADD1 X1)) + X2) + (RETURN))) + (SETQ CDL (IDIFFERENCE CDL DY] + (SETQ Y1 (IPLUS Y1 YINC] + (RETURN NIL]) +) +(DEFINEQ + +(LOADPOLY + [LAMBDA (POLY POLYPRIME A B C D) (* hdj "13-Mar-85 18:01") + (replace (POLYNOMIAL A) of POLY with (FQUOTIENT A 6.0)) + (replace (POLYNOMIAL B) of POLY with (FQUOTIENT B 2.0)) + (replace (POLYNOMIAL C) of POLY with C) + (replace (POLYNOMIAL D) of POLY with D) + (replace (POLYNOMIAL A) of POLYPRIME with (FQUOTIENT A 2.0)) + (replace (POLYNOMIAL B) of POLYPRIME with B) + (replace (POLYNOMIAL C) of POLYPRIME with C]) + +(PARAMETRICSPLINE + [LAMBDA (KNOTS CLOSEDFLG SPLINE) (* rmk%: "30-Nov-84 17:02") + + (* ;; "KNOTS is a non-NIL list of knots, CLOSEDFLG => closed curve") + + (PROG (DX DY DDX DDY DDDX DDDY %#KNOTS A BX BY X Y SX SY A C R D2X D2Y I) + [COND + (CLOSEDFLG (* ; "Wrap around") + (push KNOTS (CAR (LAST KNOTS] + (SETQ %#KNOTS (LENGTH KNOTS)) + (SETQ DX (ARRAY %#KNOTS 0 0.0)) + (SETQ DDX (ARRAY %#KNOTS 0 0.0)) + (SETQ DDDX (ARRAY %#KNOTS 0 0.0)) + (SETQ DY (ARRAY %#KNOTS 0 0.0)) + (SETQ DDY (ARRAY %#KNOTS 0 0.0)) + (SETQ DDDY (ARRAY %#KNOTS 0 0.0)) + (SETQ X (ARRAY %#KNOTS 0 0.0)) + (SETQ Y (ARRAY %#KNOTS 0 0.0)) + (for KNOT in KNOTS as I from 1 to %#KNOTS do (OR (type? POSITION KNOT) + (ERROR "bad knot" KNOT)) + (SETA X I (CAR KNOT)) + (SETA Y I (CDR KNOT))) + (SETQ A (ARRAY %#KNOTS 0 0.0)) + (SETQ BX (ARRAY %#KNOTS 0 0.0)) + (SETQ BY (ARRAY %#KNOTS 0 0.0)) + [COND + (CLOSEDFLG (SETQ C (ARRAY %#KNOTS 0 0.0)) + (SETQ R (ARRAY %#KNOTS 0 0.0)) + (SETQ SX (ARRAY %#KNOTS 0 0.0)) + (SETQ SY (ARRAY %#KNOTS 0 0.0] + (SETA A 1 4.0) + [for I from 2 to (IDIFFERENCE %#KNOTS 2) + do (SETA A I (FDIFFERENCE 4.0 (FQUOTIENT 1.0 (ELT A (SUB1 I] + [COND + (CLOSEDFLG (SETA C 1 1.0) + (for I from 2 to (IDIFFERENCE %#KNOTS 2) + do (SETA C I (FMINUS (FQUOTIENT (ELT C (SUB1 I)) + (ELT A (SUB1 I] + [COND + ((IGEQ %#KNOTS 3) + (COND + [CLOSEDFLG [SETA BX 1 (FTIMES 6.0 (FPLUS (ELT X 2) + (FMINUS (FTIMES 2.0 (ELT X 1))) + (ELT X (SUB1 %#KNOTS] + [SETA BY 1 (FTIMES 6.0 (FPLUS (ELT Y 2) + (FMINUS (FTIMES 2.0 (ELT Y 1))) + (ELT Y (SUB1 %#KNOTS] + [for I from 2 to (IDIFFERENCE %#KNOTS 2) + do [SETA BX I (FDIFFERENCE [FTIMES 6.0 + (FPLUS (ELT X (ADD1 I)) + (FMINUS (FTIMES 2.0 + (ELT X I))) + (ELT X (SUB1 I] + (FQUOTIENT (ELT BX (SUB1 I)) + (ELT A (SUB1 I] + (SETA BY I (FDIFFERENCE [FTIMES 6.0 + (FPLUS (ELT Y (ADD1 I)) + (FMINUS (FTIMES 2.0 + (ELT Y I))) + (ELT Y (SUB1 I] + (FQUOTIENT (ELT BY (SUB1 I)) + (ELT A (SUB1 I] + (SETA R (SUB1 %#KNOTS) + 1.0) + (SETA SX (SUB1 %#KNOTS) + 0.0) + (SETA SY (SUB1 %#KNOTS) + 0.0) + (for I from (IDIFFERENCE %#KNOTS 2) to 1 by -1 + do [SETA R I (FMINUS (FQUOTIENT (FPLUS (ELT R (ADD1 I)) + (ELT C I)) + (ELT A I] + (SETA SX I (FQUOTIENT (FDIFFERENCE (ELT BX I) + (ELT SX (ADD1 I))) + (ELT A I))) + (SETA SY I (FQUOTIENT (FDIFFERENCE (ELT BY I) + (ELT SY (ADD1 I))) + (ELT A I] + (T [SETA BX 1 (FTIMES 6.0 (FPLUS (FDIFFERENCE (ELT X 3) + (FTIMES 2.0 (ELT X 2))) + (ELT X 1] + [SETA BY 1 (FTIMES 6.0 (FPLUS (FDIFFERENCE (ELT Y 3) + (FTIMES 2.0 (ELT Y 2))) + (ELT Y 1] + (for I from 2 to (IDIFFERENCE %#KNOTS 2) + do [SETA BX I (FDIFFERENCE (FTIMES 6.0 + (FPLUS [FDIFFERENCE + (ELT X (IPLUS I 2)) + (FTIMES 2 (ELT X (ADD1 I] + (ELT X I))) + (FQUOTIENT (ELT BX (SUB1 I)) + (ELT A (SUB1 I] + (SETA BY I (FDIFFERENCE (FTIMES 6.0 + (FPLUS [FDIFFERENCE + (ELT Y (IPLUS I 2)) + (FTIMES 2 (ELT Y (ADD1 I] + (ELT Y I))) + (FQUOTIENT (ELT BY (SUB1 I)) + (ELT A (SUB1 I] + [COND + (CLOSEDFLG [SETQ D2X (FPLUS (ELT X %#KNOTS) + [FMINUS (FTIMES 2.0 (ELT X (SUB1 %#KNOTS] + (ELT X (IDIFFERENCE %#KNOTS 2] + [SETQ D2Y (FPLUS (ELT Y %#KNOTS) + [FMINUS (FTIMES 2.0 (ELT Y (SUB1 %#KNOTS] + (ELT Y (IDIFFERENCE %#KNOTS 2] + (SETA DDX (SUB1 %#KNOTS) + (FQUOTIENT (FDIFFERENCE (FDIFFERENCE (FTIMES D2X 6.0) + (ELT SX 1)) + (ELT SX (IDIFFERENCE %#KNOTS 2))) + (FPLUS (ELT R 1) + (ELT R (IDIFFERENCE %#KNOTS 2)) + 4.0))) + (SETA DDY (SUB1 %#KNOTS) + (FQUOTIENT (FDIFFERENCE (FDIFFERENCE (FTIMES D2Y 6.0) + (ELT SY 1)) + (ELT SY (IDIFFERENCE %#KNOTS 2))) + (FPLUS (ELT R 1) + (ELT R (IDIFFERENCE %#KNOTS 2)) + 4.0))) + [for I from 1 to (IDIFFERENCE %#KNOTS 2) + do [SETA DDX I (FPLUS (ELT SX I) + (FTIMES (ELT R I) + (ELT DDX (SUB1 %#KNOTS] + (SETA DDY I (FPLUS (ELT SY I) + (FTIMES (ELT R I) + (ELT DDY (SUB1 %#KNOTS] + (SETA DDX %#KNOTS (ELT DDX 1)) + (SETA DDY %#KNOTS (ELT DDY 1))) + (T (* ; "COMPUTE SECOND DERIVATIVES.") + [SETA DDX 1 (SETA DDY 1 (SETA DDX %#KNOTS (SETA DDY %#KNOTS 0.0] + (for I from (SUB1 %#KNOTS) to 2 by -1 + do [SETA DDX I (FQUOTIENT (FDIFFERENCE (ELT BX (SUB1 I)) + (ELT DDX (ADD1 I))) + (ELT A (SUB1 I] + (SETA DDY I (FQUOTIENT (FDIFFERENCE (ELT BY (SUB1 I)) + (ELT DDY (ADD1 I))) + (ELT A (SUB1 I] + [for I from 1 to (SUB1 %#KNOTS) + do (* ; "COMPUTE 1ST & 3RD DERIVATIVES") + (SETA DX I (FDIFFERENCE (FDIFFERENCE (ELT X (ADD1 I)) + (ELT X I)) + (FQUOTIENT (FPLUS (FTIMES 2 (ELT DDX I)) + (ELT DDX (ADD1 I))) + 6.0))) + (SETA DY I (FDIFFERENCE (FDIFFERENCE (ELT Y (ADD1 I)) + (ELT Y I)) + (FQUOTIENT (FPLUS (FTIMES 2 (ELT DDY I)) + (ELT DDY (ADD1 I))) + 6.0))) + (SETA DDDX I (FDIFFERENCE (ELT DDX (ADD1 I)) + (ELT DDX I))) + (SETA DDDY I (FDIFFERENCE (ELT DDY (ADD1 I)) + (ELT DDY I] + (SETQ SPLINE + (create SPLINE + %#KNOTS _ %#KNOTS + SPLINEX _ X + SPLINEY _ Y + SPLINEDX _ DX + SPLINEDY _ DY + SPLINEDDX _ DDX + SPLINEDDY _ DDY + SPLINEDDDX _ DDDX + SPLINEDDDY _ DDDY)) + (RETURN SPLINE]) + +(\CURVE + [LAMBDA (X0 Y0 X1 Y1 DX DY DDX DDY DDDX DDDY N BRUSHBM DISPLAYDATA BBT ENDING USERFN DISPLAYSTREAM) + (* rrb "30-Apr-85 12:44") + (DECLARE (LOCALVARS . T)) + + (* ;; "Puts a spline segment down. Since it calls BitBlt1 directly, it must clip to both clipping region and the size of the destination bit map.") + + (PROG (OLDX X Y OLDY DELTAX DELTAY DELTA TX TY OOLDX OOLDY) + [COND + ((NEQ N 0) + [COND + (USERFN (* ; + "if there is a user fn, stay in his coordinates.") + (SETQ OLDX X0) + (SETQ OLDY Y0)) + (T + (* ;; "SUB1 on brush size is to cause the extra bit to be in the top left direction as is documented for lines.") + + (SETQ OLDX (\DSPTRANSFORMX (IDIFFERENCE X0 (LRSH (SUB1 BRUSHWIDTH) + 1)) + DISPLAYDATA)) + (SETQ OLDY (\DSPTRANSFORMY (IDIFFERENCE Y0 (LRSH (SUB1 BRUSHHEIGHT) + 1)) + DISPLAYDATA] (* ; "draw origin point") + (\CURVESMOOTH OLDX OLDY USERFN DISPLAYSTREAM) (* ; + "convert the derivatives to fractional representation.") + + (* ;; "\CONVERTTOFRACTION always returns a large number box. This uses 0.49 because 0.5 causes rounding up.") + + (SETQ X (\CONVERTTOFRACTION (FPLUS OLDX 0.49))) + (SETQ Y (\CONVERTTOFRACTION (FPLUS OLDY 0.49))) + (SETQ DX (\CONVERTTOFRACTION DX)) + (SETQ DY (\CONVERTTOFRACTION DY)) + (SETQ DDX (\CONVERTTOFRACTION DDX)) + (SETQ DDY (\CONVERTTOFRACTION DDY)) + (SETQ DDDX (\CONVERTTOFRACTION DDDX)) + (SETQ DDDY (\CONVERTTOFRACTION DDDY)) + [for I from 1 to N do (* ; + "uses \BOXIPLUS to save box and also set the new value of the variable.") + (\BOXIPLUS X DX) + (\BOXIPLUS DX DDX) + (\BOXIPLUS DDX DDDX) + (\BOXIPLUS Y DY) + (\BOXIPLUS DY DDY) + (\BOXIPLUS DDY DDDY) + (SETQ OOLDX OLDX) + (SETQ OOLDY OLDY) + (SETQ DELTAX (IDIFFERENCE (SETQ OLDX (\GETINTEGERPART X)) + OOLDX)) + (SETQ DELTAY (IDIFFERENCE (SETQ OLDY (\GETINTEGERPART Y)) + OOLDY)) + (SETQ DELTA (IMAX (IABS DELTAX) + (IABS DELTAY))) + (COND + ((EQ DELTA 1) + (\CURVESMOOTH OLDX OLDY USERFN DISPLAYSTREAM))) + (COND + ((IGREATERP DELTA 1) + (SETQ DELTAX (\CONVERTTOFRACTION (FQUOTIENT DELTAX DELTA))) + (SETQ DELTAY (\CONVERTTOFRACTION (FQUOTIENT DELTAY DELTA))) + (SETQ TX (\CONVERTTOFRACTION OOLDX)) + (SETQ TY (\CONVERTTOFRACTION OOLDY)) + (for I from 0 to DELTA do (\CURVESMOOTH (\GETINTEGERPART + TX) + (\GETINTEGERPART TY) + USERFN DISPLAYSTREAM) + (\BOXIPLUS TX DELTAX) + (\BOXIPLUS TY DELTAY] + (* ; "draw the end point") + (COND + (USERFN (\CURVESMOOTH X1 Y1 USERFN DISPLAYSTREAM)) + (T (\CURVESMOOTH (\DSPTRANSFORMX (IDIFFERENCE X1 (LRSH (SUB1 BRUSHWIDTH) + 1)) + DISPLAYDATA) + (\DSPTRANSFORMY (IDIFFERENCE Y1 (LRSH (SUB1 BRUSHHEIGHT) + 1)) + DISPLAYDATA) + NIL DISPLAYSTREAM))) + (AND DISPLAYSTREAM (MOVETO X1 Y1 DISPLAYSTREAM] + (COND + (ENDING (\CURVESMOOTH (IPLUS \CURX \CURX (IMINUS \OLDX)) + (IPLUS \CURY \CURY (IMINUS \OLDY)) + USERFN DISPLAYSTREAM) + (\CURVESMOOTH (IPLUS \CURX \CURX (IMINUS \OLDX)) + (IPLUS \CURY \CURY (IMINUS \OLDY)) + USERFN DISPLAYSTREAM))) + (RETURN NIL]) + +(\CURVE2 + [LAMBDA (SPLINE BRUSH DASHLST BBT DISPLAYSTREAM) (* jds "26-Nov-85 12:21") + +(* ;;; "Given a spline curve, represented as a set of derivatives for each segment, draw it on DISPLAYSTREAM using the brush BRUSH, and dashing it according to DASHLST. For speed, use the bitblt table BBT.") + + (DECLARE (SPECVARS . T)) + + (* ;; "DISPLAYSTREAM is guaranteed to be a display-stream. Should declare most of these variables local but currently have the \CURVE function between here and \CURVEBBT so can't") + + (PROG (BRUSHBM DestinationBitMap OPERATION BRUSHWIDTH BRUSHHEIGHT BRUSHBASE BRUSHRASTERWIDTH LEFT + RIGHTPLUS1 TOP BOTTOM DESTINATIONBASE LEFTMINUSBRUSH BOTTOMMINUSBRUSH TOPMINUSBRUSH + RASTERWIDTH NBITSRIGHTPLUS1 HEIGHTMINUS1 COLOR COLORBRUSHBASE NBITS \CURX \CURY + \OLDX \OLDY \OLDERX \OLDERY LKNOT (DASHON T) + (DASHTAIL DASHLST) + (DASHCNT (CAR DASHLST)) + NPOINTS NSEGS POINTSPERSEG DX D2X D3X DY D2Y D3Y D1 D2 D3 X0 Y0 X1 Y1 DX DDX DDDX DY + DDY DDDY (XPOLY (create POLYNOMIAL)) + (X/PRIME/POLY (create POLYNOMIAL)) + (YPOLY (create POLYNOMIAL)) + (Y/PRIME/POLY (create POLYNOMIAL)) + (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM)) + (USERFN (AND (LITATOM BRUSH) + BRUSH))) + + (* ;; "many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.") + + [COND + (USERFN (* ; + "if calling user fn, don't bother with set up and leave points in window coordinates.") + (\CURVESTART (ELT (fetch (SPLINE SPLINEX) of SPLINE) + 1) + (ELT (fetch (SPLINE SPLINEY) of SPLINE) + 1))) + (T (.SETUP.FOR.\BBTCURVEPT.) (* ; + "Do it interruptably here to get set up, then uninterruptably when drawing points") + (\INSURETOPWDS DISPLAYSTREAM) (* ; + "curve pts will be kept in screen coordinates, start smoothing values there.") + (\CURVESTART (\DSPTRANSFORMX (IDIFFERENCE (ELT (fetch (SPLINE SPLINEX) of SPLINE) + 1) + (LRSH (SUB1 BRUSHWIDTH) + 1)) + DISPLAYDATA) + (\DSPTRANSFORMY (IDIFFERENCE (ELT (fetch (SPLINE SPLINEY) of SPLINE) + 1) + (LRSH (SUB1 BRUSHHEIGHT) + 1)) + DISPLAYDATA] + [bind PERSEG for KNOT from 1 to (SUB1 (fetch %#KNOTS of SPLINE)) + when (PROGN + (* ;; "Loop thru the segments of the spline curve, drawing each in turn.") + + (SETQ X0 (ELT (fetch (SPLINE SPLINEX) of SPLINE) + KNOT)) (* ; + "Set up X0,Y0 -- the starting point of this segment") + (SETQ Y0 (ELT (fetch (SPLINE SPLINEY) of SPLINE) + KNOT)) + (SETQ X1 (ELT (fetch (SPLINE SPLINEX) of SPLINE) + (ADD1 KNOT))) (* ; "And X1,Y1 -- the ending point") + (SETQ Y1 (ELT (fetch (SPLINE SPLINEY) of SPLINE) + (ADD1 KNOT))) + (SETQ DX (ELT (fetch (SPLINE SPLINEDX) of SPLINE) + KNOT)) (* ; + "And the initial derivatives -- first") + (SETQ DY (ELT (fetch (SPLINE SPLINEDY) of SPLINE) + KNOT)) + (SETQ DDX (ELT (fetch SPLINEDDX of SPLINE) + KNOT)) (* ; "Second") + (SETQ DDY (ELT (fetch SPLINEDDY of SPLINE) + KNOT)) + (SETQ DDDX (ELT (fetch SPLINEDDDX of SPLINE) + KNOT)) (* ; "And third.") + (SETQ DDDY (ELT (fetch SPLINEDDDY of SPLINE) + KNOT)) + (SETQ NPOINTS (FOLDLO (ITIMES (IMAX (IABS (IDIFFERENCE X1 X0)) + (IABS (IDIFFERENCE Y1 Y0))) + 3) + 2)) + + (* ;; "Establish an upper bound on the number of points we'll draw while painting this segment. We know that 3/2 the maximum DX or DY is the right amount.") + + (NOT (ZEROP NPOINTS))) + do + (* ;; "NPOINTS can be zero if a knot is duplicated in the spline curve to produce a discontinuity. Skip over zero-length segments to avoid divide-by-zero trouble") + + (* ;; "To prevent round-off errors from accumulating, we'll draw this segment as runs of no more than 64 points each -- recomputing completely at the start of each run. This is a trade off of speed and accuracy.") + + [COND + ((ILEQ NPOINTS 64) (* ; + "Fewer than 64 points to draw. Do it in one run.") + (SETQ NSEGS 1) + (SETQ POINTSPERSEG NPOINTS)) + (T (* ; + "Figure out how many runs to do it in.") + (SETQ NSEGS (FOLDLO NPOINTS 64)) + (SETQ POINTSPERSEG 64) + (SETQ NPOINTS (UNFOLD NSEGS 64] + (SETQ D1 (FQUOTIENT 1.0 NPOINTS)) (* ; + "Set up ÿ&Eÿt, ÿ&Eÿt**2 and ÿ&Eÿt**3, for computing the next point.") + (SETQ D2 (FTIMES D1 D1)) + (SETQ D3 (FTIMES D2 D1)) + (SETQ D3X (FTIMES D3 DDDX)) + (SETQ D3Y (FTIMES D3 DDDY)) + (COND + [(EQ NSEGS 1) (* ; "Just one segment to draw.") + [SETQ DX (FPLUS (FTIMES D1 DX) + (FTIMES DDX D2 0.5) + (FTIMES DDDX D3 (CONSTANT (FQUOTIENT 1.0 6.0] + (SETQ D2X (FPLUS (FTIMES D2 DDX) + (FTIMES D3 DDDX))) + [SETQ DY (FPLUS (FTIMES D1 DY) + (FTIMES D2 DDY 0.5) + (FTIMES D3 DDDY (CONSTANT (FQUOTIENT 1.0 6.0] + (SETQ D2Y (FPLUS (FTIMES D2 DDY) + (FTIMES D3 DDDY))) + (COND + (USERFN (* ; + "Draw this run of points, using the user's supplied function.") + (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y NPOINTS BRUSHBM DISPLAYDATA + BBT NIL USERFN DISPLAYSTREAM)) + (T (* ; + "Draw this run of points, using the brush.") + (.WHILE.TOP.DS. DISPLAYSTREAM + (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y NPOINTS BRUSHBM + DISPLAYDATA BBT NIL NIL DISPLAYSTREAM] + (T (* ; + "Have to do this segment in several runs.") + (SETQ PERSEG (FQUOTIENT 1.0 NSEGS)) + (LOADPOLY XPOLY X/PRIME/POLY DDDX DDX DX X0) + (LOADPOLY YPOLY Y/PRIME/POLY DDDY DDY DY Y0) + (bind (TT _ 0.0) + (DDDX/PER/SEG _ (FTIMES DDDX PERSEG)) + (DDDY/PER/SEG _ (FTIMES DDDY PERSEG)) + [D3XFACTOR _ (FTIMES D3 DDDX (CONSTANT (FQUOTIENT 1.0 6.0] + [D3YFACTOR _ (FTIMES D3 DDDY (CONSTANT (FQUOTIENT 1.0 6.0] for I + from 0 to (SUB1 NSEGS) + do + (* ;; + "TT is the parameter, and runs from 0 to 1 as the curve segment runs from beginning to end.") + + (SETQ TT (FPLUS TT PERSEG)) + (SETQ X1 (POLYEVAL TT XPOLY 3)) + (SETQ Y1 (POLYEVAL TT YPOLY 3)) + (SETQ DX (FPLUS (FTIMES D1 DX) + (FTIMES D2 DDX 0.5) + D3XFACTOR)) + (SETQ D2X (FPLUS (FTIMES D2 DDX) + (FTIMES D3 DDDX))) + (SETQ DY (FPLUS (FTIMES D1 DY) + (FTIMES D2 DDY 0.5) + D3YFACTOR)) + (SETQ D2Y (FPLUS (FTIMES D2 DDY) + (FTIMES D3 DDDY))) + [COND + (USERFN (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y 64 BRUSHBM + DISPLAYDATA BBT NIL USERFN DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM + (\CURVE X0 Y0 X1 Y1 DX DY D2X D2Y D3X D3Y 64 BRUSHBM + DISPLAYDATA BBT NIL NIL DISPLAYSTREAM] + (SETQ X0 X1) + (SETQ Y0 Y1) + (SETQ DDX (FPLUS DDX DDDX/PER/SEG)) + (SETQ DDY (FPLUS DDY DDDY/PER/SEG)) + (SETQ DX (POLYEVAL TT X/PRIME/POLY 2)) + (SETQ DY (POLYEVAL TT Y/PRIME/POLY 2] + + (* ;; "Draw the final point on the curve.") + + (COND + (USERFN (\CURVE 0 0 0 0 0 0 0 0 0 0 0 BRUSHBM DISPLAYDATA BBT T USERFN DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM + (\CURVE 0 0 0 0 0 0 0 0 0 0 0 BRUSHBM DISPLAYDATA BBT T NIL DISPLAYSTREAM]) + +(\CURVEEND + [LAMBDA NIL (* rrb " 5-JAN-82 17:24") + + (* ;; "Put out the last two points, using \CURVEPT, since they were held back for smoothing.") + + (PROG ((X \CURX) + (Y \CURY) + (DX (IDIFFERENCE \CURX \OLDX)) + (DY (IDIFFERENCE \CURY \OLDY))) + (for I from 1 to 2 do (\CURVESMOOTH (SETQ X (IPLUS X DX)) + (SETQ Y (IPLUS Y DY]) + +(\CURVESLOPE + [LAMBDA (KNOTS ENDFLG) (* rrb "30-Nov-84 18:17") + + (* ;; "returns a CONS of DX DY that gives the slope of the curve thru KNOTS. If ENDFLG is NIL, it is at the beginning. If ENDFLG is T, it is at the last point.") + + (PROG (DX DY PARAMS (%#KNOTS (LENGTH KNOTS))) + (RETURN (SELECTQ %#KNOTS + ((0 1) (* ; "define slope as horizontal") + '(1 . 0)) + (2 [CONS (DIFFERENCE (fetch (POSITION XCOORD) of (CADR KNOTS)) + (fetch (POSITION XCOORD) of (CAR KNOTS))) + (DIFFERENCE (fetch (POSITION YCOORD) of (CADR KNOTS)) + (fetch (POSITION YCOORD) of (CAR KNOTS]) + (PROGN [SETQ PARAMS (COND + [ENDFLG (PARAMETRICSPLINE (REVERSE (NLEFT KNOTS + (IMIN %#KNOTS + 4] + (T (PARAMETRICSPLINE (COND + ((EQ %#KNOTS 3) + (LIST (CAR KNOTS) + (CADR KNOTS) + (CADDR KNOTS))) + (T (LIST (CAR KNOTS) + (CADR KNOTS) + (CADDR KNOTS) + (CADDDR KNOTS] + (SETQ DX (ELT (fetch (SPLINE SPLINEDX) of PARAMS) + 1)) + (SETQ DY (ELT (fetch (SPLINE SPLINEDY) of PARAMS) + 1)) + (if ENDFLG + then (CONS (MINUS DX) + (MINUS DY)) + else (CONS DX DY]) + +(\CURVESTART + [LAMBDA (X Y) (* jds "27-OCT-81 15:48") + + (* ;; "Set up the init vals for \OLDER* \OLD* \CUR*, for curve smoothing in \CURVEPT.") + + (SETQ \OLDERX X) + (SETQ \OLDX X) + (SETQ \CURX X) + (SETQ \OLDERY Y) + (SETQ \OLDY Y) + (SETQ \CURY Y]) + +(\FDIFS/FROM/DERIVS + [LAMBDA (DZ DDZ DDDZ RAD NSTEPS) (* rrb "12-MAY-81 10:59") + + (* ;; "the derivatives of the function, plus a scale factor (radius for drawing circles) See 'Spline Curve Techniques' , equations 2.18.") + + (PROG (S SS SSS) + (SETQ S (FQUOTIENT 1.0 NSTEPS)) + (SETQ SS (FTIMES S S)) + (SETQ SSS (FTIMES SS S)) + (SETQ S (FTIMES S DZ RAD)) + (SETQ SS (FTIMES SS DDZ RAD)) + (SETQ SSS (FTIMES SSS DDDZ RAD)) + (RETURN (LIST (FPLUS S (FQUOTIENT SS 2.0) + (FQUOTIENT SSS 6.0)) + (FPLUS SS SSS) + SSS]) +) +(DECLARE%: DONTCOPY +(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE + +(ARRAYRECORD POLYNOMIAL (A B C D) + (CREATE (ARRAY 4 'FLOATP)) + (SYSTEM)) + +(RECORD SPLINE (%#KNOTS SPLINEX SPLINEY SPLINEDX SPLINEDY SPLINEDDX SPLINEDDY SPLINEDDDX SPLINEDDDY)) +) + +(* "END EXPORTED DEFINITIONS") + +) +(DECLARE%: DONTCOPY +(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE + +(PUTPROPS HALF MACRO ((X) + (LRSH X 1))) + +(PUTPROPS \FILLCIRCLEBLT MACRO (OPENLAMBDA (CX CY X Y) (* ; + "calls bitblt twice to fill in one line of the circle.") + (\LINEBLT FCBBT (IDIFFERENCE CX X) + (IPLUS CY Y) + (IPLUS CX X) + DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH + GRAYHEIGHT GRAYBASE NBITS) + (\LINEBLT FCBBT (IDIFFERENCE CX X) + (IDIFFERENCE CY Y) + (IPLUS CX X) + DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH + GRAYHEIGHT GRAYBASE NBITS))) +) + +(* "END EXPORTED DEFINITIONS") + + +(DECLARE%: EVAL@COMPILE + +(PUTPROPS \CURVEPT MACRO [OPENLAMBDA (X Y) + (COND + ((OR (ILEQ X LEFTMINUSBRUSH) + (IGEQ X RIGHTPLUS1) + (ILEQ Y BOTTOMMINUSBRUSH) + (IGEQ Y TOP)) + NIL) + ((NULL BBT) + (\FBITMAPBIT DESTINATIONBASE X Y OPERATION HEIGHTMINUS1 RASTERWIDTH)) + (T + (* ;; + "This should have been done in .SETUP.FOR.\BBTCURVEPT., under \GETBRUSHBBT.") + + (* ;; "Its a bug here, because brushes can't use operation REPLACE.") + + (* ;; + "(\SETPBTFUNCTION BBT (ffetch DDSOURCETYPE of DISPLAYDATA) OPERATION)") + + (\BBTCURVEPT X Y BBT LEFT BRUSHWIDTH LEFTMINUSBRUSH RIGHTPLUS1 + NBITSRIGHTPLUS1 TOPMINUSBRUSH DestinationBitMap BRUSHHEIGHT + BOTTOMMINUSBRUSH TOP BRUSHBASE DESTINATIONBASE RASTERWIDTH + BRUSHRASTERWIDTH COLORBRUSHBASE NBITS DISPLAYDATA]) + +(PUTPROPS .SETUP.FOR.\BBTCURVEPT. MACRO [NIL (PROGN (SETQ BOTTOM (ffetch (\DISPLAYDATA + DDClippingBottom) + of DISPLAYDATA)) + (SETQ TOP (ffetch (\DISPLAYDATA DDClippingTop) + of DISPLAYDATA)) + (SETQ RIGHTPLUS1 (ffetch (\DISPLAYDATA + DDClippingRight) + of DISPLAYDATA)) + (SETQ LEFT (ffetch (\DISPLAYDATA DDClippingLeft) + of DISPLAYDATA)) + (SETQ DestinationBitMap (ffetch (\DISPLAYDATA + DDDestination) + of DISPLAYDATA)) + (SETQ OPERATION (OR OPERATION (ffetch + (\DISPLAYDATA + DDOPERATION) + of DISPLAYDATA)) + ) + (SETQ NBITS (fetch (BITMAP BITMAPBITSPERPIXEL) + of DestinationBitMap)) + [COND + [(NOT (EQ NBITS 1)) + (SETQ BRUSHBM (\GETCOLORBRUSH BRUSH + (MAXIMUMCOLOR NBITS) + NBITS)) + [SETQ COLOR + (COND + [(AND (LISTP BRUSH) + (CAR (LISTP (CDDR BRUSH] + ((DSPCOLOR NIL DISPLAYSTREAM)) + (T (MAXIMUMCOLOR NBITS] + [COND + ((EQ OPERATION 'ERASE) + (SETQ COLOR (OPPOSITECOLOR COLOR NBITS] + (SETQ COLORBRUSHBASE + (fetch (BITMAP BITMAPBASE) + of (\GETCOLORBRUSH BRUSH COLOR NBITS] + (T (SETQ BRUSHBM (\GETBRUSH BRUSH] + (SETQ RASTERWIDTH (ffetch (BITMAP + BITMAPRASTERWIDTH + ) of + DestinationBitMap + )) + (SETQ DESTINATIONBASE (ffetch (BITMAP BITMAPBASE) + of DestinationBitMap)) + (SETQ BBT (\GETBRUSHBBT BRUSHBM DISPLAYDATA BBT)) + (SETQ BRUSHBASE (fetch (BITMAP BITMAPBASE) + of BRUSHBM)) + (SETQ BRUSHRASTERWIDTH (ffetch (BITMAP + BITMAPRASTERWIDTH + ) + of BRUSHBM)) + [COND + ((NULL BBT) + (SETQ HEIGHTMINUS1 (SUB1 (ffetch (BITMAP + + BITMAPHEIGHT + ) + of + DestinationBitMap + ))) + (COND + ((EQ (ffetch (\DISPLAYDATA DDOPERATION) + of DISPLAYDATA) + 'INVERT) + (SETQ OPERATION 'INVERT] + (SETQ BRUSHWIDTH (ffetch (BITMAP BITMAPWIDTH) + of BRUSHBM)) + (SETQ BRUSHHEIGHT (ffetch (BITMAP BITMAPHEIGHT) + of BRUSHBM)) + (SETQ LEFTMINUSBRUSH (IDIFFERENCE LEFT BRUSHWIDTH + )) + (SETQ BOTTOMMINUSBRUSH (IDIFFERENCE BOTTOM + BRUSHHEIGHT)) + (SETQ TOPMINUSBRUSH (IDIFFERENCE TOP BRUSHHEIGHT) + ) + (SETQ NBITSRIGHTPLUS1 (ITIMES RIGHTPLUS1 NBITS)) + (SETQ BRUSHWIDTH (ITIMES BRUSHWIDTH NBITS]) + +(PUTPROPS \CIRCLEPTS MACRO (OPENLAMBDA (CX CY X Y) + (\CURVEPT (IPLUS CX X) + (IPLUS CY Y)) + (\CURVEPT (IDIFFERENCE CX X) + (IPLUS CY Y)) + (\CURVEPT (IPLUS CX X) + (IDIFFERENCE CY Y)) + (\CURVEPT (IDIFFERENCE CX X) + (IDIFFERENCE CY Y)))) + +(PUTPROPS \CURVESMOOTH MACRO (OPENLAMBDA (NEWX NEWY USERFN DISPLAYSTREAM) + (PROG [(DX (IABS (IDIFFERENCE NEWX \OLDX))) + (DY (IABS (IDIFFERENCE NEWY \OLDY] + (COND + ((OR (IGREATERP DX 1) + (IGREATERP DY 1)) + [COND + ((NEQ [IPLUS (ADD1 (IDIFFERENCE \OLDX \OLDERX)) + (ITIMES 3 (ADD1 (IDIFFERENCE \OLDY \OLDERY] + 4) + [COND + (DASHON (COND + (USERFN (APPLY* USERFN \OLDX \OLDY + DISPLAYSTREAM)) + (T (.WHILE.TOP.DS. DISPLAYSTREAM + (\CURVEPT \OLDX \OLDY] + (COND + (DASHTAIL (COND + ((EQ 0 (SETQ DASHCNT (SUB1 DASHCNT))) + (SETQ DASHON (NOT DASHON)) + (SETQ DASHTAIL + (OR (LISTP (CDR DASHTAIL)) + DASHLST)) + (SETQ DASHCNT (CAR DASHTAIL] + (SETQ \OLDERX \OLDX) + (SETQ \OLDERY \OLDY) + (SETQ \OLDX \CURX) + (SETQ \OLDY \CURY))) + (SETQ \CURX NEWX) + (SETQ \CURY NEWY)))) +) +) +(DEFINEQ + +(\FILLCIRCLE.DISPLAY + [LAMBDA (DISPLAYSTREAM CENTERX CENTERY RADIUS TEXTURE) (* kbr%: "24-Jan-86 19:12") + + (* ;; "Fill in area bounded by circle DRAWCIRCLE would draw.") + + (COND + ((OR (NOT (NUMBERP RADIUS)) + (ILESSP (SETQ RADIUS (FIXR RADIUS)) + 0)) + (\ILLEGAL.ARG RADIUS)) + (T (GLOBALRESOURCE \BRUSHBBT + (PROG (TOP BOTTOM RIGHT LEFT OPERATION DestinationBitMap DISPLAYDATA X Y D + DESTINATIONBASE RASTERWIDTH CX CY TEXTUREBM GRAYHEIGHT GRAYWIDTH GRAYBASE + NBITS FCBBT) + (SETQ DISPLAYDATA (fetch (STREAM IMAGEDATA) of DISPLAYSTREAM)) + (SETQ X 0) + (SETQ Y RADIUS) + (SETQ D (ITIMES 2 (IDIFFERENCE 1 RADIUS))) + (SETQ FCBBT \BRUSHBBT) + (SETQ LEFT (fetch (\DISPLAYDATA DDClippingLeft) of DISPLAYDATA)) + (SETQ BOTTOM (fetch (\DISPLAYDATA DDClippingBottom) of DISPLAYDATA)) + (SETQ TOP (SUB1 (fetch (\DISPLAYDATA DDClippingTop) of DISPLAYDATA))) + (SETQ RIGHT (SUB1 (fetch (\DISPLAYDATA DDClippingRight) of DISPLAYDATA))) + (SETQ OPERATION (fetch (\DISPLAYDATA DDOPERATION) of DISPLAYDATA)) + (SETQ DestinationBitMap (fetch (\DISPLAYDATA DDDestination) of DISPLAYDATA)) + (SETQ NBITS (fetch (BITMAP BITMAPBITSPERPIXEL) of DestinationBitMap)) + [SETQ TEXTUREBM (COND + ((BITMAPP TEXTURE)) + [(NOT (EQ NBITS 1))(* ; + "color case, default texture differently") + (COND + ((BITMAPP (COLORTEXTUREFROMCOLOR# + (COLORNUMBERP (OR TEXTURE (DSPCOLOR NIL + DISPLAYSTREAM + )) + NBITS T) + NBITS))) + [(AND (LISTP TEXTURE) + (BITMAPP (COLORTEXTUREFROMCOLOR# + (COLORNUMBERP (CADR TEXTURE) + NBITS) + NBITS] + (T (\ILLEGAL.ARG TEXTURE] + ((LISTP TEXTURE) (* ; + "either a color or a list of (texture color)") + (INSURE.B&W.TEXTURE TEXTURE)) + [(AND (NULL TEXTURE) + (BITMAPP (fetch (\DISPLAYDATA DDTexture) of + DISPLAYDATA + ] + ([OR (FIXP TEXTURE) + (AND (NULL TEXTURE) + (SETQ TEXTURE (fetch (\DISPLAYDATA DDTexture) + of DISPLAYDATA] + (* ; + "create bitmap for the texture. Could reuse a bitmap but for now this is good enough.") + (SETQ TEXTUREBM (BITMAPCREATE 16 4)) + (SETQ GRAYBASE (fetch (BITMAP BITMAPBASE) of TEXTUREBM)) + (\PUTBASE GRAYBASE 0 (\SFReplicate (LOGAND (LRSH TEXTURE + 12) + 15))) + (\PUTBASE GRAYBASE 1 (\SFReplicate (LOGAND (LRSH TEXTURE 8 + ) + 15))) + (\PUTBASE GRAYBASE 2 (\SFReplicate (LOGAND (LRSH TEXTURE 4 + ) + 15))) + (\PUTBASE GRAYBASE 3 (\SFReplicate (LOGAND TEXTURE 15))) + TEXTUREBM) + (T (\ILLEGAL.ARG TEXTURE] + (SETQ GRAYBASE (fetch (BITMAP BITMAPBASE) of TEXTUREBM)) + (SETQ DESTINATIONBASE (fetch (BITMAP BITMAPBASE) of DestinationBitMap)) + (SETQ RASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of DestinationBitMap)) + (* ; + "update as many fields in the brush bitblt table as possible from DS.") + (replace (PILOTBBT PBTFLAGS) of FCBBT with 0) + (replace (PILOTBBT PBTDESTBPL) of FCBBT with (UNFOLD RASTERWIDTH BITSPERWORD)) + (* ; + "clear gray information. PBTSOURCEBPL is used for gray information too.") + (replace (PILOTBBT PBTSOURCEBPL) of FCBBT with 0) + (replace (PILOTBBT PBTUSEGRAY) of FCBBT with T) + [replace (PILOTBBT PBTGRAYWIDTHLESSONE) of FCBBT + with (SUB1 (SETQ GRAYWIDTH (IMIN (fetch (BITMAP BITMAPWIDTH) of TEXTUREBM) + 16] + [replace (PILOTBBT PBTGRAYHEIGHTLESSONE) of FCBBT + with (SUB1 (SETQ GRAYHEIGHT (IMIN (fetch (BITMAP BITMAPHEIGHT) of TEXTUREBM + ) + 16] + (replace (PILOTBBT PBTDISJOINT) of FCBBT with T) + (\SETPBTFUNCTION FCBBT 'TEXTURE OPERATION) + (replace (PILOTBBT PBTHEIGHT) of FCBBT with 1) + (* ; + "take into account the brush thickness.") + (SETQ CX (\DSPTRANSFORMX CENTERX DISPLAYDATA)) + (SETQ CY (\DSPTRANSFORMY CENTERY DISPLAYDATA)) + (* ; + "change Y TOP and BOTTOM to be in bitmap coordinates") + (SETQ CY (SUB1 (\SFInvert DestinationBitMap CY))) + (SETQ TOP (SUB1 (\SFInvert DestinationBitMap TOP))) + (SETQ BOTTOM (SUB1 (\SFInvert DestinationBitMap BOTTOM))) + (swap TOP BOTTOM) + (\INSURETOPWDS DISPLAYSTREAM) + + (* ;; "Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points") + + (COND + ((EQ RADIUS 0) (* ; + "put a single point down. Use \LINEBLT to get proper texture. NIL") + (.WHILE.TOP.DS. DISPLAYSTREAM + (\LINEBLT FCBBT CX CY CX DESTINATIONBASE RASTERWIDTH LEFT RIGHT + BOTTOM TOP GRAYWIDTH GRAYHEIGHT GRAYBASE NBITS)) + (RETURN))) + LP (* ; + "(UNFOLD x 2) is used instead of (ITIMES x 2)") + [COND + [(IGREATERP 0 D) + (SETQ X (ADD1 X)) + (COND + ((IGREATERP (UNFOLD (IPLUS D Y) + 2) + 1) + (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) + 2) + 4))) + (T (SETQ D (IPLUS D (UNFOLD X 2) + 1)) (* ; "don't draw unless Y changes.") + (GO LP] + ((OR (EQ 0 D) + (IGREATERP X D)) + (SETQ X (ADD1 X)) + (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) + 2) + 4))) + (T (SETQ D (IPLUS (IDIFFERENCE D (UNFOLD Y 2)) + 3] + (COND + ((EQ Y 0) (* ; + "draw the middle line differently to avoid duplication.") + (.WHILE.TOP.DS. DISPLAYSTREAM + (\LINEBLT FCBBT (IDIFFERENCE CX X) + CY + (IPLUS CX X) + DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH + GRAYHEIGHT GRAYBASE NBITS))) + (T (.WHILE.TOP.DS. DISPLAYSTREAM (\FILLCIRCLEBLT CX CY X Y)) + (SETQ Y (SUB1 Y)) + (GO LP))) + (MOVETO CENTERX CENTERY DISPLAYSTREAM) + (RETURN NIL]) + +(\LINEBLT + [LAMBDA (BBT X Y XRIGHT DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH GRAYHEIGHT + GRAYBASE NBITS) (* kbr%: "15-Feb-86 22:08") + + (* ;; "fills in the changing fields of a bit blt tablt to draw one line of aan area.") + + (PROG NIL + (COND + ((ILESSP X LEFT) + (SETQ X LEFT))) + (COND + ((IGREATERP XRIGHT RIGHT) + (SETQ XRIGHT RIGHT))) + (COND + ((OR (IGREATERP X XRIGHT) + (IGREATERP Y TOP) + (IGREATERP BOTTOM Y)) + (RETURN))) + (replace (PILOTBBT PBTDEST) of BBT with (\ADDBASE DESTINATIONBASE (ITIMES RASTERWIDTH Y))) + [freplace (PILOTBBT PBTSOURCE) of BBT with (\ADDBASE GRAYBASE (freplace (PILOTBBT + PBTGRAYOFFSET + ) + of BBT + with (MOD Y GRAYHEIGHT] + (SELECTQ NBITS + (1 (freplace (PILOTBBT PBTDESTBIT) of BBT with X) + (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) + (freplace (PILOTBBT PBTWIDTH) of BBT with (ADD1 (IDIFFERENCE XRIGHT X)))) + (4 (* ; + "color case, shift x values {which are in pixels} into bit values.") + (freplace (PILOTBBT PBTDESTBIT) of BBT with (SETQ X (LLSH X 2))) + (* ; + "if TEXTURE is not a multiple of nbits wide this is probably garbage.") + (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) + (freplace (PILOTBBT PBTWIDTH) of BBT with (IDIFFERENCE (LLSH (ADD1 XRIGHT) + 2) + X))) + (8 (* ; + "color case, shift x values {which are in pixels} into bit values.") + (freplace (PILOTBBT PBTDESTBIT) of BBT with (SETQ X (LLSH X 3))) + (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) + (freplace (PILOTBBT PBTWIDTH) of BBT with (IDIFFERENCE (LLSH (ADD1 XRIGHT) + 3) + X))) + (24 (* ; + "color case, shift x values {which are in pixels} into bit values.") + (freplace (PILOTBBT PBTDESTBIT) of BBT with (SETQ X (ITIMES 24 X))) + (freplace (PILOTBBT PBTSOURCEBIT) of BBT with (MOD X GRAYWIDTH)) + (freplace (PILOTBBT PBTWIDTH) of BBT with (IDIFFERENCE (ITIMES 24 (ADD1 XRIGHT)) + X))) + (SHOULDNT)) + (\PILOTBITBLT BBT 0]) +) + + + +(* ; "making and copying bitmaps") + +(DEFINEQ + +(SCREENBITMAP + [LAMBDA (SCREEN) (* ; "Edited 20-Feb-87 14:57 by rrb") + + (* ;; "Return bitmap destination of SCREEN.") + + (COND + ((NULL SCREEN) + ScreenBitMap) + ((type? SCREEN SCREEN) + (fetch (SCREEN SCDESTINATION) of SCREEN)) + ((WINDOWP SCREEN) + (fetch (SCREEN SCDESTINATION) of (fetch (WINDOW SCREEN) of SCREEN))) + (T (\ILLEGAL.ARG SCREEN]) + +(BITMAPP + [LAMBDA (X) (* rrb "25-JUN-82 15:21") + (* ; "is x a bitmap?") + (AND (type? BITMAP X) + X]) + +(BITMAPHEIGHT + [LAMBDA (BITMAP) (* kbr%: " 8-Jul-85 16:01") + + (* ;; "returns the height in pixels of a bitmap.") + + (COND + ((type? BITMAP BITMAP) + (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) + ((type? WINDOW BITMAP) + (WINDOWPROP BITMAP 'HEIGHT)) + (T (\ILLEGAL.ARG BITMAP]) + +(BITSPERPIXEL + [LAMBDA (BITMAP) (* ; "Edited 15-Feb-94 16:10 by nilsson") + + (* ;; "returns the height in pixels of a bitmap.") + + (COND + ((type? BITMAP BITMAP) + (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP)) + ((type? SCREEN BITMAP) + + (* ;; "Read the propper slots, not the implicit bitmap.") + + (OR (fetch (SCREEN SCDEPTH) of BITMAP) + (fetch (SCREEN SCBITSPERPIXEL) of BITMAP))) + ((type? WINDOW BITMAP) + (BITSPERPIXEL (fetch (WINDOW SCREEN) of BITMAP))) + ((ARRAYP BITMAP) (* ; "Consider array to be a colormap.") + (SELECTQ (ARRAYSIZE BITMAP) + (256 8) + (16 4) + (LISPERROR "ILLEGAL ARG" BITMAP))) + (T (LISPERROR "ILLEGAL ARG" BITMAP]) +) +(* "FOLLOWING DEFINITIONS EXPORTED")(PUTDEF (QUOTE BITMAPS) (QUOTE FILEPKGCOMS) '[(COM + MACRO + (X (VARS . X]) +(PUTDEF (QUOTE CURSORS) (QUOTE FILEPKGCOMS) '[(COM MACRO (X (E (MAPC 'X 'PRINTCURSOR]) + +(* "END EXPORTED DEFINITIONS") + +(DECLARE%: EVAL@COMPILE +(* "FOLLOWING DEFINITIONS EXPORTED") +(ADDTOVAR GLOBALVARS SCREENHEIGHT SCREENWIDTH ScreenBitMap) + +(* "END EXPORTED DEFINITIONS") + +) + + + +(* ; "Display stream functions that are not needed in the primitive system") + +(DEFINEQ + +(DSPFILL + [LAMBDA (REGION TEXTURE OPERATION STREAM) (* kbr%: " 8-Jul-85 15:40") + + (* ;; "wipes a region of an imagestream with texture.") + + (* ;; "TEXTURE and OPERATION default to those of STREAM") + + (PROG (STRM) + (SETQ STRM (\OUTSTREAMARG STREAM)) + (OR REGION (SETQ REGION (DSPCLIPPINGREGION NIL STRM))) + (RETURN (BLTSHADE TEXTURE STRM (fetch (REGION LEFT) of REGION) + (fetch (REGION BOTTOM) of REGION) + (fetch (REGION WIDTH) of REGION) + (fetch (REGION HEIGHT) of REGION) + OPERATION]) + +(INVERTW + [LAMBDA (WIN SHADE) (* rrb "18-May-84 21:52") + + (* ;; "inverts a window and returns the window. Used in RESETFORMS.") + + (DSPFILL (DSPCLIPPINGREGION NIL WIN) + (OR SHADE BLACKSHADE) + 'INVERT WIN) + WIN]) +) +(DEFINEQ + +(\DSPCOLOR.DISPLAY + [LAMBDA (STREAM COLOR) (* ; "Edited 29-Jan-91 11:33 by matsuda") + + (* ;; "sets and returns a display stream's background color.") + + (PROG (DD COLORCELL DESTINATION BITSPERPIXEL) + (SETQ DD (\GETDISPLAYDATA STREAM)) + (SETQ COLORCELL (fetch (\DISPLAYDATA DDCOLOR) of DD)) + (SETQ DESTINATION (fetch (\DISPLAYDATA DDDestination) of DD)) + (SETQ BITSPERPIXEL (BITSPERPIXEL DESTINATION)) + (RETURN (COND + (COLOR (SETQ COLOR (COLORNUMBERP COLOR BITSPERPIXEL)) + (PROG1 (COND + (COLORCELL (PROG1 (CAR COLORCELL) + (RPLACA COLORCELL COLOR))) + (T (* ; "no color cell yet, make one.") + (replace (\DISPLAYDATA DDCOLOR) of DD + with (CONS COLOR 0)) + (MAXIMUMCOLOR BITSPERPIXEL))) + (\SFFixFont STREAM DD))) + (T (OR (CAR COLORCELL) + (MAXIMUMCOLOR BITSPERPIXEL]) + +(\DSPBACKCOLOR.DISPLAY + [LAMBDA (STREAM COLOR) (* kbr%: "25-Aug-85 18:15") + + (* ;; "sets and returns a display stream's foreground color.") + + (PROG (DD COLORCELL DESTINATION BITSPERPIXEL) + (SETQ DD (\GETDISPLAYDATA STREAM)) + (SETQ COLORCELL (fetch (\DISPLAYDATA DDCOLOR) of DD)) + (RETURN (COND + (COLOR (SETQ DESTINATION (fetch (\DISPLAYDATA DDDestination) of DD)) + (SETQ BITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) of DESTINATION)) + (SETQ COLOR (COLORNUMBERP COLOR BITSPERPIXEL)) + (PROG1 (COND + (COLORCELL (PROG1 (CDR COLORCELL) + (RPLACD COLORCELL COLOR))) + (T (* ; "no color cell yet, make one.") + (replace (\DISPLAYDATA DDCOLOR) of DD + with (CONS (MAXIMUMCOLOR BITSPERPIXEL) + COLOR)) + 0)) + (\SFFixFont STREAM DD))) + (T (OR (CDR COLORCELL) + 0]) + +(DSPEOLFN + [LAMBDA (EOLFN DISPLAYSTREAM) (* rrb "18-May-84 21:44") + + (* ;; "sets the end of line function for a displaystream. EOLFN will be called every EOL with the argument of the display stream. If EOLFN is 'OFF, the eolfn is cleared.") + + (PROG ((DD (\GETDISPLAYDATA DISPLAYSTREAM))) + (RETURN (PROG1 (COND + ((fetch (\DISPLAYDATA DDEOLFN) of DD)) + (T 'OFF)) + [AND EOLFN (COND + [(LITATOM EOLFN) + (replace (\DISPLAYDATA DDEOLFN) of DD + with (COND + ((EQ EOLFN 'OFF) + NIL) + (T EOLFN] + (T (\ILLEGAL.ARG EOLFN])]) +) +(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE + +(RPAQQ BLACKSHADE 65535) + +(RPAQQ WHITESHADE 0) + + +(CONSTANTS (BLACKSHADE 65535) + (WHITESHADE 0)) +) + +(RPAQQ GRAYSHADE 43605) + +(ADDTOVAR GLOBALVARS GRAYSHADE) + +(* "END EXPORTED DEFINITIONS") + +(DECLARE%: EVAL@COMPILE + +(PUTPROPS DSPRUBOUTCHAR MACRO ((DS CHAR X Y TTBL) + (\DSPMOVELR DS CHAR X Y TTBL NIL T))) +) +(DEFINEQ + +(DSPCLEOL + [LAMBDA (DISPLAYSTREAM XPOS YPOS HEIGHT) (* lmm " 3-May-84 10:31") + (\CHECKCARET DISPLAYSTREAM) + (PROG ((DD (\GETDISPLAYDATA DISPLAYSTREAM DISPLAYSTREAM))) + (RETURN (BITBLT NIL NIL NIL DISPLAYSTREAM (OR (FIXP XPOS) + (SETQ XPOS (ffetch DDLeftMargin of DD))) + [OR (FIXP YPOS) + (IDIFFERENCE (ffetch DDYPOSITION of DD) + (FONTPROP DISPLAYSTREAM 'DESCENT] + (IMAX 0 (IDIFFERENCE (ffetch DDRightMargin of DD) + XPOS)) + (OR (FIXP HEIGHT) + (IMINUS (ffetch DDLINEFEED of DD))) + 'TEXTURE + 'REPLACE]) + +(DSPRUBOUTCHAR + [LAMBDA (STREAM CHAR X Y TTBL) (* Pavel " 6-Oct-86 22:44") + (if (DISPLAYSTREAMP CHAR) + then + (* ;; "Some older code may use the CHAR argument first.") + + (swap STREAM CHAR) + (SETQ TTBL X) + (SETQ X) + (SETQ Y)) + (\GETDISPLAYDATA STREAM STREAM) + (\DSPMOVELR STREAM CHAR X Y TTBL NIL T]) + +(\DSPMOVELR + [LAMBDA (DS CHAR X Y TTBL RIGHTWARDSFLG ERASEFLG) (* JonL " 7-May-84 02:47") + + (* ;; "Moves the cursor 'leftwards' (or 'rightwards' if RIGHTWARDSFLG is non-null) over any main character and control or meta indicators. Returns NIL if the move can't be determined, such as trying to move left when already at the left margin. Effaces (or 'Rubs out') any bits moved over if ERASEFLG is non-null.") + + ([LAMBDA (DD) + + (* ;; + "Must do the \GETDISPLAYDATA first, since it may reset DS when it coerces to a DISPLAYSTREAM") + + (PROG [(WIDTH (\STREAMCHARWIDTH (COND + ((CHARCODEP CHAR) + CHAR) + (T (CHARCODE M))) + DS TTBL)) + (DEFAULTPOS? (AND (NULL X) + (NULL Y] + (OR ERASEFLG DEFAULTPOS? (SHOULDNT)) (* ; + "CURSORLEFT and CURSORRIGHT commands aren't allowed to start from anywhere except current spot") + + (* ;; "Note that if CHAR is not specified and DS has a variable-pitch font, then the results may be somewhat random. Smart terminal drivers thus can work well only on fixed-pitch fonts.") + + (COND + ((NULL WIDTH) + (RETURN)) + ((EQ 0 WIDTH) (* ; "Ha, what an easy case") + (RETURN T))) + (OR (FIXP X) + (SETQ X (ffetch DDXPOSITION of DD))) + (OR (FIXP Y) + (SETQ Y (ffetch DDYPOSITION of DD))) + (COND + ([COND + (RIGHTWARDSFLG (IGREATERP (add X WIDTH) + (ffetch DDRightMargin of DD))) + (T (ILESSP (add X (IMINUS WIDTH)) + (ffetch DDLeftMargin of DD] (* ; + "If we can't do the full backup, then return NIL to signal this fact") + (RETURN))) + (\CHECKCARET DS) (* ; + "Take down the caret, if there is one, just in case we are moving over it.") + [COND + (ERASEFLG (* ; "And do the erasure if requested") + ([LAMBDA (FONT) + (PROG ((YPRIME (IDIFFERENCE Y (FONTDESCENT FONT))) + (HEIGHT (FONTHEIGHT FONT))) + (COND + ((NOT DEFAULTPOS?) + (MOVETO X Y DS) (* ; + "Backup over the bits, and 'wipe' them out.") + )) + (BITBLT NIL 0 0 DS X YPRIME WIDTH HEIGHT 'TEXTURE 'REPLACE) + (* ; "wipe out some bits") + ] + (ffetch DDFONT of DD] + (DSPXPOSITION X DS) (* ; "Now do the move.") + (RETURN T] + (\GETDISPLAYDATA DS DS]) +) + + + +(* ; "for cursor") + + +(RPAQQ \DefaultCursor #*(16 16)H@@@L@@@N@@@O@@@OH@@OL@@ON@@O@@@MH@@IH@@@L@@@L@@@F@@@F@@@C@@@C@@) +(DEFINEQ + +(\CURSOR.DEFPRINT + [LAMBDA (CURSOR STREAM) (* ; "Edited 15-Sep-94 16:13 by sybalsky") + (COND + (*PRINT-ARRAY* (PRIN1 "#,(LET(image) (CURSORCREATE (SETQ image '" STREAM) + (PRIN4 (fetch (CURSOR CUIMAGE) of CURSOR) + STREAM) + (PRIN1 ") " STREAM) + (COND + ((EQ (fetch (CURSOR CUIMAGE) of CURSOR) + (fetch (CURSOR CUMASK) of CURSOR)) + (PRIN1 " image " STREAM)) + (T (PRIN1 " '" STREAM) + (PRIN4 (fetch (CURSOR CUMASK) of CURSOR) + STREAM))) + (PRIN1 " " STREAM) + (PRIN1 (fetch (CURSOR CUHOTSPOTX) of CURSOR) + STREAM) + (PRIN1 " " STREAM) + (PRIN1 (fetch (CURSOR CUHOTSPOTY) of CURSOR) + STREAM) + (PRIN1 " " STREAM) + (PRIN1 (fetch (CURSOR CUDATA) of CURSOR) + STREAM) + (PRIN1 "))" STREAM]) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY + +(RPAQ? DEFAULTCURSOR (CURSORCREATE \DefaultCursor NIL 0 15)) + + +(COND + ((NULL \CURRENTCURSOR) + (SETQ \CURRENTCURSOR DEFAULTCURSOR))) + +(DEFPRINT 'CURSOR '\CURSOR.DEFPRINT) +) +(DECLARE%: DONTCOPY +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS DEFAULTCURSOR) +) +) + + + +(* ; "stuff to interpret colors as textures which is needed even in system that don't have color.") + +(DEFINEQ + +(TEXTUREOFCOLOR + [LAMBDA (COLOR NOERRORFLG) (* rrb "30-Oct-85 19:43") + + (* ;; "returns a texture to represent a color on a black and white display") + + (PROG ((RGB (INSURE.RGB.COLOR COLOR NOERRORFLG))) + (RETURN (COND + ((NULL RGB) + NIL) + ((AND (IGREATERP (fetch (RGB RED) of RGB) + 245) + (IGREATERP (fetch (RGB GREEN) of RGB) + 245) + (IGREATERP (fetch (RGB BLUE) of RGB) + 245)) (* ; "special case white") + BLACKSHADE16) + (T (PROG [(TEX (\PRIMARYTEXTURE 'RED (fetch (RGB RED) of RGB] + (BITBLT NIL NIL NIL TEX 0 0 16 16 'TEXTURE 'PAINT + (\PRIMARYTEXTURE 'BLUE (fetch (RGB BLUE) of RGB))) + (BITBLT NIL NIL NIL TEX 0 0 16 16 'TEXTURE 'PAINT + (\PRIMARYTEXTURE 'GREEN (fetch (RGB GREEN) of RGB))) + (RETURN TEX]) + +(\PRIMARYTEXTURE + [LAMBDA (PRIMARY LEVEL) (* rrb "30-Oct-85 19:25") + + (* ;; "returns the 16x16 texture for a primary color level.") + + (PROG [(TEXTURE (BITMAPCOPY (SELECTQ PRIMARY + (RED REDTEXTURE) + (BLUE BLUETEXTURE) + (GREEN GREENTEXTURE) + (\ILLEGAL.ARG PRIMARY] + (BITBLT (\LEVELTEXTURE LEVEL) + 0 0 TEXTURE 0 0 16 16 'INPUT 'ERASE) + (RETURN TEXTURE]) + +(\LEVELTEXTURE + [LAMBDA (LEVEL) (* rrb "20-Aug-85 16:42") + + (* ;; "returns a 16x16 texture which is merged so that only light bits on both go to light with a primary color pattern to get a level primary pattern.") + + (COND + ((ILESSP LEVEL 100) + BLACKSHADE16) + ((ILESSP LEVEL 150) + DARKGRAY16) + ((ILESSP LEVEL 200) + MEDIUMGRAY16) + ((ILESSP LEVEL 245) + LIGHTGRAY16) + (T WHITESHADE16]) + +(INSURE.B&W.TEXTURE + [LAMBDA (TEXTURE NOERRORFLG) (* rrb "30-Oct-85 19:47") + + (* ;; "coerces a TEXTURE argument to a 1 bit per pixel bitmap or small number") + + (SELECTQ (TYPENAME TEXTURE) + (LITATOM (* ; "includes NIL case") + (COND + (TEXTURE (* ; "should be a color name") + (TEXTUREOFCOLOR (INSURE.RGB.COLOR TEXTURE NOERRORFLG))) + (T WHITESHADE))) + ((SMALLP FIXP) + (LOGAND TEXTURE BLACKSHADE)) + (BITMAP TEXTURE) + (LISTP (* ; + "can be a list of (TEXTURE COLOR) or a list of levels rgb or hls.") + (COND + ((TEXTUREOFCOLOR TEXTURE T)) + ((CAR TEXTURE) + (INSURE.B&W.TEXTURE (CAR TEXTURE) + NOERRORFLG)) + ((CAR (LISTP (CDR TEXTURE))) + (TEXTUREOFCOLOR (CADR TEXTURE) + NOERRORFLG)) + (T (* ; "list of form (NIL NIL)") + WHITESHADE))) + (COND + ((NULL NOERRORFLG) + (\ILLEGAL.ARG TEXTURE]) + +(INSURE.RGB.COLOR + [LAMBDA (COLOR NOERRFLG) (* rrb "30-Oct-85 19:34") + (* ; + "returns the RGB triple for a color.") + (PROG (LEVELS) + (RETURN (COND + [(FIXP COLOR) (* ; + "don't know what to do with color numbers so error") + (COND + (NOERRFLG NIL) + (T (\ILLEGAL.ARG COLOR] + [(LITATOM COLOR) + (COND + ((SETQ LEVELS (\LOOKUPCOLORNAME COLOR)) + (* ; "recursively look up color number") + (INSURE.RGB.COLOR (CDR LEVELS) + NOERRFLG)) + (NOERRFLG NIL) + (T (ERROR "Unknown color name" COLOR] + ((HLSP COLOR) (* ; "HLS form convert to RGB") + (HLSTORGB COLOR)) + ((RGBP COLOR) (* ; "check for RGB or HLS") + COLOR) + (NOERRFLG NIL) + (T (\ILLEGAL.ARG COLOR]) + +(\LOOKUPCOLORNAME + [LAMBDA (COLORNAME) (* rrb "13-DEC-82 13:14") + + (* ;; "looks up a prospective color name. Returns a list whose CAR is the name and whose CDR is a color spec.") + + (FASSOC COLORNAME COLORNAMES]) + +(RGBP + [LAMBDA (X) (* rrb "27-OCT-82 10:15") + (* ; + "return X if it is a red green blue triple.") + (PROG (TMP) + (RETURN (AND (LISTP X) + (SMALLP (SETQ TMP (CAR X))) + (IGREATERP TMP -1) + (IGREATERP 256 TMP) + (SMALLP (SETQ TMP (CADR X))) + (IGREATERP TMP -1) + (IGREATERP 256 TMP) + (SMALLP (SETQ TMP (CADDR X))) + (IGREATERP TMP -1) + (IGREATERP 256 TMP) + X]) + +(HLSP + [LAMBDA (X) (* rrb "31-Oct-85 10:51") + + (* ;; "return T if X is a hue lightness saturation triple.") + + (AND (NUMBERP (CAR (LISTP X))) + (IGREATERP (CAR X) + -1) + (IGREATERP 361 (CAR X)) + [FLOATP (CAR (LISTP (CDR X] + [FLOATP (CAR (LISTP (CDDR X] + X]) + +(HLSTORGB + [LAMBDA (HLS) (* rrb "30-Oct-85 19:59") + + (* ;; "converts from a hue saturation lightness triple into red green blue triple. HUE is in range 0 to 360, lightness and saturation are in the range 0 to 1.0") + + (* ;; "this algorithm was taken from siggraph vol 13 number 3 August 1979: Status report on graphics standards planning committee.") + + (PROG ((H (fetch (HLS HUE) of HLS)) + (L (fetch (HLS LIGHTNESS) of HLS)) + (S (fetch (HLS SATURATION) of HLS)) + Max Min) + [SETQ Max (COND + ((FGREATERP 0.5 L) + (FTIMES L (FPLUS 1.0 S))) + (T (FDIFFERENCE (FPLUS L S) + (FTIMES L S] + (SETQ Min (FDIFFERENCE (FTIMES L 2) + Max)) + (RETURN (create RGB + RED _ (\HLSVALUEFN Min Max H) + GREEN _ (\HLSVALUEFN Min Max (IDIFFERENCE H 120)) + BLUE _ (\HLSVALUEFN Min Max (IDIFFERENCE H 240]) + +(\HLSVALUEFN + [LAMBDA (MIN MAX HUE) (* rrb "25-OCT-82 10:47") + + (* ;; "internal value function for converting from HLS to RGB.") + + [COND + ((ILESSP HUE 0) + (SETQ HUE (IPLUS HUE 360] + (FIX (FTIMES (COND + ((ILESSP HUE 60) + (FPLUS MIN (FQUOTIENT (FTIMES (FDIFFERENCE MAX MIN) + HUE) + 60))) + ((ILESSP HUE 180) + MAX) + ((ILESSP HUE 240) + (FPLUS MIN (FQUOTIENT (FTIMES (FDIFFERENCE MAX MIN) + (FDIFFERENCE 240 HUE)) + 60))) + (T MIN)) + 255]) +) + +(RPAQQ COLORNAMES + ((WHITE 255 255 255) + (CYAN 0 255 255) + (MAGENTA 255 0 255) + (YELLOW 255 255 0) + (RED 255 0 0) + (GREEN 0 255 0) + (BLUE 0 0 255) + (BLACK 0 0 0))) +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS COLORNAMES) +) +(DECLARE%: DONTCOPY +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 WHITESHADE16 REDTEXTURE GREENTEXTURE + BLUETEXTURE) +) +) + +(READVARS-FROM-STRINGS '(BLACKSHADE16 DARKGRAY16 MEDIUMGRAY16 LIGHTGRAY16 WHITESHADE16 REDTEXTURE + GREENTEXTURE BLUETEXTURE) + "({(READBITMAP)(16 16 +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%" +%"OOOO%")} {(READBITMAP)(16 16 +%"NMGG%" +%"KGMM%" +%"MNKK%" +%"GKNN%" +%"MNKK%" +%"GKNM%" +%"NMGN%" +%"KGMG%" +%"NKKM%" +%"KNNK%" +%"GGMN%" +%"MMGG%" +%"GGKM%" +%"MJOG%" +%"NOEK%" +%"KMNN%")} {(READBITMAP)(16 16 +%"JJJJ%" +%"EEEE%" +%"JJJJ%" +%"EEEE%" +%"JJJJ%" +%"EEEE%" +%"JJJJ%" +%"EEEE%" +%"JJJJ%" +%"EEEE%" +%"JJJJ%" +%"EEEE%" +%"JJJJ%" +%"EEEE%" +%"JJJJ%" +%"EEEE%")} {(READBITMAP)(16 16 +%"HBDB%" +%"BHAA%" +%"DDHD%" +%"AABH%" +%"HHDA%" +%"BBAD%" +%"DDHB%" +%"AABH%" +%"HDAD%" +%"AADA%" +%"DHBH%" +%"BBHB%" +%"HHAD%" +%"ABDA%" +%"DDHH%" +%"BABB%")} {(READBITMAP)(16 16 +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%" +%"@@@@%")} {(READBITMAP)(16 16 +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%" +%"LLLL%")} {(READBITMAP)(16 16 +%"CLCL%" +%"O@O@%" +%"LCLC%" +%"@O@O%" +%"CLCL%" +%"O@O@%" +%"LCLC%" +%"@O@O%" +%"CLCL%" +%"O@O@%" +%"LCLC%" +%"@O@O%" +%"CLCL%" +%"O@O@%" +%"LCLC%" +%"@O@O%")} {(READBITMAP)(16 16 +%"LFGA%" +%"NCCH%" +%"GAIL%" +%"CHLN%" +%"ALFG%" +%"HNCC%" +%"LGAI%" +%"NCHL%" +%"GALF%" +%"CHNC%" +%"ILGA%" +%"LNCH%" +%"FGAL%" +%"CCHN%" +%"AILG%" +%"HLNC%")}) +") +(DECLARE%: DONTCOPY +(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE + +(RECORD HLS (HUE LIGHTNESS SATURATION)) + +(RECORD RGB (RED GREEN BLUE)) +) + +(* "END EXPORTED DEFINITIONS") + +) +(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS + +(ADDTOVAR NLAMA ) + +(ADDTOVAR NLAML ) + +(ADDTOVAR LAMA UNIONREGIONS INTERSECTREGIONS) +) +(PUTPROPS ADISPLAY COPYRIGHT ("Venue & Xerox Corporation" 1982 1983 1984 1985 1986 1987 1988 1990 1991 + 1993 1994 2021)) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (12017 19378 (\BBTCURVEPT 12027 . 19376)) (19379 29195 (CREATETEXTUREFROMBITMAP 19389 . +21319) (PRINTBITMAP 21321 . 22672) (PRINT-BITMAPS-NICELY 22674 . 26525) (PRINTCURSOR 26527 . 27560) ( +\WRITEBITMAP 27562 . 29193)) (29238 31786 (\GETINTEGERPART 29248 . 30793) (\CONVERTTOFRACTION 30795 . +31784)) (31923 32795 (CURSORP 31933 . 32152) (CURSORBITMAP 32154 . 32200) (CreateCursorBitMap 32202 . +32793)) (37157 46200 (CARET 37167 . 38927) (\CARET.CREATE 38929 . 39107) (\CARET.DOWN 39109 . 40461) ( +\CARET.FLASH? 40463 . 42277) (\CARET.SHOW 42279 . 42848) (CARETRATE 42850 . 43508) (\CARET.FLASH.AGAIN + 43510 . 44676) (\CARET.FLASH.MULTIPLE 44678 . 45201) (\CARET.FLASH 45203 . 46198)) (46201 51273 ( +\MEDW.CARET.SHOW 46211 . 51271)) (51637 53472 (\AREAVISIBLE? 51647 . 52571) (\REGIONOVERLAPAREAP 52573 + . 53118) (\AREAINREGIONP 53120 . 53470)) (53521 65997 (CREATEREGION 53531 . 53867) (REGIONP 53869 . +54015) (INTERSECTREGIONS 54017 . 56787) (UNIONREGIONS 56789 . 58940) (REGIONSINTERSECTP 58942 . 59550) + (SUBREGIONP 59552 . 60197) (EXTENDREGION 60199 . 62356) (EXTENDREGIONBOTTOM 62358 . 63000) ( +EXTENDREGIONLEFT 63002 . 63621) (EXTENDREGIONRIGHT 63623 . 64176) (EXTENDREGIONTOP 64178 . 64719) ( +INSIDEP 64721 . 65489) (STRINGREGION 65491 . 65995)) (66242 71516 (\BRUSHBITMAP 66252 . 67969) ( +\GETBRUSH 67971 . 68282) (\GETBRUSHBBT 68284 . 70312) (\InitCurveBrushes 70314 . 71380) ( +\BrushFromWidth 71382 . 71514)) (71517 74584 (\MAKEBRUSH.DIAGONAL 71527 . 71807) ( +\MAKEBRUSH.HORIZONTAL 71809 . 72203) (\MAKEBRUSH.VERTICAL 72205 . 72517) (\MAKEBRUSH.SQUARE 72519 . +72796) (\MAKEBRUSH.ROUND 72798 . 74582)) (74585 75750 (INSTALLBRUSH 74595 . 75748)) (76151 80623 ( +\DRAWLINE.DISPLAY 76161 . 79338) (RELMOVETO 79340 . 79727) (MOVETOUPPERLEFT 79729 . 80621)) (80624 +104109 (\CLIPANDDRAWLINE 80634 . 87080) (\CLIPANDDRAWLINE1 87082 . 98830) (\CLIPCODE 98832 . 100206) ( +\LEASTPTAT 100208 . 100806) (\GREATESTPTAT 100808 . 101436) (\DRAWLINE1 101438 . 102554) ( +\DRAWLINE.UFN 102556 . 104107)) (108639 154686 (\DRAWCIRCLE.DISPLAY 108649 . 117462) (\DRAWARC.DISPLAY + 117464 . 117754) (\DRAWARC.GENERIC 117756 . 118509) (\COMPUTE.ARC.POINTS 118511 . 120776) ( +\DRAWELLIPSE.DISPLAY 120778 . 136447) (\DRAWCURVE.DISPLAY 136449 . 138738) (\DRAWPOINT.DISPLAY 138740 + . 139936) (\DRAWPOLYGON.DISPLAY 139938 . 143466) (\LINEWITHBRUSH 143468 . 154684)) (154687 186379 ( +LOADPOLY 154697 . 155257) (PARAMETRICSPLINE 155259 . 165456) (\CURVE 165458 . 171060) (\CURVE2 171062 + . 182393) (\CURVEEND 182395 . 182877) (\CURVESLOPE 182879 . 185362) (\CURVESTART 185364 . 185688) ( +\FDIFS/FROM/DERIVS 185690 . 186377)) (198908 213244 (\FILLCIRCLE.DISPLAY 198918 . 209666) (\LINEBLT +209668 . 213242)) (213288 215288 (SCREENBITMAP 213298 . 213775) (BITMAPP 213777 . 214011) ( +BITMAPHEIGHT 214013 . 214389) (BITSPERPIXEL 214391 . 215286)) (215929 216922 (DSPFILL 215939 . 216622) + (INVERTW 216624 . 216920)) (216923 220566 (\DSPCOLOR.DISPLAY 216933 . 218230) (\DSPBACKCOLOR.DISPLAY +218232 . 219611) (DSPEOLFN 219613 . 220564)) (220999 225653 (DSPCLEOL 221009 . 221885) (DSPRUBOUTCHAR +221887 . 222319) (\DSPMOVELR 222321 . 225651)) (225783 226901 (\CURSOR.DEFPRINT 225793 . 226899)) ( +227313 235887 (TEXTUREOFCOLOR 227323 . 228585) (\PRIMARYTEXTURE 228587 . 229169) (\LEVELTEXTURE 229171 + . 229672) (INSURE.B&W.TEXTURE 229674 . 231069) (INSURE.RGB.COLOR 231071 . 232499) (\LOOKUPCOLORNAME +232501 . 232771) (RGBP 232773 . 233538) (HLSP 233540 . 233915) (HLSTORGB 233917 . 235057) (\HLSVALUEFN + 235059 . 235885))))) +STOP diff --git a/sources/ADISPLAY.LCOM b/sources/ADISPLAY.LCOM index b01836efc417c0682410755f0705b1cfd9f7d359..efa56474dbb06db048027cf31ecdb64bb1db7503 100644 GIT binary patch delta 11866 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 delta 12888 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 gwia+U Date: Wed, 1 Mar 2023 07:53:44 -0800 Subject: [PATCH 03/25] once more --- sources/ADISPLAY | 266 +++++++++++++++++++++++++++++------------- sources/ADISPLAY.LCOM | Bin 70835 -> 71906 bytes sources/FILESETS | 8 +- 3 files changed, 188 insertions(+), 86 deletions(-) diff --git a/sources/ADISPLAY b/sources/ADISPLAY index 2907ed81..28b9736e 100644 --- a/sources/ADISPLAY +++ b/sources/ADISPLAY @@ -1,10 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "28-Feb-2023 06:37:11" {DSK}larry>il>medley>sources>ADISPLAY.;2 238362 +(FILECREATED " 1-Mar-2023 07:49:03" {DSK}larry>il>medley>sources>ADISPLAY.;2 245335 :EDIT-BY "lmm" - :PREVIOUS-DATE "13-Jun-2021 14:03:35" {DSK}larry>il>medley>sources>ADISPLAY.;1) + :CHANGES-TO (FNS \DRAWLINE.DISPLAY) + + :PREVIOUS-DATE "28-Feb-2023 06:37:11" {DSK}larry>il>medley>sources>ADISPLAY.;1) (* ; " @@ -1470,56 +1472,154 @@ Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2021 by Venue & Xerox Corporation (\DRAWLINE.DISPLAY [LAMBDA (DISPLAYSTREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR DASHING) - (* ; "Edited 13-Jun-2021 14:03 by rmk:") + (* ; "Edited 1-Mar-2023 07:42 by lmm") + (* ; "Edited 29-Jan-91 14:59 by matsuda") (* ;; "DISPLAYSTREAM is guaranteed to be a display-stream. Draws a line from x1,y1 to x2,y2 leaving the position at x2,y2") (* ;; "Added handling of brushes (I think, this is actually pretty tricky).") - (DECLARE (LOCALVARS . T)) - (SELECTQ OPERATION - (NIL (ffetch DDOPERATION of (fetch IMAGEDATA of DISPLAYSTREAM))) - ((REPLACE PAINT INVERT ERASE) - OPERATION) - (\ILLEGAL.ARG OPERATION)) - (\INSURETOPWDS DISPLAYSTREAM) (* ; - "RMK: This was only in the no-dash case, oddly") - (IF (OR DASHING (BRUSHP WIDTH)) - THEN [LET ((BRUSH (INSURE.BRUSH WIDTH))) - (if COLOR - then (replace (BRUSH BRUSHCOLOR) of BRUSH with COLOR)) - (IF (BIGBITMAPP (ffetch DDDestination of (fetch IMAGEDATA of DISPLAYSTREAM))) - THEN (\DRAWLINE.BIGBM.DASH DISPLAYSTREAM X1 Y1 X2 Y2 BRUSH DASHING OPERATION) - ELSE (GLOBALRESOURCES \BRUSHBBT (\LINEWITHBRUSH X1 Y1 X2 Y2 BRUSH - (\GOOD.DASHLST DASHING BRUSH) - DISPLAYSTREAM \BRUSHBBT OPERATION] - ELSEIF (BIGBITMAPP (ffetch DDDestination of (fetch IMAGEDATA of DISPLAYSTREAM))) - THEN (\DRAWLINE.BIGBM.NODASH DISPLAYSTREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR) - ELSE (LET ((DD (fetch IMAGEDATA of DISPLAYSTREAM))) - (\CLIPANDDRAWLINE (\DSPTRANSFORMX (OR (FIXP X1) - (FIXR X1)) - DD) - (\DSPTRANSFORMY (OR (FIXP Y1) - (FIXR Y1)) - DD) - (\DSPTRANSFORMX (OR (FIXP X2) - (FIXR X2)) - DD) - (\DSPTRANSFORMY (OR (FIXP Y2) - (FIXR Y2)) - DD) - [COND - ((NULL WIDTH) - 1) - ((OR (FIXP WIDTH) - (FIXR WIDTH] - OPERATION - (ffetch DDDestination of DD) - (ffetch DDClippingLeft of DD) - (SUB1 (ffetch DDClippingRight of DD)) - (ffetch DDClippingBottom of DD) - (SUB1 (ffetch DDClippingTop of DD)) - DISPLAYSTREAM COLOR))) (* ; + (DECLARE (LOCALVARS . T) + (GLOBALVARS \SCREENBITMAPS)) + [COND + [(OR DASHING (BRUSHP WIDTH)) + (GLOBALRESOURCE + \BRUSHBBT + (LET ((BBT \BRUSHBBT) + (BRUSH (INSURE.BRUSH WIDTH))) + (if COLOR + then (replace (BRUSH BRUSHCOLOR) of BRUSH with COLOR)) + (IF [NOT (type? BIGBM (ffetch DDDestination of (fetch IMAGEDATA of DISPLAYSTREAM] + THEN (\LINEWITHBRUSH X1 Y1 X2 Y2 BRUSH (\GOOD.DASHLST DASHING BRUSH) + DISPLAYSTREAM BBT (SELECTQ OPERATION + (NIL (ffetch DDOPERATION + of (fetch IMAGEDATA of DISPLAYSTREAM))) + ((REPLACE PAINT INVERT ERASE) + OPERATION) + (\ILLEGAL.ARG OPERATION))) + ELSE (PROG ((DD (fetch IMAGEDATA of DISPLAYSTREAM)) + BITMAP BIGBMLIST HEIGHT BOTTOM BM YY1 YY2 ClippingTop ClippingBottom CTop + CBottom) + (SETQ BITMAP (ffetch DDDestination of DD)) + (SETQ BIGBMLIST (fetch (BIGBM BIGBMLIST) of BITMAP)) + (SETQ HEIGHT (BITMAPHEIGHT BITMAP)) + (SETQ ClippingTop (ffetch DDClippingTop of DD)) + (SETQ ClippingBottom (ffetch DDClippingBottom of DD)) + (SETQ BM (GetNewFragment BIGBMLIST)) + (while (AND BM (IGREATERP HEIGHT ClippingBottom)) + do (SETQ BOTTOM (IDIFFERENCE HEIGHT (BITMAPHEIGHT BM))) + [SETQ CTop (COND + ((IGREATERP ClippingTop HEIGHT) + (IDIFFERENCE HEIGHT BOTTOM)) + (T (IDIFFERENCE ClippingTop BOTTOM] + (if (IGEQ CTop 0) + then [SETQ CBottom (COND + ((ILESSP ClippingBottom BOTTOM) + 0) + (T (IDIFFERENCE ClippingBottom BOTTOM] + (replace DDDestination of DD with BM) + (replace DDClippingTop of DD with CTop) + (replace DDClippingBottom of DD with CBottom) + (\LINEWITHBRUSH X1 (IDIFFERENCE Y1 BOTTOM) + X2 + (IDIFFERENCE Y2 BOTTOM) + BRUSH + (\GOOD.DASHLST DASHING BRUSH) + DISPLAYSTREAM BBT + (SELECTQ OPERATION + (NIL (ffetch DDOPERATION + of (fetch IMAGEDATA of DISPLAYSTREAM))) + ((REPLACE PAINT INVERT ERASE) + OPERATION) + (\ILLEGAL.ARG OPERATION))) + (SETQ BM (GetNewFragment BIGBMLIST)) + (SETQ HEIGHT BOTTOM))) + (freplace DDDestination of DD with BITMAP) + (freplace DDClippingTop of DD with ClippingTop) + (freplace DDClippingBottom of DD with ClippingBottom] + (T (PROG ((DD (fetch IMAGEDATA of DISPLAYSTREAM)) + BITMAP) + (\INSURETOPWDS DISPLAYSTREAM) (* ; "bring the window to the top") + (SETQ BITMAP (ffetch DDDestination of DD)) + (COND + ((NOT (type? BIGBM BITMAP)) + (\CLIPANDDRAWLINE (\DSPTRANSFORMX (OR (FIXP X1) + (FIXR X1)) + DD) + (\DSPTRANSFORMY (OR (FIXP Y1) + (FIXR Y1)) + DD) + (\DSPTRANSFORMX (OR (FIXP X2) + (FIXR X2)) + DD) + (\DSPTRANSFORMY (OR (FIXP Y2) + (FIXR Y2)) + DD) + [COND + ((NULL WIDTH) + 1) + ((OR (FIXP WIDTH) + (FIXR WIDTH] + (SELECTQ OPERATION + (NIL (ffetch DDOPERATION of DD)) + ((REPLACE PAINT INVERT ERASE) + OPERATION) + (\ILLEGAL.ARG OPERATION)) + BITMAP + (ffetch DDClippingLeft of DD) + (SUB1 (ffetch DDClippingRight of DD)) + (ffetch DDClippingBottom of DD) + (SUB1 (ffetch DDClippingTop of DD)) + DISPLAYSTREAM COLOR)) + (T (PROG ((BIGBMLIST (fetch (BIGBM BIGBMLIST) of BITMAP)) + (HEIGHT (BITMAPHEIGHT BITMAP)) + BOTTOM BM CTop CBottom (ClippingTop (ffetch DDClippingTop of DD)) + (ClippingBottom (ffetch DDClippingBottom of DD)) + (YY1 (\DSPTRANSFORMY (OR (FIXP Y1) + (FIXR Y1)) + DD)) + (YY2 (\DSPTRANSFORMY (OR (FIXP Y2) + (FIXR Y2)) + DD))) + (SETQ BM (GetNewFragment BIGBMLIST)) + (while (AND BM (IGREATERP HEIGHT ClippingBottom)) + do (SETQ BOTTOM (IDIFFERENCE HEIGHT (BITMAPHEIGHT BM))) + [SETQ CTop (COND + ((IGREATERP ClippingTop HEIGHT) + (IDIFFERENCE HEIGHT BOTTOM)) + (T (IDIFFERENCE ClippingTop BOTTOM] + (COND + ((IGEQ CTop 0) + [SETQ CBottom (COND + ((ILESSP ClippingBottom BOTTOM) + 0) + (T (IDIFFERENCE ClippingBottom BOTTOM] + (\CLIPANDDRAWLINE (\DSPTRANSFORMX (OR (FIXP X1) + (FIXR X1)) + DD) + (IDIFFERENCE YY1 BOTTOM) + (\DSPTRANSFORMX (OR (FIXP X2) + (FIXR X2)) + DD) + (IDIFFERENCE YY2 BOTTOM) + [COND + ((NULL WIDTH) + 1) + ((OR (FIXP WIDTH) + (FIXR WIDTH] + (SELECTQ OPERATION + (NIL (ffetch DDOPERATION of DD)) + ((REPLACE PAINT INVERT ERASE) + OPERATION) + (\ILLEGAL.ARG OPERATION)) + BM + (ffetch DDClippingLeft of DD) + (SUB1 (ffetch DDClippingRight of DD)) + CBottom + (SUB1 CTop) + DISPLAYSTREAM COLOR))) + (SETQ BM (GetNewFragment BIGBMLIST)) + (SETQ HEIGHT BOTTOM] (* ;  "the generic case of MOVETO is used so that the hardcopy streams get handled as well.") (MOVETO X2 Y2 DISPLAYSTREAM]) @@ -4334,40 +4434,40 @@ Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2021 by Venue & Xerox Corporation (PUTPROPS ADISPLAY COPYRIGHT ("Venue & Xerox Corporation" 1982 1983 1984 1985 1986 1987 1988 1990 1991 1993 1994 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (12017 19378 (\BBTCURVEPT 12027 . 19376)) (19379 29195 (CREATETEXTUREFROMBITMAP 19389 . -21319) (PRINTBITMAP 21321 . 22672) (PRINT-BITMAPS-NICELY 22674 . 26525) (PRINTCURSOR 26527 . 27560) ( -\WRITEBITMAP 27562 . 29193)) (29238 31786 (\GETINTEGERPART 29248 . 30793) (\CONVERTTOFRACTION 30795 . -31784)) (31923 32795 (CURSORP 31933 . 32152) (CURSORBITMAP 32154 . 32200) (CreateCursorBitMap 32202 . -32793)) (37157 46200 (CARET 37167 . 38927) (\CARET.CREATE 38929 . 39107) (\CARET.DOWN 39109 . 40461) ( -\CARET.FLASH? 40463 . 42277) (\CARET.SHOW 42279 . 42848) (CARETRATE 42850 . 43508) (\CARET.FLASH.AGAIN - 43510 . 44676) (\CARET.FLASH.MULTIPLE 44678 . 45201) (\CARET.FLASH 45203 . 46198)) (46201 51273 ( -\MEDW.CARET.SHOW 46211 . 51271)) (51637 53472 (\AREAVISIBLE? 51647 . 52571) (\REGIONOVERLAPAREAP 52573 - . 53118) (\AREAINREGIONP 53120 . 53470)) (53521 65997 (CREATEREGION 53531 . 53867) (REGIONP 53869 . -54015) (INTERSECTREGIONS 54017 . 56787) (UNIONREGIONS 56789 . 58940) (REGIONSINTERSECTP 58942 . 59550) - (SUBREGIONP 59552 . 60197) (EXTENDREGION 60199 . 62356) (EXTENDREGIONBOTTOM 62358 . 63000) ( -EXTENDREGIONLEFT 63002 . 63621) (EXTENDREGIONRIGHT 63623 . 64176) (EXTENDREGIONTOP 64178 . 64719) ( -INSIDEP 64721 . 65489) (STRINGREGION 65491 . 65995)) (66242 71516 (\BRUSHBITMAP 66252 . 67969) ( -\GETBRUSH 67971 . 68282) (\GETBRUSHBBT 68284 . 70312) (\InitCurveBrushes 70314 . 71380) ( -\BrushFromWidth 71382 . 71514)) (71517 74584 (\MAKEBRUSH.DIAGONAL 71527 . 71807) ( -\MAKEBRUSH.HORIZONTAL 71809 . 72203) (\MAKEBRUSH.VERTICAL 72205 . 72517) (\MAKEBRUSH.SQUARE 72519 . -72796) (\MAKEBRUSH.ROUND 72798 . 74582)) (74585 75750 (INSTALLBRUSH 74595 . 75748)) (76151 80623 ( -\DRAWLINE.DISPLAY 76161 . 79338) (RELMOVETO 79340 . 79727) (MOVETOUPPERLEFT 79729 . 80621)) (80624 -104109 (\CLIPANDDRAWLINE 80634 . 87080) (\CLIPANDDRAWLINE1 87082 . 98830) (\CLIPCODE 98832 . 100206) ( -\LEASTPTAT 100208 . 100806) (\GREATESTPTAT 100808 . 101436) (\DRAWLINE1 101438 . 102554) ( -\DRAWLINE.UFN 102556 . 104107)) (108639 154686 (\DRAWCIRCLE.DISPLAY 108649 . 117462) (\DRAWARC.DISPLAY - 117464 . 117754) (\DRAWARC.GENERIC 117756 . 118509) (\COMPUTE.ARC.POINTS 118511 . 120776) ( -\DRAWELLIPSE.DISPLAY 120778 . 136447) (\DRAWCURVE.DISPLAY 136449 . 138738) (\DRAWPOINT.DISPLAY 138740 - . 139936) (\DRAWPOLYGON.DISPLAY 139938 . 143466) (\LINEWITHBRUSH 143468 . 154684)) (154687 186379 ( -LOADPOLY 154697 . 155257) (PARAMETRICSPLINE 155259 . 165456) (\CURVE 165458 . 171060) (\CURVE2 171062 - . 182393) (\CURVEEND 182395 . 182877) (\CURVESLOPE 182879 . 185362) (\CURVESTART 185364 . 185688) ( -\FDIFS/FROM/DERIVS 185690 . 186377)) (198908 213244 (\FILLCIRCLE.DISPLAY 198918 . 209666) (\LINEBLT -209668 . 213242)) (213288 215288 (SCREENBITMAP 213298 . 213775) (BITMAPP 213777 . 214011) ( -BITMAPHEIGHT 214013 . 214389) (BITSPERPIXEL 214391 . 215286)) (215929 216922 (DSPFILL 215939 . 216622) - (INVERTW 216624 . 216920)) (216923 220566 (\DSPCOLOR.DISPLAY 216933 . 218230) (\DSPBACKCOLOR.DISPLAY -218232 . 219611) (DSPEOLFN 219613 . 220564)) (220999 225653 (DSPCLEOL 221009 . 221885) (DSPRUBOUTCHAR -221887 . 222319) (\DSPMOVELR 222321 . 225651)) (225783 226901 (\CURSOR.DEFPRINT 225793 . 226899)) ( -227313 235887 (TEXTUREOFCOLOR 227323 . 228585) (\PRIMARYTEXTURE 228587 . 229169) (\LEVELTEXTURE 229171 - . 229672) (INSURE.B&W.TEXTURE 229674 . 231069) (INSURE.RGB.COLOR 231071 . 232499) (\LOOKUPCOLORNAME -232501 . 232771) (RGBP 232773 . 233538) (HLSP 233540 . 233915) (HLSTORGB 233917 . 235057) (\HLSVALUEFN - 235059 . 235885))))) + (FILEMAP (NIL (12060 19421 (\BBTCURVEPT 12070 . 19419)) (19422 29238 (CREATETEXTUREFROMBITMAP 19432 . +21362) (PRINTBITMAP 21364 . 22715) (PRINT-BITMAPS-NICELY 22717 . 26568) (PRINTCURSOR 26570 . 27603) ( +\WRITEBITMAP 27605 . 29236)) (29281 31829 (\GETINTEGERPART 29291 . 30836) (\CONVERTTOFRACTION 30838 . +31827)) (31966 32838 (CURSORP 31976 . 32195) (CURSORBITMAP 32197 . 32243) (CreateCursorBitMap 32245 . +32836)) (37200 46243 (CARET 37210 . 38970) (\CARET.CREATE 38972 . 39150) (\CARET.DOWN 39152 . 40504) ( +\CARET.FLASH? 40506 . 42320) (\CARET.SHOW 42322 . 42891) (CARETRATE 42893 . 43551) (\CARET.FLASH.AGAIN + 43553 . 44719) (\CARET.FLASH.MULTIPLE 44721 . 45244) (\CARET.FLASH 45246 . 46241)) (46244 51316 ( +\MEDW.CARET.SHOW 46254 . 51314)) (51680 53515 (\AREAVISIBLE? 51690 . 52614) (\REGIONOVERLAPAREAP 52616 + . 53161) (\AREAINREGIONP 53163 . 53513)) (53564 66040 (CREATEREGION 53574 . 53910) (REGIONP 53912 . +54058) (INTERSECTREGIONS 54060 . 56830) (UNIONREGIONS 56832 . 58983) (REGIONSINTERSECTP 58985 . 59593) + (SUBREGIONP 59595 . 60240) (EXTENDREGION 60242 . 62399) (EXTENDREGIONBOTTOM 62401 . 63043) ( +EXTENDREGIONLEFT 63045 . 63664) (EXTENDREGIONRIGHT 63666 . 64219) (EXTENDREGIONTOP 64221 . 64762) ( +INSIDEP 64764 . 65532) (STRINGREGION 65534 . 66038)) (66285 71559 (\BRUSHBITMAP 66295 . 68012) ( +\GETBRUSH 68014 . 68325) (\GETBRUSHBBT 68327 . 70355) (\InitCurveBrushes 70357 . 71423) ( +\BrushFromWidth 71425 . 71557)) (71560 74627 (\MAKEBRUSH.DIAGONAL 71570 . 71850) ( +\MAKEBRUSH.HORIZONTAL 71852 . 72246) (\MAKEBRUSH.VERTICAL 72248 . 72560) (\MAKEBRUSH.SQUARE 72562 . +72839) (\MAKEBRUSH.ROUND 72841 . 74625)) (74628 75793 (INSTALLBRUSH 74638 . 75791)) (76194 87596 ( +\DRAWLINE.DISPLAY 76204 . 86311) (RELMOVETO 86313 . 86700) (MOVETOUPPERLEFT 86702 . 87594)) (87597 +111082 (\CLIPANDDRAWLINE 87607 . 94053) (\CLIPANDDRAWLINE1 94055 . 105803) (\CLIPCODE 105805 . 107179) + (\LEASTPTAT 107181 . 107779) (\GREATESTPTAT 107781 . 108409) (\DRAWLINE1 108411 . 109527) ( +\DRAWLINE.UFN 109529 . 111080)) (115612 161659 (\DRAWCIRCLE.DISPLAY 115622 . 124435) (\DRAWARC.DISPLAY + 124437 . 124727) (\DRAWARC.GENERIC 124729 . 125482) (\COMPUTE.ARC.POINTS 125484 . 127749) ( +\DRAWELLIPSE.DISPLAY 127751 . 143420) (\DRAWCURVE.DISPLAY 143422 . 145711) (\DRAWPOINT.DISPLAY 145713 + . 146909) (\DRAWPOLYGON.DISPLAY 146911 . 150439) (\LINEWITHBRUSH 150441 . 161657)) (161660 193352 ( +LOADPOLY 161670 . 162230) (PARAMETRICSPLINE 162232 . 172429) (\CURVE 172431 . 178033) (\CURVE2 178035 + . 189366) (\CURVEEND 189368 . 189850) (\CURVESLOPE 189852 . 192335) (\CURVESTART 192337 . 192661) ( +\FDIFS/FROM/DERIVS 192663 . 193350)) (205881 220217 (\FILLCIRCLE.DISPLAY 205891 . 216639) (\LINEBLT +216641 . 220215)) (220261 222261 (SCREENBITMAP 220271 . 220748) (BITMAPP 220750 . 220984) ( +BITMAPHEIGHT 220986 . 221362) (BITSPERPIXEL 221364 . 222259)) (222902 223895 (DSPFILL 222912 . 223595) + (INVERTW 223597 . 223893)) (223896 227539 (\DSPCOLOR.DISPLAY 223906 . 225203) (\DSPBACKCOLOR.DISPLAY +225205 . 226584) (DSPEOLFN 226586 . 227537)) (227972 232626 (DSPCLEOL 227982 . 228858) (DSPRUBOUTCHAR +228860 . 229292) (\DSPMOVELR 229294 . 232624)) (232756 233874 (\CURSOR.DEFPRINT 232766 . 233872)) ( +234286 242860 (TEXTUREOFCOLOR 234296 . 235558) (\PRIMARYTEXTURE 235560 . 236142) (\LEVELTEXTURE 236144 + . 236645) (INSURE.B&W.TEXTURE 236647 . 238042) (INSURE.RGB.COLOR 238044 . 239472) (\LOOKUPCOLORNAME +239474 . 239744) (RGBP 239746 . 240511) (HLSP 240513 . 240888) (HLSTORGB 240890 . 242030) (\HLSVALUEFN + 242032 . 242858))))) STOP diff --git a/sources/ADISPLAY.LCOM b/sources/ADISPLAY.LCOM index efa56474dbb06db048027cf31ecdb64bb1db7503..f3094c84a4146e70aa76126b9e9bc8e545e7ad7f 100644 GIT binary patch delta 2116 zcmb7FO>Y}j6pc+3(v(;e$4XKP$-^X4g0MB;A66G0d&V;pkLOvQNkSx}G>xOCNmEdP z6`)zr4Lj0^vOsJQ3o0Z?u(D`TI*V=`iR|Mo8w4xz3(B1jr?#n(>c#lZefOPn?zvBI znhyv6I2`0Yy z+nWuvv9*5Z=H^FpIaF6_@``C#YF07qswuCcTX#^pv}Bry?t;l?vuV^={}}d;q`Ma) zd_KJ}GG8)GwOCW-D~_t5^b5s(N^T&Uau~C?2IBiD(X=}@;OGxQB)d@?0ueTK8?i%cLBZfI2C;I=0Hw0H39P5=L&=9{GkM6Msc?ne;(68+!zO7{XSqruZVz!A>a-fQKP z;d=Nscx(pCPs**iwWL>W&90@qN~{t;UL!nAd}B3m>byDamCe+!SH{WHIe4Z{XUFwG z$@pRHPfWN0M0+ja;bg-)-}5Y-Xs=Cp+j!!r~K@cR}Ppl;RA-@gpV4A zQ>U|F0TdP$c=Q;N=rZEnm+$|gsl=1RXYX{d#>Qg#>w$00$*p`~dhq(jgM4V4elon; z2!?b2aNuW8ZZPPFU`3A%JS#Nz|CTiO=vDn>`k+_X|IWqGTWP)Z_D)-G&FZbWopxSJ zjKV4M=Ua`yjgYD}2Q`I$>Y+2`dCCoU44sXYE-%IwkTTE17SYK59?8J-OwP2e1lNmkc@@ z4$pe&rA@)fjw^Tqr@B44Xo~pl@Y%w^yhKT;UNnuWY$yV;=(e3J)VF5+MSjj4~t(&%kXpZa^Pl;?_f@AuDDHgc8TM?kO z9$4_pu7|&{$^|)#nT2ABRB9Re3eAj)sHVBaddJ{VShbEm8s(`9r};jsPh}h-6T-)R95a rWF&*4$O{=1N&7f664}|zcMONFBRrbjk6lZ}g#EvMpJ{$}O*s1(@j@p9 delta 1017 zcmZWnUu)A)6mPpBU1ejl;x-s~h!3tpYjbatwsEi|%}shWYeJH)4)QQ(hZFb52L)l1 zf)74B3i|}2_#&HS4?gvIpFrOP@dM0n;Jr!4s@|9L>dJQ*K+8h_Whj%r17 zbEAmL2t!#`a80SmhtEh)zI2PCBGnaK7hvP@-p=#w+g*6N3xe6UZ9pTuQmG_B_tA^Z zE(oLkIKP5~LT=HdHfeZ73y8r;|J1H3qA0+=;XinN_@=M~2-mQTKp_SViuxMlgzcRj z0TkCGtJG=xMT6;pAmZZvm%Drf5yXm8#tN1W_wNp}nM}0@CLjoXR+F@J8mwrpUx4(h zOgc4Tp61jmDfW&FPq;ZB2xbE26Y$yW#-8^RoH10_xj7%?x6~X*-olX@N37|OBtl>I zVmmXFwx*7H%}mCcnj6N2&dO)mn3PvFy&5mg^r8s+??Kt%+0S!v>8=VsW}-} zp|hNoKS`Z#MQC{ZP3=ZATuR>W&6E*^Syk- zP_J^%bZQY-F|0VNBya%B6$l$Pb+wjZcv{D%Edm%zVA6*kU{Q<#s-pz3)F_0cN&;{h z!i&_BPAz?<)N%~XZvqk#a0mO1p60qBR%Hlzg$@mxy4PkDQLaL0IgU}{8MYsQh-?4p zMQS4Z^+b(})iKbP-}Xo;R;o!50T-$ggn<({ZpZLJmcj5{qeuLJwzPmcEvVEXq_#~g z%`R!4#f}w=tP6wsuC1-HQ_}#|c@v|KDogsyA@i|E8MqF9z%G6TP#Ir9k+m6yy4U}; zJe#TE{*UE_ISIkR_?Sy=C(!jESaZp(19s064;pM`iHgLQl?+iqKs?RoKf{JzC0+oi Z0larry>il>medley>sources>FILESETS.;2 6410 +(FILECREATED " 1-Mar-2023 07:49:03" {DSK}larry>il>medley>sources>FILESETS.;2 6433 + + :EDIT-BY "lmm" :CHANGES-TO (VARS EXPORTFILES) - :PREVIOUS-DATE "11-Sep-2022 20:08:31" {DSK}larry>il>medley>sources>FILESETS.;1) + :PREVIOUS-DATE "26-Feb-2023 11:25:24" {DSK}larry>il>medley>sources>FILESETS.;1) (* ; " @@ -71,7 +73,7 @@ Copyright (c) 1981-1990, 1998, 2021 by Xerox Corporation. LLCHAR LLSTK PMAP LLGC ATBL FILEIO EXTERNALFORMAT LLARITH LLFLOAT FONT LLKEY LLDISPLAY ADISPLAY AINTERRUPT RENAMEMACROS HLDISPLAY WINDOW MACROAUX ADDARITH LLFAULT LLTIMER IMAGEIO PROC XCCS PASSWORDS INTERPRESS HARDCOPY CMLARRAY LLSUBRS LLETHER PUP UFS - DTDECLARE BIGBITMAP)) + DTDECLARE BIGBITMAPS)) (RPAQQ MAKEINITFILES (MAKEINIT MEM I-NEW)) From 28c673f29677b81f0b2c9e18bb30a3139a315ef0 Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Sat, 17 Jun 2023 20:14:00 -0700 Subject: [PATCH 04/25] LLREAD: CHARACTERNAMES saved with ALISTS instead of VARS commands Also CHARACTERSETNAMES. So that initial values don't smash or pick up the values that might otherwise be active in a development environment. --- sources/LLREAD | 103 +++++++++++++++++++++++--------------------- sources/LLREAD.LCOM | Bin 22517 -> 22502 bytes 2 files changed, 53 insertions(+), 50 deletions(-) diff --git a/sources/LLREAD b/sources/LLREAD index cebf3d84..606e9bd1 100644 --- a/sources/LLREAD +++ b/sources/LLREAD @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "19-Jul-2022 23:36:54"  -{DSK}kaplan>local>medley3.5>working-medley>sources>LLREAD.;102 89980 +(FILECREATED "17-Jun-2023 13:12:06" {WMEDLEY}LLREAD.;104 90176 - :CHANGES-TO (FNS PEEKCCODE SKIPSEPRCODES \SUBREAD) + :EDIT-BY rmk - :PREVIOUS-DATE "10-Sep-2021 19:41:58" -{DSK}kaplan>local>medley3.5>working-medley>sources>LLREAD.;101) + :CHANGES-TO (VARS LLREADCOMS CHARACTERNAMES) + + :PREVIOUS-DATE "19-Jul-2022 23:36:54" {WMEDLEY}LLREAD.;102) (* ; " @@ -37,7 +37,10 @@ Copyright (c) 1981-1988, 1990-1991, 1993, 2021 by Venue & Xerox Corporation. (COMS (* ; "Reading characters with #\") (FNS CHARACTER.READ CHARCODE.DECODE) (FNS HEXNUM? OCTALNUM?) - (VARS CHARACTERNAMES CHARACTERSETNAMES)) + (ALISTS (CHARACTERNAMES Page Form FF Rubout Del Null Escape Esc Bell Tab Backspace Bs + Newline CR EOL Return Tenexeol Space Sp Linefeed LF) + (CHARACTERSETNAMES Meta Function Greek Cyrillic Hira Hiragana Kata Katakana + Kanji))) (DECLARE%: DOEVAL@COMPILE DONTCOPY (CONSTANTS * READTYPES) (MACROS .CALL.SUBREAD. FIXDOT RBCONTEXT PROPRB \RDCONC) (SPECVARS *READ-NEWLINE-SUPPRESS* \RefillBufferFn) @@ -1523,38 +1526,38 @@ Copyright (c) 1981-1988, 1990-1991, 1993, 2021 by Venue & Xerox Corporation. ELSE (RETURN NIL)) FINALLY (RETURN NUM]) ) -(RPAQQ CHARACTERNAMES - (("Page" 12) - ("Form" 12) - ("FF" 12) - ("Rubout" 127) - ("Del" 127) - ("Null" 0) - ("Escape" 27) - ("Esc" 27) - ("Bell" 7) - ("Tab" 9) - ("Backspace" 8) - ("Bs" 8) - ("Newline" 13) - ("CR" 13) - ("EOL" 13) - ("Return" 13) - ("Tenexeol" 31) - ("Space" 32) - ("Sp" 32) - ("Linefeed" 10) - ("LF" 10))) +(ADDTOVAR CHARACTERNAMES + (Page 12) + (Form 12) + (FF 12) + (Rubout 127) + (Del 127) + (Null 0) + (Escape 27) + (Esc 27) + (Bell 7) + (Tab 9) + (Backspace 8) + (Bs 8) + (Newline 13) + (CR 13) + (EOL 13) + (Return 13) + (Tenexeol 31) + (Space 32) + (Sp 32) + (Linefeed 10) + (LF 10)) -(RPAQQ CHARACTERSETNAMES (("Meta" 1) - ("Function" 2) - ("Greek" 38) - ("Cyrillic" 39) - ("Hira" 36) - ("Hiragana" 36) - ("Kata" 37) - ("Katakana" 37) - ("Kanji" 48))) +(ADDTOVAR CHARACTERSETNAMES (Meta 1) + (Function 2) + (Greek 38) + (Cyrillic 39) + (Hira 36) + (Hiragana 36) + (Kata 37) + (Katakana 37) + (Kanji 48)) (DECLARE%: DOEVAL@COMPILE DONTCOPY (RPAQQ READTYPES (READ.RT RATOM.RT NOPROPRB.RT PROPRB.RT)) @@ -1660,17 +1663,17 @@ Copyright (c) 1981-1988, 1990-1991, 1993, 2021 by Venue & Xerox Corporation. (PUTPROPS LLREAD COPYRIGHT ("Venue & Xerox Corporation" 1981 1982 1983 1984 1985 1986 1987 1988 1990 1991 1993 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3265 11709 (LASTC 3275 . 3581) (PEEKC 3583 . 3971) (PEEKCCODE 3973 . 4384) (RATOM 4386 - . 5467) (READ 5469 . 6029) (READC 6031 . 6672) (READCCODE 6674 . 7433) (READP 7435 . 7987) ( -SETREADMACROFLG 7989 . 8288) (SKIPSEPRCODES 8290 . 9370) (SKIPSEPRS 9372 . 9758) (SKREAD 9760 . 11707) -) (11755 20364 (CL:READ 11765 . 12314) (CL:READ-PRESERVING-WHITESPACE 12316 . 13038) ( -CL:READ-DELIMITED-LIST 13040 . 13955) (CL:PARSE-INTEGER 13957 . 20362)) (20457 32934 (RSTRING 20467 . -21199) (READ-EXTENDED-TOKEN 21201 . 25073) (\RSTRING2 25075 . 32932)) (32970 63584 (\TOP-LEVEL-READ -32980 . 34963) (\SUBREAD 34965 . 60000) (\SUBREADCONCAT 60002 . 60625) (\ORIG-READ.SYMBOL 60627 . -61695) (\ORIG-INVALID.SYMBOL 61697 . 62596) (\APPLYREADMACRO 62598 . 63014) (INREADMACROP 63016 . -63582)) (63743 63918 (READQUOTE 63753 . 63916)) (63943 75847 (READVBAR 63953 . 65284) (READHASHMACRO -65286 . 71096) (DEFMACRO-LAMBDA-LIST-KEYWORD-P 71098 . 71318) (DIGITBASEP 71320 . 72054) ( -READNUMBERINBASE 72056 . 73942) (ESTIMATE-DIMENSIONALITY 73944 . 74269) (SKIP.HASH.COMMENT 74271 . -75239) (CMLREAD.FEATURE.PARSER 75241 . 75845)) (75891 82235 (CHARACTER.READ 75901 . 77155) ( -CHARCODE.DECODE 77157 . 82233)) (82236 85406 (HEXNUM? 82246 . 84589) (OCTALNUM? 84591 . 85404))))) + (FILEMAP (NIL (3460 11904 (LASTC 3470 . 3776) (PEEKC 3778 . 4166) (PEEKCCODE 4168 . 4579) (RATOM 4581 + . 5662) (READ 5664 . 6224) (READC 6226 . 6867) (READCCODE 6869 . 7628) (READP 7630 . 8182) ( +SETREADMACROFLG 8184 . 8483) (SKIPSEPRCODES 8485 . 9565) (SKIPSEPRS 9567 . 9953) (SKREAD 9955 . 11902) +) (11950 20559 (CL:READ 11960 . 12509) (CL:READ-PRESERVING-WHITESPACE 12511 . 13233) ( +CL:READ-DELIMITED-LIST 13235 . 14150) (CL:PARSE-INTEGER 14152 . 20557)) (20652 33129 (RSTRING 20662 . +21394) (READ-EXTENDED-TOKEN 21396 . 25268) (\RSTRING2 25270 . 33127)) (33165 63779 (\TOP-LEVEL-READ +33175 . 35158) (\SUBREAD 35160 . 60195) (\SUBREADCONCAT 60197 . 60820) (\ORIG-READ.SYMBOL 60822 . +61890) (\ORIG-INVALID.SYMBOL 61892 . 62791) (\APPLYREADMACRO 62793 . 63209) (INREADMACROP 63211 . +63777)) (63938 64113 (READQUOTE 63948 . 64111)) (64138 76042 (READVBAR 64148 . 65479) (READHASHMACRO +65481 . 71291) (DEFMACRO-LAMBDA-LIST-KEYWORD-P 71293 . 71513) (DIGITBASEP 71515 . 72249) ( +READNUMBERINBASE 72251 . 74137) (ESTIMATE-DIMENSIONALITY 74139 . 74464) (SKIP.HASH.COMMENT 74466 . +75434) (CMLREAD.FEATURE.PARSER 75436 . 76040)) (76086 82430 (CHARACTER.READ 76096 . 77350) ( +CHARCODE.DECODE 77352 . 82428)) (82431 85601 (HEXNUM? 82441 . 84784) (OCTALNUM? 84786 . 85599))))) STOP diff --git a/sources/LLREAD.LCOM b/sources/LLREAD.LCOM index 3d0b8de06e1b885acfef6a512123ba35ed857c0a..7783332caf0886aa1300db1043dc3fab7cc5a896 100644 GIT binary patch delta 1031 zcmaiy&2G~`6ou6;EfyfLV0mN-$yp@wPm{C;Avyj@1CzMeZlMb#Tz4oYjvd*tC_*T& z0P2GjsqAGaY@?cL-|Y8goRqZf zL(i9G_0U9Ktlp;i8B*4lc;hv09_{sdGEUF5~cVh+>Zw`OBE>_$G6BP$3cG$Y#nGz41=EIV?8nKgC84$OnV zJ(~E3Vb@_Yn2J3{G2;|<=!R(w%>K?z6<@yIzk0R3>#r>`38N5-bh{%C;xh`bC>QWN z1ocT#ui(%OvpUP*R!O|1JYYmw9mOXY#mT%{#tFr!!i>Jp(wxE$;Q9msUDag{DWW+& zr$vTPYz&upP1v?Kl;I^_2TCgIZ=^pu!_7zYiMk%)BrZPWJX!UmbAuY5hh>lu*dsn==JrRYT+w_K5y7M tz&kcB7+hd$g~5jqei(yICQK2PFa-vmx3y delta 1059 zcmb_a&2G~`5LP%Livur!v|0(29Ad?GQXEr7a-4M%;wFyQi8yd^oFy`GY|D<-Ru%Fq zAoa{M^blTx3y;w^;Lfb`(*oiIxA|sgzWKhHy}zscxT}1ASG4PI^RO;AWEshdrkrW5 zCPr24$D1Sw*%HMO!brI3(b1>#JY#9rS$j$7MV&DAy|A-k%aC0wVykl*r|TeE)%TfB z7U!wYvW{grMDK}jq=sBWSb8*0QZ+>?w5AOFi3L^Z)UJYrsL*~QDjMjUg6m&M~lqLLD5?I!nlGalH^)^or z$B}m5EA7dvx$aOTfLKR2T;h!N3t0FGQsS1G+xw~cTo4W2vc$tNM09)Z%$^B-Ytq%N zl4keC`TC@AY<)U?px853tJwBd3?m6XMHQQIx;e$>F>>-noNqaL&5L?0JjLTY1kixA zfJx?i2~h2;03E|FgQ5bJ&91k=sLg4*p1;l#&xa1R#MvPjv&%4uxF&_?4d)n Date: Sat, 17 Jun 2023 20:18:17 -0700 Subject: [PATCH 05/25] SEDIT: SELECTC formatted like SELECTQ, copy-select from the titlebar Fixes long-standing irritants (for me at least). SELECTC is highlighted and format like SELECTQ and SELCHARQ. And left-button in the title bar with the copy (shift) key down does a bksysbuf of the thing being edited. The menu is available under the middle button, moving and reshaping still provided by modernize with the shift not down. --- sources/SEDIT-LIST-FORMATS | 26 +++-- sources/SEDIT-LIST-FORMATS.DFASL | Bin 12453 -> 12487 bytes sources/SEDIT-WINDOW | 185 ++++++++++++++++++------------- sources/SEDIT-WINDOW.DFASL | Bin 30996 -> 31358 bytes 4 files changed, 124 insertions(+), 87 deletions(-) diff --git a/sources/SEDIT-LIST-FORMATS b/sources/SEDIT-LIST-FORMATS index e8be5b90..c02be5fa 100644 --- a/sources/SEDIT-LIST-FORMATS +++ b/sources/SEDIT-LIST-FORMATS @@ -1,14 +1,16 @@ (DEFINE-FILE-INFO PACKAGE "SEDIT" READTABLE "XCL" BASE 10) -(IL:FILECREATED "17-May-90 11:08:07" IL:|{DSK}local>lde>lispcore>sources>SEDIT-LIST-FORMATS.;2| 9591 - IL:|changes| IL:|to:| (IL:FILES IL:SEDIT-INDENT) - (IL:VARS IL:SEDIT-LIST-FORMATSCOMS) +(IL:FILECREATED "17-Jun-2023 19:46:35" IL:|{WMEDLEY}SEDIT-LIST-FORMATS.;2| 9581 - IL:|previous| IL:|date:| "18-Nov-88 10:56:22" -IL:|{DSK}local>lde>lispcore>sources>SEDIT-LIST-FORMATS.;1|) + :EDIT-BY IL:|rmk| + + :CHANGES-TO (IL:SEDIT-FORMATS IL:SELECTC) + (IL:VARS IL:SEDIT-LIST-FORMATSCOMS) + + :PREVIOUS-DATE "17-May-90 11:08:07" IL:|{WMEDLEY}SEDIT-LIST-FORMATS.;1|) -; Copyright (c) 1987, 1988, 1990 by Venue & Xerox Corporation. All rights reserved. +; Copyright (c) 1987-1988, 1990 by Venue & Xerox Corporation. (IL:PRETTYCOMPRINT IL:SEDIT-LIST-FORMATSCOMS) @@ -19,7 +21,7 @@ IL:|{DSK}local>lde>lispcore>sources>SEDIT-LIST-FORMATS.;1|) (IL:SEDIT-FORMATS RETURN-FROM THROW BLOCK (IL:* IL:|;;| - "some handy formats under names we don't expect to find as CAR of form") + "some handy formats under names we don't expect to find as CAR of form") :DEFAULT :DATA :BINDING :BINDING-LIST :LAMBDA-LIST :FBINDING :FBINDING-LIST :COND-CLAUSE :CASE-CLAUSE :HORIZONTAL :HORIZONTAL-NOBREAK :VERTICAL @@ -36,9 +38,9 @@ IL:|{DSK}local>lde>lispcore>sources>SEDIT-LIST-FORMATS.;1|) ECASE ERROR ETYPECASE EVAL-WHEN FLET FORMAT IF IGNORE-ERRORS LABELS LAMBDA IL:LAMBDA LET LET* LOCALLY LIST LIST* MACROLET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-SETQ IL:NLAMBDA IL:OPENLAMBDA OR IL:P PROCEED-CASE PROG PROG* PROGN - PROGV RESTART-CASE IL:SELCHARQ IL:SELECTQ TAGBODY THE TYPECASE UNDOABLY UNLESS - UNWIND-PROTECT WHEN WITH-INPUT-FROM-STRING WITH-OUTPUT-TO-STRING WITH-OPEN-FILE - WITH-OPEN-STREAM IL:WITH.MONITOR IL:WITH.FAST.MONITOR IL:WITH.SPY))) + PROGV RESTART-CASE IL:SELCHARQ IL:SELECTQ IL:SELECTC TAGBODY THE TYPECASE UNDOABLY + UNLESS UNWIND-PROTECT WHEN WITH-INPUT-FROM-STRING WITH-OUTPUT-TO-STRING + WITH-OPEN-FILE WITH-OPEN-STREAM IL:WITH.MONITOR IL:WITH.FAST.MONITOR IL:WITH.SPY))) (IL:PUTPROPS IL:SEDIT-LIST-FORMATS IL:FILETYPE :COMPILE-FILE) @@ -148,7 +150,7 @@ IL:|{DSK}local>lde>lispcore>sources>SEDIT-LIST-FORMATS.;1|) (DEF-LIST-FORMAT DEFCONSTANT DEFVAR) (DEF-LIST-FORMAT DEFDEFINER :INDENT ((2) - 1) + 1) :ARGS (:KEYWORD :CASE-CLAUSE NIL :LAMBDA-LIST NIL)) (DEF-LIST-FORMAT DEFUN :INDENT ((2)) @@ -309,6 +311,8 @@ IL:|{DSK}local>lde>lispcore>sources>SEDIT-LIST-FORMATS.;1|) :ARGS (:KEYWORD NIL :CASE-CLAUSE) :LAST NIL) +(DEF-LIST-FORMAT IL:SELECTC IL:SELECTQ) + (DEF-LIST-FORMAT TAGBODY :INDENT (:TAGBODY :STEP 0) :ARGS (:KEYWORD NIL)) diff --git a/sources/SEDIT-LIST-FORMATS.DFASL b/sources/SEDIT-LIST-FORMATS.DFASL index a385b5f12b0bede322e3b8e5f36034dcf365baeb..1fa4daba98734f2d7c666a0cc67f001b09846ff0 100644 GIT binary patch delta 3492 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 diff --git a/sources/SEDIT-WINDOW b/sources/SEDIT-WINDOW index 3be6a4fb..824149b3 100644 --- a/sources/SEDIT-WINDOW +++ b/sources/SEDIT-WINDOW @@ -1,18 +1,19 @@ -(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE (DEFPACKAGE SEDIT (USE LISP XCL))) -(IL:FILECREATED "14-May-2018 14:12:02"  -IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;2| 84658 +(DEFINE-FILE-INFO PACKAGE (DEFPACKAGE SEDIT (USE LISP XCL)) READTABLE "XCL" BASE 10) - IL:|changes| IL:|to:| (IL:FNS BUTTONEVENTFN) +(IL:FILECREATED "17-Jun-2023 19:59:30" IL:|{WMEDLEY}SEDIT-WINDOW.;2| 87420 - IL:|previous| IL:|date:| " 2-Apr-92 11:08:50" -IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) + :EDIT-BY IL:|rmk| + + :CHANGES-TO (IL:FNS BUTTONEVENTFN) + + :PREVIOUS-DATE "14-May-2018 14:12:02" IL:|{WMEDLEY}SEDIT-WINDOW.;1|) -; Copyright (c) 1986, 1987, 1988, 1990, 1991, 1992, 2018 by Venue & Xerox Corporation. All rights reserved. +; Copyright (c) 1986-1988, 1990-1992, 2018 by Venue & Xerox Corporation. (IL:PRETTYCOMPRINT IL:SEDIT-WINDOWCOMS) -(IL:RPAQQ IL:SEDIT-WINDOWCOMS +(IL:RPAQQ IL:SEDIT-WINDOWCOMS ((IL:PROP IL:FILETYPE IL:SEDIT-WINDOW) (IL:PROP IL:MAKEFILE-ENVIRONMENT IL:SEDIT-WINDOW) (IL:LOCALVARS . T) @@ -36,11 +37,11 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) SET-SELECTION-NOWHERE SHIFT-DOWN SHOW-CARET SHRINKFN STRING-OFFSET TRACK-EXTEND TRACK-SELECT UNDERLINE-SELECTION UPDATE-TITLE))) -(IL:PUTPROPS IL:SEDIT-WINDOW IL:FILETYPE :COMPILE-FILE) +(IL:PUTPROPS IL:SEDIT-WINDOW IL:FILETYPE :COMPILE-FILE) -(IL:PUTPROPS IL:SEDIT-WINDOW IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE - (DEFPACKAGE IL:SEDIT (:USE IL:LISP - IL:XCL)))) +(IL:PUTPROPS IL:SEDIT-WINDOW IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE + (DEFPACKAGE IL:SEDIT (:USE IL:LISP IL:XCL + )))) (IL:DECLARE\: IL:DOEVAL@COMPILE IL:DONTCOPY (IL:LOCALVARS . T) @@ -58,40 +59,64 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) (IL:RPAQQ ICON-TITLE-REGION (5 16 130 24)) -(IL:RPAQ TITLED-ICON (IL:CREATE IL:TITLEDICON IL:ICON IL:_ ICON IL:MASK IL:_ ICON-MASK - IL:TITLEREG IL:_ ICON-TITLE-REGION)) +(IL:RPAQ TITLED-ICON (IL:CREATE IL:TITLEDICON IL:ICON IL:_ ICON IL:MASK IL:_ ICON-MASK IL:TITLEREG + IL:_ ICON-TITLE-REGION)) (IL:RPAQQ KEEP-WINDOW-REGION T) (IL:DECLARE\: IL:DONTCOPY (IL:DECLARE\: IL:EVAL@COMPILE -(IL:PUTPROPS IN-TITLE-BAR IL:MACRO ((WINDOW) +(IL:PUTPROPS IN-TITLE-BAR IL:MACRO ((WINDOW) (NOT (IL:INSIDEP (IL:DSPCLIPPINGREGION NIL WINDOW) (IL:LASTMOUSEX WINDOW) (IL:LASTMOUSEY WINDOW))))) -(IL:PUTPROPS TRACK-BAR-IN-TRACK-SELECT IL:MACRO - (NIL (WHEN (OR (IL:NEQ POINT? (IL:|fetch| POINT-TYPE IL:|of| PENDING-CARET)) - (IL:NEQ BAR-X (IL:|fetch| POINT-X IL:|of| PENDING-CARET)) - (IL:NEQ BAR-LINE (IL:|fetch| POINT-LINE IL:|of| PENDING-CARET))) - (WHEN POINT? - (IL:BLTSHADE IL:BLACKSHADE WINDOW BAR-X BAR-Y 1 BAR-HEIGHT 'IL:INVERT)) - (WHEN (IL:SETQ POINT? (IL:|fetch| POINT-TYPE IL:|of| PENDING-CARET)) - (IL:SETQ BAR-X (IL:|fetch| POINT-X IL:|of| PENDING-CARET)) - (IL:SETQ BAR-LINE (IL:|fetch| POINT-LINE IL:|of| PENDING-CARET)) - (IL:SETQ BAR-HEIGHT (IL:IPLUS (IL:|fetch| LINE-ASCENT IL:|of| BAR-LINE) - (IL:|fetch| LINE-DESCENT IL:|of| BAR-LINE))) - (IL:SETQ BAR-Y (IL:IDIFFERENCE (IL:|fetch| YCOORD IL:|of| BAR-LINE) - (IL:IPLUS (IL:|fetch| LINE-SKIP IL:|of| BAR-LINE) - BAR-HEIGHT))) - (IL:BLTSHADE IL:BLACKSHADE WINDOW BAR-X BAR-Y 1 BAR-HEIGHT 'IL:INVERT))))) +(IL:PUTPROPS TRACK-BAR-IN-TRACK-SELECT IL:MACRO (NIL (WHEN (OR (IL:NEQ POINT? (IL:|fetch| POINT-TYPE + IL:|of| + PENDING-CARET) + ) + (IL:NEQ BAR-X (IL:|fetch| POINT-X + IL:|of| PENDING-CARET + )) + (IL:NEQ BAR-LINE (IL:|fetch| + POINT-LINE + IL:|of| + PENDING-CARET + ))) + (WHEN POINT? + (IL:BLTSHADE IL:BLACKSHADE WINDOW BAR-X + BAR-Y 1 BAR-HEIGHT 'IL:INVERT)) + (WHEN (IL:SETQ POINT? (IL:|fetch| POINT-TYPE + IL:|of| + PENDING-CARET + )) + (IL:SETQ BAR-X (IL:|fetch| POINT-X + IL:|of| PENDING-CARET) + ) + (IL:SETQ BAR-LINE (IL:|fetch| POINT-LINE + IL:|of| + PENDING-CARET + )) + (IL:SETQ BAR-HEIGHT + (IL:IPLUS (IL:|fetch| LINE-ASCENT + IL:|of| BAR-LINE) + (IL:|fetch| LINE-DESCENT + IL:|of| BAR-LINE))) + (IL:SETQ BAR-Y + (IL:IDIFFERENCE (IL:|fetch| YCOORD + IL:|of| BAR-LINE) + (IL:IPLUS (IL:|fetch| LINE-SKIP + IL:|of| BAR-LINE) + BAR-HEIGHT))) + (IL:BLTSHADE IL:BLACKSHADE WINDOW BAR-X + BAR-Y 1 BAR-HEIGHT 'IL:INVERT))))) ) ) (DEFUN SELECT-NODE-SEGMENT (CONTEXT NODE &OPTIONAL (START 1) - END) + END) -(IL:* IL:|;;;| "set the current selection to be a segment under this node") +(IL:* IL:|;;;| "set the current selection to be a segment under this node") (LET ((SELECTION (IL:FETCH SELECTION IL:OF CONTEXT)) (POINT (IL:FETCH CARET-POINT IL:OF CONTEXT))) @@ -100,7 +125,7 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) (IL:|replace| SELECT-END IL:|of| SELECTION IL:|with| END) (SELECT-SEGMENT SELECTION CONTEXT NODE) - (IL:* IL:|;;| "set point to be the selection. This should really be done by select-segment but it doesn't because it expects finalization code to be run after it cause it's generally called from the mouse tracking code which finalizes.") + (IL:* IL:|;;| "set point to be the selection. This should really be done by select-segment but it doesn't because it expects finalization code to be run after it cause it's generally called from the mouse tracking code which finalizes.") (PENDING-DELETE POINT SELECTION))) (IL:DEFINEQ @@ -182,9 +207,10 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) (IL:DSPRIGHTMARGIN 64000 DISPLAY-WINDOW)))) (BUTTONEVENTFN - (IL:LAMBDA (WINDOW) (IL:* IL:\; "Edited 23-Apr-2018 09:37 by rmk:") + (IL:LAMBDA (WINDOW) (IL:* IL:\; "Edited 17-Jun-2023 19:59 by rmk") + (IL:* IL:\; "Edited 23-Apr-2018 09:37 by rmk:") - (IL:* IL:|;;| "called by the window system whenever the user hits a mouse button in an SEdit window. allows selection and setting the caret point") + (IL:* IL:|;;| "called by the window system whenever the user hits a mouse button in an SEdit window. allows selection and setting the caret point") (LET* ((CONTEXT (IL:WINDOWPROP WINDOW 'EDIT-CONTEXT)) (LOCK (AND CONTEXT (IL:|fetch| CONTEXT-LOCK IL:|of| CONTEXT))) @@ -192,12 +218,12 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) (COND ((IL:LASTMOUSESTATE IL:UP) - (IL:* IL:|;;| "oops, no mouse buttons down. what are we doing here?") + (IL:* IL:|;;| "oops, no mouse buttons down. what are we doing here?") NIL) ((NOT (AND CONTEXT (IL:WINDOWPROP WINDOW 'IL:PROCESS))) - (IL:* IL:|;;| "this context or process is dead. make it a dead SEdit.") + (IL:* IL:|;;| "this context or process is dead. make it a dead SEdit.") (IL:|printout| (IL:GETPROMPTWINDOW WINDOW) T "This SEdit is dead.") @@ -209,21 +235,32 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) ((AND (IL:LASTMOUSESTATE IL:RIGHT) (IN-TITLE-BAR WINDOW)) - (IL:* IL:|;;| "right buttoning the title bar or window border gives the default menu of window commands. Not interlocked because want to be able to move window under a break that has the lock.") + (IL:* IL:|;;| "right buttoning the title bar or window border gives the default menu of window commands. Not interlocked because want to be able to move window under a break that has the lock.") (IL:\\CARET.DOWN) (IL:DOWINDOWCOM WINDOW)) ((AND (NOT (IL:TTY.PROCESSP (IL:WINDOWPROP WINDOW 'IL:PROCESS))) (NOT SHIFT-DOWN)) - (IL:* IL:|;;| "just grab the tty and don't change state") + (IL:* IL:|;;| "just grab the tty and don't change state") (IL:TOTOPW WINDOW) (IL:TTY.PROCESS (IL:WINDOWPROP WINDOW 'IL:PROCESS))) + ((AND (EQ SHIFT-DOWN 'COPY) + (IL:MOUSESTATE IL:LEFT) + (IN-TITLE-BAR WINDOW)) + + (IL:* IL:|;;| "RMK: copy-select in the title bar: return the thing being edited") + + (LET ((NAME (IL:LISTGET (IL:WINDOWPROP WINDOW 'TITLE-INFO) + :|name|))) + (WHEN NAME (IL:* IL:\; + "Not sure about FLG and RDTBL") + (IL:BKSYSBUF NAME)))) ((OR (EQ SHIFT-DOWN 'COPY) (IL:OBTAIN.MONITORLOCK LOCK T)) - (IL:* IL:|;;| "at this point we must have the lock, unless we're shift selecting (Copy only: Move and Delete are non-passive operation and must lock)") + (IL:* IL:|;;| "at this point we must have the lock, unless we're shift selecting (Copy only: Move and Delete are non-passive operation and must lock)") (IL:\\CARET.DOWN) (IL:TOTOPW WINDOW) @@ -233,31 +270,27 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) (AND (IL:LASTMOUSESTATE IL:LEFT) (IL:KEYDOWNP 'IL:CTRL)))) - (IL:* IL:|;;| "popup help command menu here.") + (IL:* IL:|;;| "popup help command menu here.") - (IL:* IL:|;;| "RMK: CTRL-LEFT = MIDDLE") + (IL:* IL:|;;| "RMK: CTRL-LEFT = MIDDLE") (HELPMENU CONTEXT)) (T (WITH-PROFILE (IL:|fetch| PROFILE IL:|of| CONTEXT) (PROG NIL (CLOSE-OPEN-NODE CONTEXT) - (IL:* IL:|;;| "record that we're busy making a selection in this window, and make sure that variables we use for recording our temporary state are all ready for action. note that these are global vars, and hence all this code is nonrentrant. shouldn't be a problem, since there's only one mouse") + (IL:* IL:|;;| "record that we're busy making a selection in this window, and make sure that variables we use for recording our temporary state are all ready for action. note that these are global vars, and hence all this code is nonrentrant. shouldn't be a problem, since there's only one mouse") (IL:SETQ SELECTION-PENDING? CONTEXT) - (IL:SETQ PENDING-LAST-X (IL:|fetch| LAST-MOUSE-X IL:|of| - CONTEXT)) - (IL:SETQ PENDING-LAST-Y (IL:|fetch| LAST-MOUSE-Y IL:|of| - CONTEXT)) - (IL:SETQ PENDING-TYPE (IL:|fetch| LAST-MOUSE-TYPE IL:|of| - CONTEXT)) + (IL:SETQ PENDING-LAST-X (IL:|fetch| LAST-MOUSE-X IL:|of| CONTEXT)) + (IL:SETQ PENDING-LAST-Y (IL:|fetch| LAST-MOUSE-Y IL:|of| CONTEXT)) + (IL:SETQ PENDING-TYPE (IL:|fetch| LAST-MOUSE-TYPE IL:|of| CONTEXT)) (IL:SETQ PENDING-SHIFT SHIFT-DOWN) - (IL:|replace| SELECT-NODE IL:|of| PENDING-SELECTION - IL:|with| NIL) + (IL:|replace| SELECT-NODE IL:|of| PENDING-SELECTION IL:|with| NIL) (WHEN (NOT PENDING-SHIFT) - (IL:* IL:|;;| - "if they're setting a new selection take down the main selection") + (IL:* IL:|;;| + "if they're setting a new selection take down the main selection") (SELECTION-DOWN CONTEXT)) (IL:SETQ LAST-MOVE-CLOCK NIL) @@ -268,15 +301,15 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) (TRACK-SELECT CONTEXT WINDOW)) (IL:|until| (CHECK-SELECTION-SHIFT CONTEXT T) IL:|do| (WHEN (NOT (IL:MOUSESTATE IL:UP)) - (GO MOUSE-BUTTON-DOWN)) + (GO MOUSE-BUTTON-DOWN)) (WHEN (IL:IN/SCROLL/BAR? WINDOW IL:LASTMOUSEX IL:LASTMOUSEY - ) (IL:* IL:\; - "let them scroll while making a selection") + ) (IL:* IL:\; + "let them scroll while making a selection") (IL:SCROLL.HANDLER WINDOW)) (IL:BLOCK)) (IL:SETQ SELECTION-PENDING? NIL) - (IL:* IL:\; - "figure out what we should do") + (IL:* IL:\; + "figure out what we should do") (FINALIZE-MOUSE-SELECTION CONTEXT WINDOW))))) (OR (EQ SHIFT-DOWN 'COPY) (IL:RELEASE.MONITORLOCK LOCK))))))) @@ -781,22 +814,22 @@ IL:|{DSK}kaplan>Local>medley3.5>lispcore>sources>SEDIT-WINDOW.;1|) (IL:PUTPROPS IL:SEDIT-WINDOW IL:COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1991 1992 2018)) (IL:DECLARE\: IL:DONTCOPY - (IL:FILEMAP (NIL (9049 9957 (SELECT-NODE-SEGMENT 9049 . 9957)) (9958 84520 (BUILD-WINDOW 9971 . 15811) - (BUTTONEVENTFN 15813 . 21522) (CHECK-SELECTION 21524 . 23564) (CHECK-SELECTION-SHIFT 23566 . 24689) ( -CLOSEFN 24691 . 27694) (CONFLICTING-SELECTION? 27696 . 28457) (DISPLAY-SELECTION 28459 . 29486) ( -DRAW-HIGHLIGHT 29488 . 30618) (DRAW-OUTLINE 30620 . 31975) (DRAW-UNDERLINE 31977 . 32752) (EXPANDFN -32754 . 33261) (EXPANDREGIONFN 33263 . 33853) (EXTEND-SELECTION 33855 . 36432) ( -FINALIZE-MOUSE-SELECTION 36434 . 42980) (FIND-LINE-START 42982 . 43673) (FIND-NODE 43675 . 44950) ( -GET-DESTINATION-CONTEXT 44952 . 45504) (GRAY 45506 . 45893) (GROW-CLICK? 45895 . 47880) ( -GROW-SELECTION 47882 . 48225) (GROW-SELECTION-DEFAULT 48227 . 48598) (HIGHLIGHT-SELECTION 48600 . -48893) (ICON-COPYFN 48895 . 49239) (LESS-PROMPT-WINDOW 49241 . 49610) (NORMALIZE-SELECTION 49612 . -50978) (OUTLINE-SELECTION 50980 . 52118) (PENDING-DELETE 52120 . 52454) (PLACE-CARET-AND-SELECTION -52456 . 54016) (PUNT-SET-POINT 54018 . 54476) (PUNT-SET-SELECTION 54478 . 54927) (REPAINTFN 54929 . -56207) (RESHAPEFN 56209 . 58547) (SCAN-FOR-BOUNDS 58549 . 61092) (SELECT-NODE 61094 . 61464) ( -SELECT-SEGMENT 61466 . 61906) (SELECT-SEGMENT-DEFAULT 61908 . 63935) (SELECTION-DOWN 63937 . 64347) ( -SELECTION-UP 64349 . 64775) (SET-POINT 64777 . 65536) (SET-POINT-NOWHERE 65538 . 65797) ( -SET-POINT-UNKNOWN 65799 . 66420) (SET-SELECTION 66422 . 66855) (SET-SELECTION-ME 66857 . 67949) ( -SET-SELECTION-NOWHERE 67951 . 68149) (SHIFT-DOWN 68151 . 68692) (SHOW-CARET 68694 . 74252) (SHRINKFN -74254 . 76989) (STRING-OFFSET 76991 . 78351) (TRACK-EXTEND 78353 . 80409) (TRACK-SELECT 80411 . 82900) - (UNDERLINE-SELECTION 82902 . 83304) (UPDATE-TITLE 83306 . 84518))))) + (IL:FILEMAP (NIL (11430 12334 (SELECT-NODE-SEGMENT 11430 . 12334)) (12335 87282 (BUILD-WINDOW 12348 . +18188) (BUTTONEVENTFN 18190 . 24284) (CHECK-SELECTION 24286 . 26326) (CHECK-SELECTION-SHIFT 26328 . +27451) (CLOSEFN 27453 . 30456) (CONFLICTING-SELECTION? 30458 . 31219) (DISPLAY-SELECTION 31221 . 32248 +) (DRAW-HIGHLIGHT 32250 . 33380) (DRAW-OUTLINE 33382 . 34737) (DRAW-UNDERLINE 34739 . 35514) (EXPANDFN + 35516 . 36023) (EXPANDREGIONFN 36025 . 36615) (EXTEND-SELECTION 36617 . 39194) ( +FINALIZE-MOUSE-SELECTION 39196 . 45742) (FIND-LINE-START 45744 . 46435) (FIND-NODE 46437 . 47712) ( +GET-DESTINATION-CONTEXT 47714 . 48266) (GRAY 48268 . 48655) (GROW-CLICK? 48657 . 50642) ( +GROW-SELECTION 50644 . 50987) (GROW-SELECTION-DEFAULT 50989 . 51360) (HIGHLIGHT-SELECTION 51362 . +51655) (ICON-COPYFN 51657 . 52001) (LESS-PROMPT-WINDOW 52003 . 52372) (NORMALIZE-SELECTION 52374 . +53740) (OUTLINE-SELECTION 53742 . 54880) (PENDING-DELETE 54882 . 55216) (PLACE-CARET-AND-SELECTION +55218 . 56778) (PUNT-SET-POINT 56780 . 57238) (PUNT-SET-SELECTION 57240 . 57689) (REPAINTFN 57691 . +58969) (RESHAPEFN 58971 . 61309) (SCAN-FOR-BOUNDS 61311 . 63854) (SELECT-NODE 63856 . 64226) ( +SELECT-SEGMENT 64228 . 64668) (SELECT-SEGMENT-DEFAULT 64670 . 66697) (SELECTION-DOWN 66699 . 67109) ( +SELECTION-UP 67111 . 67537) (SET-POINT 67539 . 68298) (SET-POINT-NOWHERE 68300 . 68559) ( +SET-POINT-UNKNOWN 68561 . 69182) (SET-SELECTION 69184 . 69617) (SET-SELECTION-ME 69619 . 70711) ( +SET-SELECTION-NOWHERE 70713 . 70911) (SHIFT-DOWN 70913 . 71454) (SHOW-CARET 71456 . 77014) (SHRINKFN +77016 . 79751) (STRING-OFFSET 79753 . 81113) (TRACK-EXTEND 81115 . 83171) (TRACK-SELECT 83173 . 85662) + (UNDERLINE-SELECTION 85664 . 86066) (UPDATE-TITLE 86068 . 87280))))) IL:STOP diff --git a/sources/SEDIT-WINDOW.DFASL b/sources/SEDIT-WINDOW.DFASL index f1c9091f55830818c5063135be4f4914e3f23ed1..2b0c8ab9602e55f9cb40f16ac73f3909ca26005e 100644 GIT binary patch delta 13108 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 delta 12694 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 N!G!H0%i~{u`F~e7C*lAA From d6a4b3bf88b1a5f81a074c53407d8c3ea424b4da Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Tue, 20 Jun 2023 21:12:13 -0700 Subject: [PATCH 06/25] SEDIT-WINDOW: use COPYINSERT instead of BKSYSBUF for shift-selection from titlebar Gets the package --- sources/SEDIT-WINDOW | 45 +++++++++++++++++++------------------ sources/SEDIT-WINDOW.DFASL | Bin 31358 -> 33848 bytes 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/sources/SEDIT-WINDOW b/sources/SEDIT-WINDOW index 824149b3..53f583f5 100644 --- a/sources/SEDIT-WINDOW +++ b/sources/SEDIT-WINDOW @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE (DEFPACKAGE SEDIT (USE LISP XCL)) READTABLE "XCL" BASE 10) -(IL:FILECREATED "17-Jun-2023 19:59:30" IL:|{WMEDLEY}SEDIT-WINDOW.;2| 87420 +(IL:FILECREATED "20-Jun-2023 21:10:34" IL:|{WMEDLEY}SEDIT-WINDOW.;3| 87531 :EDIT-BY IL:|rmk| :CHANGES-TO (IL:FNS BUTTONEVENTFN) - :PREVIOUS-DATE "14-May-2018 14:12:02" IL:|{WMEDLEY}SEDIT-WINDOW.;1|) + :PREVIOUS-DATE "17-Jun-2023 19:59:30" IL:|{WMEDLEY}SEDIT-WINDOW.;2|) ; Copyright (c) 1986-1988, 1990-1992, 2018 by Venue & Xerox Corporation. @@ -207,7 +207,8 @@ (IL:DSPRIGHTMARGIN 64000 DISPLAY-WINDOW)))) (BUTTONEVENTFN - (IL:LAMBDA (WINDOW) (IL:* IL:\; "Edited 17-Jun-2023 19:59 by rmk") + (IL:LAMBDA (WINDOW) (IL:* IL:\; "Edited 20-Jun-2023 21:10 by rmk") + (IL:* IL:\; "Edited 17-Jun-2023 19:59 by rmk") (IL:* IL:\; "Edited 23-Apr-2018 09:37 by rmk:") (IL:* IL:|;;| "called by the window system whenever the user hits a mouse button in an SEdit window. allows selection and setting the caret point") @@ -256,7 +257,7 @@ :|name|))) (WHEN NAME (IL:* IL:\;  "Not sure about FLG and RDTBL") - (IL:BKSYSBUF NAME)))) + (IL:COPYINSERT NAME)))) ((OR (EQ SHIFT-DOWN 'COPY) (IL:OBTAIN.MONITORLOCK LOCK T)) @@ -814,22 +815,22 @@ (IL:PUTPROPS IL:SEDIT-WINDOW IL:COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1991 1992 2018)) (IL:DECLARE\: IL:DONTCOPY - (IL:FILEMAP (NIL (11430 12334 (SELECT-NODE-SEGMENT 11430 . 12334)) (12335 87282 (BUILD-WINDOW 12348 . -18188) (BUTTONEVENTFN 18190 . 24284) (CHECK-SELECTION 24286 . 26326) (CHECK-SELECTION-SHIFT 26328 . -27451) (CLOSEFN 27453 . 30456) (CONFLICTING-SELECTION? 30458 . 31219) (DISPLAY-SELECTION 31221 . 32248 -) (DRAW-HIGHLIGHT 32250 . 33380) (DRAW-OUTLINE 33382 . 34737) (DRAW-UNDERLINE 34739 . 35514) (EXPANDFN - 35516 . 36023) (EXPANDREGIONFN 36025 . 36615) (EXTEND-SELECTION 36617 . 39194) ( -FINALIZE-MOUSE-SELECTION 39196 . 45742) (FIND-LINE-START 45744 . 46435) (FIND-NODE 46437 . 47712) ( -GET-DESTINATION-CONTEXT 47714 . 48266) (GRAY 48268 . 48655) (GROW-CLICK? 48657 . 50642) ( -GROW-SELECTION 50644 . 50987) (GROW-SELECTION-DEFAULT 50989 . 51360) (HIGHLIGHT-SELECTION 51362 . -51655) (ICON-COPYFN 51657 . 52001) (LESS-PROMPT-WINDOW 52003 . 52372) (NORMALIZE-SELECTION 52374 . -53740) (OUTLINE-SELECTION 53742 . 54880) (PENDING-DELETE 54882 . 55216) (PLACE-CARET-AND-SELECTION -55218 . 56778) (PUNT-SET-POINT 56780 . 57238) (PUNT-SET-SELECTION 57240 . 57689) (REPAINTFN 57691 . -58969) (RESHAPEFN 58971 . 61309) (SCAN-FOR-BOUNDS 61311 . 63854) (SELECT-NODE 63856 . 64226) ( -SELECT-SEGMENT 64228 . 64668) (SELECT-SEGMENT-DEFAULT 64670 . 66697) (SELECTION-DOWN 66699 . 67109) ( -SELECTION-UP 67111 . 67537) (SET-POINT 67539 . 68298) (SET-POINT-NOWHERE 68300 . 68559) ( -SET-POINT-UNKNOWN 68561 . 69182) (SET-SELECTION 69184 . 69617) (SET-SELECTION-ME 69619 . 70711) ( -SET-SELECTION-NOWHERE 70713 . 70911) (SHIFT-DOWN 70913 . 71454) (SHOW-CARET 71456 . 77014) (SHRINKFN -77016 . 79751) (STRING-OFFSET 79753 . 81113) (TRACK-EXTEND 81115 . 83171) (TRACK-SELECT 83173 . 85662) - (UNDERLINE-SELECTION 85664 . 86066) (UPDATE-TITLE 86068 . 87280))))) + (IL:FILEMAP (NIL (11430 12334 (SELECT-NODE-SEGMENT 11430 . 12334)) (12335 87393 (BUILD-WINDOW 12348 . +18188) (BUTTONEVENTFN 18190 . 24395) (CHECK-SELECTION 24397 . 26437) (CHECK-SELECTION-SHIFT 26439 . +27562) (CLOSEFN 27564 . 30567) (CONFLICTING-SELECTION? 30569 . 31330) (DISPLAY-SELECTION 31332 . 32359 +) (DRAW-HIGHLIGHT 32361 . 33491) (DRAW-OUTLINE 33493 . 34848) (DRAW-UNDERLINE 34850 . 35625) (EXPANDFN + 35627 . 36134) (EXPANDREGIONFN 36136 . 36726) (EXTEND-SELECTION 36728 . 39305) ( +FINALIZE-MOUSE-SELECTION 39307 . 45853) (FIND-LINE-START 45855 . 46546) (FIND-NODE 46548 . 47823) ( +GET-DESTINATION-CONTEXT 47825 . 48377) (GRAY 48379 . 48766) (GROW-CLICK? 48768 . 50753) ( +GROW-SELECTION 50755 . 51098) (GROW-SELECTION-DEFAULT 51100 . 51471) (HIGHLIGHT-SELECTION 51473 . +51766) (ICON-COPYFN 51768 . 52112) (LESS-PROMPT-WINDOW 52114 . 52483) (NORMALIZE-SELECTION 52485 . +53851) (OUTLINE-SELECTION 53853 . 54991) (PENDING-DELETE 54993 . 55327) (PLACE-CARET-AND-SELECTION +55329 . 56889) (PUNT-SET-POINT 56891 . 57349) (PUNT-SET-SELECTION 57351 . 57800) (REPAINTFN 57802 . +59080) (RESHAPEFN 59082 . 61420) (SCAN-FOR-BOUNDS 61422 . 63965) (SELECT-NODE 63967 . 64337) ( +SELECT-SEGMENT 64339 . 64779) (SELECT-SEGMENT-DEFAULT 64781 . 66808) (SELECTION-DOWN 66810 . 67220) ( +SELECTION-UP 67222 . 67648) (SET-POINT 67650 . 68409) (SET-POINT-NOWHERE 68411 . 68670) ( +SET-POINT-UNKNOWN 68672 . 69293) (SET-SELECTION 69295 . 69728) (SET-SELECTION-ME 69730 . 70822) ( +SET-SELECTION-NOWHERE 70824 . 71022) (SHIFT-DOWN 71024 . 71565) (SHOW-CARET 71567 . 77125) (SHRINKFN +77127 . 79862) (STRING-OFFSET 79864 . 81224) (TRACK-EXTEND 81226 . 83282) (TRACK-SELECT 83284 . 85773) + (UNDERLINE-SELECTION 85775 . 86177) (UPDATE-TITLE 86179 . 87391))))) IL:STOP diff --git a/sources/SEDIT-WINDOW.DFASL b/sources/SEDIT-WINDOW.DFASL index 2b0c8ab9602e55f9cb40f16ac73f3909ca26005e..3a41cbd983010a342bf2e8416a3763c6d46f9e6b 100644 GIT binary patch delta 11341 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 Date: Fri, 30 Jun 2023 16:42:07 -0700 Subject: [PATCH 07/25] Fix places where rename of record LINE to XXLINE was incomplete (#1212) --- sources/XXGEOM | 183 ++++++++++++++++++++------------------------ sources/XXGEOM.LCOM | Bin 10392 -> 10200 bytes 2 files changed, 85 insertions(+), 98 deletions(-) diff --git a/sources/XXGEOM b/sources/XXGEOM index 3c738f96..fba9c4ae 100644 --- a/sources/XXGEOM +++ b/sources/XXGEOM @@ -1,36 +1,30 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED "13-Jun-2021 14:39:29"  -{DSK}kaplan>Local>medley3.5>git-medley>sources>XXGEOM.;2 49841 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (VARS XXGEOMCOMS) - (RECORDS XXLINE) - (FNS MAKELINE LINE.LESSP) - (MACROS \GETLINEORIGY \GETLINEDIFFY) +(FILECREATED "14-May-2023 15:47:43" {DSK}larry>il>medley>sources>XXGEOM.;5 48712 - previous date%: "19-Jan-93 11:30:54" -{DSK}kaplan>Local>medley3.5>git-medley>sources>XXGEOM.;1) + :EDIT-BY "lmm" + :CHANGES-TO (MACROS GETLINEORIG) + + :PREVIOUS-DATE "13-Jun-2021 14:39:29" {DSK}larry>il>medley>sources>XXGEOM.;4) -(* ; " -Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. -") (PRETTYCOMPRINT XXGEOMCOMS) (RPAQQ XXGEOMCOMS ( -(* ;;; "Integer Geometry Library") +(* ;;; "Integer Geometry Library") -(* ;;; "Scalar methods") +(* ;;; "Scalar methods") (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS \SGN)) (FNS \IRND) -(* ;;; "XYpt object and methods") +(* ;;; "XYpt object and methods") (RECORDS XYPT) (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS XYPT.X XYPT.Y)) @@ -39,7 +33,7 @@ Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. MMLTLIST IMLTLIST XYPT.LESSP PATH.LESSP CONVEXP) -(* ;;; "Line object and methods") +(* ;;; "Line object and methods") (RECORDS XXLINE) (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS GETLINEDIFF GETLINEORIG \GETLINEDIFF \GETLINEORIGY @@ -48,24 +42,24 @@ Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. (FNS LINEY MIDDX INITX TERMX SCANX XPROD) -(* ;;; "line segment methods") +(* ;;; "line segment methods") (FNS XYSECTLSEG) -(* ;;; "Bresenham line object and methods") +(* ;;; "Bresenham line object and methods") (RECORDS BRES) (FNS MAKEBRES) (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS BRESSTEP)) -(* ;;; "Debugging control panel") +(* ;;; "Debugging control panel") (DECLARE%: EVAL@COMPILE DONTCOPY (VARS \GEOM.PANEL)) -(* ;;; "Trapezoidal decomposition") +(* ;;; "Trapezoidal decomposition") (FNS TRAPLOOP TRAPMAKE) (VARS TRAP.DEBUG) @@ -84,11 +78,11 @@ Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. (DECLARE%: EVAL@COMPILE (PUTPROPS \SGN DMACRO ((VAL) - (if (IGREATERP VAL 0) - then 1 - elseif (ILESSP VAL 0) - then -1 - else 0))) + (if (IGREATERP VAL 0) + then 1 + elseif (ILESSP VAL 0) + then -1 + else 0))) ) ) (DEFINEQ @@ -119,26 +113,26 @@ Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. (DECLARE%: EVAL@COMPILE (PUTPROPS XYPT.X DMACRO ((PT) - (CAR PT))) + (CAR PT))) (PUTPROPS XYPT.Y DMACRO ((PT) - (CDR PT))) + (CDR PT))) ) ) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (PUTPROPS HEADPT DMACRO ((PATH) - (CAR PATH))) + (CAR PATH))) (PUTPROPS NEXTPT DMACRO ((PATH) - (CADR PATH))) + (CADR PATH))) (PUTPROPS HEADPTY DMACRO ((PATH) - (CDAR PATH))) + (CDAR PATH))) (PUTPROPS NEXTPTY DMACRO ((PATH) - (CDADR PATH))) + (CDADR PATH))) ) ) (DEFINEQ @@ -587,35 +581,30 @@ Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. (PUTPROPS GETLINEDIFF DMACRO [(SELF DX DY) - (* ;; "External method, get dx, dy from line") + (* ;; "External method, get dx, dy from line") - (WITH LINE SELF (SETQ DX (ffetch (XYPT X) of DIFF)) - (SETQ DY (ffetch (XYPT Y) OF DIFF]) + (WITH XXLINE SELF (SETQ DX (ffetch (XYPT X) of DIFF)) + (SETQ DY (ffetch (XYPT Y) OF DIFF]) (PUTPROPS GETLINEORIG DMACRO [(SELF OX OY) - (* ;; "External method, get dx, dy from line") + (* ;; "External method, get dx, dy from line") - (WITH LINE SELF (SETQ OX (ffetch (XYPT X) of ORIG)) - (SETQ OY (ffetch (XYPT Y) OF ORIG]) + (WITH XXLINE SELF (SETQ OX (ffetch (XYPT X) of ORIG)) + (SETQ OY (ffetch (XYPT Y) OF ORIG]) -(PUTPROPS \GETLINEDIFF DMACRO [(SELF DX DY) (* edited " 1-Jan-00 00:00") +(PUTPROPS \GETLINEDIFF DMACRO [(SELF DX DY) (* edited " 1-Jan-00 00:00") - (* ;; "Degenerate private method, get dx, dy from line") + (* ;; "Degenerate private method, get dx, dy from line") - (WITH LINE SELF (SETQ DX (FFETCH (XYPT X) OF - DIFF)) - (SETQ DY (FFETCH (XYPT T) OF DIFF]) + (WITH XXLINE SELF (SETQ DX (FFETCH (XYPT X) OF DIFF)) + (SETQ DY (FFETCH (XYPT T) OF DIFF]) (PUTPROPS \GETLINEORIGY DMACRO [(SELF YPTR) - (SETQ YPTR (FFETCH (XYPT Y) of (FFETCH - (XXLINE ORIG) - of SELF]) + (SETQ YPTR (FFETCH (XYPT Y) of (FFETCH (XXLINE ORIG) of SELF]) (PUTPROPS \GETLINEDIFFY DMACRO [(SELF YPTR) - (SETQ YPTR (FFETCH (XYPT Y) of (FFETCH - (XXLINE DIFF) - of SELF]) + (SETQ YPTR (FFETCH (XYPT Y) of (FFETCH (XXLINE DIFF) of SELF]) ) ) (DEFINEQ @@ -990,54 +979,53 @@ Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. (PUTPROPS BRESSTEP DMACRO ((SELF SCANY INITX TERMX) - (* * Assume that this Y is exactly incremented by one from the last call, so - DDA can be used. Then passed parameter scany is not used.) + (* * Assume that this Y is exactly incremented by one from the last call, so DDA + can be used. Then passed parameter scany is not used.) - (* * (WITH BRES SELF (*) (SETQ INITX X) - (IF (EQ MAJOR (QUOTE X)) THEN (while (ILESSP P 0) do - (SETQ X (IPLUS X IX)) (SETQ P (IPLUS P IPX))) - (IF (ILEQ INITX X) THEN (SETQ TERMX X) ELSE - (SETQ TERMX INITX) (SETQ INITX X)) (SETQ X - (IPLUS X IX)) (SETQ P (IPLUS P IPY)) ELSE - (SETQ TERMX X) (if (ILESSP P 0) then (SETQ P - (IPLUS P IPY)) else (SETQ P (IPLUS P IPX)) - (SETQ X (IPLUS X IX)))))) + (* * (WITH BRES SELF (*) (SETQ INITX X) (IF + (EQ MAJOR (QUOTE X)) THEN (while (ILESSP P 0) do + (SETQ X (IPLUS X IX)) (SETQ P (IPLUS P IPX))) + (IF (ILEQ INITX X) THEN (SETQ TERMX X) ELSE + (SETQ TERMX INITX) (SETQ INITX X)) (SETQ X + (IPLUS X IX)) (SETQ P (IPLUS P IPY)) ELSE + (SETQ TERMX X) (if (ILESSP P 0) then (SETQ P + (IPLUS P IPY)) else (SETQ P (IPLUS P IPX)) + (SETQ X (IPLUS X IX)))))) - (LET (X0 DX D DDX DDY) + (LET (X0 DX D DDX DDY) - (* * (WITH BRES SELF (*) (SETQ X0 X) (SETQ DX IX) - (SETQ D P) (SETQ DDX IPX) (SETQ DDY IPY))) + (* * (WITH BRES SELF (*) (SETQ X0 X) (SETQ DX IX) + (SETQ D P) (SETQ DDX IPX) (SETQ DDY IPY))) - (SETQ D (FFETCH (BRES P) OF SELF)) - (SETQ X0 (FFETCH (BRES X) OF SELF)) - (SETQ DX (FFETCH (BRES IX) OF SELF)) - (SETQ DDX (FFETCH (BRES IPX) OF SELF)) - (SETQ DDY (FFETCH (BRES IPY) OF SELF)) + (SETQ D (FFETCH (BRES P) OF SELF)) + (SETQ X0 (FFETCH (BRES X) OF SELF)) + (SETQ DX (FFETCH (BRES IX) OF SELF)) + (SETQ DDX (FFETCH (BRES IPX) OF SELF)) + (SETQ DDY (FFETCH (BRES IPY) OF SELF)) - (* * Above faster than WITH form * *) + (* * Above faster than WITH form * *) - (SETQ INITX X0) - [IF (EQ (FFETCH (BRES MAJOR) OF SELF) - 'X) - THEN (while (ILESSP D 0) - do (SETQ X0 (IPLUS X0 DX)) - (SETQ D (IPLUS D DDX))) - (IF (ILEQ INITX X0) - THEN (SETQ TERMX X0) - ELSE (SETQ TERMX INITX) - (SETQ INITX X0)) - (SETQ X0 (IPLUS X0 DX)) - (SETQ D (IPLUS D DDY)) - ELSE (SETQ TERMX X0) - (if (ILESSP D 0) - then (SETQ D (IPLUS D DDY)) - else (SETQ D (IPLUS D DDX)) - (SETQ X0 (IPLUS X0 DX] + (SETQ INITX X0) + [IF (EQ (FFETCH (BRES MAJOR) OF SELF) + 'X) + THEN (while (ILESSP D 0) do (SETQ X0 (IPLUS X0 DX)) + (SETQ D (IPLUS D DDX))) + (IF (ILEQ INITX X0) + THEN (SETQ TERMX X0) + ELSE (SETQ TERMX INITX) + (SETQ INITX X0)) + (SETQ X0 (IPLUS X0 DX)) + (SETQ D (IPLUS D DDY)) + ELSE (SETQ TERMX X0) + (if (ILESSP D 0) + then (SETQ D (IPLUS D DDY)) + else (SETQ D (IPLUS D DDX)) + (SETQ X0 (IPLUS X0 DX] - (* * (WITH BRES SELF (*) (SETQ X X0) (SETQ P D))) + (* * (WITH BRES SELF (*) (SETQ X X0) (SETQ P D))) - (FREPLACE (BRES X) OF SELF with X0) - (FREPLACE (BRES P) OF SELF with D)))) + (FREPLACE (BRES X) OF SELF with X0) + (FREPLACE (BRES P) OF SELF with D)))) ) ) @@ -1223,15 +1211,14 @@ Copyright (c) 1985-1987, 1990, 1993, 2021 by Venue & Xerox Corporation. (PRINTOUT MYWIN "CONVEX: " (CONVEXP RLIST) T]) ) -(PUTPROPS XXGEOM COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1990 1993 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2461 2894 (\IRND 2471 . 2892)) (3638 23250 (MAKEXYPT 3648 . 3879) (IRNDLIST 3881 . 4485 -) (NORMLOOP 4487 . 6115) (SLITLOOP 6117 . 7816) (PREPLOOP 7818 . 8483) (YMAPLIST 8485 . 10046) ( -IMAPLIST 10048 . 13607) (UNIQLIST 13609 . 14230) (MERGLIST 14232 . 16879) (MMLTLIST 16881 . 17694) ( -IMLTLIST 17696 . 18579) (XYPT.LESSP 18581 . 18950) (PATH.LESSP 18952 . 20278) (CONVEXP 20280 . 23248)) - (25235 30477 (MAKELINE 25245 . 25928) (MSECT 25930 . 26399) (XSECT 26401 . 26957) (YSECT 26959 . -27517) (XYSECT 27519 . 28260) (KNOTLINE 28262 . 29186) (KNOTLOOP 29188 . 30064) (LINE.LESSP 30066 . -30475)) (30478 34052 (LINEY 30488 . 30942) (MIDDX 30944 . 31447) (INITX 31449 . 32130) (TERMX 32132 . -32762) (SCANX 32764 . 33548) (XPROD 33550 . 34050)) (34092 35556 (XYSECTLSEG 34102 . 35554)) (36000 -38555 (MAKEBRES 36010 . 38553)) (42116 48478 (TRAPLOOP 42126 . 44868) (TRAPMAKE 44870 . 48476))))) + (FILEMAP (NIL (2192 2625 (\IRND 2202 . 2623)) (3321 22933 (MAKEXYPT 3331 . 3562) (IRNDLIST 3564 . 4168 +) (NORMLOOP 4170 . 5798) (SLITLOOP 5800 . 7499) (PREPLOOP 7501 . 8166) (YMAPLIST 8168 . 9729) ( +IMAPLIST 9731 . 13290) (UNIQLIST 13292 . 13913) (MERGLIST 13915 . 16562) (MMLTLIST 16564 . 17377) ( +IMLTLIST 17379 . 18262) (XYPT.LESSP 18264 . 18633) (PATH.LESSP 18635 . 19961) (CONVEXP 19963 . 22931)) + (24428 29670 (MAKELINE 24438 . 25121) (MSECT 25123 . 25592) (XSECT 25594 . 26150) (YSECT 26152 . +26710) (XYSECT 26712 . 27453) (KNOTLINE 27455 . 28379) (KNOTLOOP 28381 . 29257) (LINE.LESSP 29259 . +29668)) (29671 33245 (LINEY 29681 . 30135) (MIDDX 30137 . 30640) (INITX 30642 . 31323) (TERMX 31325 . +31955) (SCANX 31957 . 32741) (XPROD 32743 . 33243)) (33285 34749 (XYSECTLSEG 33295 . 34747)) (35193 +37748 (MAKEBRES 35203 . 37746)) (41075 47437 (TRAPLOOP 41085 . 43827) (TRAPMAKE 43829 . 47435))))) STOP diff --git a/sources/XXGEOM.LCOM b/sources/XXGEOM.LCOM index 07a53a2f8ab22f7a4341c02b120fc0e389e2fa34..f1f974b4329e397cf56c350ec19712429dffa1d6 100644 GIT binary patch delta 483 zcma)&!AiqG6h%Q?W#`h3JO-3Rn2?#I){GKJlSv$#CN)W=E^8aGkTjCoMJUp5aOZ#c zGk%5N;B=#+pzhw{a_)WS`RX+}QhgqXnBzc19E&(e;9%%_eK+KQM4a<964?+v?d@-R zZpMKanxd%Nu$OW-=RP1};lZTE)SxDi4zp}#Py{NP*46#IEM`zI0KwYN`j6*#byYa! zq-k1bUOH7VD~r}y)~jY(ES>Q<u8`LLO!XKGQ-|5BC)qk@xgVY2&q~}-6vmltc3l)*$>CBpStR5p88x8{#N@_C?<6tF$S5L&nTrNv?vTlpmePk9 z+;rP#=*#p8y6iJ}uOO%^-TdJE;XB_s=WqJ!R8>O~#R<`)m=Zlsq7=4r;)kVwNC}`g zDM?P_B17vBAFnh;m2H7&C`kwi+xqdU)h*M)fE~}VJiLcMMKgZ4s2es1-U0&UM_8Qv z{5)B*ZaKQG7ERTTD4$i$=#I@B_T4syqwBiY*XxZNOM9h?z2Uy+ms_xs<2&E2>Ay0AcT+ye*0?51k3*%Erb?SXpc=LJls zMA289%}J2vp-fV7Rgs920>=Icks(MJloUlKDq}y$)8gLzw3Wc3V_$2&T0X8I zlo59I Date: Fri, 30 Jun 2023 16:56:54 -0700 Subject: [PATCH 08/25] Add BROWSERMAX to limit depth of paths graph (#1158) * Add BROWSERMAX to limit depth of paths graph * Update Browser to use left-button menu popup to select action --- library/BROWSER | 530 +++++++++++++++++++++++------------------- library/BROWSER.LCOM | Bin 10459 -> 12328 bytes library/BROWSER.TEDIT | Bin 0 -> 47646 bytes 3 files changed, 293 insertions(+), 237 deletions(-) create mode 100644 library/BROWSER.TEDIT diff --git a/library/BROWSER b/library/BROWSER index 53640727..5ca7aee9 100644 --- a/library/BROWSER +++ b/library/BROWSER @@ -1,17 +1,17 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 7-Feb-2022 14:06:19" {DSK}kaplan>Local>medley3.5>my-medley>library>BROWSER.;3 26344 +(FILECREATED "26-Apr-2023 12:41:36" {DSK}larry>il>medley>library>BROWSER.;6 29801 - :CHANGES-TO (VARS BROWSERCOMS) - (FNS GET.BROWSE.PP.WINDOW NUMSPATHS) + :EDIT-BY "lmm" - :PREVIOUS-DATE "25-Mar-94 13:43:20" -{DSK}kaplan>Local>medley3.5>my-medley>library>BROWSER.;1) + :CHANGES-TO (FNS BROWSER.LEFTFN NUMSPATHS STBROWSER MSPATHS.DISPATCH BROWSER + BROWSER.WHENFNSCHANGED BRPATHS1 GET.BROWSE.PP.WINDOW + GET.BROWSE.DESCRIBE.WINDOW BROWSEPP PPREPAINTFN PPRESHAPEFN DESCRIBEREPAINTFN + BROWSERDESCRIBE BROWSER.MIDDLEFN DEDITPROCESSRUNNINGP REDRAWBROWSEGRAPH) + (VARS BROWSERCOMS BROWSER.BORDERS) + :PREVIOUS-DATE "15-Apr-2023 18:55:36" {DSK}larry>il>medley>library>BROWSER.;1) -(* ; " -Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation. -") (PRETTYCOMPRINT BROWSERCOMS) @@ -20,27 +20,26 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) GRAPHER) (CONSTANTS (CHANGEDSHADE 8840))) - (FNS NUMSPATHS BROWSER BROWSER.WHENFNSCHANGED BRPATHS1 BROWSER.LEFTFN GET.BROWSE.PP.WINDOW - GET.BROWSE.DESCRIBE.WINDOW BROWSEPP PPREPAINTFN PPRESHAPEFN DESCRIBEREPAINTFN - BROWSERDESCRIBE BROWSER.MIDDLEFN DEDITPROCESSRUNNINGP REDRAWBROWSEGRAPH STBROWSER) + (FNS MSPATHS.DISPATCH NUMSPATHS BROWSER BROWSER.WHENFNSCHANGED BRPATHS1 BROWSER.LEFTFN + GET.BROWSE.PP.WINDOW GET.BROWSE.DESCRIBE.WINDOW BROWSEPP PPREPAINTFN PPRESHAPEFN + DESCRIBEREPAINTFN BROWSERDESCRIBE BROWSER.MIDDLEFN DEDITPROCESSRUNNINGP + REDRAWBROWSEGRAPH STBROWSER) (GLOBALRESOURCES BROWSEHASH) (DECLARE%: DONTCOPY (RECORDS BROWSEWIN PATHSARGS)) - [VARS (BROWSERBOXING) - (BROWSERFORMAT) - (BROWSERWINDOWS) - (NODESELECTIONWINDOW) - (PFWINDOW) - (BROWSER.DESCRIBE.WINDOW) - (BrowserPPWindowWidth 750) - (BROWSERFONT '(GACHA 8] - [P (MOVD? 'MSPATHS 'OLDMSPATHS) - (MOVD? 'NILL 'MODERNWINDOW) - (PROG [(WC (FILEPKGTYPE 'FNS 'WHENCHANGED] - (OR (MEMB 'BROWSER.WHENFNSCHANGED WC) - (FILEPKGTYPE 'FNS 'WHENCHANGED (CONS 'BROWSER.WHENFNSCHANGED WC] - (DECLARE%: DONTEVAL@LOAD DOCOPY (P (SELECTQ (SYSTEMTYPE) - (D (BROWSER T)) - NIL]) + [INITVARS (BROWSER T) + (BROWSERBOXING) + (BROWSERFORMAT) + (BROWSERWINDOWS) + (NODESELECTIONWINDOW) + (PFWINDOW) + (BROWSER.DESCRIBE.WINDOW) + (BrowserPPWindowWidth 750) + (BROWSERMAX 10) + (BROWSERFONT '(GACHA 8] + (P (MOVD? 'NILL 'MODERNWINDOW)) + (VARS BROWSER.BORDERS) + (GLOBALVARS BROWSER.BORDERS BROWSERWINDOWS) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (BROWSER T]) (FILESLOAD MASTERSCOPE GRAPHER) (DECLARE%: EVAL@COMPILE DONTCOPY @@ -58,64 +57,74 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation ) (DEFINEQ -(NUMSPATHS +(MSPATHS.DISPATCH [LAMBDA (FROM TO INVERTED AVOIDING SEPARATE NOTRACE MARKING) - (* ; "Edited 7-Feb-2022 13:57 by rmk") - (* ; "Edited 11-Apr-88 11:08 by jrb:") - (COND - [(AND (WINDOWWORLD) + (* ; "Edited 15-Apr-2023 11:33 by lmm") + (IF (AND (GETD 'NUMSPATHS) + (WINDOWWORLD) (EQ (OUTPUT) T)) - [OR AVOIDING (SETQ AVOIDING '(NIL (NIL NIL . FNS) - APPLY LAMBDA (X) - (GETPROP X 'AVOID] - (RESETVARS ((MSPRINTFLG)) - (AND INVERTED (UPDATECHANGED)) - (STBROWSER - [GLOBALRESOURCE - BROWSEHASH - (PROG [X NAMED TEM (UNDONE (MSLISTSET FROM T)) - ROOTS GRAPHNODE.LIST (SEEN BROWSEHASH) - (CALLRELATION (PARSERELATION 'CALL] - (DECLARE (SPECVARS SEEN UNDONE GRAPHNODE.LIST)) - (CLRHASH SEEN) - (for X in UNDONE do (PUTHASH X (COND - ((AND NOTRACE (MSMEMBSET X NOTRACE)) - -1) - (T 0)) - SEEN) - (OR INVERTED (UPDATEFN X NIL 0))) - [do (COND - (NAMED (PUTHASH (CAR NAMED) - 0 SEEN) - [push ROOTS (fetch (GRAPHNODE NODEID) - of (BRPATHS1 (CAR NAMED] - (SETQ NAMED (CDR NAMED))) - (UNDONE [COND - ([OR (NULL (SETQ TEM (GETHASH (CAR UNDONE) - SEEN))) - (EQ TEM 0) - (AND (LISTP TEM) - (NULL (CAR TEM] - (PUTHASH (CAR UNDONE) - (LIST NIL) - SEEN) - (SETQ NAMED (LIST (CAR UNDONE] - (SETQ UNDONE (CDR UNDONE))) - (T (RETURN] - (RETURN (LAYOUTFOREST GRAPHNODE.LIST ROOTS BROWSERFORMAT BROWSERBOXING] - (PROG1 (LIST FROM TO INVERTED AVOIDING SEPARATE NOTRACE) - (* ; - "this LIST is actually an 'instance' of PATHSARGS") - ] - (T (OLDMSPATHS FROM TO INVERTED AVOIDING SEPARATE NOTRACE MARKING]) + THEN (NUMSPATHS FROM TO INVERTED AVOIDING SEPARATE NOTRACE MARKING) + ELSE (OLDMSPATHS FROM TO INVERTED AVOIDING SEPARATE NOTRACE MARKING]) + +(NUMSPATHS + [LAMBDA (FROM TO INVERTED AVOIDING SEPARATE NOTRACE MARKING DEPTH) + (DECLARE (SPECVARS INVERTED GRAPHNODE.LIST)) (* ; "Edited 26-Apr-2023 09:12 by lmm") + (* ; "Edited 15-Apr-2023 18:43 by lmm") + (* ; "Edited 7-Feb-2022 13:57 by rmk") + (* ; "Edited 11-Apr-88 11:08 by jrb:") + [OR AVOIDING (SETQ AVOIDING '(NIL (NIL NIL . FNS) + APPLY LAMBDA (X) + (GETPROP X 'AVOID] + (AND INVERTED (UPDATECHANGED)) + (OR DEPTH (SETQ DEPTH BROWSERMAX)) + (WITH-RESOURCES BROWSEHASH (PROG [NAMED TEM (UNDONE (MSLISTSET FROM T)) + ROOTS GRAPHNODE.LIST (SEEN BROWSEHASH) + (CALLRELATION (PARSERELATION 'CALL] + (DECLARE (SPECVARS SEEN GRAPHNODE.LIST CALLRELATION)) + (CLRHASH SEEN) + (for X in UNDONE do (PUTHASH X (COND + ((AND NOTRACE (MSMEMBSET + X NOTRACE)) + -1) + (T 0)) + SEEN) + (OR INVERTED (UPDATEFN X NIL 0))) + [do (COND + (NAMED (PUTHASH (CAR NAMED) + 0 SEEN) + (PUSH ROOTS (fetch (GRAPHNODE NODEID) + of (BRPATHS1 (CAR NAMED) + DEPTH))) + (SETQ NAMED (CDR NAMED))) + (UNDONE [COND + ([OR (NULL (SETQ TEM (GETHASH (CAR UNDONE) + SEEN))) + (EQ TEM 0) + (AND (LISTP TEM) + (NULL (CAR TEM] + (PUTHASH (CAR UNDONE) + (LIST NIL) + SEEN) + (SETQ NAMED (LIST (CAR UNDONE] + (SETQ UNDONE (CDR UNDONE))) + (T (RETURN] + (RETURN (STBROWSER (LAYOUTGRAPH GRAPHNODE.LIST ROOTS + (APPEND BROWSERFORMAT BROWSERBOXING)) + (LIST FROM TO INVERTED AVOIDING SEPARATE NOTRACE + MARKING DEPTH]) (BROWSER - [LAMBDA (DISPLAYFLG) (* rmk%: "16-Dec-83 15:39") - (COND - (DISPLAYFLG (SETQ BROWSERFONT (FONTCREATE BROWSERFONT)) - (MOVD 'NUMSPATHS 'MSPATHS)) - (T (MOVD 'OLDMSPATHS 'MSPATHS]) + [LAMBDA (DISPLAYFLG) (* ; "Edited 15-Apr-2023 14:55 by lmm") + (* rmk%: "16-Dec-83 15:39") + (MOVD? 'MSPATHS 'OLDMSPATHS) + (MOVD 'MSPATHS.DISPATCH 'MSPATHS) + (SETQ BROWSER DISPLAYFLG) + (OR (FONTP BROWSERFONT) + (SETQ BROWSERFONT (FONTCREATE BROWSERFONT))) + (PROG [(WC (FILEPKGTYPE 'FNS 'WHENCHANGED] + (OR (MEMB 'BROWSER.WHENFNSCHANGED WC) + (FILEPKGTYPE 'FNS 'WHENCHANGED (CONS 'BROWSER.WHENFNSCHANGED WC]) (BROWSER.WHENFNSCHANGED [LAMBDA (FNNAME TYPE REASON) (* DECLARATIONS%: (RECORDS BROWSEWIN)) @@ -134,78 +143,122 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation FNNAME)) (BROWSERDESCRIBE FNNAME BROWSER.DESCRIBE.WINDOW))) (for X in BROWSERWINDOWS do (COND - ((find GRAPHNODE - in (fetch (GRAPH GRAPHNODES) - of (fetch (BROWSEWIN GRAPH) - of X)) - suchthat (EQ (fetch (GRAPHNODE NODELABEL) - of GRAPHNODE) - FNNAME)) - (COND - ((fetch (BROWSEWIN GRAPH) of X) - (DSPFILL NIL CHANGEDSHADE 'PAINT - (fetch (BROWSEWIN WINDOW) of - X)) - (WINDOWPROP (fetch (BROWSEWIN WINDOW) - of X) - 'BUTTONEVENTFN - (FUNCTION REDRAWBROWSEGRAPH)) - (replace (BROWSEWIN GRAPH) of X - with NIL]) + ((find GRAPHNODE in (fetch (GRAPH GRAPHNODES) + of (fetch (BROWSEWIN GRAPH) of X)) + suchthat (EQ (fetch (GRAPHNODE NODELABEL) of GRAPHNODE) + FNNAME)) + (COND + ((fetch (BROWSEWIN GRAPH) of X) + (DSPFILL NIL CHANGEDSHADE 'PAINT (fetch (BROWSEWIN WINDOW) + of X)) + (WINDOWPROP (fetch (BROWSEWIN WINDOW) of X) + 'BUTTONEVENTFN + (FUNCTION REDRAWBROWSEGRAPH)) + (replace (BROWSEWIN GRAPH) of X with NIL]) (BRPATHS1 - [LAMBDA (FROM) (* ; "Edited 11-Apr-88 11:27 by jrb:") - (DECLARE (GLOBALVARS BROWSERFONT)) - (PROG (TEM) + [LAMBDA (FROM DEPTH) (* ; "Edited 25-Apr-2023 10:59 by lmm") + (* ; "Edited 11-Apr-88 11:27 by jrb:") + (DECLARE (SPECVARS INVERTED) + (GLOBALVARS BROWSERFONT MISSING.GRAPH.NODEBORDER)) + (PROG (TEM ENTRY TOFNS) (MSPATHS2 FROM) (COND ((EQ (SETQ TEM (GETHASH FROM SEEN)) -1) (* ; - "on NOPATHS list - create a node for it with no subs") + "on NOPATHS list - create a node for it with no subs") (SETQ TEM (create GRAPHNODE NODEID _ FROM NODELABEL _ FROM NODEFONT _ BROWSERFONT TONODES _ NIL)) - (push GRAPHNODE.LIST TEM) + (PUAH GRAPHNODE.LIST TEM) (PUTHASH FROM TEM SEEN) (RETURN TEM)) ((NEQ TEM 0) (* ; "already expanded into a list") (RETURN TEM)) - (T (RETURN (PROG ((ENTRY (create GRAPHNODE - NODEID _ FROM - NODELABEL _ FROM - NODEFONT _ BROWSERFONT))) - (push GRAPHNODE.LIST ENTRY) - (PUTHASH FROM ENTRY SEEN) - (replace (GRAPHNODE TONODES) of ENTRY - with (for X - in (for Y - in (COND - ((NOT INVERTED) - (GETRELATION FROM CALLRELATION)) - (T (GETRELATION FROM CALLRELATION T) - )) when (MSPATHS2 Y) - collect Y) when (SETQ X (BRPATHS1 - X)) - collect (fetch (GRAPHNODE NODEID) of X))) - (RETURN ENTRY]) + (T [SETQ TOFNS (COND + ((NOT INVERTED) + (GETRELATION FROM CALLRELATION)) + (T (GETRELATION FROM CALLRELATION T] + (SETQ ENTRY (create GRAPHNODE + NODEID _ FROM + NODELABEL _ FROM + NODEFONT _ BROWSERFONT)) + (PUSH GRAPHNODE.LIST ENTRY) + (PUTHASH FROM ENTRY SEEN) + (IF (AND TOFNS (<= DEPTH 0)) + THEN (REPLACE (GRAPHNODE NODEBORDER) OF ENTRY WITH (CDDR (ASSOC 'ENDOFLINE + BROWSER.BORDERS)) + ) + (RETURN ENTRY)) + (replace (GRAPHNODE TONODES) of ENTRY with (for X + in (for Y in TOFNS + when (MSPATHS2 Y) collect Y) + when (SETQ X (BRPATHS1 X + (- DEPTH 1))) + collect (fetch (GRAPHNODE NODEID) + of X))) + (RETURN ENTRY]) (BROWSER.LEFTFN - [LAMBDA (NODE NWINDOW) (* ; "Edited 31-Mar-87 11:16 by jop") + [LAMBDA (NODE NWINDOW) (* ; "Edited 26-Apr-2023 12:41 by lmm") + (* ; "Edited 31-Mar-87 11:16 by jop") (* ;  "function that is applied upon selection of a node.") - (COND - ((NULL NODE)) - ((EQ (fetch NODELABEL of NODE) - (WINDOWPROP (GET.BROWSE.PP.WINDOW) - 'FNBROWSED)) - (BROWSERDESCRIBE (fetch NODELABEL of NODE) - (GET.BROWSE.DESCRIBE.WINDOW))) - (T (* ; - "if first time touched, pretty print it.") - (BROWSEPP (fetch NODELABEL of NODE) - (GET.BROWSE.PP.WINDOW]) + (PROG (FN SELECTION) + (IF (NULL NODE) + THEN (RETURN) + (MOVEW NWINDOW) (* ; + " really want to just drag the content around") + (RETURN)) + (IF (NULL (SETQ FN (FETCH NODELABEL OF NODE))) + THEN (RETURN)) + [SETQ SELECTION (MENU (CREATE MENU + ITEMS _ '(CallsFrom CallsTo Edit Show InspectCode] + + (* ;; "Mot implemented: Ignore Avoid") + + (DESTRUCTURING-BIND (FROM TO INVERTED AVOIDING SEPARATE NOTRACE MARKING DEPTH) + (FOR BW IN BROWSERWINDOWS WHEN (EQ (FETCH (BROWSEWIN WINDOW) OF BW) + NWINDOW) DO (RETURN (FETCH (BROWSEWIN ARGS) + OF BW)) + FINALLY (PROMPTPRINT "No browser window found for" FN) + (RETURN)) + + (* ;; "Now we have the arguments to MSPATHS .. insert this node?") + + (SELECTQ SELECTION + ((NIL) + (RETURN)) + ((CallsFrom CallsTo) + (* ;; "new graph, FN at the root") + + (NUMSPATHS (CREATE SENTENCE + SUBJECT _ '(NIL NIL . FNS) + MSPRED _ 'QUOTE + OTHERSTUFF _ (LIST FN)) + (IF INVERTED + THEN TO + ELSE FROM) + INVERTED AVOIDING NIL NOTRACE MARKING DEPTH)) + NIL + (Ignore (* ; "local ignore")) + (Avoid (* ; " global ignore")) + (Edit (ED FN (IF (HASDEF FN 'FNS) + THEN 'FNS + ELSEIF (HASDEF FN 'FUNCTIONS) + THEN 'FUNCTIONS + ELSE (PROMPTPRINT FN "no definition") + NIL))) + (Show (CL:UNLESS (EQ FN (WINDOWPROP (GET.BROWSE.PP.WINDOW) + 'FNBROWSED)) + (BROWSEPP FN (GET.BROWSE.PP.WINDOW)))) + (Describe (BROWSERDESCRIBE FN (GET.BROWSE.DESCRIBE.WINDOW))) + (InspectCode (IF (NOT (CCODEP FN)) + THEN (PROMPTPRINT FN "not compiled") + ELSE (INSPECTCODE FN))) + (HELP]) (GET.BROWSE.PP.WINDOW [LAMBDA NIL (* ; "Edited 7-Feb-2022 14:01 by rmk") @@ -253,9 +306,9 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation BOTTOM]) (PPREPAINTFN - [LAMBDA (WINDOW REGION RESHAPE) (* ; "Edited 11-Jun-90 14:11 by mitani") + [LAMBDA (WINDOW REGION RESHAPE) (* ; "Edited 11-Jun-90 14:11 by mitani") - (* ;; "repaints the browser pp window WINDOW. Returns the width of the image so that caller can set the EXTENT.") + (* ;; "repaints the browser pp window WINDOW. Returns the width of the image so that caller can set the EXTENT.") (PROG ((FN (WINDOWPROP WINDOW 'FNBROWSED)) (EXTENT (WINDOWPROP WINDOW 'EXTENT)) @@ -265,25 +318,23 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation (MOVETOUPPERLEFT WINDOW EXTENT) (printout WINDOW .FONT DEFAULTFONT) (COND - ((for FPTYPE in MSFNTYPES - when (SETQ DEF (GETDEF FN (ffetch (MSANALYZABLE FILEPKGNAME) - of FPTYPE) - NIL - 'NOERROR)) - do (SETQ FNTYPE (ffetch (MSANALYZABLE FILEPKGNAME) - of FPTYPE)) - (RETURN DEF) finally NIL) - (* ; - "set up linelength characteristics.") + ((for FPTYPE in MSFNTYPES when (SETQ DEF (GETDEF FN (ffetch (MSANALYZABLE + FILEPKGNAME) + of FPTYPE) + NIL + 'NOERROR)) + do (SETQ FNTYPE (ffetch (MSANALYZABLE FILEPKGNAME) of FPTYPE)) + (RETURN DEF) finally NIL) (* ; + "set up linelength characteristics.") (RESETLST (RESETSAVE (OUTPUT WINDOW)) (RESETSAVE (SETREADTABLE T)) (RESETSAVE **COMMENT**FLG) (if (EQ FNTYPE 'FNS) - then (printout WINDOW "(" .FONT LAMBDAFONT |.P2| FN .FONT - DEFAULTFONT T)) - (DSPRIGHTMARGIN (fetch (REGION RIGHT) of (DSPCLIPPINGREGION - NIL WINDOW)) + then (printout WINDOW "(" .FONT LAMBDAFONT .P2 FN .FONT + DEFAULTFONT T)) + (DSPRIGHTMARGIN (fetch (REGION RIGHT) of (DSPCLIPPINGREGION NIL + WINDOW)) WINDOW) (PRINTDEF DEF (AND (EQ FNTYPE 'FNS) 2) @@ -291,19 +342,19 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation (if (EQ FNTYPE 'FNS) then (PRIN1 ")" WINDOW))) (fetch (REGION WIDTH) of (DSPCLIPPINGREGION NIL WINDOW))) - (T (* ; - "set right margin out so wouldn't clip.") + (T (* ; + "set right margin out so wouldn't clip.") (DSPRIGHTMARGIN 5000 WINDOW) (APPLY* (FUNCTION PF*) FN NIL (GETSTREAM WINDOW)) - (DSPRIGHTMARGIN (fetch (REGION RIGHT) of (DSPCLIPPINGREGION - NIL WINDOW)) + (DSPRIGHTMARGIN (fetch (REGION RIGHT) of (DSPCLIPPINGREGION NIL WINDOW + )) WINDOW) BrowserPPWindowWidth))) (T 0]) (PPRESHAPEFN - [LAMBDA (WINDOW) (* lmm "20-Jul-84 15:48") + [LAMBDA (WINDOW) (* lmm "20-Jul-84 15:48") (BROWSEPP (WINDOWPROP WINDOW 'FNBROWSED) WINDOW]) @@ -314,17 +365,18 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation (PROG [(FN (WINDOWPROP WIN 'FNBROWSED)) (EXTENT (WINDOWPROP WIN 'EXTENT] (COND - (FN (RESETLST (RESETSAVE MSPRINTFLG NIL) - (RESETSAVE (OUTPUT WIN)) - (DSPSCROLL 'OFF WIN) - (COND - (EXTENT (MOVETOUPPERLEFT WIN EXTENT))) - (MSDESCRIBE FN]) + (FN (RESETLST + (RESETSAVE MSPRINTFLG NIL) + (RESETSAVE (OUTPUT WIN)) + (DSPSCROLL 'OFF WIN) + (COND + (EXTENT (MOVETOUPPERLEFT WIN EXTENT))) + (MSDESCRIBE FN))]) (BROWSERDESCRIBE [LAMBDA (FN WIN) (* ; "Edited 31-Mar-87 11:15 by jop") - - (* ;; "puts the masterscope DESCRIBE information in the window DS. Keeps tracks of which fn so if it changes the window can be updated.") + + (* ;; "puts the masterscope DESCRIBE information in the window DS. Keeps tracks of which fn so if it changes the window can be updated.") (WINDOWPROP WIN 'FNBROWSED FN) (CLEARW WIN) @@ -337,9 +389,9 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation (DSPYPOSITION NIL WIN]) (BROWSER.MIDDLEFN - [LAMBDA (NODE NWINDOW) (* ; "Edited 25-Mar-94 13:25 by jds") + [LAMBDA (NODE NWINDOW) (* ; "Edited 25-Mar-94 13:25 by jds") (* ; - "called when yellow selection from browser. Call display editor on the function.") + "called when yellow selection from browser. Call display editor on the function.") (COND ((NULL NODE)) [(THIS.PROCESS) (* ; "processes are running.") @@ -352,7 +404,7 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation " " "into the Dedit " "window then selecting 'Edit'.")) (T (ADD.PROCESS `(ED ',(fetch NODELABEL of NODE]) ((SEDIT SEDIT:SEDIT) (* ; - "SEdit doesn't have to worry about this stuff") + "SEdit doesn't have to worry about this stuff") (ED (fetch NODELABEL of NODE) ':DONTWAIT)) (ED (fetch NODELABEL of NODE] @@ -360,8 +412,8 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation (DEDITPROCESSRUNNINGP [LAMBDA NIL (* ; "Edited 31-Mar-87 11:27 by jop") - - (* ;; "is there a dedit process running?") + + (* ;; "is there a dedit process running?") (AND (EQ (EDITMODE) 'DEDIT) @@ -369,73 +421,69 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation (REDRAWBROWSEGRAPH [LAMBDA (WINDOW) (* DECLARATIONS%: (RECORDS BROWSEWIN)) + (* ; "Edited 15-Apr-2023 16:12 by lmm") (* ; "Edited 31-Mar-87 11:24 by jop") - (PROG [(WN (find X in BROWSERWINDOWS suchthat (EQ (fetch (BROWSEWIN WINDOW) - of X) - WINDOW] - (AND WN (APPLY 'NUMSPATHS (fetch (BROWSEWIN ARGS) of WN))) - (* ; "(OR WN (SHOULDNT))") + (PROG [(WN (find X in BROWSERWINDOWS suchthat (EQ (fetch (BROWSEWIN WINDOW) of X) + WINDOW] + (AND WN (APPLY (FUNCTION NUMSPATHS) + (fetch (BROWSEWIN ARGS) of WN))) (* ; "(OR WN (SHOULDNT))") (WINDOWPROP WINDOW 'BUTTONEVENTFN (FUNCTION APPLYTOSELECTEDNODE)) (APPLYTOSELECTEDNODE WINDOW]) (STBROWSER [LAMBDA (GRAPH ARGS) (* DECLARATIONS%: (RECORDS BROWSEWIN)) + (* ; "Edited 25-Apr-2023 21:05 by lmm") (* ; "Edited 31-Mar-87 11:18 by jop") (* ;; "puts a browser graph for the args FROMFN in a window. If a similar graph is already a window, that window is reused; otherwise a new window is created.") - (WINDOWADDPROP (bind TMP for W in BROWSERWINDOWS - when (EQUAL (fetch (PATHSARGS DISCRIMINANT) of ARGS) - (fetch (PATHSARGS DISCRIMINANT) of (fetch - (BROWSEWIN ARGS) - of W))) + (WINDOWADDPROP (bind TMP for W in BROWSERWINDOWS when (EQUAL (fetch (PATHSARGS DISCRIMINANT) + of ARGS) + (fetch (PATHSARGS DISCRIMINANT) + of (fetch (BROWSEWIN ARGS) + of W))) do (replace (BROWSEWIN ARGS) of W with ARGS) - (replace (BROWSEWIN GRAPH) of W with GRAPH) - (SHOWGRAPH GRAPH (SETQ W (fetch (BROWSEWIN WINDOW) of W)) - (FUNCTION BROWSER.LEFTFN) - (FUNCTION BROWSER.MIDDLEFN)) - (RETURN W) + (replace (BROWSEWIN GRAPH) of W with GRAPH) + (SHOWGRAPH GRAPH (SETQ W (fetch (BROWSEWIN WINDOW) of W)) + (FUNCTION BROWSER.LEFTFN) + (FUNCTION BROWSER.MIDDLEFN)) + (RETURN W) finally (SETQ W (SHOWGRAPH GRAPH (CONCAT "PATHS" - (COND - ((SETQ TMP (fetch - (PATHSARGS FROM) - of ARGS)) + (COND + ((SETQ TMP (fetch (PATHSARGS FROM) + of ARGS)) + (CONCAT (COND + ((CADR (CADR TMP)) + " FROM ") + (T " TO ")) + (CADDDR TMP))) + (T "")) + (COND + ((SETQ TMP (fetch (PATHSARGS TO) + of ARGS)) (* ; - "CADDDR here gets the thing that looks like it might be a function name.") - (CONCAT (COND - ((CADR (CADR TMP)) - " FROM ") - (T " TO ")) - (CADDDR TMP))) - (T "")) - (COND - ((SETQ TMP (fetch - (PATHSARGS TO) - of ARGS)) - (* ; - "CADDDR here gets the thing that looks like it might be a function name.") - (CONCAT (COND - ((CADR (CADR TMP)) - " FROM ") - (T " TO ")) - (CADDDR TMP))) - (T ""))) - (FUNCTION BROWSER.LEFTFN) - (FUNCTION BROWSER.MIDDLEFN))) + "CADDDR here gets the thing that looks like it might be a function name.") + (CONCAT (COND + ((CADR (CADR TMP)) + " FROM ") + (T " TO ")) + (CADDDR TMP))) + (T ""))) + (FUNCTION BROWSER.LEFTFN) + (FUNCTION BROWSER.MIDDLEFN))) (push BROWSERWINDOWS - (create BROWSEWIN - ARGS _ ARGS - GRAPH _ GRAPH - WINDOW _ W)) + (create BROWSEWIN + ARGS _ ARGS + GRAPH _ GRAPH + WINDOW _ W)) (RETURN W)) 'CLOSEFN (FUNCTION (LAMBDA (WINDOW) (* ; - "The closing function for browser windows. removes it from BROWSERWINDOWS") + "The closing function for browser windows. removes it from BROWSERWINDOWS") (SETQ BROWSERWINDOWS (DREMOVE (for X in BROWSERWINDOWS when (EQ (fetch (BROWSEWIN WINDOW) - of X) - WINDOW) - do (RETURN X)) + of X) + WINDOW) do (RETURN X)) BROWSERWINDOWS]) ) (DECLARE%: DONTCOPY @@ -457,41 +505,49 @@ Copyright (c) 1983-1984, 1987-1988, 1990, 1993-1994 by Venue & Xerox Corporation ) ) -(RPAQQ BROWSERBOXING NIL) +(RPAQ? BROWSER T) -(RPAQQ BROWSERFORMAT NIL) +(RPAQ? BROWSERBOXING ) -(RPAQQ BROWSERWINDOWS NIL) +(RPAQ? BROWSERFORMAT ) -(RPAQQ NODESELECTIONWINDOW NIL) +(RPAQ? BROWSERWINDOWS ) -(RPAQQ PFWINDOW NIL) +(RPAQ? NODESELECTIONWINDOW ) -(RPAQQ BROWSER.DESCRIBE.WINDOW NIL) +(RPAQ? PFWINDOW ) -(RPAQQ BrowserPPWindowWidth 750) +(RPAQ? BROWSER.DESCRIBE.WINDOW ) -(RPAQQ BROWSERFONT (GACHA 8)) +(RPAQ? BrowserPPWindowWidth 750) -(MOVD? 'MSPATHS 'OLDMSPATHS) +(RPAQ? BROWSERMAX 10) + +(RPAQ? BROWSERFONT '(GACHA 8)) (MOVD? 'NILL 'MODERNWINDOW) -[PROG [(WC (FILEPKGTYPE 'FNS 'WHENCHANGED] - (OR (MEMB 'BROWSER.WHENFNSCHANGED WC) - (FILEPKGTYPE 'FNS 'WHENCHANGED (CONS 'BROWSER.WHENFNSCHANGED WC] +(RPAQQ BROWSER.BORDERS + ((NORMAL "Normal" 2 -1) + (GHOST "Shown elsewhere" 2 8840) + (RECURSIVEGHOST "End of recursive chain" 2 0 -1) + (MERGED "Includes other branches" 4 42405) + (SELFRECURSIVE "Includes self-recursive calls" 2 61375) + (RECURSIVE "Head of recursive chain" 4 28086) + (ENDOFLINE "exceeded depth limit" 6 64510))) +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS BROWSER.BORDERS BROWSERWINDOWS) +) (DECLARE%: DONTEVAL@LOAD DOCOPY -(SELECTQ (SYSTEMTYPE) - (D (BROWSER T)) - NIL) +(BROWSER T) ) -(PUTPROPS BROWSER COPYRIGHT ("Venue & Xerox Corporation" 1983 1984 1987 1988 1990 1993 1994)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2054 25148 (NUMSPATHS 2064 . 5246) (BROWSER 5248 . 5511) (BROWSER.WHENFNSCHANGED 5513 - . 7812) (BRPATHS1 7814 . 10080) (BROWSER.LEFTFN 10082 . 10940) (GET.BROWSE.PP.WINDOW 10942 . 11767) ( -GET.BROWSE.DESCRIBE.WINDOW 11769 . 12517) (BROWSEPP 12519 . 13393) (PPREPAINTFN 13395 . 16529) ( -PPRESHAPEFN 16531 . 16711) (DESCRIBEREPAINTFN 16713 . 17409) (BROWSERDESCRIBE 17411 . 18169) ( -BROWSER.MIDDLEFN 18171 . 19478) (DEDITPROCESSRUNNINGP 19480 . 19751) (REDRAWBROWSEGRAPH 19753 . 20516) - (STBROWSER 20518 . 25146))))) + (FILEMAP (NIL (2085 28437 (MSPATHS.DISPATCH 2095 . 2569) (NUMSPATHS 2571 . 6158) (BROWSER 6160 . 6731) + (BROWSER.WHENFNSCHANGED 6733 . 8518) (BRPATHS1 8520 . 11171) (BROWSER.LEFTFN 11173 . 14599) ( +GET.BROWSE.PP.WINDOW 14601 . 15426) (GET.BROWSE.DESCRIBE.WINDOW 15428 . 16176) (BROWSEPP 16178 . 17052 +) (PPREPAINTFN 17054 . 20180) (PPRESHAPEFN 20182 . 20358) (DESCRIBEREPAINTFN 20360 . 21064) ( +BROWSERDESCRIBE 21066 . 21808) (BROWSER.MIDDLEFN 21810 . 23125) (DEDITPROCESSRUNNINGP 23127 . 23382) ( +REDRAWBROWSEGRAPH 23384 . 24148) (STBROWSER 24150 . 28435))))) STOP diff --git a/library/BROWSER.LCOM b/library/BROWSER.LCOM index bdffbde2d8c3c18010fc0938d72a78ae3e4488ad..d242ec04bdc320e7ed213a4b192568bc39cf1a72 100644 GIT binary patch literal 12328 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

-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 Gr~VhCV}>OF diff --git a/library/BROWSER.TEDIT b/library/BROWSER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a9d492a71f85eeaae06961580fd6660cbebbd1cb GIT binary patch literal 47646 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 Date: Mon, 3 Jul 2023 12:43:19 -0700 Subject: [PATCH 09/25] Add .tedit files which correspond to Medley release notes (#1124) --- docs/ReleaseNote/APPENDIXA-THEEXEC.TEDIT | Bin 0 -> 96099 bytes docs/ReleaseNote/APPENDIXB-SEDIT.TEDIT | Bin 0 -> 78968 bytes docs/ReleaseNote/APPENDIXC-ICONW.TEDIT | Bin 0 -> 15452 bytes docs/ReleaseNote/APPENDIXD-FREEMENU.TEDIT | Bin 0 -> 81150 bytes docs/ReleaseNote/APPENDIXE-ERRSYS.TEDIT | 148 ++++++++++++++++++ docs/ReleaseNote/ENVOSCOVERSHEET.TEDIT | Bin 0 -> 5503 bytes docs/ReleaseNote/Indexfinal.tedit | 138 ++++++++++++++++ docs/ReleaseNote/LOT.tedit | Bin 0 -> 3368 bytes docs/ReleaseNote/PREFACE.TEDIT | Bin 0 -> 10616 bytes docs/ReleaseNote/PRINTINGSPEC.TEDIT | Bin 0 -> 1634 bytes docs/ReleaseNote/SEC1-INTRODUCTION.TEDIT | Bin 0 -> 7019 bytes .../ReleaseNote/SEC2-NOTES-AND-CAUTIONS.TEDIT | Bin 0 -> 15016 bytes docs/ReleaseNote/SEC3-IRMFEATURES-I.TEDIT | Bin 0 -> 25426 bytes docs/ReleaseNote/SEC3-IRMFEATURES-II.TEDIT | Bin 0 -> 134052 bytes docs/ReleaseNote/SEC3-IRMFEATURES-III.TEDIT | Bin 0 -> 55722 bytes docs/ReleaseNote/SEC4-IRMERRATA.TEDIT | Bin 0 -> 133384 bytes docs/ReleaseNote/SEC5-LIBRARY-MODULES.TEDIT | Bin 0 -> 24785 bytes docs/ReleaseNote/SEC6-USERS-GUIDES.TEDIT | Bin 0 -> 62245 bytes docs/ReleaseNote/SEC7-CLIMPLMNTN.TEDIT | Bin 0 -> 45410 bytes docs/ReleaseNote/TABS2L.SKETCH | Bin 0 -> 7568 bytes docs/ReleaseNote/TABSINFOP.SKETCH | 2 + docs/ReleaseNote/TABSLAYOUTL.SKETCH | Bin 0 -> 7652 bytes docs/ReleaseNote/TABSPEC.TEDIT | Bin 0 -> 3140 bytes docs/ReleaseNote/TOC.TEDIT | Bin 0 -> 34289 bytes docs/ReleaseNote/Tab-Replacements.tedit | Bin 0 -> 5396 bytes docs/ReleaseNote/Titlepage.tedit | Bin 0 -> 6183 bytes docs/ReleaseNote/bindercover.sketch | Bin 0 -> 4100 bytes docs/ReleaseNote/indexbase.tedit | 146 +++++++++++++++++ 28 files changed, 434 insertions(+) create mode 100644 docs/ReleaseNote/APPENDIXA-THEEXEC.TEDIT create mode 100644 docs/ReleaseNote/APPENDIXB-SEDIT.TEDIT create mode 100644 docs/ReleaseNote/APPENDIXC-ICONW.TEDIT create mode 100644 docs/ReleaseNote/APPENDIXD-FREEMENU.TEDIT create mode 100644 docs/ReleaseNote/APPENDIXE-ERRSYS.TEDIT create mode 100644 docs/ReleaseNote/ENVOSCOVERSHEET.TEDIT create mode 100644 docs/ReleaseNote/Indexfinal.tedit create mode 100644 docs/ReleaseNote/LOT.tedit create mode 100644 docs/ReleaseNote/PREFACE.TEDIT create mode 100644 docs/ReleaseNote/PRINTINGSPEC.TEDIT create mode 100644 docs/ReleaseNote/SEC1-INTRODUCTION.TEDIT create mode 100644 docs/ReleaseNote/SEC2-NOTES-AND-CAUTIONS.TEDIT create mode 100644 docs/ReleaseNote/SEC3-IRMFEATURES-I.TEDIT create mode 100644 docs/ReleaseNote/SEC3-IRMFEATURES-II.TEDIT create mode 100644 docs/ReleaseNote/SEC3-IRMFEATURES-III.TEDIT create mode 100644 docs/ReleaseNote/SEC4-IRMERRATA.TEDIT create mode 100644 docs/ReleaseNote/SEC5-LIBRARY-MODULES.TEDIT create mode 100644 docs/ReleaseNote/SEC6-USERS-GUIDES.TEDIT create mode 100644 docs/ReleaseNote/SEC7-CLIMPLMNTN.TEDIT create mode 100644 docs/ReleaseNote/TABS2L.SKETCH create mode 100644 docs/ReleaseNote/TABSINFOP.SKETCH create mode 100644 docs/ReleaseNote/TABSLAYOUTL.SKETCH create mode 100644 docs/ReleaseNote/TABSPEC.TEDIT create mode 100644 docs/ReleaseNote/TOC.TEDIT create mode 100644 docs/ReleaseNote/Tab-Replacements.tedit create mode 100644 docs/ReleaseNote/Titlepage.tedit create mode 100644 docs/ReleaseNote/bindercover.sketch create mode 100644 docs/ReleaseNote/indexbase.tedit diff --git a/docs/ReleaseNote/APPENDIXA-THEEXEC.TEDIT b/docs/ReleaseNote/APPENDIXA-THEEXEC.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..07693336481ce9c8fea016613022946fd67e3ad8 GIT binary patch literal 96099 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 z zO+_^c0uV&a!G#a(8=xQ}V^r0H2wQh=7P|(wu(WA4uZ4Kr!>y8Wgs@^J${^_hlW*G2 z0@>HNG&g3jOWR;QQ-*B`dN@^SMC8VajTEndOlHF~hf3*EdL~9kci_Hc3P}7k_b%S) z3de_NNlT%8-HbDM(g9d40UqvqX~sq#eq=vXU--DU-#XmrjN{l7-l2ihJBDvkP5hTC zlT=86+}_4>UZDaYm`1n`rJSye!D+~d3&BO>^?wjq=mlI6%IgR*2}l?Q=NT~x2!>Eb zEN{9h4-Q;oJlv|nY_>Jcl=R%^TbM1uM)`$%Nb6^=G~627L1rum={vpsX%tyhTRu{e z>D{s98SsH#uS*jL;U}hcaO@*44qkv=Z56%VSbHNk5{h%f$Ymaxu^4f+&9rLtnP+<= zqJjNQX6{;2llhMbU6Bgb7ghiVNVpLn%YTAK;SMyFu)H6f7VH}iPR@LNwlTDTO*|ts z(8;(Jm_Uidm=R6GzF}2J18IS`+PYqo3=F#+E^)TD9GbL(=))Sh>s3~nfr}gq2;A8z3#=?|W9tbXr z8Y}Z)7hVAZp0l^a5r7h3+G#6Z8A2UEK{F?o$xZQ+J6@fGAYXiE?*?^VW;~x)0nmyN zV|hzBUGX3z4>?0nOL*@*{R#1?0eK9RVkF%B#|`goo+>N&;s^qFv&3?x8dR6?`l*Wx zc`k)3SaM(!^K7>^u{(y$KAoSiC6d^r#6q-4e)^~lQ$d^>OGcEL=t{}hB)?z=Q;B6r zVDv9#LPp~*68sLFM!{!A+K4OJbyRIaDkS$v%GuMKJg)i)$sBytbMKC?=fuuElvp3B zg$b16RD2urM5qq#89C==GS17>V3(JTdEA~BiDjoGO$8`{UJJ41>%^B@@iOZEsphHz ztgTxV^Bo9am2C!LMT)8Eb^UYdj&mR3x`f5t9E%5UB}s%9+d*{lkgpY_GMtojdaRU#7p$KRBEYZ1Uki*T2{bivSP{OaX?*|9qq!EGi0Z z9>4~s6#}1yZ(dpl?C&1}`(;)PvwEpb z9RcPcGaOU37+8eFQnrz$1+oI-L*{m$&R=EW%cUvKT7erQ8n<%fB}wUWqK0}91gSK_ ziuok)e2{;|oM=L2mD~)ILL_7d2HoDW!MtaAyScXoUnV>N@c`XT_+yEA5<@`6>1Jv$ zpaBEr0z}!{pYl41ZQws`9@=H0I$avKWC>;+y<;yH2GbiV!1b-|&TXtvEl<|`TnkIE zs@z_U91f2Zg2xW@CHGxfGdP27!BW$C25#?ygE&n7n4DkC7F6b8lKi|%9G~XpxTe>I z+jSg2gaj*Zz;Y>o+fCRFlj;CoqQ*kUR#HjuZS7dZ4IKJexe2=C5D)$yG{;$B>Ln^Y z4{x1Jt7Q!Pw!p#5^=r$u#Tkkrx>bUQ596W?bYMvZsets_NfdY#SjFLD1o$OY8`jUW z!(^IUh7s&6s@!~{B&~mp4+v(GeG~5%IGmW@Y~P_6i=zV)?UOav*IQVJ`H_G4#9O-I z9XMB@T)fB2SD4P{BD~YwLfrchoS)dzTls9Qm`s_ZTD~?Z0i7*93@-RUoDNk>F_0-? zGp@wbx2qT7=+Mr?0HwcDd8CoeQ`x1v2fgETK$WJ3LMe z2Z%f)BwT+C-B{bdIdl<@DwvJ-7}UU!yU2}?2nbBv4RPkpv>XT*_o&)`+iRA)dJS%>?!2w3LGh zzQUbk_lh$_|-Lv}a5c2hpm zjc?qH7>HG)$xlF8b-Gy|mj}OAb?MNJ=W|%BBZ022vm4n>WDH2Q>1K|vaRuEv81*$C zS06p0Dc6S#@+p=D#}j2~(U+cL^rQe0bt%4D2o}(?W#LyMV9&Qm&?rd%L3FCj@|RRn zmGB1l@lcKJ{c-GKuWNzgmxB~j%13H=b($7{vq=TMjN8*&UIRu@%!v020ZkLpLs>LrRsFg8Qvz zcm0;XCm*hs-1PSAM z_vTQnKui{BDJ>pb^x5DofG-hBM+Aw&Vj)#)fy`rPSJ4f^ ztl_AkwDbbj+|)^umu?QtaMeGug!PzA33BCZWMK>&yLeTB1yYLWwNM%WUxUX1ea~l7 zPc(g4vPGoFB;4XWifR+@jhomYfOi1@&LcuD1@xa_6PQy0zgGdAd|cqd$W;u2Cowdy z7z@~P$AKE2b_|B$EhX4DfqN%44gZfXL+Nbr?OZ4;_=wFl8Hh_zqPU&ZChAmn8y;f_ z1F;jE1j(IP7@icsxv_f*CLp?_ktlUR6u|&2Bj{pIYQdFEoGr729))yL3|u{t~5Z3 zN#};~y_;$2T-ew#)s6_SF@6vq2w`7|S^3el2d1@%W1J{J*x5Zu`FzHdCBUu@2Fwr( zl(O64BtrrA!*Sa!Wf{zpLgKjc7uSfvx-@rNBv#olEQ9l~G{w3QrU)Dqa85(6p-ywy zC8Inzs(PS^1(^VWw>F}2au8_zGX9<3`7&Ue0zF7=+3N|lzC+MnM_N<+gAT73-^B(X zErjpOXfui$x-fFzsyPQ6KrJ9|3%)(W;~)$aJGw(?l9tAY1M`5vkax`&R&96^9FT0Z zY9a3e2=Cg8kng8K#IZ02*lCfb&v#rC^Q_{WI-}+8TVYuQVO_jQXuz7ji(A~AeKWhU zTdH6}Pl1>=CgajtPCaDO!u)nA3f4tlV0U*CKD!SRc@E}&z$!pKi3L8iGb}(lF16HN zM!So*DsrWU9kBGqSD?=CLQ6oasbrX`Fl$scm=QkfBO?x!faVp!vpjSH}#hs@v^Clt`; zmwAC>LR-uiV8`STcTV~VIGx8FIlW(nZuEUO*ASA=g!iMjz^`&`@l^z(LOak`BE@0j zEgnGMR};X(ZF#(=KlW!xcB>_V?qP;3b5lQfQ;Xz(CoFg&AgexymJ#ekJMmE1XG z*j_Wq-0qaP9EE@`I)x`B2Luo{QAm9RV)G;dC5zP%P2f+HevsW~`J zKm!||F8J$(#nvjCJ^7VeSL8CF2%r>P1g@mCzzt`McVFSlF1pt}SYmhFmtI=$q|7*I zLY`v{%>*UI%ht5FtNDSr{vtq5oZ3NAMc>ZW+ncC`5E^2{fyo;oIpZ_NRW<}I0jLdJ z0wE&1(%3s$1GKB*H4*RgodNTgs>Lryow%4f-+zjXoUTK-cDsyW)YpDO4`N4e!=UrV zt3pl}mm|1;j#C(5(n~_BROZ#oOIMd`EA>T6T($U(3H5wy1DT+ly)}gpa?d^F0j_9D zia|!j@G_bp8`(zkU=F_M&%Iz=Tch2b!eVzUnE>0~M1Xk{TuXf+p-OH^;_p}&m)hgX zlS8D=z!oYC#dg(UNhH8X^wh>p0}`4#gL$|s6oahPm$u6@iA@1$74!`v z#F7aoP3^!&+A^>$GT_yeiCv%xgmOh}-YC#RbkmhUd|@2^1A4S5XwJuSpaKw|jPxqu zh&dr(4P^~0FP7WtbT)*0rZ4IxY5+qaQSgLbFoyk0W6P2HO!dy4=SN3uXT-RYI-ij1 z$iLYgFb7;JL<(})BKBJ{iL%^59I+2@WzEZ1q`K_)Jq7nC(ty;&a7$m^6H>S_iSD>Cz+n#tW@ahWc<&x;Mskj&jbZ$S zc{rS80XAA5<2sdTfo6tLH(UBMy^L7);B@yCk+Tk!jO|>fLf&Lgbe|BN+032dS zJtR49QdLTSy*ZqID*XABUBOkw``a(o?Hs`}5{OrHiR3)u15hHfOY?I}bBnV}$g^Fk zU7VZFYU88XYNNKoqZn-X9B%W# znM~;|qZzjwQ}OB*4m!OuhpRcx;#kM~bE|W>lms{D&StCidE7&^3=kUnj)PMT6yOk{ zp7OfO$+OvPZD9_tPsXK@^_9g8=@cvTbBn2i#>(8gb=<_O21p+$JkvhrDsSV#?KD^B zaRhO79=A2cx2ts~l4T3nWyf7mde@DQOqLK@xc|1=xDIf+#iqlvHK3-9FrZ}WHC!$E zN;dWS>)AP60jkQ?%eb`zXf#BnFFYrNZkCAO6*PS1d^Yu3_R1^8c8&TqJNd%VS%d$d zJ)gZch1ValYu=*uuvA5p2d5%aMgIRsM4c9Fr zmRbKwsQ*_o{P;3_B>h*Q-yWC#qodOBKTsK~oU44Z^34<9sZ>#N@>5S$Dkmy`sD}gp zoM@n!O}>pLKbV?)_C)2|18b{LOu2_0@0w zeLRhzl9MO%2l1)U0F_Ui^ckGQq>uPf6Yp8D->>pmVWO2|Dsw=e->3Nn^Xva9fIL;yd>NtK8(|gEX0C_obQSqx=x9Qeyqe zP^h}%w9@BtFQ9h;)^aZ)Favt2vkb6smM1=SOfOF-ll%UCJ0WR~n2>j}GN2P@9C7Y_ z7-xVqeY0}n)_`6MMX&O60qvhXS_BJh=dFI2t-%rx*6NMQyOp29SegtO=~IHX;$j@pPn)J6|B9D!u32hc8sv0VH#wfl+RIYNXX91jm58jgg|vgyMh!2x5t z2ha=Oto&JF?qKCVQ^O6#gnT#A$Jm#IHPlbti6X%ZyXyOq40DHR+L|#_|59HMZ z68`bJ*6$$w-Cy^9wv8>^o;a)%148Lo~nGN@?(`D zT%7iPy)idkt2}M02m0qnE2nJThcf@k%RU|T{#xY+F4eH=tjHRxW^WOC`|Fjb{cg2F z#k@bUKB!q5_ml6kJItj7Vm?mZ{L@i2FMGzIE_M0o%BNV`Q>Ka-CU2X@7*r3H^LpZ1 z^=I8atIkhUe(3VbmHGO_CAK3QSI34Zp1&)_q>f`{*k4PP$y z#2){8Z^0vV&DoZEV!?y<1YG8`8^dP_7@=h!eFeiP{x|rH62=-N=W%1@9F)5Dh8*Wj z_CZ7ly#!mM^V>Om{NcHU3EbjZzh)FeY2`oRpHhoI^Af_rb-;=je2yOou$W6jq$>ZV zS4nM7{QaJS%75quL;OI~P+Gzh3u4aVD+i8Ggl*Nw+)7o&uMbxBJRv!E>5jOIQ^*30Bb&tkZ z-#};Bh64pTU-Ob7eqeWkv{Xkhu;gf90`Q}OQDb!uh>5;`3%`LE3T900`Qj7WFHz0g zvY>Bfzt1LpFao(JukwkL9R(-eC>ET?7j-Pn0LVD@aXOziK~?ZaQ}Tw-q2RybBOhx7 zpC!pGcmmKTqh68@k6@y(N^;rNDVPjP-9?Yp~o8&w$F1M2Zdts91EPgpU3A%5{oaOp?c+? zmj}}Igb?RLlLJLxPP{Z{LMiv$s{(`O*|XsE;J*I?k78Ocp#Fb~de2;3Si1O==6Ria zAZM8f`D^To2oY57Mm{oTh~MD&=lY=^0GD_nIOE%d$8o{lzU&36NBY0qS3;br(GT(i z8KuOO#4*?GszNaqLkG`m=4_-9IJUasP-FO2tEeLku}<_8tz4MKy-|OaAbm87l92I` z=nuRfb_^;TS~&JxKVn(;Z}JbHvjK6U&RG!P_fJ~JvQ$U5y;Kr2ihgA0SVx2-@&f*# zfj+R#U~q`vFASc@0oz3HtoRdNBE+#IFxc1ofKHEMyTJaJynksA&WF4=7@0$SLJ(r^ z)xpzvi4|iS>@>J1n*MFC(>IL=lOD}LjK=;qytnB8Kl2jyPX-B=7N4<^x}duH4X;~% zL^Bx1ssE8E%s>5)p7#zz629Oi{gr>*A4TP(`FX(F?kE!XLmrkgV7Tc+hv2{HB|;>L zEnk?^3}nka(Cm}A1xr2{=~O-X4`BLH6kJnwNI10SLhuAt5tuKbP|Oz+GwvnMYBEv5 z0VOhv$4igYH%ID!6!Z3uSxsY?>vFvJ{E{S6``agjI0wSF_~z^F=@y&rZ9y9 zGTtLu_UF*>_wk!U&wfkD9YsOR>%S@0CBi~8Mx7I0Cx8!v#+1dSL~(GS@a+W6@Z=$w zDtJC%2%aZis7#N;j`#v~_!Gdh38!9VDdCE~V>ZE_nb%<>68e!wV=oUO=)o)j*pr*I zJVs7B2)2qZWi*7_^VpLf={F}wX}5q!A3|Wsv;%q}%;IG}7n86>lngMOY!PfLER@E0 zau}BSBZdVH2MLjg62%8gtQSs4)ah^aJmB1zfr@g+tTX1VLb#%i zWQ27-@;W}0`iohyN-$?AumJsw-a1rcpm&0g*gSly7<0y3ML*j0C{DNx1*gC0jYLv* z97qv>EQ!G*rcu)K#AJWR8n!gyU-O|JODs6ryTzU|e0hom1U05EtWbUF1LveitfR^- zIi^m(NIXcZ{yIVw#|qI2QyW<2!$(%c^o-PH3DvtO6=Ta==A^?IIYUZGmKyy}-Y772 z+e<`Db`wAc*M*opRLPHd&-xHl(Kx-r8Q^@)8wEJwDIPO;i1aaa&U??t)CsW_b7VxxR$s}8mnf|9psX9Mjsf{?@A;TI4?+sfxI|>>2=O*V;68$_YMfRK z75o(3LkvEa&lNMw`uz}MA)bc@3Jn;pAc1&f?N%}^(Rb*9C<(ef_LK*BK1X?6A{R*@ zG>{;&nA8eSZuV!YY=AF+ z6n_TILOQi9BY%eT7$r|`uJTzq*Xa8t=iw;X@sh`uSBV7~^N7e>%v4s5b7y5ql=S42 zmDYgft3F5!TNY#j@iSg00QuNUqE*vNqURvyW25dNSSbu`pfl7_nCHh<^jCeZG1`ci zkV+!lf|tnb5sObwMF{Eaa`0YDZtYaDr0<^`5(2>?y)XKdADiIO#}CLCoig;k;;s2V)>KdSA&{UrCs3&W*uV0bZK^k~fOk1~}m>>QSjx#Cn3+ zr7~EDLp^fzhv>M?KG;)uc>lhauUIt)`lBs{VVa86~{c9z!1C zLOi)41GzEefE*-F?a2&D{T|!AL9}TOP$K@zUh-IEJdIwo8SGxm^C&pZYmw<=75oSx z-tajT{02*%&KW+x(C@4qwR)97r(}e5JQlMMjr`wpGPkN+>G(EHz~nLRo2%m5*j=ShjzLqtQ7dSY#GKKZ0n z9B5`GSm2xt@p@!;i+Ur>mKL+Pf_`Jb9(TaTuqF~;rLs;qFM^dKr z4LkmKyit_=eJ=?<{ber+aKcNAITAFXlJ4712kpwE0VfQ?XUB;#}9TP!22u|&x7z8;xnsMpz>{-`(p37QjO0+Q6# z_?eBu!0U*=Sga2YKB0KWtB5;UB^WNaKp)sBN^W?ouobU+NdPF= zOW^#wUME^f5*!>3{0*<7ZG3|BB`*mQly>+>@K{gSOU&VCy%DDa1z-oHg%=c%7nLYi zEYR*nu^=YPKG@`Kc3P~_*GG5&Y(nft2uet0+n;17gf$l4*S#bL3<|KD(gdSQpfWnv z+}Uwxmq=|px|^^0*wN@e@)FUJ5SO5NWF0`p`-k2)J7vK;#RASPu;Vp?`d$#LO)m(> zV*v$6h?SV4;CU20k~2uj|Bvx&x&nQWoWZXBj27tnr^QBOD(P#7=Oq+85!@UE+OpH5`o56 zx4a~TOp3!nzn@469?lUzqMg9OcQSj4xt>SCBQe)=Xc!5#Z()?4jb=QqT;(6a>@%%2 zyo94>_!4*@u-IT-K~Id7c`-^HBag*`ax~bJWRxHU3kKu@v{Yvv^~$pge&FoxMp+5{^#alSgTz84euh=-!TgBJCpfO%pu2pbz@sdPjkLp@E=9)xJ)oUW)+8 zx$o(S$Nv2Y#udu+;l;N`o#3pAz^8vP1 zI)Gvr0-z6UF@)df>yc4T5T(KiRfxm5_Z=GGi(Vq*!0|IL2~G;T5hcRA&zD2V%W@R4 zV3NIf!6Vy<%sXLEqk~Zyh!evHPT4}^JD87!${N)VCb5`Q? zkD_DMVM)~a0=@|3uyoO3h<22yL!u|fA~=u5Sp`cpP@6qDIpef7(-^X!p+ecllw;MW z5<(-lg?J8UE20L0pBO7z)qV6}F}Wk`C)jY>>jb^}8R4IK9cKj9Wj8S``mCC$3^zgU z@8(^v6RrBWIV30QgvpMQAWuKY3BVKoz=vYNX?&5+R}Uz7Uf>;_7NjB53ic{1id7f@(WoK{e(b8 zi8zOK!ikWtz>;9Rm_d~Av1S=1LB$aH&^J*co-Dz$=>0eqf3jFWDiZ&(zItRTX6WSq z*H(DD@-5$C7ZwqE5(Q)cL<_JDU}|svrvY$w+XbZ*b|PqpcVcB8oqQ zh)q5v2_#$(*}+Y_;EuLrl@kZB5V5w95Mj7* zacPCDf`qI`9JLZw`m%l@CRxW(awze<2qLN7B=TJPviq(_w8hGq67p5Zz}&RLCz;s` z5tJ?l0%4R~yE1$(WSl4=rvt$b;R7*KZEgb6IyJIJJy7@Lgj7k+Q&_DR)9+fQ<Yb9MQ{H2PS!9tEl{h~-bo_EllNa;}LQc2qAPT6%=3-1lCp~Y< znp6LBn`tebjdh5=76?Q?4a5gVu3rhnNfPp6gU|;irEQVy(j+?1qYk7TeO)BP1_XW} z1VpqZg_Z{aSyIa)VAsSW(pRi-=Y@{xi1IU`!;4b761~>(&+WRFrOn&+uf9vAiJ z92N-OlRSeU%ws4rPC#T{F}H}(RD7EHoz@(11>}I!n*(#GY+%C~$a(moB?o++=YU_( z*jGIwf)*c~BG+$?_iSweoDJ8r)|Pn)c& z?zsJuOU~C}Z^QlGtY~3Yjo?nYLK*F7eZEg*+lY3eXt|yq74<^q*FeP6UR@7l@_{|9 zuytz6p<}-IFnK+sO=On?>u=;P_bp3YLmo(^#XLz=5%x7vSVo4S!orf_l6Urn?4&Q} z0_5>Pw7d$8*1eZFf21XAOl_yWJG4`$?Ql0!VITxWQJqxAPlr2f!fXg~He|HhcKTo* zL`5!;6XNY#E#f34KauAEZ?$QLMeCD}C!$=(6`KQ4q1K_o4d|s@iI*(l5c^n1xyDL} zpyQQMkv=(}|M57v3UYD{TL$lboFjz<7DwA$*myoD;{s$APgIYEs zjrop{XE_Ct66B>BC3q<t0fk|dFyn_DnRzpmkohYR@zW{e zzJSe%5NQ$2v_9Nvw0KK^=e&2p&OeP7PO$rZ5bQ7*H(|#Nlu`O3Ht#FFdbkL7*$Kkz zw3nMv)XxWi5@v`NBj++zgHK{~iJfG@xtpcdA$Xx})}p!}e1i*jI}WJcT%dsrUk4&3 zjUjFbY9%9Af@B>ytxG}WbHB^UO!JD@x#Ui&NWG-_MTK%|J)hg5Wdk)iEKZa*?fx?ePTK2RqpF2Oa za^NEqlOBk#1sVA{>EQ&hw$lEt1{7Rdf%CV4gx!G$*g%r8 zrB>M84*(GcV;=~S;o^WEM_Oidh>JT;d?}RJr~q`_*91n5%6PJ~|M!EtU*7&7^;ZoZ literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/APPENDIXB-SEDIT.TEDIT b/docs/ReleaseNote/APPENDIXB-SEDIT.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a4496af2277e45f4d3d44c6b4e95de2f5d03d67b GIT binary patch literal 78968 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 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/APPENDIXD-FREEMENU.TEDIT b/docs/ReleaseNote/APPENDIXD-FREEMENU.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..ed50cc0926a1aadfc07cf70f5f69ae9dd6d2f800 GIT binary patch literal 81150 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 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/APPENDIXE-ERRSYS.TEDIT b/docs/ReleaseNote/APPENDIXE-ERRSYS.TEDIT new file mode 100644 index 00000000..b695b9fa --- /dev/null +++ b/docs/ReleaseNote/APPENDIXE-ERRSYS.TEDIT @@ -0,0 +1,148 @@ +1 LISP RELEASE NOTES, MEDLEY RELEASE, ERROR SYSTEM 1 LISP RELEASE NOTES, MEDLEY RELEASE, ERROR SYSTEM APPENDIX E - ERROR SYSTEM 1 APPENDIX E - ERROR SYSTEM 1 APPENDIX E. ERROR SYSTEM 6 This appendix replaces Chapter 24, Error System, of Common Lisp Implementation Notes, Lyric Release, which replaced most of Chapter 24, Errors, of Common Lisp, the Language. Text shown with StrikeThru is that text from the Lyric release that no longer applies in Medley. Enhancements added in Medley are indicated with revision bars in the right margin. The XCL error system has been updated to reflect the current ANSI Common Lisp error system proposal. This version seems to be gaining wide use in other Common Lisp implementations, so no further major changes are anticipated. The Common Lisp error system is based on proposal number 18 for the Common Lisp error system. Deviations from this proposal are noted. Since the Common Lisp error system has not yet been standardized, this system may change in future releases to accommodate the final version of the Common Lisp error system. If you have access to the ARPANet, a copy of this (ERROR% SYSTEM% PROPOSAL NIL Error% system% proposal NIL (E) 1)proposal may be retrieved from MIT-AI.ARPA as the file "COMMON;COND18 TXT". All symbols(SYMBOLS NIL Symbols NIL (E) 1 SUBNAME IN% ERROR% SYSTEM% SUBTEXT in% Error% system% ) described in the error system proposal that are not already in the "LISP" package are exported from the "CONDITIONS" package. In addition, the "XEROX-COMMON-LISP" package exports these symbols, so you can make them available either by using "XCL" or using "CONDITIONS", whichever is appropriate to your application. The distinction is made so that XCL extensions of the Common Lisp error system will be clear. All unqualified symbols are assumed to be in the "LISP" package. 2 Summary of Error System Changes 1 The semantics of HANDLER-BIND where multiple bindings are set up or mutiple condition types are being handled are slightly (ERROR% SYSTEM% NIL Error% system NIL (E) 1 SUBNAME DIFFERENCES% BETWEEN% OLD% AND% NEW% % SUBTEXT differences% between% old% and% new% )different. Old code that used this will probably not behave as expected. HANDLER-BIND and HANDLER-CASE (a.k.a. CONDITION-CASE) now always take a typespec instead of a list of condition types to indicate the conditions to be handled. Old code that uses this will only handle the first condition type in the list. The function, CONDITIONS::CONVERT-HANDLER-CASE is provided to aid in converting old code(CONVERTING% OLD% CODE NIL Converting% old% code NIL (E) 1 SUBNAME FOR% USE% WITH% NEW% ERROR% SYSTEM% SUBTEXT for% use% with% new% Error% system% ). It may be used as a mutation function in SEdit. HANDLER-CASE now supports a :NO-ERROR option that is executed if none of the other clauses are taken. This is handy for writing code that depends on the normal completion of some operation, for example, creating auxilliary files if a particular stream is successfully opened. SERIOUS-CONDITION no longer forces entry to the debugger. The function used to signal the condition now determines what happens if the condition is not handled. This means that SERIOUS-CONDITION has no more interesting properties and is likely to be removed in the final version of the error standard. Several new condition types have been defined. Others have moved in the hierarchy. For example, ILLEGAL-GO is now a subtype of PROGRAM-ERROR. No standard condition type has a default handler. The standard debugger entry point is now called INVOKE-DEBUGGER instead of DEBUG. The syntax of DEFINE-CONDITION has been changed to make it more like CLOS' DEFCLASS. The function CONDITIONS::CONVERT-OLD-DEFINE-CONDITION is provided to aid in converting old code. It may be used as a mutation function in SEdit. Several DEFINE-CONDITION options have been merged, while others have been removed. In particular, there are no more "instant variables." PROCEED-CASE has been replaced by RESTART-CASE. The semantics of restarts have been cleaned up and several new features added. Related functions, such as COMPUTE-PROCEED-CASES, have been renamed appropriately. INVOKE-PROCEED-CASE has been renamed to INVOKE-RESTART. DEFINE-PROCEED-FUNCTION has been removed, although XCL will continue to support it for compatibility. The arguments to a restart's report function are different. Old code that used something other than a string for the report method will not work correctly. A distinction is now made between invoking a restart interactively and simply invoking one. To this end, there is the function INVOKE-RESTART-INTERACTIVELY and the :INTERACTIVE option to RESTART-CASE. RESTART-BIND, in analogy to HANDLER-BIND, has been added. A new variable, *BREAK-ON-SIGNALS* exists to aid in debugging. It is a generalization of *BREAK-ON-WARNINGS*. The latter has been retained for compatibility. The proceed function PROCEED has been changed to CONTINUE. Old compiled code will continue to work except in the following cases, some of which have been mentioned above: A proceed case's report function was not a simple string. Such code can cause stack overflow trying to report the condition (*STANDARD-OUTPUT* ends up being bound to NIL). Such code should be rewritten. A handler binding is made to a list of condition types. Only the first type in the list will be handled. Multiple handler bindings were created by the same HANDLER-BIND or HANDLER-CASE. Such code will work as expected, but if recompiled in Medley, will not. To get the effect of the current semantics, you must use nested HANDLER-BINDs. Under the new error system, use-value and store-value no longer prompt for a value. 2 Introduction to Error System Terminology 1 (CONDITION NIL condition NIL (E) 3)condition A condition is a kind of object which is created when an exceptional situation arises in order to represent the relevant features of that situation. (SIGNALLING% CONDITIONS NIL Signalling% conditions NIL (E) 3)signal, (HANDLING% CONDITIONS% NIL Handling% conditions% NIL (E) 3)handlers Once a condition is created, it is common to signal it. When a condition is signaled, a set of handlers are tried in some pre-defined order until one decides to handle the condition or until no more handlers are found. A condition is said to have been handled if a handler performs a non-local transfer of control to exit the signalling process. (RESTARTING% COMPUTATIONS NIL Restarting% computations NIL (E) 3)restart Although such transfers of control may be done directly using traditional Lisp mechanisms such as catch and throw, block and return, or tagbody and go, the condition system also provides a more structured way to restart a computation. Among other things, the use of these structured primitives for restarting allows a better and more integrated relationship between the user program and the interactive debugger. serious conditions It is not necessary that all conditions be handled. Some conditions are trivial enough that a failure to handle them may be disregarded. Others, which we will call serious conditions must be handled in order to assure correct program behavior. If a serious condition is signalled but no handler is found, the debugger will be entered so that the user may interactively specify how to proceed. errors(ERRORS NIL Errors NIL (E) 3 SUBNAME DEFINITION% OF% SUBTEXT definition% of% ) conditions which result from incorrect programs or data are called errors. Not all conditions are errors, however. Storage conditions are examples of conditions that are not errors. For example, the control stack may legitimately overflow without a program being in error. Even though a stack overflow is not necessarily a program error, it is serious enough to warrant entry to the debugger if the condition goes unhandled. Some types of conditions are predefined by the system. All types of conditions are subtypes of conditions:condition. That is, (typep c 'conditions:condition) is true if c is a condition. creating conditions(CREATING% CONDITIONS NIL Creating% conditions NIL (E) 4) The only standard way to define a new condition type is conditions:define-condition. The only standard way to instantiate a condition is conditions:make-condition. When a condition object is created, the most common operation to be performed upon it is to signal it (although there may be applications in which this does not happen, or does not happen immediately). When a condition is signaled, the system tries to locate the most appropriate handler for the condition and invoke that handler. Handlers are located according to the following rules: (BOUND% NIL bound% NIL (E) 4)bound ÿÿïfÿ Check for (LOCALLY% DEFINED% HANDLER% NIL Locally% defined% handler% NIL (E) 4)locally defined (ie, bound) handlers. ÿÿïfÿ If no appropriate bound handler is found, check first for the default handler of the signaled type and then of each of its superiors. (DECLINING% BY% CONDITION% HANDLER% NIL Declining% by% Condition% handler% NIL (E) 4)decline If an appropriate handler is found, the handler may decline by simply returning without performing a non-local transfer of control. In such cases, the search for an appropriate handler is picked up where it left off, as if the called handler had never been present. When a handler is running, the "handler binding stack" is popped back to just below the binding that caused that handler to be invoked. This is done to avoid infinite recursion in the case that a handler also signals a condition. conditions:handler-bind(CONDITIONS:HANDLER-BIND (Macro) conditions:handler-bind NIL (E) 4) When a condition is signaled, handlers are searched for in the dynamic environment of the signaller. Handlers can be (ESTABLISHING% HANDLERS% WITHIN% DYNAMIC% CONTEXT% NIL Establishing% handlers% within% dynamic% context NIL (E) 4)established within a dynamic context by use of conditions:handler-bind and other forms based on it. (HANDLER (Function) handler NIL (E) 4)handler A handler is a function of one argument, the condition to be handled. The handler may inspect the object (using primitives described in another section) to be sure it is interested in handling the condition. After inspecting the condition, the handler must take one of the following actions: ÿÿïfÿ It may decline to handle the condition by simply returning. When this happens, any returned values are ignored and the effect on the signaling process is the same as if the handler had not run. The next handler in line will be tried, or if no such handler exists, the default action for the given condition will be taken. A default handler may also decline, in which case the condition will go unhandled. What happens then depends on which function was used to signal the condition (xcl:signal, error, cerror, warn). ÿÿïfÿ It may perform some non-local transfer of control using go, return, throw, abort, or conditions:invoke-restart. ÿÿïf ÿIt may signal another condition. ÿÿïf ÿIt may invoke the debugger. conditions:restart-case(CONDITIONS:RESTART-CASE (Function) conditions:restart-case NIL (E) 5) When a condition is signalled, a facility is available for use by handlers to transfer control to an outer dynamic contour of the program. The form which creates contours that may be returned to is conditions:restart-case. Each contour is set up by a conditions:restart-case clause, and is called a restart. The function that transfers control to a (RESTARTING% CONDITIONS% NIL Restarting% conditions NIL (E) 5)restart is conditions:invoke-restart(CONDITIONS:INVOKE-RESTART (Function) conditions:invoke-restart NIL (E) 5). proceed function Also, control may be transferred along with parameters to a named xcl:proceed-case clause by invoking a proceed function of that name. Proceed functions are created with the macro xcl:define-proceed-function. restart type(RESTART% TYPE NIL Restart% type NIL (E) 5) A restart with a particular name is sometimes called a restart type. (REPORTING% A% CONDITION% OR% RESTART NIL Reporting% a% condition% or% restart NIL (E) 5)report In some cases, it may be useful to report a condition or a restart to a user or a log file of some sort. When the printer is invoked on a condition or proceed case and *print-escape* is nil, the report function for that object is invoked. In particular, this means that an expression like (princ condition) will invoke condition's report function. Because of this, no special function is provided for invoking the report function of a condition or a restart. 2 Program Interface to the Condition System 1 Defining and Creating Conditions 1 conditions:define-condition(CONDITIONS:DEFINE-CONDITION (Macro) conditions:define-condition NIL (E) 5) name (parent-type) [({slot}*) {option}*] [Macro] Defines a new condition type with the given name, making it a subtype of the given parent-type. Except as otherwise noted, the arguments are not evaluated. The valid options(OPTIONS NIL options NIL (E) 5) are: (:documentation doc-string) doc-string should be a string which describes the purpose of the condition type or NIL. If this option is omitted, NIL is assumed. (documentation name 'type) will retrieve this information. (:conc-name symbol-or-string) As in defstruct, this sets up automatic prefixing of the names of slot accessors. Also as in defstruct if no prefix is specified the default behavior for automatic prefixing is to use the name of the new type followed by a hyphen interned in the package which is current at the time that the conditions:define-condition is processed. :report-function expression expression should be a suitable argument to the function special form, e.g., a symbol or a lambda expression. It designates a function of two arguments, a condition and a stream, which prints the condition to the stream when *print-escape* is nil. The :report-function describes the condition in a human-sensible form. This item is somewhat different than a structure's :print-function in that it is only used if *print-escape* is nil. (:report exp) This option specifies the report function for this condition type. Report function are inherited, so if a particular condition type does not have one, the report function of its parent will be used. If exp is a string, it is a shorthand for (:report (lambda (condition stream) (declare (ignore conditions)) (princ exp stream))) If exp is not a string, (function exp) will be evaluated in the current lexical environment. This should return a function of two arguments, a condition and a stream. It will be called when a condition of this type is to be printed and *print-escape* is nil. The report function will be called with the condition to be reported and the stream to which the report is to be made. :handler-function expression expression should be a suitable argument to the function special form. It designates a function of one argument, a condition, which may handle that condition if no dynamically-bound handler did. (:handle exp) This option specifies a default handler for conditions of this type. (function exp) will be evaluated in the current lexical context. This should result in a function of one argument, a condition, to be used as the default handler for this condition type. Each slot is a defstruct slot-description. In addition to those specified, the slots of the parent-type are also available. No slot-options are allowed, only an optional default-value expression. Condition objects are immutable, i.e., all of their slots are automatically declared to be :read-only. conditions:make-condition(CONDITIONS:MAKE-CONDITION (Function) conditions:make-condition NIL (E) 6) will accept keywords with the same name as any of the slots, and will initialize the corresponding slots in conditions it creates. Accessors are created according to the same rules as used by defstruct. For example: (conditions:define-condition bad-food-color (food-lossage) (food color) (:report (lambda (c s) (format s "The food ~A was ~A" (bad-food-color-food c) (bad-food-color-color c))))) defines a condition of type bad-food-color which inherits from the food-lossage condition type. The new type has slots food and color so that conditions:make-condition will accept :food and :color keywords and accessors bad-food-color-food and bad-food-color-color will apply to objects of this type. The report function for a condition will be implicitly called any time a condition is printed with *print-escape* being nil. Hence, (princ condition) is a way to invoke the condition's report function. Here are some examples of defining condition types. This form defines a condition called machine-error which inherits from error: (conditions:define-condition machine-error (error) (machine-name) (:report (lambda (c s) (format s "There is a problem with ~A." (machine-error-machine-name c)))) ) The following defines a new error condition (a subtype of machine-error) for use when machines are not available: (conditions:define-condition machine-not-available-error (machine-error) (machine-name) (:report (lambda (c s) (format s "The machine ~A is not available." (machine-error-machine-name c)))) ) The following defines a still more specific condition, built upon machine-not-available-error, which provides a default for machine-name but which does not provide any new slots: (conditions:define-condition my-favorite-machine-not-available-error (machine-not-available-error) ((machine-name "Tesuji:AISDev"))) This gives the machine-name slot a default initialization. Since no :report clause was given, the information supplied in the definition of machine-not-available-error will be used if a condition of this type is printed while *print-escape* is nil. xcl:condition-reporter type(XCL:CONDITION-REPORTER% (Macro) xcl:condition-reporter NIL (E) 7) [Macro] Returns the object used to report conditions of the given type. This will be either a string, a function of two arguments (condition and stream) or nil if there is no report function. setf may be used with this form to change the report function for a condition type. xcl:condition-handler type(XCL:CONDITION-HANDLER (Macro) xcl:condition-handler NIL (E) 7) [Macro] Returns the default handler for conditions of the given type. This will be a function of one argument or nil if there is no default handler. setf may be used with this form to change the default handler for a condition type. conditions:make-condition type &rest slot-initializations(CONDITIONS:MAKE-CONDITION (Function) conditions:make-condition% NIL (E) 8) [Function] Calls the appropriate constructor function for the given type, passing along the given slot initializations to the constructor, and returning an instantiated condition. The slot-initializations are given in alternating keyword/value pairs. eg, (conditions:make-condition 'bad-food-color :food my-food :color my-color) This function is provided mainly for writing subroutines that manufacture a condition to be signaled. Since all of the condition signalling functions can take a type and slot-initializations, it is usually easier to call them directly. Signalling Conditions 1 xcl:*current-condition*(XCL:*CURRENT-CONDITION* (Variable) xcl:*current-condition* NIL (E) 8) [Variable] This variable is bound by condition-signalling forms (conditions:signal, error, cerror, and warn) to the condition being signaled. This is especially useful in restart filters. The top-level value of xcl:*current-condition* is nil. conditions:signal datum &rest arguments(CONDITIONS:SIGNAL% (Function) conditions:signal NIL (E) 8) [Function] Invokes the signal facility on a condition. If the condition is not handled, conditions:signal returns the condition object that was signaled. If datum is a condition then that condition is used directly. In this case, it is an error for arguments to be non-nil. If datum is a condition type, then the condition used is the result of doing (apply #'conditions:make-condition datum arguments) If datum is a string, then the condition used is the result of doing (conditions:make-condition 'conditions:simple-condition :format-string datum :format-arguments arguments). If the condition is of type xcl:serious-condition, then xcl:signal will behave exactly like error, i.e., it will call xcl:debug if the condition isn't handled, and will never return to its caller. If (typep condition conditions:*break-on-signals*) is true, then the debugger will be entered prior to the signalling process. This is true for all other functions and macros that signal conditions, such as warn, error, cerror, assert and check-type. conditions:*break-on-signals*(CONDITIONS:*BREAK-ON-SIGNALS* (Variable) conditions:*break-on-signals* NIL (E) 9) [Variable] This flag is primarily for use when debugging programs that do signaling. Its value is a type specifier. When (typep condition conditions:*break-on-signals*) is true, then calls to conditions:signal and other functions that implicitly call conditions:signal will enter the debugger prior to signalling the condition. The conditions:continue restart may be used to continue with the normal signalling process. The default value of this variable is nil. Note: the variable *break-on-warnings* continues to be supported for compatibility, but conditions:*break-on-signals* offers that power and more. New code should not use *break-on-warnings*. error datum &rest arguments(ERROR% (Function) error% NIL (E) 9) [Function] Like conditions:signal except if the condition is not handled, the debugger is called with the given condition, and error never returns. datum is treated as in conditions:signal. If datum is a string, a conditon of type conditions:simple-error is made. This form is compatible with that described in Steele's Common Lisp, the Language. cerror proceed-format-string datum &rest arguments(CERROR% (Function) cerror NIL (E) 9) [Function] Like error, if the condition is not handled the debugger is called with the given condition. However, cerror enables the restart conditions:continue, which will simply return the condition being signalled from cerror. datum is treated as in error. If datum is a condition, then that condition is used directly. In this case, arguments will be used only with the proceed-format-string and will not be used to initialize datum. The proceed-format-string must be a string. Note that if datum is not a string, then the format arguments used by the proceed-format-string will still be the arguments (in the keyword format as specified). In this case, some care may be necessary to set up the proceed-format-string correctly. The format directive ~* may be particularly useful in this situation. The value returned by cerror is the condition which was signaled. See Steele's Common Lisp, the Language, page 430 for examples of the use of cerror. (WARN (Function) warn NIL (E) 10)warn datum &rest arguments [Function] Invokes the signal facility on a condition. If the condition is not handled, then the text of the warning is printed on *error-output*. If the variable *break-on-warnings* is true, then in addition to printing the warning, the debugger is entered using the function break. The value returned by warn is the condition that was signalled. If datum is a condition, then that condition is used directly. In this case, if the condition is not of type conditions:warning or arguments is non-null, then an error of type conditions:type-error is signalled. If datum is a condition type, then the condition used is the result of doing (apply #'conditions:make-conditions datum arguments). This result must be of type conditions:warning or an error of type conditions:type-error is signalled. If datum is a string, then the condition used is the result of (conditions:make-conditions 'conditions:simple-warning :format-string datum :format-arguments arguments). The precise mechanism for warning is as follows: 1) If *break-on-warnings* is true, the debugger will be entered. This feature is primarily for compatibility with old code: use of conditions:*break-on-signals* is preferred. If the break is continued using the conditions:continue restart, warn proceeds with step 2. 2) The warning condition is signalled. While it is being signalled, the conditions:muffle-warning restart is established for use by a handler to bypass further action by warn, i.e., to cause warn to immediately return. 3) The warning condition is reported to *error-output* by the warn function. Note that warn will indicate that the condition being signalled is a warning when it reports it, so there is no need for the condition to do so in its report method. *break-on-warnings*(*BREAK-ON-WARNINGS* (Variable) *break-on-warnings* NIL (E) 10) [Variable] check-type(CHECK-TYPE (Macro) check-type NIL (E) 10) [Macro] (ECASE (Macro) ecase NIL (E) 10)ecase [Macro] (CCASE (Macro) ccase NIL (E) 10)ccase [Macro] (ETYPECASE (Macro) etypecase NIL (E) 10)etypecase [Macro] (CTYPECASE (Macro) ctypecase NIL (E) 10)ctypecase [Macro] (ASSERT (Macro) assert NIL (E) 10)assert [Macro] All of the above behave as described in Common Lisp: the Language. The default clauses of ecase and ccase forms signal conditions:simple-error conditions. The default clauses of etypecase and ctypecase forms signal conditions:type-error conditions. assert signals the xcl:assertion-failed condition. ccase and ctypecase set up a conditions:store-value restart. Handling Conditions 1 conditions:handler-bind(CONDITIONS:HANDLER-BIND (Macro) conditions:handler-bind NIL (E) 11) bindings &rest forms [Macro] Executes the forms in a dynamic context where the given local handler bindings are in effect. The elements of bindings must take the form (type-spec handler). The handlers are bound in the order they are given, i.e., when searching for a handler, the error system will consider the leftmost binding in a particular conditions:handler-bind form first. However, while one of these handlers is running, none of the bindings established by the conditions:handler-bind will be in effect. type must be a type specifier. To make a binding for several condition types, use (or type1 type2 ...). handler should evaluate to a function of one argument, a condition, to be used to handle a signalled condition during execution of the forms. An example of the use of conditions:handler-bind appears at the end of the conditions:restart-case macro description. conditions:handler-case(CONDITIONS:HANDLER-CASE (Macro) conditions:handler-case NIL (E) 11) form &rest cases [Macro] xcl:condition-case(XCL:CONDITION-CASE (Macro) xcl:condition-case NIL (E) 11) form &rest cases [Macro] Executes the given form. Each case has the form (type ([var]) . body) If a condition is signalled (and not handled by an intervening handler) during the execution of the form, and there is an appropriate clauseÿÿï%ÿi.e., one for which (typep condition 'type) is trueÿÿï%ÿthen control is transferred to the body of the relevant clause, binding var, if present, to the condition that was signaled. If no condition is signalled, then the values resulting from the form are returned by the xcl:condition-case. If the condition is not needed, var may be omitted. Earlier clauses will be considered first by the error system. I.e., (xcl:condition-case form (cond1 ...) (cond2 ...)) is equivalent to (xcl:condition-case (xcl:condition-case form (cond1 ...)) (cond2 ...)) type may also be a list of types, in which case it will catch conditions of any of the specified types. One may also specify an action to be taken if execution of form completes normally. This may be done by specifying a clause that has :no-error as its type. Such a clause, if provided, must be last. A :no-error clause looks like: (:no-error lambda-list . body) If execution of the form completes normally and there is a :no-error clause, the values produced by the form will be bound to variables in the clause's lambda-list and the body will be executed with none of the handler bindings in effect. In this case the value of the xcl:condition-case form is the value returned by the last form of the body of its :no-error clause. Having a :no-error clause is equivalent to wrapping (mutiple-value-call #'(lambda lambda-list . body) ...) around the xcl:condition-case form. conditions:handler-case is synonymous with xcl:condition-case. Examples: (xcl:condition-case (/ x y) (division-by-zero () nil)) (xcl:condition-case (open *the-file* :direction :input) (file-error (condition) (format t "~&Open failed: ~A~%" condition))) (xcl:condition-case (some-user-function) (file-error (condition) condition) (division-by-zero () 0) ((or unbound-variable undefined-function) () 'unbound)) (xcl:condition-case (open my-file) (file-error () (format *error-output* "Couldn't open ~S." my-file)) (:no-error (stream) (open-more-files my-file stream) stream))) Note the difference between xcl:condition-case and conditions:handler-bind. In conditions:handler-bind, you are specifying functions that will be called in the dynamic context of the condition signalling form. In xcl:condition-case, you are specifying continuations to be used instead of the original form if a condition of a particular type is signaled. These continuations will be executed in the same dynamic context as the original form. conditions:ignore-errors(CONDITIONS:IGNORE-ERRORS (Macro) conditions:ignore-errors NIL (E) 12) &body forms [Macro] Executes the forms in a context that handles conditions of type error by returning control to this form. If no error is signaled, all values returned by the last form are returned by conditions:ignore-errors. Otherwise, the form returns the two values nil and the condition that was signaled. Synonym for (xcl:condition-case (progn . forms) (error (condition) (values nil condition)). xcl:debug &optional datum &rest arguments [Function] Enters the debugger with a given condition without signalling that condition. When the debugger is entered, it will announce the condition by invoking the condition's report function. datum is treated the same as for xcl:signal except if datum is not specified, it defaults to "Call to DEBUG". This function will never directly return to its caller. Return can occur only by a special transfer of control, such as to a catch, block, tagbody, xcl:proceed-case or xcl:catch-abort. conditions:invoke-debugger(CONDITIONS:INVOKE-DEBUGGER (Function) conditions:invoke-debugger NIL (E) 13) condition [Function] Invokes the debugger with the given condition. This is intended to be used as a portable entry point to the debugger. For finer control over the debugging state, see the function xcl:debugger. break &optional(BREAK (Function) break NIL (E) 13) format-string &rest format-arguments [Function] Enters the debugger with a simple condition with the given arguments. If no format-string is provided, it defaults to "Break." Computation may be continued by invoking the conditions:continue restart. If continued, break returns nil. break is approximately: (defun break (&optional (format-string "Break") &rest format-arguments) (conditions:restart-case (conditions:invoke-debugger (conditions:make-conditions 'conditions:simple-condition :format-string format-string :format-arguments format-arguments) (conditions:continue () :report "Return from BREAK." nil))) Restarts 1 conditions:restart-case(CONDITIONS:RESTART-CASE (Macro) conditions:restart-case NIL (E) 13) expression {(case-name arglist {keyword value}* {form}*)}* [Macro] The expression is evaluated in a dynamic context where the case clauses have special meanings as points to which control may be transferred. If expression runs to completion, all values returned by the form are simply returned by the conditions:restart-case form. On the other hand, the computation of expression may choose to transfer control to one of the restart clauses. If a transfer to a clause occurs, the forms in the body of that clause will be evaluated in the same dynamic context as the conditions:restart-case form, and any values returned by the last such form will be returned by the conditions:restart-case form. A restart clause has the form given above: (case-name arglist {keyword value}* {form}*) The case-name may be nil or any symbol. The arglist is a normal lambda list that will be bound and evaluated in the dynamic context of the conditions:restart-case form. They will use whatever values were provided by conditions:invoke-restart or conditions:invoke-restart-interactively. Definitions of these two functions appear later in this section. The valid keyword/value pairs are: :filter expression expression should be suitable as an argument to the function special form. It defines a predicate of no arguments that determines if this clause is visible to conditions:find-restart. Default = true. :condition type Shorthand for a common special case of :filter. The following two key/value pairs are equivalent: :condition foo :filter (lambda () (typep xcl:*current-condition* 'foo)) :interactive expression The expression must be a form suitable as an argument to function. (function expression) will be evaluated in the current lexical and dynamic environments. The result should be a function of no arguments which returns a list of values to be used by conditions:invoke-restart-interactively. This function will be called in the dynamic environment available prior to any restart attempt. Any interaction with the user should be done here and not in the body of the restart. If there is no :interactive option specified and the restart is invoked interactively, no arguments will be supplied. :report expression The expression can either be a constant string or a form suitable as an argument to function. If expression is not a string, (function expression) will be evaluated in the current lexical and dynamic environment. The result should be a function of one argument, a stream, which will be called to report that restart. This function should print a short summary of the action that restart will take if invoked. If expression is a string, it is a shorthand for (lambda (s) (format s expression)). Only one of :condition or :filter may be specified. If no :report is specified, the case-name will be used. It is an error to have a null case name and no report function. Examples: (loop (conditions:restart-case (return (apply function some-args)) (new-function (new-fn) :report "Use a different function." :interactive (lambda () (list (prompt-for 'function "Function: "))) (setq function new-fn)))) (loop (conditions:restart-case (return (apply function some-args)) (nil (new-fn) :report "Use a different function." :interactive (lambda () (list (prompt-for 'function "Function: "))) (setq function new-fn)))) (conditions:restart-case (a-command-loop) (return-from-command-level () :report (lambda (stream) (format stream "Return from command level ~D." level)) nil)) (loop (conditions:restart-case (another-computation) (conditions:continue () nil))) The first and second examples are equivalent from the point of view of someone using the interactive debugger, but differ in one important aspect for non-interactive handling. If a handler "knows about" restart names, as in: (when (conditions:find-restart 'new-function) (conditions:invoke-restart 'new-function the-replacement)) then only the first example, and not the second, will have control transferred to its correction clause. Here's a more complete example: (let ((my-food 'milk) (my-color 'greenish-blue)) (do () ((not (food-colorable-p my-food my-color))) (conditions:restart-case (error 'bad-food-color :food my-food :color my-color) (use-food (new-food) :report "Use another food." (setf my-food new-food)) (use-color (new-color) :report "Use another color." (setf my-color new-color)))) ;; We won't get to here until my-food ;; and my-color are compatible. (list my-food my-color)) Assuming that use-food and use-color have been defined as (defun use-food (new-food) (invoke-restart 'use-food new-food)) (defun use-color (new-color) (invoke-restart 'use-color new-color)) then a handler can proceed from the error in either of two ways. It may correct the color or correct the food. For example: #'(lambda (condition) ... ;; Corrects color (use-color 'white) ...) or #'(lambda (condition) ... ;; Corrects food (use-food 'cheese) ...) Here is an example using conditions:handler-bind and conditions:restart-case. (conditions:handler-bind ((foo-error #'(lambda (condition) (conditions:use-value 7)))) (conditions:restart-case (error 'foo-error) (conditions:use-value (x) (* x x)))) The above form returns 49. xcl:define-proceed-function name [Macro] {keyword value}* {variable}* Valid keyword/value pairs are the same as those which are defined for the xcl:proceed-case special form. That is, :filter, :filter-function, :condition, :report, and :report-function. The filter and report functions specified in a xcl:define-proceed-function form will be used for xcl:proceed-case clauses with the same name that do not specify their own filter or report functions, respectively. This form defines a function called name which will invoke a proceed case with the same name. The proceed function takes optional arguments which are given by the variables specification. The parameter list for the proceed function will look like (&optional . variables) The only thing that a proceed function really does is collect values to be passed on to a proceed case clause. Each element of variables has the form variable-name or (variable-name initial-value). If initial-value is not supplied, it defaults to nil. For example, here are some possible proceed functions which might be useful in conjunction with the bad-food-color error we used as an example earlier: (xcl:define-proceed-function use-food :report "Use another food." (food (read-typed-object 'food "Food to use instead: "))) (xcl:define-proceed-function use-color :report "Change the food's color." (color (read-typed-object 'food "Color to make the food: "))) (defun maybe-use-water (condition) ;; A sample handler (when (eq (bad-food-color-food condition) 'milk) (use-food 'water))) (xcl:handler-bind ((bad-food-color #'maybe-use-water)) ...) If a named proceed function is invoked in a context in which there is no active proceed case by that name, the proceed function simply returns nil. So, for example, in each of the following pairs of handlers, the first is equivalent to the second but less efficient: #'(lambda (condition) ; OK, but slow (when (xcl:find-proceed-case 'use-food) (use-food 'milk))) #'(lambda (condition) ; Preferred (use-food 'milk)) #'(lambda (condition) (cond ((xcl:find-proceed-case 'use-food) (use-food 'chocolate)) ((xcl:find-proceed-case 'use-color) (use-color 'orange)))) #'(lambda (condition) (use-food 'chocolate) (use-color 'orange)) conditions:restart-bind(CONDITIONS:RESTART-BIND (Macro) conditions:restart-bind NIL (E) 17) ({(name function {keyword value}*)}* {form}* [Macro] Executes the forms in a dynamic context where the given restart bindings are in effect. name may be nil to indicate an anonymous restart, or some other symbol to indicate a named restart. function will be evaluated in the current lexical and dynamic contexts and should produce a function of no arguments to be used to perform the restart. This function will be called when that restart is activated by conditions:invoke-restart or conditions:invoke-restart-interactively. Note that unlike conditions:restart-case, invoking the restart does not automatically transfer control back to the contour in which it was established. If that is appropriate for that restart it is up to the individual restart function to do this. The valid keyword/value pairs are: :interactive-function form form will be evaluated in the current lexical and dynamic environments and should produce a function of no arguments that will construct the list of values to be used by conditions:invoke-restart-interactively. :report-function form form will be evaluated in the current lexical and dynamic environments and should produce a function of one argument, a stream, that will be used to report that restart. :filter-function form form will be evaluated in the current lexical and dynamic environments and should produce a function of no arguments that will be used to determine if the given restart is currently active. This form is a more primitive way of establishing restarts than conditions:restart-case. It is expected that conditions:restart-case will be sufficient for most uses of the restart facility. An example of where the more general facility provided by conditions:restart-bind may be useful is: (conditions:restart-bind ((nil #'(lambda () (expunge-directory the-dir)) :report-function #'(lambda (stream) (format stream "Expunge ~A." (directory-namestring the-dir))))) (cerror "Try this file operation again." 'directory-full :directory the-dir)) In this case, a restart is provided that allows the user to expunge the full directory and return to the debugger after doing so. He can then try some other restart, such as conditions:continue to retry the failed operation. conditions:compute-restarts(CONDITIONS:COMPUTE-RESTARTS (Function) conditions:compute-restarts NIL (E) 18) [Function] Uses the dynamic state of the program to compute a list of restarts. Each restart object represents a point in the current dynamic state of the program to which control may be transferred. The only operations that Lisp defines for such objects are: conditions:restart-name, conditions:find-restart, conditions:invoke-restart, conditions:invoke-restart-interactively, princ, and prin1, to identify an object as a restart using (typep x 'conditions:restart), and standard Lisp operations that work for all objects, such as eq, eql, describe, etc. The list which results from a call to conditions:compute-restarts is ordered so that the innermost (ie, more-recently established) restarts are nearer the head of the list. Note also that conditions:compute-restarts returns all valid restarts, even if some of them have the same name as others and therefore would not be found by conditions:find-restart. It is an error to modify the list returned by conditions:compute-restarts. conditions:restart-name(CONDITIONS:RESTART-NAME (Function) conditions:restart-name NIL (E) 19) restart [Function] Returns the name of the given restart, or nil if it is not named. xcl:default-proceed-test proceed-case-name [Macro] Returns the default filter function for proceed cases with the given proceed-case-name. May be used with setf to change it. xcl:default-proceed-report proceed-case-name [Macro] Returns the default report function for proceed cases with the given proceed-case-name. This may be a string or a function just as for condition types. May be used with setf to change it. conditions:find-restart(CONDITIONS:FIND-RESTART (Function) conditions:find-restart NIL (E) 19) identifier [Function] Searches for a restart by the given identifier which is in the current dynamic environment. If identifier is a symbol, then the innermost (ie, most recently established) restart with that name that is active is returned. nil is returned if no such restart is found. If identifier is a restart object, then it is simply returned unless it is not currently valid for use. In that case, nil is returned. When searching for a matching restart, the filter function, if any, of potential matches will be called to see if they are active. If it returns nil, then the restart is considered to not have been seen and the search for a match continues. Although anonymous restarts have a name of nil, it is an error for the symbol nil to be given as an identifier to this function. If it is approriate to search for anonymous restarts, you should use conditions:compute-restarts instead. conditions:invoke-restart(CONDITIONS:INVOKE-RESTART (Function) conditions:invoke-restart NIL (E) 20) restart &rest values [Function] Calls the function associated with the given restart, passing the values as arguments. The restart must be a restart object or the non-null name of a restart which is valid in the current dynamic context. If an argument is not valid, an error of type conditions:control-error will be signalled. If the argument is a named proceed case that has a corresponding proceed function, xcl:invoke-proceed-case will do the optional argument resolution specified by that function before transferring control to the proceed case. conditions:invoke-restart-interactively(CONDITIONS:INVOKE-RESTART-INTERACTIVELY (Function) conditions:invoke-restart-interactively NIL (E) 20) restart [Function] Calls the function associated with the given restart, providing for any necessary arguments. The restart must be a restart object or the non-null name or a restart which is valid in the current dynamic context. If the restart is not valid, an error of type conditions:control-error will be signalled. conditions:invoke-restart-interactively will first call the restart's interactive function as specified by the :interactive keyword of conditions:restart-case or the :interactive-function keyword of conditions:restart-bind. The interactive function should return a list of values to be passed as arguments to the restart. This list must be at least as long as the number of required arguments that the restart has. If the restart has no interactive function, no arguments will be passed to the restart function. It is an error for a restart to require arguments but not have an interactive function. Once the arguments have been determined, conditions:invoke-restart-interactively will simply do (apply #'conditions:invoke-restart restart arguments). conditions:with-simple-restart(CONDITIONS:WITH-SIMPLE-RESTART (Macro) conditions:with-simple-restart NIL (E) 20) (name format-string {format-arguments}*) {form}* [Macro] This is a shorthand for one of the most common uses of conditions:restart-case. If the restart designated by name is not invoked while executing the forms, all values produced by the last form are returned. If the restart established by conditions:with-simple-restart is invoked, control is transferred to the conditions:with-simple-restart form, which immediately returns the two values nil and t. It is permissible for name to be nil. In that case, an anonymous restart is established. conditions:with-simple-restart is essentially: (defmacro conditions:with-simple-restart ((restart-name format-string &rest format-arguments) &body forms) `(conditions:restart-case (progn ,@forms) (,restart-name () :report (lambda (stream) (format stream ,format-string ,@format-arguments)) (values nil t)))) Example: (defun read-eval-print-loop (level) (conditions:with-simple-restart (conditions:abort "Exit command level ~D." level) (loop (conditions:with-simple-restart (conditions:abort "Return to command level ~D." level) (print (eval (read))))))) xcl:catch-abort(XCL:CATCH-ABORT (Macro) xcl:catch-abort NIL (E) 21) print-form &body forms [Macro] Like conditions:with-simple-restart, but always uses the name conditions:abort . xcl:catch-abort could be defined by: (defmacro xcl:catch-abort (print-form &body forms) ©(conditions:with-simple-restart (conditions:abort ,print-form) ,@forms)) conditions:abort(CONDITIONS:ABORT (Function) conditions:abort NIL (E) 21) [Function] This function transfers control to the nearest active restart named conditions:abort. If there is none, this function signals an error of type conditions:control-error. xcl:abort could be defined by: (define-proceed-function xcl:abort :report "Abort") conditions:continue(CONDITIONS:CONTINUE (Function) conditions:continue NIL (E) 21) [Function] This function transfers control to the nearest active restart named conditions:continue. If none exists it simply returns nil. The conditions:continue restart is generally part of simple protocols where there is a single "obvious" way to continue, such as in break and cerror. NB: conditions:continue replaces xcl:proceed. xcl:proceed &optional condition [Function] This is a predefined proceed function. It is used by such functions as break, cerror, etc. conditions:muffle-warning(CONDITIONS:MUFFLE-WARNING (Function) conditions:muffle-warning NIL (E) 22) [Function] This function transfers control to the nearest active restart named conditions:muffle-warning. If none exists, an error of type conditions:control-error is signalled. warn sets up this restart so that handlers of conditions:warning conditions have a way to tell warn that the warning has been dealt with and that no further action is warranted. conditions:use-value(CONDITIONS:USE-VALUE (Function) conditions:use-value NIL (E) 22) new-value [Function] This function transfers control (and one value) to the nearest active restart named conditions:use-value. If no such restart exists, this function simply returns nil. The conditions:use-value restart is generally used by handlers trying to recover from errors of types such as conditions:cell-error, where the handler may wish to supply a replacement datum for one-time use. conditions:store-value(CONDITIONS:STORE-VALUE (Function) conditions:store-value NIL (E) 22) new-value [Function] This function transfers control (and one value) to the nearest active restart named conditions:store-value. If no such restart exists, this function simply returns nil. The conditions:use-value restart is generally used by handlers trying to recover from errors of types such as conditions:cell-error, where the handler may wish to supply a replacement datum to be stored in the offending cell. [This page intentionally left blank](LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "E-" "") STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "E-" "")) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (TEXT NIL NIL (54 54 504 723) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "E-" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "E-" "")) (54 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "E-" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "E-" "")) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))))G3H„øøT4ø&TT4ÌÌø +øTT3ÌÌø +øT-ÌÌøT2ÌÌøø.ÌÌøTT3HHø øT3øøT-øT2ø&3ø&T-ÌÌø +T3ø&T-ààøT,ø-ø2T-øT-øT,ÌÌø5ÌÌøÀÌ3ÌÌøøT3ÌÌøøT3ààøøT-ààøT3ØØø +øT-TTøT3ÌÌø +øT-ÌÌøT-ÌÌøT-ääøT-ØØøT3HHø øT6Ìø ÀÌT-ÌÌø T2 &,ÌÌø ,ØØø2ÌØø Ø5Ìø ÀÌ2HHøø5Ìø ÀÌ2ÌÌøø2ÌÌøø2¨¨øø2 &2HHø ø,ÌÌø 2ÌÌøÌ,ø2ø +ø2ø2ø,ø,ø22ÌÌø +ø,ÌÌø,ääø2ÌÌøø2ààøø2ôô &2àà &2ôôø&-øäìT2øø2øø2ø,ÌÌøFøø PAGEHEADING VERSOHEADFøø PAGEHEADING RECTOHEADEøø PAGEHEADINGFOOTINGVEøø PAGEHEADINGFOOTINGRMODERN +€MODERN +€TITAN +€MODERN +€TITAN + TITAN + TITAN +TITAN +MODERN + MODERN + MODERN + +TIMESROMAN TERMINAL  +TIMESROMAN MODERN +TIMESROMANMODERN +MODERNMODERN +G HRULE.GETFNMODERN +G3F HRULE.GETFNMODERN +F1EE HRULE.GETFNMODERN +DD HRULE.GETFNMODERN + HRULE.GETFNMODERN3#  .  + žâ:2?IM.INDEX.GETFNN WIM.INDEX.GETFNÝ HRULE.GETFNMODERN  HRULE.GETFNMODERN{‹IM.INDEX.GETFNIG•IM.INDEX.GETFN2.Ž3RæŠÒ8fœÉ:ž;pÌiè  !6 HRULE.GETFNMODERN2)5 HRULE.GETFNMODERN * #IM.INDEX.GETFN  ‹* =IM.INDEX.GETFN =IM.INDEX.GETFN - , : ³" AIM.INDEX.GETFN b> Â*  +¦  +Ó " OIM.INDEX.GETFN B ° °#_  8 * 9IM.INDEX.GETFN 860\ h0¸( IM.INDEX.GETFN  GIM.INDEX.GETFN '‰* WIM.INDEX.GETFN 5 ¶*CIM.INDEX.GETFNusIM.INDEX.GETFN/* &IM.INDEX.GETFN  'ç +';'#'"FIM.INDEX.GETFNÆ +?IM.INDEX.GETFN JIM.INDEX.GETFN*  +B   + % +  " +IM.INDEX.GETFN8 * YIM.INDEX.GETFN # d&8  ƒ4 HRULE.GETFNMODERNA*A HRULE.GETFNMODERN3!A HRULE.GETFNMODERN +KIM.INDEX.GETFNTITAN +€  , # 1<1 + IM.INDEX.GETFN +  + I  !  9 N ¾C + +9 + +& ©   9 f        I} $$% +  + ÆzC + + 9 + +& ‹   E + ­8   3 ¸ :JIM.INDEX.GETFN„:= >Ñ8 (  %:c ++4:Y Ô8: +û8B  *œ8 )A;/CIM.INDEX.GETFN8: V!Q?IM.INDEX.GETFN8 -!P/LIM.INDEX.GETFN 8©8 3=P8¡  .@A HRULE.GETFNMODERN +/FIM.INDEX.GETFNTITAN +€ 86k/ <IM.INDEX.GETFN 8M18 W 8 E=*  8 ==;< < 8  +  F   +!RIM.INDEX.GETFNTITAN +€ H$ *@E&25/ &IM.INDEX.GETFN 8^8  !C / &IM.INDEX.GETFN R +>8  E  $ 8  8  ^  /8% 8  % !IM.INDEX.GETFNTITAN +€  x_' e $ E$  7F  1j3 +HI(™/?IM.INDEX.GETFNTITAN +€ ) +*IM.INDEX.GETFNTITAN +€) IM.INDEX.GETFNTITAN +€) IM.INDEX.GETFNTITAN +€)(IM.INDEX.GETFNTITAN +€ )(IM.INDEX.GETFNTITAN +€  )"IM.INDEX.GETFNTITAN +€ ( % +      +  +  HRULE.GETFNMODERN +DIM.INDEX.GETFNTITAN +€ F    žf N  8 € 8/DIM.INDEX.GETFNTITAN +€ /:IM.INDEX.GETFNTITAN +€ 8  8   88 +  8J s "7D=   7=0   7 +d ; E :   ; T  ]4  <   7 +$$:.. ..«.#007ZÕ/FIM.INDEX.GETFNTITAN +€7@r/2= 5 + + ¹ 7 + +  +"  7}      !MIM.INDEX.GETFNTITAN +€  · !#IM.INDEX.GETFNTITAN +€  L . `B A HRULE.GETFNMODERN +DIM.INDEX.GETFNTITAN +€  #  + P. + ¼M+       X7'G +    +  + *c  ' O  +  + + + + ¡'¸ [  +  + F + +  + $ +   + OC +   *  *  A     *  *  A   y Q  ],,â--k,,i,C $A$j$¸0 $$$'$$$)0};;O0;MC;$æC/ +  + +  + 7  +  +7    +  1  e 7$ | +K 7  + 7o 7 + +  + + +!  7d & ;$š$$¢$$•$$[7 x $0$.$$,$$$$/$%$/$%$$$!DIM.INDEX.GETFNTITAN +€    G U Ï'Ñ +     ¦'   ¦   º@  u ú¯ 7/OIM.INDEX.GETFNTITAN +€ 7; 7¶7'7) B7&l7  g./GIM.INDEX.GETFNTITAN +€ 7 / + 7E  +  / + 7E  +V  !GIM.INDEX.GETFNTITAN +€ + $ + / + t* + i‘]+  + X +KIM.INDEX.GETFNTITAN +€-   ™7S u !'gIM.INDEX.GETFNTITAN +€ - / r ' ,   [ R  ­)'#  !RIM.INDEX.GETFNTITAN +€ !7  $ # -+0 5*!,""$* F8 +&A"/4IM.INDEX.GETFNTITAN +€ +Q '!9IM.INDEX.GETFNTITAN +€ D;7  ;;6!?IM.INDEX.GETFNTITAN +€ D#m +  + + G   !KIM.INDEX.GETFNTITAN +€ D#*O!AIM.INDEX.GETFNTITAN +€ + T:VM!EIM.INDEX.GETFNTITAN +€  T:V_77?$Ç>¢zº \ No newline at end of file diff --git a/docs/ReleaseNote/ENVOSCOVERSHEET.TEDIT b/docs/ReleaseNote/ENVOSCOVERSHEET.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..be64dd0b024b3c271ac01a6b4de14889728caedc GIT binary patch literal 5503 zcmeH~&u`o28OL8*N!cycg#H+?Q}i^w*n?--ahOYdTA4&DB1vhkudM)d7t0U%Sg)a z$)+s_bRcbM_%eSeJArH;NsoxuKHl7<{8~PLEA@x+wd&!0I;hkt<--c?*Bg~X%IAgn zqrmEjzX>h;Iju3L6|Gztj^n)$g$$K4gaQ&xn5772DS}yw012^KLTr{$DMJjiC4@4Y zlQNrAX}05kgh)Y{F$=l2WQkI;hg}-NbhI$cn1va$jMYyKXXyl{8Jc8hlp&F(X@({l z8f8eNX_}!)hDI5RZ<=Z`%%Y`Q46|sJLab3t447-Qek`+b96&{j9>3hWR5QMFdzL6YlO!Hf(XcXTAMKP%VN9LDR(cDbY+)UBjj43f=O3awX8O?Mfe^&b>%hz|Oo$KeP z_;mQkG(6Y8%}w?H@Mi^6@wtAX{Wp9pN@4;E3xydy5MrzJ8yz3qBT;$`x?Q}kKMBub zDuAX%rg3p}TG-N`G8G?>OXE`=bY4(&HW{X6OpyRAR_Vls?rsDH~eiOxbr`s6}r&i0eJ~sf)rp*PW^^04%Cy||)^!vr@DLTDg)HOa67dSh;j!7$;3QT3Ia1qnl^@|eT z)~P6sPo}v^OvRBodBJzRe17(gk-q0UW1}U>a*kcEZ3LFX-L`ZB!rt#5 zeJ;&_0+-B|;hae7SwYL~2IRPbWlA!fCixK9O_tD+B-3^L!0XB;89o`ncH0V+zoP+F zoJX!twC#Ew*Hd9vi2mHNY)SHw^ado4kx)P_*d9sgP}^uqjxHU)>tTnS4b$v;hB+Yj zIGgY?&HSg_BMBeX_{fet>35Kvb!6FAFdzg%`UvTHuIIy*5g^=vj7~=y-b#Mk?F>BY zq!kc-9evHF7gvz~RC;b7MYY>#W6knA+&Y5-56QO;@8L?mY}=%K`J9FH9?9lP{zej^ zZP!Z3=9qh!XIkrwJftmENY@rwlRP@s^-D^riYO)cU4>J#CTF}IJ zdT1ndeYnHrMe)rp3{}v!;j_jHevM(}7V%51L5qv`%e(lYR;>|s_bUg7)z2zalRRtM zsn@FY>i$lh7Rv|aJJszaI&72=8rA(>w)%k9mS}O6R_WH-P5S8Lo1n#emGWJjM;>R; z_{;qYRg*U!dN(&VY2zbW-}sQ$Z!NJlgs)=DLD*=OHsB($ZB#yOsGzD8oPHQ(wZ0j7 zUxM8aDK*OQRf|o%2D4(_jW ze9c^2yj$5Re^P7g)b|^-MvJ@U?R#ZfTgA|$E#6&>|6s4WU#`(6#;nGwe7_^E)atu+ z@w<7X{|kbXMD|XkhrqlRgpQ}0Vl>J~@IIf#f;W|(Ca&E(_@q`@*{w8o_O+D9B$t^@ zblVoh8!s_Tr=o&g<*>-(6!s*vP)ZP5?Mi!j1V|(ZP=1=E+#n5!C$*T22iqwWv=`}ib{lP!MQwz3 zc?6z;2jCfa1|EaUeSp2>9M3pRO48DRxWURK_UH3`KK_o!ZLL%ag^oe-ko%fLBn{Vh z0Q$Te@;wJ5fKdiy0LFh9at#2b+UnF3VwqH4pCHO?4r?J+Dw*N_I04v*hkqtEtacB; z@PpCx)-m||`$x&k(QrEYdvXlJ$pK6clhG0Ie_r4qIe^aL@M!q^G&wp(iPqhkRd{X= zN5}921z|LqCKF;0$K!utocu9`{qb<}*Kdqkv21fHmt((&W{D867jvb>GY(-gMO_GF zD5Qu23FS~e;Y!KAAHntO_^E(4zA_@}5&s6%niVKlp$e^99oqNnI4WDZlU9Bxc~fLLK|JBD}DS<1Lp zg~0ENa1Z*j%T)w&m#a`jnSfE^5toCMK8P@4HpidFex!wr@QCyVp|3!PGUl_<6Hd9( zF%pA5CB~Iod7!zn_K|wgttDtYH@1r*hjYDVZ?J61u_3dqFv??j5yupsj(zmLyVwLbqm_{Mk-xF;(3cqoG-6t$b%oPm}C$d zeeNpmE~(f>?Kl4et4yH)?f`nR^XzE}N!#J8Caz&Cx5m!1HHSKZg1fJ(()`fIGj zwyEd+&o0t$(Zh!s#>NO?|CDy0y=U){XWN-P4>hwkPb{3VV2;?BTM>yK`_+l&e{+<( zgu5gQ9{b?^my65=657P)4F+GPLGc1xE3nrddqbn;t#vY~0(-l}yWDaC3A((GL_kxS)jtRT&Ub$@f4Ly*kP}f0L>gHpt^oP{ z7U}RrpwL6 z{WQaQVt$;Y`8gWDbc>P4xq>a#++M;h;vFC2wcNw zwiW>^NnbjtM8HZ)w9C2u7oGGvc1RR$K2c=hfh9{@oB literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/PREFACE.TEDIT b/docs/ReleaseNote/PREFACE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..dd8c96df065f1b4e3282a90e4ebd7f087b9c980a GIT binary patch literal 10616 zcmd^DTXP&o6&~3MB!mr@T%aI8W1@;wB`do55~sMVrIEdOwJUa4z67XZwA;Hocy?x) z*_Esm#S{Djp7|sEhWv&+@j#`ZDBkjBzVGyO?~J6iV<*K+WNS2Y`kd3JzjK{guT<)_ z_P%QQb-&v7RioMQ+bc@#`8#$0fhB{m-|}~>+rFx-Kchq?m!x3f*50ei)k>u^)JoOE zY^+pEM>@!~Y9te#sd1Vdg*~mh(=^rbM1^rbNk_pXOkx!rCew*hYT|^mq(3L?T8n^DtG*5<(-Z(sh5<0r z@i2(H+CUY?6Fo?C41qy78b_M&7!ovWC!-Mn7Kea45jlA(gXv7Ds%$zM1?h=WgeSq# z)niX}vFiXvi~_jO01BmtDH%seZyMedtylEJsmoSiW1PP2@F&>Z@To*CjV{X|4HJYzjHAN4-?0{CVM zKWoU*i$hT8d4<1y{G%p%wFipzVoiL`=!kL;UiNmde%6b$uOflfFvw9AH{ynU2pIJt z6b=d-bj1wP4EM+j9(w>8zN*2!X@p$5yt4w_dU~vJK_ZkLyE=pGPMjRa3ehr2!>)u8 z7B?!D+sUzbzMPWGuVy+3;_yS=lXAf9Jui6`S(oz4vS>=nqEd}o-DWw6O!J(`h4m|{ zeQ>i;-Sbtmb*tK_eNgSxnvF%(+yxhwI{y8RO3eNeu!}g@qFPkTIT1z$nKDV8-B6Y7 zVK4?FYJG*!qzF4X<4PW~I0dsrt3BO|^a)@v^~dH66GMW_>e)cZn&QO3+zzIK7>L7g zFpTg!$y62&;;Nbgk4(Lz(12&&gRXPVlKX0aILsG&*Bx;GXam240E3$ zZC#R=9gmoplhG>Z_jMQMyM0_8S#>6D;iP~<^12*tOj0@Ey9P=yDpcqwjA55Mv=pRa zaD-S59_m<)qX2~oqHfd6J0|5}NTJ-Q-ZW*6rmGB$1hnil`bi-gQMGO9VF-@X5Va|c zPM(ksM8yK;4x6b>F=b04c@|$d_c%y{DAJMGQ#8G$`x>nZXW9$mX%I0OyHS#9Y>(S< zg1U4VX;|7xP#7QL?C4QJcEa49!g3tY*w3iV(5ogxvq@`jMQ&#Os++_|2u~^eJSfC_ zH!8J4j||ZfT&^CTlt4xjo-*|)iKZhhM^+gk0g7oS`)jSWrz}lHY_DplgC0DR2{DEJOb%f0>?E7$kuw2xG}rS;Rbee-!hfW@CBwxtXvnfc1DwcB@ToSNdP#tw zOYuYJK~=`UqBMAtv?RPu;o5eyajzsSE)(e-C)E5@9ZtiDQ3(+gMHCl|Bq7e7sgh2# zMzx!2R{eNdR!fyQL_gAxn5YUkO_c?rq{N4ypQhNgEohbWXj#C{IFLzDl&e&C;o0=W z^jCBd>0l@l+p|pOoV4(MzNm2WyMBXRur0k4F`J7m(xa{duzgAky}DdbCq;qv z)q!1Z=V9E9rkot$3s+fgR2snu0fS6&wN3S>v6&85knGHCQz(v5S_1%O>Oh7D6mvWL z+-%l&)WQC~-`cLW{r4qE!xZIWAi-w@Sou5EdTqN6Y}IVvVu+u=^PG(jlc=XK(Cf5| z_lWtshLa!)yVBaL>M-a&%%UJ0s-@p7vw5UJmqWuC9z#eno&p3xjsR+^Qg(Y411j6` zfr2zR)O4vj$mFq3CnvU+nY7|bRmFc4um~VuSi6-$PN2iiqcBETtgo$BI{MKhUzA>; z+8EOw>dr7lSYngnE0OFSCpbR(GmsvSqfka;Wz-b)r1~i2h>WwN&Ex@+a(;n((*X$Q zDaV+DE_SHVxr1I0g#u7ul*h2cqJdyCkpw6ww#cqlT%!Rxc@cMEg>LVb^OlJ`BEV=l zxFa^~Yrr*4rh_5h`6fe{Hj?%#L1Smtgf&`fQz^!oQ7l-d)|8f9Nj&cbGj9ttIR3RNNZquL}W0dn&6f7h~*?7 zuVzD(IRqHShzE&S)}bVirx*fcYhfLdQF| z=lF>_(mBpel7S{PEa&M%8f8~<H$mS@em$3fl)v>n?}q|qn|YS z(!yW{TZor?r#aPsn1=8snP7H`SyBW8l)Yq-Oz{pio7SlD^p_!8z?W2n6wJV@RS09` zqX*Odo`%XU<}Hjq(2H*%+=$sjT{1P4Vi9!)!Gc#pR8096LZgJ&^+ct{(?fI&>AiTd zR2a0eWh8If=hd*gGEL)c3VMu3YPA{?@=gNX`R;gJfA9Jg%!#wv(B!PD;~i@n3^X1w zxZj#$kg2bt_-nkNs$Zt7pznkOb}_Y&u;G^!sM^A4QP8EzbEXLcaF){1NL~Y?6+vdF zG#z%#R~W#(lvfCJEOlwl#CypM1?McAarx5n{N1s?am}gW9ul_b&0ynUudi0}8oa)` zcDY@e&?z)ms#5uNhdpErd=b_tfSl3rLU)39oBl){MnU}Ww;q2kF5&xVM=dSwS8w?; zU*QfTO}qAiuj(4bGgZ6IdaYS&>^9X>y?M`XwVHd?hPreK|Cd#}Q*Cu>ja!ueiCVw5 ztd`c)n!38ap{~8Rfu|)Ax2jv!db4?_t(JauP(^F3-MZabR@=9$t(@FG;O5({+I|OG zYK^zUrTm(RU031w>$eVr6bS#Equ-0?)W=ql@_nBsom;ct^PpmHFx}0LpAUE zt$MAIE9kUpcl_po5kF{v!>#%E_p6OIrcitozI9Nqwp6>`-1ptnJ)gGn!*T6kkB0dz zyYoTYZwWjcPurabFc){rz^%21G537nfXv3VHGUA%4&XF+MzNxBg%L|1xGX1KO5%jxPY4Tiqyz0~nrd$mTj?l`@(oUmr5@l~S{(lgq(&!O3!?b2(w zxd4n_x!pRb`>VJ7&TeC&prgo7B&8fsgo5uD3Eb_uG*NK1sOejHcv$3;dsXLy9bsQrezdW95Rd za8+*pa)v@eiT6*I_soh!40i;-(VIP;_ivW>qUCi~*$rU#DKmd=DH~SE@;YIbPdO4- zXxWpTG>i2dTBs3`3a*R1EfStf6T{CP@pY;s=;A^`_ItSW)!N=_4X-KpP12C(JG^k+ z9{4tIi-hPj;jgC&|1J`^sY|lAxI&84D#s*64sG`#L3l~{A$~>Zd%Piq%W{!2YlZmt zK39r_-&umVhk_0PIVvfoFs1Mxt&jzwQ6$jh&C`URo+favah6cTKTRkZPftCUn`yk9 zgnLj23D2d8DgKMIQ8BNSx_Fl|K^z^$!nOmVU?Aa6!<-AnM-&pXiypfQ5BsI)ap&SeKbM0f9KH|-iK}@MQOT2B zp}C}3cl?OATydvnA_>KzM_$T^I`X=TYqk8?%D5zTTCDK*EsKN()&0y;#P6gy$5|m) lR$b#bqt_XAJ_}XKbV0kR_6&jVkZ*Gh7QFG6_umiy{y#xGM#umF literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/PRINTINGSPEC.TEDIT b/docs/ReleaseNote/PRINTINGSPEC.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..0d3cea2fb9cd16781ee09813379ca76b3d903dda GIT binary patch literal 1634 zcmb7CO>fgc5Z$;RqJW`?3OLRMh(*6#q*9{F$Rti{$#E>(Rq4@9-PlszW3(M?5rKvw0+Y)0?#p;X4`D)zS*@sS+-2i0oSk$-7~=M z`i8d&&@oz;aW;iz-ENJAmigJ$-81NPTPM~WsSF^?vNsHSaWDWg$?|m6%VVBo4FFAh zzZLO82*Xj*i=ZB+DNi96NE#%)5GC(GAX}jBsQVBLk#cw_{G3ViB1+>VkCQ%h!aU*^ zWXdluvoJ@Y6AZ%?PQ$n#^XBe;)yP)|5y5&s5xl=4wOQi`^`_*SHA+QF8( zvj<;5Rnft??uA1dkeJ7Ie|r=7*D%e57B1qTp9WW%LbptKf_=i`;i8>Ax;hsl;FsV8 zeVVAIAr7*mJBBM>hv9F9Ewep#%CBdv8LP3o@nO-rDTp7nUt?OTEs_zATJ}HM z!cAH#qJ{gi=zoK)if_PfV@1jJAGa`R%Ulg9`N{y?LyI zx~ml7frxy=?U=T1!GWT%$8#);(vuFvP#JrLhZRC30%%TU;PpcVrrk?<^AMn!ls(9l z@|eVstpG341DOvPNVtd<_j}SQKkrHjs$ zRC3-5`CsNpHH)Xl!}Mhd{I@#ml{%GHDgYJ6`{2Ft@CZYaO#mdsSz2Rfw?F>?bilXd literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/SEC1-INTRODUCTION.TEDIT b/docs/ReleaseNote/SEC1-INTRODUCTION.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..c69de86fd55e99ce9af718147dc60543245d1080 GIT binary patch literal 7019 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 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/SEC2-NOTES-AND-CAUTIONS.TEDIT b/docs/ReleaseNote/SEC2-NOTES-AND-CAUTIONS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..36d058bceb0df2ee8520d8631cd9d6b53df1d046 GIT binary patch literal 15016 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 R04Uaf^~R6>@fZL3{{|!o+0Xz0 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/SEC3-IRMFEATURES-III.TEDIT b/docs/ReleaseNote/SEC3-IRMFEATURES-III.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..6cf967cf55c7bfd6f9b2ff4382ccbf27dcea4ee8 GIT binary patch literal 55722 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 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/SEC5-LIBRARY-MODULES.TEDIT b/docs/ReleaseNote/SEC5-LIBRARY-MODULES.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..394c5a00473b0e009b91ae01740402c1b46cd0f6 GIT binary patch literal 24785 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 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/SEC6-USERS-GUIDES.TEDIT b/docs/ReleaseNote/SEC6-USERS-GUIDES.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..b06d1e3410a431f9f780a9971b96ca2178ce850c GIT binary patch literal 62245 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 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/SEC7-CLIMPLMNTN.TEDIT b/docs/ReleaseNote/SEC7-CLIMPLMNTN.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..4b01bb7201edc8d45a13fa652b3daa88897658dd GIT binary patch literal 45410 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 AmjD0& literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/TABSINFOP.SKETCH b/docs/ReleaseNote/TABSINFOP.SKETCH new file mode 100644 index 00000000..95fdb9b0 --- /dev/null +++ b/docs/ReleaseNote/TABSINFOP.SKETCH @@ -0,0 +1,2 @@ +((SKETCH %{ERIS%}MEDLEY>RELNOTES>TABSINFOP.SKETCH;4 VERSION 3 PRIRANGE (217 . 0) SKETCHCONTEXT ((ROUND 1 BLACK) (MODERN 10 (BOLD REGULAR REGULAR)) (CENTER BASELINE) (CURVE 18.0 8) NIL NIL (CENTER CENTER) (NIL NIL NIL) T NIL NIL 1 NIL)) ((0.03847551 11.54265 (PRI 1)) (TEXT (110.9365 . 707.4918) ("") 0.7695101 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((110.8095 703.717 0.0 11.54265)) BLACK)) ((0.03847551 14.62069 (PRI 2)) (TEXT (295.0091 . 736.6715) ("") 0.7695101 (CENTER BASELINE) (MODERN 18 (MEDIUM REGULAR REGULAR)) ((294.7224 732.1889 0.0 14.62069)) BLACK)) ((0.0538657 20.468966 (PRI 3)) (TEXT (279.6189 . 736.6715) ("TABS FOR MEDLEY RELEASE NOTES MANUAL (2-1/4%" BINDER)") 1.077314 (CENTER BASELINE) (MODERN 18 (BOLD REGULAR REGULAR)) ((2.693285 730.9576 554.8167 20.468966)) BLACK)) ((0.05 12.0 (PRI 4)) (TEXT (264.0 . 448.0) ("Table of Contents ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((219.5 445.0 89 12)) BLACK)) ((0.05 13.0 (PRI 5)) (TEXT (204.0 . 400.0) (" ") 1 (CENTER BASELINE) (MODERN 10 (MEDIUM REGULAR REGULAR)) ((202.0 396.5 4 13)) BLACK)) ((0.05 12.0 (PRI 6)) (TEXT (220.0 . 376.0) (" ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((219.0 373.0 2 12)) BLACK)) ((0.05 12.0 (PRI 7)) (TEXT (296.0 . 396.0) (" 1. Introduction ") 1 (RIGHT BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((217.0 393.0 79 12)) BLACK)) ((0.05 12.0 (PRI 8)) (TEXT (288.0 . 344.0) ("3. Integration of Languages ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((220.0 341.0 136 12)) BLACK)) ((0.05 12.0 (PRI 9)) (TEXT (284.0 . 292.0) ("4. Changes to Interlisp-D ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((223.0 289.0 122 12)) BLACK)) ((0.05 12.0 (PRI 10)) (TEXT (264.0 . 244.0) ("6. User's Guides ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((223.5 241.0 81 12)) BLACK)) ((0.05 12.0 (PRI 11)) (TEXT (304.0 . 216.0) ("7. Common Lisp Implementation ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((225.0 213.0 158 12)) BLACK)) ((0.05 12.0 (PRI 12)) (TEXT (248.0 . 140.0) ("B. SEdit ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((226.0 137.0 44 12)) BLACK)) ((0.05 12.0 (PRI 13)) (TEXT (252.0 . 116.0) ("C. ICONW ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((226.5 113.0 51 12)) BLACK)) ((0.05 12.0 (PRI 14)) (TEXT (272.0 . 268.0) ("5. Library Modules ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((224.5 265.0 95 12)) BLACK)) ((0.05 15.0 (PRI 15)) (TEXT (105.0 . 703.0) ("TYPE: MAJOR") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((59.0 698.5 92 15)) BLACK)) ((0.05 15.0 (PRI 16)) (TEXT (113.0 . 687.0) ("TAB SIZE: 2-3/8%"") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((58.5 682.5 109 15)) BLACK)) ((0.05 15.0 (PRI 17)) (TEXT (125.0 . 671.0) ("NO. TABS PER BANK: 5") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((49.5 666.5 151 15)) BLACK)) ((0.05 15.0 (PRI 18)) (TEXT (113.0 . 656.0) ("NO. OF BANKS: 3") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((56.0 651.5 114 15)) BLACK)) ((0.05 15.0 (PRI 19)) (TEXT (200.0 . 636.0) ("COLOR OF TABS: GREEN background, BLACK lettering ") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((17.0 631.5 366 15)) BLACK)) ((0.05 12.0 (PRI 20)) (TEXT (264.0 . 92.0) ("D. Free Menu ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((228.0 89.0 72 12)) BLACK)) ((0.05 12.0 (PRI 21)) (TEXT (268.0 . 68.0) ("E. Error System ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((228.0 65.0 80 12)) BLACK)) ((0.05 12.0 (PRI 22)) (TEXT (256.0 . 192.0) ("A. The Exec ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((226.0 189.0 60 12)) BLACK)) ((0.05 13.0 (PRI 23)) (TEXT (328 . 664) ("Point size: 10 " "Font : Modern ") 1 (CENTER BASELINE) (MODERN 12 (BOLD ITALIC REGULAR)) ((289.0 667.0 78 13) (285.0 654.0 86 13)) BLACK)) ((0.05 12.0 (PRI 24)) (TEXT (240.0 . 420.0) ("Preface ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((221.0 417.0 38 12)) BLACK)) ((0.05 12.0 (PRI 25)) (TEXT (272 . 372) ("2. Notes and Cautions ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((220.5 369.0 103 12)) BLACK)) ((0.05 12.0 (PRI 26)) (TEXT (244.0 . 40.0) ("Index ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((229.5 37.0 29 12)) BLACK)) ((0.03847551 11.54265 (PRI 27)) (TEXT (110.9365 . 707.4918) ("") 0.7695101 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((110.8095 703.717 0.0 11.54265)) BLACK)) ((0.038475506 10.773141 (PRI 28)) (TEXT (149.7169 . 319.9311) ("BANK 2") 0.7695101 (CENTER BASELINE) (MODERN 12 (MEDIUM REGULAR REGULAR)) ((132.35573 317.80768 35.397465 10.773141)) BLACK)) ((0.05 13.0 (PRI 29)) (TEXT (212.0 . 312.0) (" ") 1 (CENTER BASELINE) (MODERN 10 (MEDIUM REGULAR REGULAR)) ((210.0 308.5 4 13)) BLACK)) ((0.05 12.0 (PRI 30)) (TEXT (228.0 . 288.0) (" ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((227.0 285.0 2 12)) BLACK)) ((0.12 64.0 (PRI 31)) (BOX (88.0 184.0 120.0 128.0) (ROUND 1 BLACK) NIL 1 (NIL NIL NIL))) ((0.0 52.0 (PRI 32)) (WIRE ((208.0 . 288.0) (192.0 . 288.0) (192.0 . 184.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 183.0 18.0 106.0) NIL)) ((0.0 8.0 (PRI 33)) (WIRE ((192.0 . 264.0) (208.0 . 264.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 263.0 18.0 2.0) NIL)) ((0.0 8.0 (PRI 34)) (WIRE ((192.0 . 240.0) (208.0 . 240.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 239.0 18.0 2.0) NIL)) ((0.0 8.0 (PRI 35)) (WIRE ((192.0 . 216.0) (208.0 . 216.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 215.0 18.0 2.0) NIL)) ((0.05 15.0 (PRI 36)) (TEXT (105.0 . 703.0) ("TYPE: MAJOR") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((59.0 698.5 92 15)) BLACK)) ((0.05 15.0 (PRI 37)) (TEXT (113.0 . 687.0) ("TAB SIZE: 2-3/8%"") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((58.5 682.5 109 15)) BLACK)) ((0.05 15.0 (PRI 38)) (TEXT (125.0 . 671.0) ("NO. TABS PER BANK: 5") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((49.5 666.5 151 15)) BLACK)) ((0.05 15.0 (PRI 39)) (TEXT (113.0 . 656.0) ("NO. OF BANKS: 1") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((56.0 651.5 114 15)) BLACK)) ((0.05 15.0 (PRI 40)) (TEXT (200.0 . 636.0) ("COLOR OF TABS: GREEN background, BLACK lettering ") 1 (CENTER BASELINE) (MODERN 14 (BOLD ITALIC REGULAR)) ((17.0 631.5 366 15)) BLACK)) ((0.05 13.0 (PRI 41)) (TEXT (116 . 608) ("Point size: 10 " "Font : Modern ") 1 (CENTER BASELINE) (MODERN 12 (BOLD ITALIC REGULAR)) ((77.0 611.0 78 13) (73.0 598.0 86 13)) BLACK)) ((0.05 12.0 (PRI 42)) (TEXT (196 . 540) ("Tick marks indicate hole placement: " "3-hole punch, 5/16%" diameter holes " " " "1st hole centered: 1 3/16%" from top of page, 7/16%" in from side " "2nd hole centered: 5 7/16%" from top of page, 7/16%" in from side") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((111.5 561.0 169 12) (112.5 549.0 167 12) (196.0 537.0 0 12) (50.0 525.0 292 12) (44.0 513.0 304 12)) BLACK)) ((0.05 12.0 (PRI 43)) (TEXT (200.0 . 512.0) ("" "3rd hole centered: 9 11/16%" from top of page, 7/16%" in from side ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((200.0 515.0 0 12) (47.0 503.0 306 12)) BLACK)) ((0.05 12.0 (PRI 44)) (TEXT (344.0 . 528.0) ("" "" "") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((344.0 537.0 0 12) (344.0 525.0 0 12) (344.0 513.0 0 12)) BLACK)) ((0.05 12.0 (PRI 45)) (TEXT (44.0 . 516.0) ("" "") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((44.0 519.0 0 12) (44.0 507.0 0 12)) BLACK)) ((0.05 12.0 (PRI 46)) (TEXT (104 . 248) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 245.0 6 12)) BLACK)) ((0.05 12.0 (PRI 47)) (TEXT (104 . 296) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 293.0 6 12)) BLACK)) ((0.05 12.0 (PRI 48)) (TEXT (104 . 204) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 201.0 6 12)) BLACK)) ((0.05 12.0 (PRI 49)) (TEXT (100.0 . 248.0) (" ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((97.0 245.0 6 12)) BLACK)) ((0.05 12.0 (PRI 50)) (TEXT (96 . 564) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((93.0 561.0 6 12)) BLACK)) ((0.12 64.0 (PRI 51)) (BOX (88.0 32.0 120.0 128.0) (ROUND 1 BLACK) NIL 1 (NIL NIL NIL))) ((0.05 12.0 (PRI 52)) (TEXT (104.0 . 96.0) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 93.0 6 12)) BLACK)) ((0.05 12.0 (PRI 53)) (TEXT (104.0 . 144.0) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 141.0 6 12)) BLACK)) ((0.05 12.0 (PRI 54)) (TEXT (104.0 . 52.0) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 49.0 6 12)) BLACK)) ((0.05 12.0 (PRI 55)) (TEXT (100.0 . 96.0) (" ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((97.0 93.0 6 12)) BLACK)) ((0.038475506 10.773141 (PRI 56)) (TEXT (148.0 . 168.0) ("BANK 3") 0.7695101 (CENTER BASELINE) (MODERN 12 (MEDIUM REGULAR REGULAR)) ((130.04721 165.44467 35.397465 10.773141)) BLACK)) ((0.0 52.0 (PRI 57)) (WIRE ((208.0 . 136.0) (192.0 . 136.0) (192.0 . 32.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 31.0 18.0 106.0) NIL)) ((0.0 8.0 (PRI 58)) (WIRE ((192.0 . 112.0) (208.0 . 112.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 111.0 18.0 2.0) NIL)) ((0.0 8.0 (PRI 59)) (WIRE ((192.0 . 88.0) (208.0 . 88.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 87.0 18.0 2.0) NIL)) ((0.0 8.0 (PRI 60)) (WIRE ((192.0 . 64.0) (208.0 . 64.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 63.0 18.0 2.0) NIL)) ((0.03847551 10.77314 (PRI 61)) (TEXT (149.7169 . 471.9311) ("BANK 1") 0.7695101 (CENTER BASELINE) (MODERN 12 (MEDIUM REGULAR REGULAR)) ((133.49548 469.7497 33.08893 10.77314)) BLACK)) ((0.12 64.0 (PRI 62)) (BOX (88.0 336.0 120.0 128.0) (ROUND 1 BLACK) NIL 1 (NIL NIL NIL))) ((0.0 52.0 (PRI 63)) (WIRE ((208.0 . 440.0) (192.0 . 440.0) (192.0 . 336.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 335.0 18.0 106.0) NIL)) ((0.0 8.0 (PRI 64)) (WIRE ((192.0 . 416.0) (208.0 . 416.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 415.0 18.0 2.0) NIL)) ((0.0 8.0 (PRI 65)) (WIRE ((192.0 . 392.0) (208.0 . 392.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 391.0 18.0 2.0) NIL)) ((0.0 8.0 (PRI 66)) (WIRE ((192.0 . 368.0) (208.0 . 368.0)) (ROUND 1 BLACK) NIL NIL 1 (191.0 367.0 18.0 2.0) NIL)) ((0.05 12.0 (PRI 67)) (TEXT (104.0 . 400.0) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 397.0 6 12)) BLACK)) ((0.05 12.0 (PRI 68)) (TEXT (104.0 . 448.0) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 445.0 6 12)) BLACK)) ((0.05 12.0 (PRI 69)) (TEXT (104.0 . 356.0) ("x") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((101.0 353.0 6 12)) BLACK)) ((0.05 12.0 (PRI 70)) (TEXT (100.0 . 400.0) (" ") 1 (CENTER BASELINE) (MODERN 10 (BOLD REGULAR REGULAR)) ((97.0 397.0 6 12)) BLACK))) (0.0 174.0 728.0 583.0) 1.0 4 (PAGE NIL (PAPERSIZE NIL) (0 0 612 792) ((TEXT NIL NIL (0 0 612 792) NIL))),?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) +-o SKIO.GETFN.2-ozº \ No newline at end of file diff --git a/docs/ReleaseNote/TABSLAYOUTL.SKETCH b/docs/ReleaseNote/TABSLAYOUTL.SKETCH new file mode 100644 index 0000000000000000000000000000000000000000..22f5510c7e23898b662c242410df3371f00587b7 GIT binary patch literal 7652 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 literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/Titlepage.tedit b/docs/ReleaseNote/Titlepage.tedit new file mode 100644 index 0000000000000000000000000000000000000000..493131a0bf39142a82a28c804a5757cfd391cfad GIT binary patch literal 6183 zcmeHKUvJyi6~D65vR%Sx=vrV;)&T|#GUf=9|1~ZGYqCt+8e}Pu7|-iVLrd2-7n#&Z zDz*kgcF+&853;vCDcEbDGGN%Ff_?!3d6zf9L+r|8ps3 zDT8YTK;7YuChtI%H@V?*$fh$Wtnrq|kN3F)kX?QFP|d2U3M!O}wZ~A^N?N|A0hBAc zRs&??zhEJUv0pP>E%s*?^S@84PhkZs?)&|4&sZXYauI|HOqi%9AyktPs!0gJ1d-YV zk=g|1B8b3fF(%Z;NT`ibZnUF6j7h+csQHxJWU<_2k9sojWpBP8QS&2e5v}hUoXY_W zBWMsoy$E758b;6{f_f3eWHgMRK?L<8D4aA=VpI#3C^4!9E9c|tg@^$5HCW%4T0e9k zyakURr%o!yTes)($q#Gl#4wGgPM}^m2Lgpayhp~vD$rO>ps|`jV>Ln(H9`|LLj4F+ zF68%WKZ){(yNg{amuL9v@YkV#seBzDD*vM23PQ;@%2n*&{sqgi0U|$<7@?<(t>x}3 z_`}^}xeG*(lC#PS|2#wqM8hPZezJF#SW{jSN?!DH{WAs8WkR6yL03Yj66*B^r`>p0 zc`cZP&Lb!nqQuLWgR^Vs%aNWqOJ0QNH8PXEtH5UB^^5B$(f57w_egpD<)9m)uJSdZ zL2%{^qztZD44J<22G5jB8O0|kKIq1W!C5!{22pI-6?%^ZGDe8S|A}W$ue!{jY_B0d zHaL6Q?J`k`xIpJ!_L7*fD?DrE)}kmDIg`+7axMNM&|`zs)8wp#&SsNJjLz5MVluYmhJpQ`k&sxFD|*y|sxpsEGC)p5+jBM;zj;v*LJ zJ0Jpvg6*_yM?{)d^UWp*o(q^Dcb;<$Rn@HLwhN{U26&Fq;KzpZ4D164{*x`q!>v4xSqCNyC5@h&&eeLguVyU&Zb&Ex0z>ZmWY`23Bk6kEQ^|ZR7 z6<*E5ZhnuRJ2iY7Rs(kRY$o#x42NSqrUP`T3LEC3=^0JX{?ImC)b&WT>XUMD@0N)2 z`Y&}@=UDrau}{6Q9h19hscS9A_IRD92~4ZrY&WNU3Q) z<2VswFm=SHbznOfNe~%Qu=9=4^iyNq_WtiNaJ(Q;KQgRC4kxB}WVb!AY|pH7Vc11M zvq2Kr=Xj|s*K^t!CsCTG$k$C5)tz!r--eebJqYKf((9C_aX?h(%KNviEbR65kH^7nM zp|=hgtrj<&w5sz{4^A+S6UX#C424RF?P#>?m>N}K@&S$LT&KK^szzL#Z3cHAG}VB9~f9qtU2u14enTJ`u``ccnaSjI;2vM^IIB}izUF_ zW35^%ey%}@V{8s=R!YT6vAkJvO30zoZ&O_^!!H7hsg^;>x=wE9w52ELQLK&d$w=k$#VTz~M7ej~MicUoD=f}@GxxzLhDW4H+?j@CJElv3VZdLpuVR;sOwQaIFp`if z7IHJ}Rj|L|xlS^P8&K}j6&PJJc2~NRH&`g#ZsDF}Vc`Z7B)WsW_=G8iQodFz7J|kI zswBJ@=*}>idH*KiM`Pi~?ERg}hE^@JpO0l*Y&Er^ZRVep^vz0Hhb+BQO1qj~#4jm) zN3B<@I8a;p!ge0;y?~=t-6@vyB?NP962!!`7$a;9V;`|QrOH+%bcQacSP|JIP>ODb zDfs-5wzLTapU_qo{8ScvAb2r$cf0zeq@}kseX|_9(JgkG6oq~C^&akpAP7GYU=D0l z{XpqjgEch9bWx!uSejh^tC42`RM|*JN=#JtOL1KKQId&%MCZCAm zCMV+)QD%||n#>(1HFc6ey2x&9g$xo9R5^)MNDUd|*hoP1h;;(Ll2u6X;JRQr6eMXQ z42+DegeOyx?S&^1e?(giPo{MK^wyIpBmZ@?VzZ%>utG0FfoM&bod_<-^8P>A7k~WA Fe*h9K?Oy-@ literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/bindercover.sketch b/docs/ReleaseNote/bindercover.sketch new file mode 100644 index 0000000000000000000000000000000000000000..3ca844eebd7238933f2bba8123e6101c0ee0c501 GIT binary patch literal 4100 zcmcIn+iu%N5OtIGrKr&l=*z%B01|K%F1frYEnLvjS|&`B0!bTA-|EyzjTUa;^rbEO zWBt0Gnbnd~OkWz;0wj{l)$YukGiPQ!uRSu|?2umkWtyUW@%MN0dbW3L=B0VF*O;=Z zJJas%7uDP}v-;FD6FdJ~MR;h7x}u1dP0{4l!Vr0BND~Ttva@D&)tR#n<6cvrRC7|a zU*@wTA0vx=c9@e2aEtAVlVfVk;-t(QclCMJ%wUCv_Vd=1MP+2@q&dY_Dw_n9`BW99 zeEYffFFez|!qum)pQ-pxR`-I5ibJAM^J3(|5mNGIzdpmWN_aTnA3c?OOrO9#TKN+= ze|RfWvdH?bZkIr3M6s+On?&-0V`Ddp6_zE+#0+I0*e2d-=g^d=rYmOo_72g`eqGL~ z=<>3d?clZDvor@C4UQkzfUDXFuKmYGY`xX4cE32neBRHE25eHC@u+Xzyv6N}IQJgM zuuV%qII6mL7>lTYUraC|aXz+7pi5r(QoYhtRI@|>_2AtI30CX@cAf-ej5}Uv!xyk%7aNMpOB1!;G$lJM5;ZmCN=%<1c z_uyo`!wgQs-U6H?a4zOeR~!_xA};|=XUeizm}+LIebaX4xCKxOe;h%{@lZRMMjeeN z;7UA=aS0ZkQUL$)hjT)J; zk$M{9qC&)-GuUbw@9B&jVydi;tmIGW730&DeC#}JOv9ATP5AdgAr%^tx3V@0R}^49 zvLStR03*fta+<|7y)AqL#uDG&Akkr_WN#3o`kGFFFST7>>lC#i1VInF1MY!6KZqNnRc$1$0!#2w`d*~3<{ zlUji(H&~*i+HiPR)y4|rdbx?D6s!_mF%%5JNA;773@6=avEg)CVRkCiHtwWs3tk}Xk+lchJO!(Yy5&17Y}KB!cBoKufWRJWkxk#gjfE1+RPoF}W{zp%;AF_1M9;)XLM&8tD)U&=BThWz zAAV6sMv@POp0R=v+>|6kSF)<~wna+<+c=15BM43fO?6tgROQF!Raq};Iy8-up3HlH z{oDDE=fD0zAAY}l`^&|(zv;=)ncb}Yqlu(ru^HB{I(H>r57Q+}C&P4T820s;vC!uCL2KCubjz<^d2gX7?B)+Ly@rUr5XgBZx!K&VG#@p^#b z-`QU(p&AGm%V}nTiGRMJ|%Pj7eeB}K>9)0rg zPfAeG(CL!Ko@Y$dL{0mBtSv>#% literal 0 HcmV?d00001 diff --git a/docs/ReleaseNote/indexbase.tedit b/docs/ReleaseNote/indexbase.tedit new file mode 100644 index 00000000..7097b145 --- /dev/null +++ b/docs/ReleaseNote/indexbase.tedit @@ -0,0 +1,146 @@ + 1 1 1 1 INDEX 1 INDEX 1 1 INDEX 1 INDEX INDEX 6 A Abort (Editor Command) B.7 ACCESS 3.38 Add-Command (Function) B.14 add.process (Function) 4.12; 7.12 ADDMENU (Function) 4.24 ADDTOSCRATCHLIST (Function) 4.1 ADVICE (File Manager Command) 3.15 ADVINFOLST (Variable) 3.14 ADVISE (File Manager Command) 3.15 ADVISE (Function) 3.13,15 ADVISEDFNS (Variable) 3.14 ADVISEDUMP (Function) 3.14 Advising 3.14; 7.9 AFTERDOMAKESYS 4.7 AFTERDOSAVEVM 4.7 AFTERDOSYSOUT 4.7 AFTERLOGOUT 4.7 AFTERLOGOUTFORMS 4.7 AFTERMAKESYS 4.7 AFTERSAVEVM 4.7 AFTERSYSOUT 4.7 AGAIN (Editor Command) B.8 ALL (Event Address) A-5 ALLOWED.LOGINS 4.6 append (Function) with non-list argument 7.8 Application Menus D.1 APPLY-format input A-3 ARCHIVEFLG (Variable) 3.9 ARCHIVEFN (Variable) 3.9 Arglist (Editor Command) B.9 AROUNDEXITFNS (Variable) 4.7 array reference 7.4 arrays 3.3 ASKUSER (Function) 4.16 assert (Macro) E.10 Attach Menu (Editor Command) B.11 Attached Windows 4.28 AUTHENTICATE 4.6 AUTHENTICATION.NET.HINT (Variable) 4.33 AUTOHARDRESETFLG 4.5 B back-quote facility 3.49 BACKGROUND (FreeMenu Group Property) D.8 BACKGROUND (FreeMenu Item Property) D.10 BACKGROUNDFNS (Variable) 4.12 BACKSPACE (Editing Command) A-21 BCOMPL (Function) 3.22,25; 4.10 BEEPON (Function) 4.31 BEFORELOGOUT 4.7 BEFOREMAKESYS 4.7 BEFORESAVEVM 4.7 BEFORESYSOUT 4.7 BEFORESYSOUTFORMS 4.7 BITMAP (FreeMenu System Property) D.10 BKSYSBUF (Function) 4.30 BKSYSCHARCODE (Function) 4.30 BLOCKRECORD (Record Type) 4.3 BOTTOM (FreeMenu Group Property) D.7 bound E.4 BOUNDP (Function) 3.2 BOX (FreeMenu Group Property) D.5,8 BOX (FreeMenu Item Property) D.10 BOXSHADE (FreeMenu Group Property) D.8 BOXSHADE (FreeMenu Item Property) D.10 BOXSPACE (FreeMenu Group Property) D.8 BOXSPACE (FreeMenu Item Property) D.10 break (Function) 3.13; E.13 break commands 3.13 Break packages 3.9 BREAK0 (Function) 3.13 BREAK1 (Function) 3.9 BREAKCONNECTION (Function) 4.14 BREAKIN (Function) 3.13 breaking 7.9 BREAKREGIONSPEC (Variable) 4.8 BRECOMPILE (Function) 3.22,25 BRKINFOLST (Variable) 3.13 BROKENFNS (Variable) 3.13 bulk data transfer 4.34 C Catch errors 3.10 ccase (Macro) E.10 cerror (Function) E.9 Change Print Base (Editor Command) B.11 CHANGEBACKGROUND (Function) 4.31 CHANGEFONT (Function) 4.23 CHANGESLICE (Function) A-11,17 CHANGESTATE (FreeMenu Item Property) D.11 changing a standard readtable 3.22 characters 3.3 CHARCODE (Function) 3.3 CHCON (Function) 3.42 check-type (Macro) E.10 CL Exec 3.7 CL:* (Variable) A-10 CL:** (Variable) A-10 CL:*** (Variable) A-10 CL:+ (Variable) A-10 CL:++ (Variable) A-10 CL:+++ (Variable) A-10 CL:- (Variable) A-10 CL:/ (Variable) A-10 CL:// (Variable) A-10 CL:/// (Variable) A-10 CL:BREAK (Function) 3.13 CL:CATCH (Function) 3.5 CL:CODE-CHAR (Function) 3 CL:COMPILE-FILE (Function) 3.24-25; 4.10 CL:DEFCONSTANT (Variable) 3.20 CL:DEFINE-MODIFY-MACRO (Function) 3.20 CL:DEFMACRO (Function) 3.20 CL:DEFMACRO (Macro) 3.29 CL:DEFPARAMETER (Macro) 3.26,29 CL:DEFPARAMETER (Variable) 3.20 CL:DEFUN (Function) 3.20 CL:DEFUN (Macro) 3.29 CL:DEFVAR (Macro) 3.29 CL:DEFVAR (Variable) 3.20 CL:ERROR 3.10 CL:EVAL-WHEN (File Package Command) 3.31 CL:GENSYM (Function) 3.2 CL:LOAD (Function) 3.24 CL:MAKE-HASH-TABLE (Function) 3.4 CL:MAPHASH (Function) 3.4 CL:PRIN1 (Function) 3.41-42 CL:PRINC (Function) 3.41 CL:READ (Function) 3.40 CL:READ-PRESERVING-WHITESPACE (Function) 3.41 CL:THROW (Function) 3.5,11 CL:UNWIND-PROTECT 3.6 CL:UNWIND-PROTECT (Function) 3.11 CL:WITH-INPUT-FROM-STRING 3.37 CL:WRITE (Function) 3.41 CLEANUP (Function) 3.25 cleanup forms 3.6 CLEARCLISPARRAY (Function) 4.10 CLEARSTK (Function) 4.5 CLEARSTKLST (Variable) 4.5 CLISP infix forms 3.33 CLISPARRAY 4.2 CLOSEALL (Function) 3.38 closure 7.8 coerce (Function) 7.12 COERCE-TO-NSADDRESS (Function) 4.33 collect (Macro) 7.6 collecting objects macros for 7.6 COLLECTION (FreeMenu Item Property) D.12 COLLECTION property 4.26 COLUMN (FreeMenu Group Property) D.7 COLUMNSPACE (FreeMenu Group Property) D.7 Comment Out Selection (Editor Command) B.9 comment treated as declaration 3.32 Comments in SEdit B.6 Common Lisp strings 3.3 Common Lisp Symbols 3.1 COMMONNUMSYNTAX 3.44 compile-definer (Definer) 7.2 compile-form (Definer) 7.2 compiler behavior with FLETed lexical functions 7.12 behavior with recursion 7.12 ignoring TEdit formatting 7.12 retaining special arguments 7.12 complex numbers 3.4 coms 7.11 condition E.3 conditions:*break-on-signals* (Variable) E.9 conditions:abort (Function) E.21 conditions:compute-restarts (Function) E.18 conditions:continue (Function) E.21 conditions:define-condition (Macro) E.5 conditions:find-restart (Function) E.19 conditions:handler-bind (Macro) E.4,11 conditions:handler-case (Macro) E.11 conditions:ignore-errors (Macro) E.12 conditions:invoke-debugger (Function) E.13 conditions:invoke-restart (Function) E.5,20 conditions:invoke-restart-interactively (Function) E.20 conditions:make-condition (Function) E.6,8 conditions:muffle-warning (Function) E.22 conditions:restart-bind (Macro) E.17 conditions:restart-case (Function) E.5 conditions:restart-case (Macro) E.13 conditions:restart-name (Function) E.19 conditions:signal (Function) E.8 conditions:store-value (Function) E.22 conditions:use-value (Function) E.22 conditions:with-simple-restart (Macro) E.20 CONN (Exec Command) A-7 CONTROL-A (Editing Command) A-21 Control-C (Editor Command) B.7 Control-L (Editor Command) B.7 Control-Meta-; (Editor Command) B.9 Control-Meta-F (Editor Command) B.8 compiler behavior with FLETed lexical functions 7.12 behavior with recursion 7.12 ignoring TEdit formatting 7.12 retaining special arguments 7.12 complex numbers 3.4 coms 7.11 condition E.3 conditions:*break-on-signals* (Variable) E.9 conditions:abort (Function) E.21 conditions:compute-restarts (Function) E.18 conditions:continue (Function) E.21 conditions:define-condition (Macro) E.5 conditions:find-restart (Function) E.19 conditions:handler-bind (Macro) E.4,11 conditions:handler-case (Macro) E.11 conditions:ignore-errors (Macro) E.12 conditions:invoke-debugger (Function) E.13 conditions:invoke-restart (Function) E.5,20 conditions:invoke-restart-interactively (Function) E.20 conditions:make-condition (Function) E.6,8 conditions:muffle-warning (Function) E.22 conditions:restart-bind (Macro) E.17 conditions:restart-case (Function) E.5 conditions:restart-case (Macro) E.13 conditions:restart-name (Function) E.19 conditions:signal (Function) E.8 conditions:store-value (Function) E.22 conditions:use-value (Function) E.22 conditions:with-simple-restart (Macro) E.20 CONN (Exec Command) A-7 CONTROL-A (Editing Command) A-21 Control-C (Editor Command) B.7 Control-L (Editor Command) B.7 Control-Meta-; (Editor Command) B.9 Control-Meta-F (Editor Command) B.8 Control-Meta-O (Editor Command) B.7 Control-P 4.29 CONTROL-Q (Editing Command) A-21 CONTROL-R (Editing Command) A-21 Control-T 4.29 CONTROL-W (Editing Command) A-21 Control-W (Editor Command) B.7 CONTROL-X (Editing Command) A-21 Control-X (Editor Command) B.7 Convert Comments (Editor Command) B.9 Convert-Upgrade (Variable) B.14 converting characters 3.3 Converting old code for use with new Error system E.1 COORDINATES (FreeMenu Group Property) D.7 COPY (Function) 3.49 COPYBYTES (Function) 4.16 COPYDEF (Function) 4.4 COPYFILE (Function) 3.38 COPYREADTABLE (Function) 3.46 COS (Function) 4.3 COURIER.CALL (Function) 4.34 COURIER.OPEN (Function) 4.34 Creating an Exec process A-18 Creating conditions E.4 Creating icons with ICONW C.1 CTRLUFLG 4.18 ctypecase (Macro) E.10 CUHOTSPOTX 4.30 CUHOTSPOTY 4.30 CUIMAGE 4.30 current package 3.45 CURSOR 4.30 Cursor Movement Commands A-22 CURSORBITMAP 4.30 CURSORCREATE (Function) 4.30 CURSORHOTSPOTX 4.30 CURSORHOTSPOTY 4.30 D DA (Exec Command) A-7 DAUGHTERS (FreeMenu Group Property) D.8 DC (Function) 3.18 Declining by Condition handler E.4 DEdit 3.15 Default handlers 3.10 Default-Commands (Function) B.15 DEFAULT.OSTYPE (Variable) 4.15 DEFAULTFONT (Variable) D.7 DEFAULTICONFN (Variable) 4.25 DEFAULTTEXTICON (Variable) C.3 deferredconstant (Function) 7.12 define-file-environment (Definer) 7.2 define-record (Definer) 7.3 Defining New Terms A-11 DEFMACRO (Macro) 3.5 defstruct (Macro) 7.4 warning 7.6 DELDEF (Function) 3.28 Delete Selection (Editor Command) B.7 Delete Structure (Editor Command) B.8 Delete Word (Editor Command) B.7 DELFILE (Function) 3.38 DESELECT (FreeMenu Item Property) D.12 DF (Function) 3.18 DFASL files 2.1 DFNFLG (Variable) 3.27 DIR (Exec Command) A-7 DISPLAY (FreeMenu Item) D.6-7,14 Display icons C.1 DISPLAY item 4.26 DISPLAYFONTDIRECTORIES (Variable) 4.23 DMACRO (Property) 3.5 DMACROs 2.1 DO-EVENTS (Exec Command) A-8 DOCOLLECT (Function) 4.1 DOSHAPEFN (Window Property) 4.25 DOWNFN (FreeMenu Mouse Property) D.10 DP (Function) 3.18 DRAWARC (Function) 4.19 DRAWLINE (Function) 4.19 DRAWPOLYGON (Function) 4.20 DSPCLEOL (Function) 4.18 DSPFONT 4.16 DSPRUBOUTCHAR (Function) 4.18 DSPSCALE 4.19 dummy definitions 3.17 DV (Function) 3.18 DWIMIFYCOMPFLG (Variable) 3.34 E ecase (Macro) E.10 ECHOCHAR (FreeMenu Item Property) D.13 ED (Function) 3.16 Edit (Editor Command) B.9 EDIT (FreeMenu Item) 4.27; D.13 Edit caret in SEdit B.2 Edit Interface 3.18 EDITBM (Function) 4.18 EDITCALLERS (Function) 3.19 Editing Exec Input A-20 Editing Lisp Code in Memory B.1 Editing VALUES 3.18 EDITMODE (Function) 3.16 EDITSTART (FreeMenu Item) 4.27; D.14 END-OF-FILE (Error Type) 3.12 ENDCOLLECT (Function) 4.1 Ending an SEdit session B.2 ENDOFSTREAMOP 3.38 ENVAPPLY 3.6 ENVEVAL 3.6 EQUAL (Function) 3.26 EQUALALL (Function) 4.3 ERROR (Function) 3.10 error (Function) E.9 Error conditions 3.10 error system 3.10 Error system differences between old and new E.1 Error system proposal E.1 Error type mapping 3.11 Error type name 3.11 Error type number 3.11 ERROR! (Function) 3.10 ERRORMESS (Function) 3.10 ERRORMESS1 (Function) 3.10 ERRORN (Function) 2.2; 3.10 Errors definition of E.3 ERRORSET 3.10 ERRORSTRING (Function) 3.10 ERRORTYPELIST 3.10 ERRORTYPELIST (Variable) 2.2 ERSETQ (Function) 3.10; 4.8 ERXM 3.10 ESCAPE (Editing Command) A-21 Escape in SEdit B.6 Establishing handlers within dynamic context E.4 etypecase (Macro) E.10 Eval (Editor Command) B.9 EVAL-format input A-2 Exec Editing Commands A-22 Exec type A-4 EXEC-EVAL (Function) 3.9 EXPAND (Editor Command) B.9 EXPANDBITMAP (Function) 4.18 EXPANDMACRO (Function) 3.5 EXPANDREGIONFN (Window Property) 4.24 EXPLICIT (FreeMenu Group Property) D.7 export (Function) 7.9 Extract (Editor Command) B.9 F F (Event Address) A-5 features new Common Lisp 7.1 FETCH 3.33 File Manager 3.19 file-reading functions 3.20 FILEPKGCOM (Function) 4.9 FILEPKGTYPE (Function) 4.9 FILEPKGTYPES (Variable) 3.16 FILEPOS (Function) 4.16 FILERDTBL 3.22 files containing bitmaps 3.31 FILES? (Function) 3.28 FILETYPE (Property) 3.25 FILLPOLYGON (Function) 4.19-20 FIND (Editor Command) B.8 Find Gap (Editor Command) B.8 FIND-READTABLE (Function) 3.45 FINDCALLERS (Function) 3.19 FIX (Exec Command) A-8 FIXP (Predicate) 3.4 flet (Special form) 7.4 floating point 3.4 FLOATP (Predicate) 3.4 FM.BACKGROUND (FreeMenu Window Property) D.15 FM.CHANGELABEL (FreeMenu Function) D.16 FM.CHANGELABEL (Function) 4.27-28 FM.CHANGESTATE (FreeMenu Function) D.16 FM.CHANGESTATE (Function) 4.28 FM.DONTRESHAPE (FreeMenu Window Property) D.15 FM.EDITITEM (FreeMenu Function) D.17 FM.EDITP (FreeMenu Function) D.17 FM.ENDEDIT (FreeMenu Function) D.17 FM.FIXSHAPE (Function) 4.28 FM.FORMATMENU (Function) 4.26-27 FM.GETITEM (Function) 4.27 FM.GETITEM (FreeMenu Function) D.15 FM.GETSTATE (FreeMenu Function) D.16 FM.GETSTATE (Function) 4.27 FM.GROUPPROP (FreeMenu Macro) D.7,18 FM.HIGHLIGHTITEM (FreeMenu Function) D.17 FM.HIGHLIGHTITEM (Function) 4.28 FM.ITEMFROMID (Function) 4.27 FM.ITEMPROP (FreeMenu Macro) D.18 FM.MAKEMENU (Function) 4.26-27 FM.MENUPROP (FreeMenu Macro) D.7,19 FM.NWAYPROP (FreeMenu Macro) D.19 FM.NWAYPROPS (Macro) 4.27 FM.PROMPTWINDOW (FreeMenu Window Property) D.15 FM.READSTATE (Function) 4.27 FM.REDISPLAYITEM (FreeMenu Function) D.18 FM.REDISPLAYMENU (FreeMenu Function) D.18 FM.RESETGROUPS (FreeMenu Function) D.17 FM.RESETMENU (FreeMenu Function) D.17 FM.RESETSHAPE (FreeMenu Function) D.17 FM.RESETSHAPE (Function) 4.28 FM.RESETSTATE (FreeMenu Function) D.17 FM.SHADE (FreeMenu Function) D.18 FM.SHADE (Function) 4.28 FM.SHADEITEM (Function) 4.28 FM.SHADEITEMBM (Function) 4.28 FM.SKIPNEXT (FreeMenu Function) D.17 FM.TOPGROUPID (FreeMenu Function) D.18 FM.WHICHITEM (FreeMenu Function) D.18 FONT (FreeMenu Group Property) D.7 FONT (FreeMenu Item Property) D.9 font descriptor 4.22 FONTCHANGEFLG (Variable) 4.23 FONTCREATE (Function) 4.22 FONTSAVAILABLE 4.21 FOR 3.33 FOR (Exec Command) A-6 FORGET 4.6 FORGET (Exec Command) A-8 FORMAT (FreeMenu Group Property) D.4,7 Free Menu How to make a D.1 Free Menu format D.2 Free Menu layout D.1 FREEMENU (FreeMenu Function) D.15 FREEMENU (Function) 4.26-27 FROM (Event Address) A-5 FULLNAME (Function) 3.37 FUNARG 4.4 G Gaps in SEdit B.4 garbage collector 4.11 gensym (Function) 3.2; 7.12 GET-ENVIRONMENT-AND-FILEMAP (Function) 3.23 Get-Prompt-Window (Function) B.15 Get-Selection (Function) B.16 Get-Window-Region (Function) B.13 GETDEF (Function) 3.28 GETFILEINFO (Function) 3.38; 4.13 GETPROMPTWINDOW (Function) 4.28 GETREADTABLE (Function) 3.39 GETSYNTAX 3.45 global macro shadowing 7.4 GROUP (FreeMenu Group Property) D.7 GROUPID (FreeMenu System Property) D.10 H handler (Function) E.4 Handling conditions E.3 HARDCOPYW (Function) 4.29 HARDRESET (Function) 4.4 HASDEF (Function) 3.26,28; 4.9 hash arrays 3.4 HASHARRAY 3.4 HASHARRAY (Function) 4.2 HELDFN (FreeMenu Mouse Property) D.10 HELP (Editor Command) B.9 HELP (Function) 3.10 Help Menu Commands B.11 HIGHLIGHT (FreeMenu Item Property) D.9,14 History list A-16 HISTORYSAVEFORMS (Variable) 3.9 HJUSTIFY (FreeMenu Item Property) D.4,9 HORRIBLEVARS 4.9,15 HPRINT (Function) 4.15 I ICONW (Function) C.1 ICONW windows from an image defined by a mask C.1 with titles C.1 ICONW.SHADE (Function) C.2 ICONW.TITLE (Function) C.2 ID (FreeMenu Group Property) D.7 ID (FreeMenu Item Property) D.9 IDLE.PROFILE 4.6 IDLE.RESETVARS (Variable) 4.6 IDLE.SUSPEND.PROCESS.NAMES (Variable) 4.7 IEEE 802.3 specification 4.34 IF 3.33 IL Exec 3.7 IL:IT (Variable) A-9 IL:LOAD (Function) 3.24 IL:MAPHASH (Function) 3.4 IL:PRIN1 (Function) 3.41 IL:PRIN2 (Function) 3.41 IL:READ (Function) 3.40 ILLEGAL-GO (Error Type) 3.11 ILLEGAL-RETURN (Error Type) 3.11 ILLEGAL-STACK-ARG (Error Type) 3.12 IN (Exec Command) A-6 in-package (Function) 7.8 INFILEP (Function) 3.37 INFINITEWIDTH (FreeMenu Item Property) D.13 INITSTATE (FreeMenu Item Prop) 4.26 INITSTATE (FreeMenu Item Property) D.9,12 INPUT (Function) 3.37 INPUTFONT (Variable) A-10 Inspect (Editor Command) B.10 INTEGERLENGTH (Function) 4.3 integers 3.4 Interlisp Compiler 3.31 INTERLISP-ERROR (Error Type) 3.12 INTERPRESSFONTDIRECTORIES (Variable) 4.22 INTERRUPTCHAR (Function) 4.29 INVALID-ARGUMENT-LIST (Error Type) 3.12 ITEMS (FreeMenu Group Property) D.8 J Join (Editor Command) B.10 K Keep-Window-Region (Variable) B.13 KEYACTION (Function) 4.31 KEYDOWNP (Function) 4.31 L LABEL (FreeMenu Item Property) D.9 LABELS construct warning 7.10 LASTC (Function) 4.15 Layout of Free Menu D.1 LCOM files 2.1 ldflg 7.11 LEFT (FreeMenu Group Property) D.7 LEFT and BOTTOM (FreeMenu Item Property) D.9 Left mouse button in SEdit B.3 lexical bindings 3.33 Library modules summary of changes 5.1 LIMITCHARS (FreeMenu Item Property) D.3,13 LINKS (FreeMenu Item Property) D.10,15 LISP 3.47 Lisp structures SEdit gaps for B.4 LISPSOURCEFILEP (Function) 4.10 LISPXEVAL (Function) 3.9 LISPXFNS (Variable) A-15 LISPXHISTORY (Variable) A-16 LISPXHISTORYMACROS (Variable) 3.9 LISPXMACROS 3.8 LISPXMACROS (Variable) 3.9 LISPXREADFN (Function) 4.8 LISPXUNREAD (Function) 3.9 LISPXUSERFN (Variable) 3.9 LIST (Function) 3.49 Lists in SEdit B.5 LOAD (Function) 3.20 loadflg (Argument) 7.11 load-time expression 7.4 LOADCOMP (Function) 3.25 LOADFNS (Function) 3.20,25 LOADFROM (Function) 3.25 loading compiled files 3.32 loading Medley files into Lyric 4.10 LOADVARS (Function) 3.25 Locally defined handler E.4 LOCALVARS 3.2 LOGIN.TIMEOUT 4.6 LOGOUT (Function) 4.7 long-site-name (Variable) 7.3 M MACHINETYPE (Function) 4.7 MAKE-READER-ENVIRONMENT (Function) 3.23 MAKEFILE (Function) 3.20,25,43,49 MAKEFILE-ENVIRONMENT (Property) 3.21 MAKESYS (Function) 4.7 MAKETITLEBARICON 4.25 map (Function) 7.11 MAPATOMS (Function) 3.2-3 MAX (Function) 4.2 MAX.INTEGER (Variable) 4.2 MAXHEIGHT (FreeMenu Item Property) D.9 MAXREGION (FreeMenu System Property) D.11 MAXWIDTH (FreeMenu Item Property) D.7,9,13 Medley on Sun workstations 1.1 on Xerox workstations 1.1 Medley compiled files 2.1 Medley enhancements summary 1.1 MENU (FreeMenu Group Property) D.7 MENUFONT (FreeMenu Item Property) D.12 MENUITEMS (FreeMenu Item Property) D.6,12 MENUTITLE (FreeMenu Item Property) D.12 MESSAGE (FreeMenu Item Property) D.9 Meta- ( (Editor Command) B.10 Meta- ) (Editor Command) B.10 Meta- / (Editor Command) B.9 Meta-9 (Editor Command) B.10 Meta-; (Editor Command) B.9 Meta-A (Editor Command) B.7 Meta-B (Editor Command) B.11 Meta-Control-C (Editor Command) B.7 Meta-Control-S (Editor Command) B.8 Meta-Control-X (Editor Command) B.7 Meta-E (Editor Command) B.9 Meta-F (Editor Command) B.8 Meta-H (Editor Command) B.9 Meta-I (Editor Command) B.10 Meta-J (Editor Command) B.10 Meta-M (Editor Command) B.11 Meta-N (Editor Command) B.8 Meta-O (Editor Command) B.9 Meta-P (Editor Command) B.11 Meta-R (Editor Command) B.8 Meta-Return (Editor Command) B.10 Meta-S (Editor Command) B.8 Meta-Space (Editor Command) B.10 Meta-U (Editor Command) B.7 Meta-X (Editor Command) B.9 Meta-Z (Editor Command) B.10 Middle mouse button in SEdit B.3 MIN (Function) 4.2 MIN.INTEGER (Variable) 4.2 minimum window size 4.24 MKSTRING (Function) 3.42 MOMENTARY (FreeMenu Item) D.11 MOTHER (FreeMenu Group Property) D.8 Mouse buttons in SEdit B.3 MOVD (Function) 4.4 MOVEDFN (FreeMenu Mouse Property) D.10 multiple escape character 3.42 Multiple Execs A-4 multiple streams 3.37 MULTIPLE-ESCAPE 3.45 Mutate (Editor Command) B.10 N NAME (Exec Command) A-8 NCHARS (Function) 3.42 NCHOOSE item 4.26 NDIR (Exec Command) A-8 Nesting Free Menu Groups D.2 NETWORKOSTYPES (Variable) 4.15 NEW (MAKEFILE Option) 3.21 NLAMBDA 3.5 NLSETQ (Function) 3.10; 4.8 NOBIND 3.2 NOCLEARSTKLST (Variable) 4.5 NODIRCORE (File Device) 4.13 Normalize Selection (Editor Command) B.10 notational conventions 18 NSADDRESS 4.32 NSNAME 4.32 NSNET.DISTANCE (Function) 4.35 NUMBER (FreeMenu Item) D.14 NUMBERP (Predicate) 3.4 NUMBERTYPE (FreeMenu Item Property) D.14 NWAY (FreeMenu Item) 4.26; D.6; 12 NWAYPROPS (FreeMenu Item Prop) 4.27 NWAYPROPS (FreeMenu Item Property) D.6,12 O OLD-INTERLISP-FILE 3.47 OLD-INTERLISP-T 3.48 once-only (Macro) 7.7 OPENFILE (Function) 3.37 OPENFN (Window Property) 4.25 OPENP (Function) 3.38 OPENSTREAM (Function) 3.11,37 OPENSTRINGSTREAM (Function) 3.37; 4.16 options E.5 ORIG 3.46 OUTPUT (Function) 3.37 P package delimiter 2.2 PACKAGEDELIM 3.47 packages 3.19 PARSE-NSADDRESS (Function) 4.33 PAT (Event Address) A-5 pattern matching 3.6 PEEKC (Function) 4.15 pkg-goto (Function) 7.8 PL (Exec Command) A-8 PLVLFILEFLG 3.42 PP (Exec Command) A-9 PRETTYDEF (Function) 4.9 PRIN1 4.30 PRIN2 4.30 PRINT (Function) 3.20,48 PRINTLEVEL 4.29 PRINTNUM (Function) 4.15 PRINTOUT 3.43 PRINTOUTFONT (Variable) A-11 PRINTSERVICE (Variable) 4.19 process status window 4.12 PROCESS.APPLY (Function) 4.12 PROCESS.EVAL (Function) 4.12 Programmer's interface to SEdit B.12 PROMPT#FLG (Variable) 3.9 PROMPTFONT (Variable) A-10 PROMTPCHARFORMS (Variable) 3.9 PROTECTION 4.13 PRXFLG 3.42 PUTDEF (Function) 3.28 Q Quote (Editor Command) B.10 Quoted structures in SEdit B.5 R RADIX (Function) 3.44 ratios 3.4 READ (Function) 3.20,48 read-eval-print A-1 read/print consistency 3.44 READBUF (Variable) 3.9 READC (Function) 3.41 READER 4.13 READER-ENVIRONMENT 3.20 READLINE (Function) 4.8 READMACROS 4.16 READSYS (Function) 4.35 READTABLEPROP (Function) 3.45 READVISE (Function) 3.14 REALFRAMEP (Function) 4.5 REBREAK (Function) 3.14 RECOMPILE (Function) 3.22,25 record-create (Macro) 7.4 record-fetch (Macro) 7.4 record-ffetch (Macro) 7.4 Redisplay (Editor Command) B.7 Redo (Editor Command) B.8 REDO (Exec Command) A-6 REGION (FreeMenu Group Property) D.8 REGION (FreeMenu System Property) D.11 RELDRAWTO (Function) 4.19 Release Notes organization of 17 REMEMBER (Exec Command) A-8 REMPROP (Function) 3.2 RENAMEFILE (Function) 3.38 REPAINTFN 4.24 REPAINTFN (Window Property) 4.25 REPEATUNTIL 4.3 Replace-Selection (Function) B.16 Reporting a condition or restart E.5 Reset (Function) 3.10; B.14 Reset-Commands (Function) B.15 RESETFORM 3.40 RESETFORM 3.39 RESETFORMS (Variable) 3.9 RESETLST 3.6 Resetting system state 3.11 RESETVARS 4.6 RESHAPEFN 4.24 Restart type E.5 Restarting computations E.3 Restarting conditions E.5 RETAPPLY 3.6 RETEVAL 3.6 RETFROM 3.6 RETFROM (Function) 3.11 RETRY (Exec Command) A-6 RETTO 3.6 RETURN 3.13; 4.5 Reverse Find (Editor Command) B.8 Right mouse button in SEdit B.3 ROTATE-BITMAP (Function) 4.18 ROW (FreeMenu Group Property) D.7 row-major-aref (Function) 7.4 ROWSPACE (FreeMenu Group Property) D.7 RS232 or TTY ports 3.38 S Save-Window-Region (Function) B.13 SAVEVM (Function) 4.7 SCRATCHLIST 4.1 SEdit 3.15 SEdit (Function) B.16 SEdit Command Menu B.12 SEE (Exec Command) A-9 SEE* (Exec Command) A-9 SELECTEDFN (FreeMenu Mouse Property) D.10 Set Package (Editor Command) B.11 SETERRORN (Function) 3.10 SETFILEINFO (Function) 3.38; 4.13 SETREADTABLE (Function) 3.48 SETSTKARGNAME (Function) 4.5 SETSYNTAX 3.45,49 SHAPEW (Function) 4.24 SHH (Exec Command) A-8 SHIFT-FIND (Editor Command) B.8 short-site-name (Variable) 7.3 SHOULDCOMPILEMACROATOMS (Variable) 4.4 SHOULDNT (Function) 3.10 SHOWPARENFLG (Variable) A-25 SHRINKBITMAP (Function) 4.18 SHRINKFN (Window Property) 4.24 SIDE effects of event A-18 Signalling conditions E.3 SIN (Function) 4.3 Sketch summary of changes 6.10 SKIP-NEXT (Editor Command) B.8 SKREAD (Function) 3.41 SORT (Function) 4.1 Special characters in SEdit B.5 Specifying event addresses A-4 Specifying Free Menu Items D.2 stack manipulations 3.5 STACK OVERFLOW (Error Type) 4.4 Stack pointers 3.5 STACK-OVERFLOW (Error Type) 3.11 STACK-POINTER-RELEASED (Error Type) 3.12 Starting an SEdit session B.2 STATE 4.26 STATE (FreeMenu Item) D.7,11 STATE (FreeMenu Item Property) D.12 STATE (FreeMenu System Property) D.10 STKARG (Function) 4.5 STKNARGS (Function) 4.5 STKPOS (Function) 4.5 STOP (Function) 4.10 STOP-UNDOABLY (Macro) A-13 strings 3.3 in SEdit B.6 STRINGWIDTH (Function) 3.42; 4.22 Structure caret in SEdit B.2 Structure editor 3.15 Substitute (Editor Command) B.8 SUCHTHAT (Event Address) A-5 SUSPEND.PROCESS.NAMES 4.7 Switching between editors 3.16 Symbols 3.1,6 in Error system E.1 symbols in the INTERLISP package 3.20 SYSDOWNFN (FreeMenu System Property) D.11 sysload 3.24; 7.11 SYSMOVEDFN (FreeMenu System Property) D.11 SYSOUT (Function) 4.7 SYSPRETTYFLG (Variable) 3.9 SYSSELECTEDFN (FreeMenu System Property) D.11 T TABLE (FreeMenu Group Property) D.7 TCOMPL (Function) 3.22,25; 4.10 TEdit summary of changes 6.1 TeleRaid Library module 4.35 TEXTICON (Function) 4.25; C.3 TIME (Exec Command) A-9 TIME (Function) 3.36 TIME (Macro) 3.36 TITLE (FreeMenu Item) 4.27 titled icons 4.25 TITLEDICONW (Function) C.1 TOGGLE (FreeMenu Item) D.11 TOO-MANY-ARGUMENTS (Error Type) 3.12 TRACE (Function) 3.13-14 TTYBACKGROUNDFNS (Variable) 4.12 TTYDISPLAYSTREAM (Function) 4.25 TTYIN display typein editor 4.16 TTYIN Editor from Exec A-20 TY (Exec Command) A-9 TYPE (Exec Command) A-9 TYPE (FreeMenu Item Property) D.9 U UGLYVARS 3.43; 4.9,15 UNBOUND-VARIABLE (Error Type) 3.12 UNBREAK (Function) 3.14 UNBREAKIN (Function) 3.13 UNDEFINED-CAR-OF-FORM (Error Type) 3.12 UNDEFINED-FUNCTION-IN-APPLY (Error Type) 3.12 UNDO (Editor Command) B.7 UNDO (Exec Command) A-4,8,13 UNDO key (Editing Command) A-21 UNDOABLY-MAKUNBOUND (Function) 3.29 UNDOABLY-SETQ (Function) A-15 Undoing in Functions A-14 Undoing In Programs A-13 Undoing out of order A-16 UNDOSAVE (Function) A-15 UNIXFTPFLG (Variable) 4.14 UNPACKFILENAME (Function) 3.37 UNSAFEMACROATOMS (Variable) 4.4 UNTIL 4.3 USE (Exec Command) A-6 USERDATA (FreeMenu System Property) D.11 USERDATA LIST D.14 USEREXEC (Function) 3.9 USERNAME 4.6 USERWORDS (Variable) A-25 USESILPACKAGE 3.45 Using Execs 3.7 V VALUEFONT (Variable) A-11 VARS 4.15 version delimiter 2.2 VIDEORATE (Function) 4.31 VJUSTIFY (FreeMenu Item Property) D.9 W warn (Function) E.10 WHENCHANGED 4.9 WINDOWPROP (Function) 4.26 WINDOWPROPS 4.26 with-collection (Macro) 7.6 with-input-from-string (Macro) 7.13 with-output-to-string (Macro) 7.13 WITH-READER-ENVIRONMENT (Macro) 3.23 write-string (Function) 7.12 WRITESTRIKEFONTFILE (Function) 4.22 writing macros macros for 7.7 Writing your own SEdit commands B.14 X XCL 3.47 XCL Compiler 3.31 XCL Exec 3.7 XCL readtable 3.21 xcl:*current-condition* (Variable) E.8 XCL:*DEBUGGER-PROMPT* (Variable) A-19 XCL:*EVAL-FUNCTION* (Variable) A-19 XCL:*EXEC-PROMPT* (Variable) A-19 XCL:*PER-EXEC-VARIABLES* (Variable) A-18 XCL:ABORT (Function) 3.10 XCL:ADD-EXEC (Function) A-18 XCL:ARGLIST (Variable) 3.15 XCL:ARRAY-SPACE-FULL (Error Type) 3.12 XCL:ATTEMPT-TO-CHANGE-CONSTANT (Error Type) 3.11-12 XCL:ATTEMPT-TO-RPLAC-NIL (Error Type) 3.11 XCL:CATCH-ABORT 3.10 xcl:catch-abort (Macro) E.21 XCL:CONDITION 3.10 xcl:condition-case (Macro) E.11 xcl:condition-handler (Macro) E.8 xcl:condition-reporter (Macro) E.7 XCL:CONTROL-E-INTERRUPT (Error Type) 3.12 XCL:DATA-TYPES-EXHAUSTED (Error Type) 3.12 XCL:DEF-DEFINE-TYPE (Macro) 3.27-28 XCL:DEFCOMMAND 3.8 XCL:DEFCOMMAND (Macro) A-11 XCL:DEFDEFINER (Function) 3.20 XCL:DEFDEFINER (Macro) 3.29 XCL:DEFGLOBALPARAMETER (Variable) 3.20 XCL:DEFGLOBALVAR (Variable) 3.20 XCL:DEFINE-PROCEED-FUNCTION (Function) 3.20 XCL:DEFINLINE (Function) 3.20 XCL:DEFOPTIMIZER 3.32 XCL:DEFOPTIMIZER (Macro) 3.5 XCL:EXEC (Function) A-18 XCL:EXEC-EVAL (Function) A-19 XCL:EXEC-FORMAT (Function) A-19 XCL:FILE-NOT-FOUND (Error Type) 3.12 XCL:FILE-WONT-OPEN (Error Type) 3.11 XCL:FLOATING-OVERFLOW (Error Type) 3.12 XCL:FLOATING-UNDERFLOW (Error Type) 3.12 XCL:FS-PROTECTION-VIOLATION (Error Type) 3.12 XCL:FS-RESOURCES-EXCEEDED (Error Type) 3.12 XCL:HASH-TABLE-FULL (Error Type) 3.12 XCL:INVALID-PATHNAME (Error Type) 3.12 XCL:SET-DEFAULT-EXEC-TYPE (Function) A-20 XCL:SET-EXEC-TYPE (Function) A-20 XCL:SIMPLE-DEVICE-ERROR (Error Type) 3.11 XCL:SIMPLE-TYPE-ERROR (Error Type) 3.11 XCL:STORAGE-EXHAUSTED (Error Type) 3.12 XCL:STREAM-NOT-OPEN (Error Type) 3.11 XCL:SYMBOL-HT-FULL (Error Type) 3.11 XCL:SYMBOL-NAME-TOO-LONG (Error Type) 3.11 XCL:UNDOABLY (Macro) A-13 XCL:UNDOABLY-SETF (Macro) A-15 \ \#UNDOSAVES (Variable) A-15 \10MBTYPE.3TO10 (Variable) 4.34 \10MBTYPE.PUP (Variable) 4.34 ~ ~C (Format directive) 7.13 ! !EVAL 2.2 " "numeric" print names 3.43 * *break-on-warnings* (Variable) E.10 *Clear-Linear-On-Completion* (Variable) B.14 *Compile-Fn* (Variable) B.16 *COMPILED-EXTENSIONS* (Variable) 3.25 *DEFAULT-CLEANUP-COMPILER* (Variable) 3.25 *DEFAULT-MAKEFILE-ENVIRONMENT* (Variable) 3.21 *Edit-Fn* (Variable) B.16 *ERROR-OUTPUT* (Variable) 3.10 *Fetch-Definition-Error-Break-Flag* (Variable) B.16 *Getdef-Error-Fn* (Variable) B.16 *Getdef-Fn* (Variable) B.16 *LAST-CONDITION* (Variable) 3.10 *LISPXPRINT* (Property) A-18 *NSADDRESS-FORMAT* (Variable) 4.32 *PACKAGE* (Variable) 3.20,45-46; A-1 *PRINT-ARRAY* (Variable) 3.43 *PRINT-BASE* (Variable) 3.39,42,44 *PRINT-BASE* vs RADIX 3.39 *PRINT-CASE* (Variable) 3.44 *PRINT-ESCAPE* (Variable) 3.41,44 *PRINT-LENGTH* (Variable) 4.22 *PRINT-LEVEL* (Variable) 4.22 *PRINT-LEVEL* & *PRINT-LENGTH* vs PRINTLEVEL 3.39 *PRINT-LEVEL* or *PRINT-LENGTH* is exceeded 3.45 *PRINT-RADIX* (Variable) 3.39,44 *READ-BASE* (Variable) 3.20,44 *READ-SUPPRESS* (Variable) 3.41 *READTABLE* (Variable) 3.39,41-42,48 *READTABLE* vs SETREADTABLE 3.39 *REMOVE-INTERLISP-COMMENTS* (Variable) 3.29-30 *STANDARD-INPUT* (Variable) 3.37 *STANDARD-INPUT* vs INPUT 3.39 *STANDARD-OUTPUT* (Variable) 3.37 *STANDARD-OUTPUT* vs OUTPUT 3.39 *Wrap-Parens* (Variable) B.13 *Wrap-Search* (Variable) B.14 . .FONT 4.16 1 10MB Ethernet encapsulation types 4.34 1108 User's Guide summary of changes 6.14 1186 User's Guide summary of changes 6.16 3 3STATE (FreeMenu Item) 4.26; D.11 : :fast-accessors (Defstruct option) 7.5 :inline (Defstruct option) 7.5 :template (Defstruct option) 7.5 :type (Defstruct option) 7.5 = = (Event Address) A-5 ? ? (Exec Command) A-7 ?? (Exec Command) A-7 ?ACTIVATEFLG (Variable) A-24 (SEQUENCE NIL NIL (0 0 0 0) ((PAGE NIL (PAPERSIZE NIL) (0 0 612 792) ((HEADING NIL (HEADINGTYPE RECTOFOOT) (58 22 554 36) NIL) (HEADING NIL (HEADINGTYPE RECTOFOOTRULE) (58 30 554 36) NIL) (HEADING NIL (HEADINGTYPE DRAFTMESSAGE) (200 5 412 36) NIL) (HEADING NIL (HEADINGTYPE TITLEHEAD) (58 761 554 36) NIL) (HEADING NIL (HEADINGTYPE TITLEHEADRULE) (58 757 554 36) NIL) (TEXT NIL NIL (58 54 241 594) NIL) (TEXT NIL NIL (317 54 241 594) NIL))) (ALTERNATE NIL NIL (0 0 0 0) ((PAGE NIL (PAPERSIZE NIL) (0 0 612 792) ((HEADING NIL (HEADINGTYPE DRAFTMESSAGE) (200 775 412 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (58 761 554 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEADRULE) (58 757 554 36) NIL) (HEADING NIL (HEADINGTYPE VERSOFOOT) (58 22 554 36) NIL) (HEADING NIL (HEADINGTYPE VERSOFOOTRULE) (58 30 554 36) NIL) (HEADING NIL (HEADINGTYPE DRAFTMESSAGE) (200 5 412 36) NIL) (TEXT NIL NIL (58 54 241 684) NIL) (TEXT NIL NIL (317 54 241 684) NIL))) (PAGE NIL (PAPERSIZE NIL) (0 0 612 792) ((HEADING NIL (HEADINGTYPE DRAFTMESSAGE) (200 775 412 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (58 761 554 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEADRULE) (58 757 554 36) NIL) (HEADING NIL (HEADINGTYPE RECTOFOOT) (58 22 554 36) NIL) (HEADING NIL (HEADINGTYPE RECTOFOOTRULE) (58 30 554 36) NIL) (HEADING NIL (HEADINGTYPE DRAFTMESSAGE) (200 5 412 36) NIL) (TEXT NIL NIL (58 54 241 684) NIL) (TEXT NIL NIL (317 54 241 684) NIL))))))),K-K TJøø PAGEHEADING TITLEHEADRULEFøø PAGEHEADING TITLEHEADCø PAGEHEADING DRAFTMESSAGEFøø PAGEHEADING RECTOFOOTDø PAGEHEADING RECTOFOOTRULEFøø PAGEHEADING VERSOFOOTDø PAGEHEADING VERSOFOOTRULEDø PAGEHEADING RECTOHEADRULE@ø PAGEHEADING RECTOHEADDø PAGEHEADING VERSOHEADRULE@ø PAGEHEADING VERSOHEAD,KMODERN +MODERN +MODERNMODERNMODERN +  HRULE.GETFN  + HRULE.GETFNMODERN +  HRULE.GETFNMODERN +CREATE.FOLIO.OBJECTMODERN HRULE.GETFNMODERN +CREATE.FOLIO.OBJECT   HRULE.GETFNMODERN +  + HRULE.GETFNMODERN +  HRULE.GETFNMODERN +CREATE.FOLIO.OBJECTMODERN HRULE.GETFNMODERN +CREATE.FOLIO.OBJECT HRULE.GETFNMODERN +                + +              +          +                   +        +        +    + +            +  +         + +  +  + +  +   +        +  +     +   +     +     +       +   ! +    +)      +  + + +  )    +  +      +    +)      +  + + +  )    +  +      +                   +       +  +      !          +  + +        +              +    +    +   +       +       +   +   "       + +     + .  +          +          +    +                    +    +          +  +     +            +                   !        +      +  +                +      +  +        +                +  +    + " +        +                   +           +      +     +           + +         +   +       +  +                   +      +        + + +      + +       "        +   +     +                       +    +       +    +  +     + "  +       +  +  +      +  +     +   +       +  +             + + + +   "             + + + + + +  +     + +      + +              %                /-           #     }©zº \ No newline at end of file From 1659c452b5ea1d7c1cd8189e312bf4c6cd3c20ad Mon Sep 17 00:00:00 2001 From: Larry Masinter Date: Mon, 3 Jul 2023 16:37:59 -0700 Subject: [PATCH 10/25] remove POSTLOADUP from fileset... was removed (#1218) --- sources/FILESETS | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/sources/FILESETS b/sources/FILESETS index 3a7290e7..d9a51911 100644 --- a/sources/FILESETS +++ b/sources/FILESETS @@ -1,15 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "11-Sep-2022 20:08:31" {DSK}larry>medley>sources>FILESETS.;2 6394 +(FILECREATED "23-May-2023 08:11:56" {DSK}larry>il>medley>sources>FILESETS.;24 6239 - :CHANGES-TO (VARS EXPORTFILES) + :EDIT-BY "lmm" - :PREVIOUS-DATE "17-Oct-2021 16:06:59" {DSK}larry>medley>sources>FILESETS.;1) + :CHANGES-TO (VARS 2LISPSET) + :PREVIOUS-DATE " 1-Mar-2023 07:49:03" {DSK}larry>il>medley>sources>FILESETS.;23) -(* ; " -Copyright (c) 1981-1990, 1998, 2021 by Xerox Corporation. -") (PRETTYCOMPRINT FILESETSCOMS) @@ -62,7 +60,7 @@ Copyright (c) 1981-1990, 1998, 2021 by Xerox Corporation. DSK UFS UFSCALLC PASSWORDS FONT LLDISPLAY APUTDQ COMPATIBILITY DMISC CMLMACROS CMLLIST CMLCHARACTER CMLREADTABLE MAIKOLOADUPFNS MAIKOBITBLT MAIKOINIT)) -(RPAQQ 2LISPSET (MACHINEINDEPENDENT POSTLOADUP)) +(RPAQQ 2LISPSET (MACHINEINDEPENDENT)) (RPAQQ 3LISPSET (MACROS DLAP BYTECOMPILER COMPILE)) @@ -162,8 +160,6 @@ Copyright (c) 1981-1990, 1998, 2021 by Xerox Corporation. (FPLUS2) (FTIMES2) (CREATECELL \CREATECELL))) -(PUTPROPS FILESETS COPYRIGHT ("Xerox Corporation" 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 -1998 2021)) (DECLARE%: DONTCOPY (FILEMAP (NIL))) STOP From 4362618ea09026d7a452536bdb8b59564d2b218b Mon Sep 17 00:00:00 2001 From: Bill Stumbo Date: Thu, 6 Jul 2023 11:27:05 -0400 Subject: [PATCH 11/25] Add documentation template (#1257) Copied from Interlisp .github repo. --- .github/ISSUE_TEMPLATE/documentation.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/documentation.md diff --git a/.github/ISSUE_TEMPLATE/documentation.md b/.github/ISSUE_TEMPLATE/documentation.md new file mode 100644 index 00000000..646b38ba --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.md @@ -0,0 +1,17 @@ +--- +name: Documentation problem +about: Problems with this web site? +title: '' +labels: '' + +--- + +**Errors happen. Please tell us the URL** + + +**What does it say?** + + +**What should it say?** + +**Screen shot** From 08852f7b55bb5b89f478bb1f453e2943ab443810 Mon Sep 17 00:00:00 2001 From: Larry Masinter Date: Fri, 7 Jul 2023 11:25:17 -0700 Subject: [PATCH 12/25] Add TEDIT files for many Library packages (#1181) * WHERE-IS library doc * Gather keyboard files, add VIRTUAL.TEDIT * add UNIXCOMM.TEDIT * rest of TEdit library files * save table of contents index for reworking * Don't move around VIRTUALKEYBOARDS files; will move in separate commit * Add MATMULT from Envos/Medley --- library/000docs/000-COVER.TEDIT | Bin 0 -> 1685 bytes library/000docs/001-TITLEPAGE.TEDIT | Bin 0 -> 4149 bytes library/000docs/002-TOC.TEDIT | Bin 0 -> 4734 bytes library/000docs/003-LOF.TEDIT | Bin 0 -> 3635 bytes library/000docs/004-PREFACE.TEDIT | Bin 0 -> 7015 bytes library/000docs/005-INTRO.TEDIT | Bin 0 -> 14687 bytes library/000docs/006-INDEX.TEDIT | 91 +++++++++++ library/CENTRONICS.TEDIT | Bin 0 -> 6294 bytes library/CHARCODETABLES.TEDIT | Bin 0 -> 9686 bytes library/CHAT.TEDIT | 107 +++++++++++++ library/CMLFLOATARRAY.TEDIT | Bin 0 -> 12412 bytes library/COLOR1.TEDIT | Bin 0 -> 50717 bytes library/COLOR2.TEDIT | 236 ++++++++++++++++++++++++++++ library/COPYFILES.TEDIT | Bin 0 -> 12885 bytes library/DATABASEFNS.TEDIT | Bin 0 -> 9613 bytes library/DEDIT.TEDIT | Bin 0 -> 54174 bytes library/EDITBITMAP.TEDIT | Bin 0 -> 44353 bytes library/ETHERRECORDS.TEDIT | Bin 0 -> 8451 bytes library/FILEBROWSER.TEDIT | Bin 0 -> 216971 bytes library/FONTSAMPLE.TEDIT | Bin 0 -> 8844 bytes library/FTPSERVER.TEDIT | Bin 0 -> 7563 bytes library/GCHAX.TEDIT | Bin 0 -> 27218 bytes library/GRAPHER.TEDIT | Bin 0 -> 73297 bytes library/GRAPHZOOM.TEDIT | Bin 0 -> 5767 bytes library/HASH.TEDIT | 33 ++++ library/HASHFILE.TEDIT | Bin 0 -> 27245 bytes library/MASTERSCOPE.TEDIT | 116 ++++++++++++++ library/MATMULT.TEDIT | 31 ++++ library/READNUMBER.TEDIT | Bin 0 -> 13810 bytes library/TCPIP.TEDIT | Bin 0 -> 119144 bytes library/TELERAID.TEDIT | Bin 0 -> 32894 bytes library/TEXEC.TEDIT | Bin 0 -> 10312 bytes library/TEXTMODULES.TEDIT | Bin 0 -> 48369 bytes library/UNIXCHAT.TEDIT | Bin 0 -> 5867 bytes library/UNIXCOMM.TEDIT | Bin 0 -> 5478 bytes library/VIRTUAL.TEDIT | Bin 0 -> 53052 bytes library/WHERE-IS.TEDIT | Bin 0 -> 9599 bytes 37 files changed, 614 insertions(+) create mode 100644 library/000docs/000-COVER.TEDIT create mode 100644 library/000docs/001-TITLEPAGE.TEDIT create mode 100644 library/000docs/002-TOC.TEDIT create mode 100644 library/000docs/003-LOF.TEDIT create mode 100644 library/000docs/004-PREFACE.TEDIT create mode 100644 library/000docs/005-INTRO.TEDIT create mode 100644 library/000docs/006-INDEX.TEDIT create mode 100644 library/CENTRONICS.TEDIT create mode 100644 library/CHARCODETABLES.TEDIT create mode 100644 library/CHAT.TEDIT create mode 100644 library/CMLFLOATARRAY.TEDIT create mode 100644 library/COLOR1.TEDIT create mode 100644 library/COLOR2.TEDIT create mode 100644 library/COPYFILES.TEDIT create mode 100644 library/DATABASEFNS.TEDIT create mode 100644 library/DEDIT.TEDIT create mode 100644 library/EDITBITMAP.TEDIT create mode 100644 library/ETHERRECORDS.TEDIT create mode 100644 library/FILEBROWSER.TEDIT create mode 100644 library/FONTSAMPLE.TEDIT create mode 100644 library/FTPSERVER.TEDIT create mode 100644 library/GCHAX.TEDIT create mode 100644 library/GRAPHER.TEDIT create mode 100644 library/GRAPHZOOM.TEDIT create mode 100644 library/HASH.TEDIT create mode 100644 library/HASHFILE.TEDIT create mode 100644 library/MASTERSCOPE.TEDIT create mode 100644 library/MATMULT.TEDIT create mode 100644 library/READNUMBER.TEDIT create mode 100644 library/TCPIP.TEDIT create mode 100644 library/TELERAID.TEDIT create mode 100644 library/TEXEC.TEDIT create mode 100644 library/TEXTMODULES.TEDIT create mode 100644 library/UNIXCHAT.TEDIT create mode 100644 library/UNIXCOMM.TEDIT create mode 100644 library/VIRTUAL.TEDIT create mode 100644 library/WHERE-IS.TEDIT diff --git a/library/000docs/000-COVER.TEDIT b/library/000docs/000-COVER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a8a18660a0575e0f49065acf48a41c9993bf4da5 GIT binary patch literal 1685 zcmd^--Ad~~5XYxcPpy)h0|!KJ2E8y5ktR)2dl~DtU5IH(qIkS3xJp4=Xwn;>!pHC# zd^%@0t%_A>a_f@p$L#!O=D)j^uG_lq=z8r+jAx=2PBPIRPH$7ZOvUst#qMl$D^Pln zpGAI=co4%>pmk#DHGg(LOS5CNS}jWl+18AJ#|aw7!0$2)d4Mz3y9qZ^>Ha1%}t&AS?&uKr8J6|OK2Mqc6 zZZdrwW~0fN{A~9W-6l3%2OFL#y~(%=E0aj5jxL4xU=wzosH94e?I1b1o`cOg5i-0< zU=hV%wdN(Rs&=%bw&AU+_7l6BS~?3Szk|lSb@hCfI65uUtL#3P443sE3!i zeR*)_rguVvo|Z$)&I^l7^B2NTX$V?uemmyGO=04$5OG9RJr^Rp!o*oYLLSFDXs`oY z3BO=*)W7gUTB$~N^AD=+z>j0zroaoM95uR6*;in@7hMMIq|1^{SosN%*G%4dUsdxm ubayr&alkz>6%PGs>qyPOd)yb-000Hbiy}kh&iud#Y literal 0 HcmV?d00001 diff --git a/library/000docs/001-TITLEPAGE.TEDIT b/library/000docs/001-TITLEPAGE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..c8d4ba694f181c83848177f34b0ad4ed46c6d7ea GIT binary patch literal 4149 zcmd^BO>-JY5FKIpEAqxwik-@_%Q*y6hynzXl}ZjPge9u@DnN?t+ps&p#LF(3*|khg zx#XT}{z`s>PtKpoP3fKmX#rW5bj_Bu?7r!K-LI#6pdnmOOraw@!L@*5E)QVY(J;~> z6!!KCR>8sxZ$-;0S=Qqd;YZ?eUFr$cWnXbMg+|~;p3p$+XhjaT>nfo&IKg-<{7^#} z{9qYZ>sSi~2Z0mO0uN>2TZM9I4{E-PF_q*VbOP>LUG77LD=*MlsMr8|rTlK*Diz9G z<^0R7y`5bQl`dv1t6uB2pE$fj^T1eWKnX&<6K-zKB{gse6?es$tG5sg=1!+V1@AwCSyy5xbtsf@6Qf|O=Ro7t?xDonGGar~DoV7^)7`037hSPS_8Eff@pGJWN|UIJJzfducqDdXP@H?ZYZGYjwb}_D+VZ5xj{n1tF(Al#$}nw^u#wnV?2cu>@#T z-YLQE_RE+)gO0aRysR}&@uq4M4L?)6y>nBw3E!Kk#afi&J@}uB&16hx-)B$pD}}L5 z)@1igtFJM(#*R{E^;5UlUr^?$>lG~8u3w{-;Wv5AYZz14+iuNle>6FuZOTn>uk{iyMErq$So@a| zW$LpDqY>Jg3vKi4WBh!@eV?#|ZEUhZXUyy%V;hM>?+S*>=NX#f5Un^_@@R`|=d z+G)-MFJPCR#E@cN;{7>2#*GsLPm;h>d`aQ*#!&}c{fi=;BKDu zgT$n7bRx+H0;WAE8)BtX#w;d*ui~{!ixrozmo3aspCpF~n*`QZdM?oz=CC79ycRqk zBVcA>PDOy(qa?86@`8wx77Gfffgx!@z{xVOw+v8dLy9AmG7qLJD9kEi&uzY&dl5hs n$IHM^%RqJ+_-h$h5q#(Bt}X07<@d*OFiIQ)-tVyfZ-4&>^2g`L literal 0 HcmV?d00001 diff --git a/library/000docs/002-TOC.TEDIT b/library/000docs/002-TOC.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..4ea2f8d579f24682717b2a25aef2ebc7475c59a1 GIT binary patch literal 4734 zcmeHJ%Wm676s2q@4I8-6v_Xq52I)ou;((-{2D+i8p+uM>*&$^++0oXZAs~qYMW=RG z{epf_Kc%aFMiyQ4-Wf`kL@COn=%ytsiF0_*xz8C|KRk5e*_1f(Wg4Zoq@N70M|}2_ z^!aeaZwccg9?dv0o@q}>Xr4Hfcou1UZb;oQIMhFkzEN-^cvwUmhj6I@zslldqUM3B ze)JOu*k{x-+f;oO$FQ>9ka?X!JG4Dljc)*{X|?)=R}BP$+pX;BA+PqH+b#8)#3H351VrR`+M!{`z!C*flOXHv;PrSZrbB~fOk zX>==W475o`3A!`XY86-0TXcpR5I_ywb)qaff%;n$DO>|mhYn*@*3>!(GDRJ1VjW!dqwFg8+yXW%``05` zLH!tkcoK`8rSD@9a)W*pPcrxj%+SEhPx(xi)6ikbcrD8Z~$-CTO`w24)+!{Uh544amo+BLI7nMe#6)n&2p; zH~cDJw;<(^-(>k#CUY3f2CjVpoy%0%&T18t5=b&0lN^E^&f+w?jz(l&D$`z^W|Rb7f{ao_89M z@{a?vLzvy|g%#57nJkBc0s3w;+Ydp-cF*jqo0_xCq=tCqSoNX5InHK^;J7OgQ z)-__8ecO3Xdek|iq1`r#cSf0GyLcXgM#$__>J6mA07`N9j9&Pr8^Fm!80`)mlaavj ze7abjQw*2%X~!P)F*eHP&IbWyqCi-{Abbv|FWgn2a;$GcbvBj`ieof2qSuMhYLRNA zB01$AH9JsHS+aZ)K8HXo&%;VHAl7TdXp(w;nHSQFP>@6y!2Q%U4^>8b5qZ@GezTtW=l7)h$*HTtwbm!(Fo~Lk z#b!9yhKG-o`+X1I-0s|;Bq)0@whDZgl!rYwaOkrx4K25{#a>LxeLQHL zR|-)8@afm^k!Ij%e||r&3>y*dq zfEd`hTcn6wmVtsrLG;m1(Sk)Gmx4vXOCh-e<z3Y3EA?&J!h->!T4W*sP$u%J=s zTp_UC$rVbt+sn!nZk(V(=({8RY(4$LjO}j2ck3D}6r4tkcCkGQ0B)d_I2IP-Xn-xY NG|>lv^4l-J{|%9o{rUg^ literal 0 HcmV?d00001 diff --git a/library/000docs/003-LOF.TEDIT b/library/000docs/003-LOF.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..dbba8ad9b5967b7a312fbbb4c83cde80c236e0d8 GIT binary patch literal 3635 zcmeHJ-IC%|5I%vO-NiAMT3T9qVY_+(*3MLb2{2`Ok%bdTO(1v@*cmM^GD~(QwGpO5 zaEg5dpJ5-sXYd*J3B1}1FMWW$vC8g*KtN`HW-V_t1H`)WiZ2-CahWri1SZ_TDLGp$h z$Tb9IS@+Lop$CP&d*;bj%CRh19OG70_1lX2t*5K@uQa-hg6TJFvK zAljQt^>BJ33;EjAr z5ib4lXmUx3s;Yd5o=2$%>P}`6jM5NQW3A)E5__pS!kwZ9obO)cA&LD810Tzf@Vh(3)mh|?4~gK z4yqWvp^wT*L*U z0@}_AW{j&6R!(#^tj^ZbVR0&T1d2Ed34S()C-dP^>c>RAdB>z-J&b8@(D|NzAYR%B}bJ# zWlxb8ANd?=u#Xp}wM!<{9vMnc=`t5lZLwMB(5a-o!^xU5&G++O^G z4PPqqf(@l2Vv9&JfvW~&_mg$c6q4W@I7uI}TTN55ZKIjAFLwWk6_$S_*!zhBR%s26 zn@xke6-Len>}J=(KN`J^@Ctipsk*{ek;s^1Z^vhe?RLb#B1_ zm5-I;R}509fH81$p>#V1QV%%=(&AH0>KwkE7TmN8B=i|svcQ*{z$Y&S;+I!eyXj~NvCb*zaj z8A(o>{t7Pm7yJW$!~O^^xMYSIu6kFVbM#>;iPLOhxB*XUzdG;vc;4rHyy|+bW_t0I zOz$vqqBH7-!X3Qjl4q@Qvy};GtiS1bdv}k05*Fj*9quQksmrkH6$-cLOKg)5yfY5 zI7DW0`iRS`H7!6fKhi4RrqvX_y z@^ew(OjI+C2V#!FhL>8wT;rPbeiEzSVO8qr^G%6`vaW3FwHMRMQ=IoIAo{Tz`g$VmAtXKRkuU zN3~b4w113VX}5P&prRt91t?ByhNV!o)E{PEq?mQM3n`if;`O|qfdf0fpC+VodMbSF z$DkC2prVoEstP5APA4k>#_lA<#4}TT+RNY>!6=L-Ss4W6O{TtJEefM#GzZcO&QQJ+ zFA=qPzAqtMbFV=k-8$Nq>mm zh*6GXgP;jF_FlUvkhCEZqnb)HfQI12#8pYmG;Eg;` zD9wk#hPrWhVkc_C!{Zap(*iBglosLF(R_{McLGWCl?D_y`u0JuqC$hNbIEUb|o zhCTqU7T4-Zi})`4NsM#x3k=w?`Lru?)zc;0gJYGrQUuu-lq3;C8zpH8dxv^>*1DjS? z_gXtT^$e4+!c-g>zt+iA2~U(x-!%G0uhXYhv;S1LtbVuEqm>o>)oEb2EZgYqu>Hrh zRj1W8TBFVN4cdCRfu~im&OKW#v)_L*pw(aPw{X`PJG*wB+Pf_)6A$(|cH1)cY(8>ShS*H5ddcmAid3f{kRQV$j+ zbzw1}`UZX8O%1m;H?CO@n-A{&cgx}bUH+f!@`VLqVHWQ=t1UT~zPMP7;mtk|ayI{yF*$6vZ}g_m2| zC3le8RlciExXKnl$(>jg^ZCPDT1|UTyJ_RUb3Ki#3LjuPFM{*~?VYyS8Vrm!T0%b1 zD+%YuA8NOYcaGdA3@YMp6)q~`t32bB7sJ8Lx3ycgZgq`b%Pd8EUwgaT$2(0=n}?dq zGO)0o%jU5e+p?T;8ELw+YweqQb4Ry3y`_@=+z04qldthtX1Kx2oBRavFK~^HK)DHKLZ&Tk*sZ|H+;>2D`q2?@xJ|3;4Lewk(1lFWmWf;m(iV zVCSa`ZPpj=2xpg~mb)w8;R6P_6Csg#79v?i^2n0Ua~(F2T-0-kU)-X;s!i(ugDlu5%+(j57i;qW2;6=li-$qO47 zX)O+0q_w~;0r(^<_%{zJ`=E}uCG>?Pa)7I5#g$3?K_2V_UU2w&F3DLE72f$U-zlJ0 zN}Q33G3)+3*Ui0r!~)(a%0{?mNv=Y?WWguA;A0hma+UA$4yykEn literal 0 HcmV?d00001 diff --git a/library/000docs/005-INTRO.TEDIT b/library/000docs/005-INTRO.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..80e20b3d4140c3797c30aee5922d94434828e3a7 GIT binary patch literal 14687 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 F{{n_3(KY}8 literal 0 HcmV?d00001 diff --git a/library/000docs/006-INDEX.TEDIT b/library/000docs/006-INDEX.TEDIT new file mode 100644 index 00000000..980b40e7 --- /dev/null +++ b/library/000docs/006-INDEX.TEDIT @@ -0,0 +1,91 @@ +1 Lisp Library Modules, Medley Release 2.0 1 Lisp Library Modules, Medley Release 2.0 INDEX 1 INDEX 1 INDEX 6 A Abort a Print Job 101,102 Aborting Commands 76 Access Functions 251 Add New Keyboards to the List 310 add-form (Function) 299 ADD.BORDER.TO.BITMAP (Function) 65 ADD.PROCESS (Function) 266 Adding FileBrowser Commands 92 Address space of the internetwork 261 ADJUSTCOLORMAP (Function) 37 Administrator Commands for NSMaintain 206 ADVISE (Function) 283 Aliases 203 ALLOCATE.ETHERPACKET (Function) 270 Analyzing user Functions 157 Application layer 261 ARPANET 253 Array Functions 193 Array operations 29 Assignments 189 B BACKWARD FIND (Command) 288 BEGINDST (Variable) 199 BIN (Function) 222 BIT.IN.COLUMN (Function) 65 BIT.IN.ROW (Function) 65 BITBLT (Function) 116 BITMAPCREATE WIDTH HEIGHT BITSPERPIXEL (Function) 38 BITSPERPIXEL BITMAP (Function) 38 BOUT (Function) 222 BREAK (Function) 283 Broadcast address 262 Browser 111 describe window 12 printout window 12 BROWSER window 74 BROWSERBOXING (Variable) 12 BROWSERFORMAT (Variable) 12 C C-Shell 303 C4 printed circuit board 1 CACHE/NODE/LABEL/BITMAPS (Variable) 116 Call graph 233 Call stack 233 Calling the Keyboard Editor 150 CALLS (Function) 175 CALLSCCODE (Function) 175 Cash-File 15 Centronics 17 cable 17 port 1 CENTRONICS.RESET (Function) 17 CH.DEFAULT.DOMAIN (Variable) 206 CH.DEFAULT.ORGANIZATION (Variable) 206 Changing an Existing Keyboard 150 Character framing errors 224 CharCodeTables 19 Chat 21,303 CHAT (Function) 22,303 Chat connections 22 Chat Menu 23 Chat window 146 CHAT.ALLHOSTS (Variable) 25 CHAT.DISPLAYTYPES (Variable) 24 CHAT.EMACSCOMMANDS (Variable) 25 CHAT.FONT (Variable) 25 CHAT.IN.EMACS? (Variable) 26 CHAT.INTERRUPTS (Variable) 24 CHAT.KEYACTIONS (Variable) 24 CHAT.PROTOCOLTYPES (Variable) 26 CHAT.TTY.PROCESS (Variable) 25 CHAT.WINDOW.REGION (Variable) 25 CHAT.WINDOW.SIZE (Variable) 25 Chatting to a host 258 CHECKSAMEDIR (Function) 231 Clean-Up After Copying Files 46 Clearinghouse 26 Clearinghouse service 203 CLOSE (Function) 305 close-hash-file (Function) 134 CLOSECHATWINDOWFLG (Variable) 25 CLOSEF (Function) 9,222 CLOSEHASHFILE (Function) 128 CmlFloatArray 29 CMYCOLORMAP (Function) 36 COLLECTINUSE (Function) 108 COLLISIONS (Function) 108 COLORDISPLAY (Function) 33 COLORDISPLAYP (Function) 33 COLORIZEBITMAP (Function) 44 COLORLEVEL (Function) 37 COLORMAPCOPY (Function) 36 COLORMAPCREATE (Function) 36 COLORNAMES (Association List) 34 COLORNUMBERP (Function) 35 COLORSCREEN (Function) 39 COLORSCREENBITMAP (Function) 38 COMMAND menu 74 Common Lisp 288 COMPILE (Command) 86 Conjunctions of Sets 168 Connecting to a host 258 Control-E (Command) 76 Control-F (Command) 53 Control-O (Command) 139 Control-P (Command) 280 Control-Q (Command) 75,87 Control-S (Command) 53 Control-Z (Command) 53 Conversation Mode 45 convert-loaded-files (Variable) 292 COPY (Command) 78 Copy-Selection 53, 77 COPYFILE (Function) 46,267 CopyFiles 45 COPYFILES (Function) 45 COPYHASHFILE (Function) 130 CPE FP 17 CPE-FP upgrade 1 Create a Key Pad for Repeated Use 216 CREATE-PROCESS-STREAM (Function) 305 CREATE.NUMBERPAD.READER (Function) 216 CREATEHASHFILE (Function) 128 CREATEW (Function) 41 Creating 4045XLP Master Files 4 a graph 112 a key pad 215 a new bitmap 64 a new keyboard 149 a TableBrowser 247 horizontal rules 139 HOST.TXT file 254 new keyboard configurations 153 objects 206 the local IP.INIT file 256 Creation dates 46 Cumulative mode 238 CURSORPOSITION (Function) 44 CURSORSCREEN (Function) 44 Customizing Chat 24 FileBrowser 89 Cyclic graphs 111 D DataBaseFns 49 Databases 313 using 313,314 Datamedia 2500 21 Daughter 114 Debuggee 279 Debugger 279 DECREASING.FONT. LIST (Variable) 125 DEdit 51,307 Command menu 54 Functions 54 idioms 59 parameters 57 window 52 DEDITLINGER (Variable) 57 DEDITTYPEINCOMS (Variable) 57 DEFAULT-CLEANUP-COMPILER (Variable) 86 DEFAULT.GRAPH.WINDOWSIZE (Variable) 117 DEFAULTCHATHOST (Variable) 22,25 DEFAULTPRINTERTYPE (Variable) 2 DEFAULTPRINTINGHOST (Variable) 2,213 defdefiner-macros (Variable) 292 DEFINEKEYBOARD (Function) 311 Defining a Virtual Keyboard 310 DEGREES-TO-RADIANS (Function) 196 DELETE (Command) 77 Deleting objects 206 Device Errors 17 Differences between TExec and TEdit 287 Digital VT100 21 Directed acyclic graph 113 DIRECTORIES (Variable) 2,258 Directory-only lines 75 DIRECTORYNAME (Function) 231 Display-Only a Keyboard 309 Displayer 233 DISPLAYFONTDIRECTORIES (Variable) 100 DISPLAYGRAPH (Function) 117 Displaying a graph 116 a stack 280 Displaystream graphics 288 DM2500 Chat 27 DODIP.HOSTP (Function) 272 Domain 203 manipulating 208 DOMAIN.GRAPH (Function) 276 DOMAIN.INIT (Function) 276 DOMAIN.LOOKUP (Function) 276 DOMAIN.LOOKUP ADDRESS (Function) 276 DOMAIN.LOOKUP NAMESERVER (Function) 276 DOMAIN.TRACE (Function) 276 DRAWBETWEEN (Function) 43 DRAWLINE (Function) 43 DRAWTO (Function) 43 DSPBACKCOLOR (Function) 42 DSPCOLOR (Function) 42 DT.EDITMACROS (Variable) 58 DUMPDATABASE (Function) 177 DUMPDB (Function) 50 DUMPGRAPH (Function) 121 Dvorak keyboard 311 Dynamic structure 233 E E-30 option kit 1 E30 option 219 EDIT (Command) 84 Edit buffer window 52 EDIT.BITMAP (Function) 61 EditBitMap 61 sub-menu 62 window 62 EDITBM (Function) 61 EDITCOLORMAP (Function) 37 EDITCONFIGURATION (Function) 154 EDITEMBEDTOKEN (Variable) 57 EDITGRAPH (Function) 121 EDITGRAPHMENU 119 EDITGRAPHMENUCOMMANDS (Variable) 119 Editing a bitmap in a document 64 editing a graph 117 existing bitmap 63 keyboard configuration 154 EDITKEYBOARD (Function) 150 EDITMODE (Function) 52 EDITMODE (Variable) 84 Effecting MasterScope Analysis 171 Element patterns 185 Embedding and extracting 59 ENDDST (Variable) 199 Entering DEdit Commands 54 Environmental and Lisp mappings 95 EOLCONVENTION (Variable) 272 Error Condition Reporting 224 ERRORPUP (record) 70 ERRORXIP (record) 69 Establishing a Connection 143 et FX-80 Fast Mode 101 ETHERHOSTNUMBER (Variable) 4,280 Ethernet 260 Ethernet packet 264 EtherRecords 69 EVALUATE-POLYNOMIAL (Function) 31 expr definitions of Functions 171 EXPUNGE (Command) 86 Extend the selection 75 Extended Processor board 17 Extended processor option 29 External Communication Service 27 F FASSOC (Function) 121 Fast mode FX-80 101 FASTFX80-DEFAULT-DESTINATION (Variable) 100 FB (Command) 90 FB.ALLOW.ABORT (Function) 94 FB.BROWSERFONT (Variable) 92 FB.DEFAULT.EDITOR (Variable) 84,92 FB.DEFAULT.INFO (Variable) 87,90 FB.DEFAULT.NAME.WIDTH (Variable) 91 FB.FETCHFILENAME (Function) 93 FB.HARDCOPY.DIRECTORY.FONT (Variable) 92 FB.HARDCOPY.FONT (Variable) 92 FB.ICONFONT (Variable) 91 FB.INFO.FIELDS (Variable) 91 FB.INFO.MENU.ITEMS (Variable) 91 FB.MENU.ITEMS (Variable) 92 FB.PROMPTFONT (Variable) 92 FB.PROMPTLINES (Variable) 92 FB.PROMPTW.FORMAT (Function) 93 FB.PROMPTWPRINT (Function) 93 FB.PROMTFORINPUT (Function) 94 FB.SELECTEDFILES (Function) 93 FB.TABLEBROWSER (Function) 93 File Manager functions, changed 313 File name translation Function 269 File transfer using RS232 226 FILEBROWSE (Command) 84 FileBrowser 71 Functions 89 Variables 90 FILEBROWSER (Function) 89 filecom-specifier (Function) 299 Filing operations 267 FILING.ENUMERATION.DEPTH (Variable) 92 FIND-ARRAY-ELEMENT-INDEX (Function) 31 FINDPOINTER (Function) 109 FINDPOINTERS.OF.TYPE (Function) 109 FLIPNODE (Function) 120 Floating-point vector 29 FNT.DISPLOOK (Function) 96 FNT.DISPTBLE (Function) 96 FNT.MAKEBOOK (Function) 95 Font mappings 95 FontSample 95 FORCEOUTPUT (Function) 222 Forest 113 form-specifier (Function) 299 FORWARD FIND (Command) 288 FREEVARS (Function) 175 FROM.SCREEN.BITMAP (Function) 66 FTP service 268 FTPDEBUG (Function) 268 FTPserver 97 FTPSERVER (Function) 4,97 FTPSERVER.DEFAULT.HOST (Variable) 97 Function-calling structures 111 Functions for saving work 283 Functions for writing routines 176 FX Printer Compatibility 102 FX-80 DIP Switch Settings 100 driver 99 family 99 serial Interface 99 FX80-PRINT (Function) 102 G GapTelnet 26 Garbage collector 284 Gateway Access Protocol 26 GCHax 105 General Purpose Records 69 Get, Set Parameters via Inspector Window 7 get-cash-file (Function) 15 GETBOXSCREENPOSITION (Function) 40 GETBOXSCREENREGION (Function) 41 GETFILEINFO (Function) 267 GETHASHTEXT (Function) 129 GETHASHVILE (Function) 129 GETRELATION (Function) 176 GETSCREENPOSITION (Function) 40 GETTEMPLATE (Function) 174 GETTERMTABLE (Function) 288 Getting Hardcopy Directory Listings 77 Ghost boxes 238 Graph 11 data structure 120 nodes 111 GRAPH (record) 121 GRAPH/HARDCOPY/FORMAT (Variable) 117 Grapher 111,233 Grapher image objects 120 GRAPHEROBJ (Function) 120 GRAPHERPROP (Function) 121 Graphics interface 99 GRAPHNODE (record) 122 GRAPHREGION (Function) 120 GraphZoom 125 GRAYCOLORMAP (Function) 36 Groups 207 H HANZON Universal Card 99 HARDCOPY (Command) 81 HARDCOPYGRAPH (Function) 117 Hash tables 178 Hash-File 133 HASHFILEDEFAULTSIZE (Variable) 130 HASHFILEDTBL (Variable) 130 HASHFILENAME (Function) 129 HASHFILEP (Function) 129 HASHFILEPLST (Function) 130 HASHFILEPROP (Function) 129 HASHLOADFACTOR (Variable) 130 HFGROWTHFACTOR (Variable) 131 HLS (Record) 35 HLSP (Function) 35 HOST&DIRECTORYFIELD (Function) 231 HOSTS.TEXT.DIRECTORIES (Variable) 276 HOSTS.TXT files, parsing 276 HPRINT (Function) 121 HQFX80-DEFAULT-DESTINATION (Variable) 100 HQFX80-FONT-DIRECTORIES (Variable) 100 HRule 139 HRULE.CREATEÿÿ (ÿFunctionÿÿ) 139 HTE.READ.FILE (ÿFunctionÿÿ) 276 Hueï$Lightnessï$Saturation Triples 35 I I/O processor 226 IDENTITY-3-BY-3 (ÿFunctionÿÿ) 194 IDENTITY-4-BY-4 (ÿFunctionÿÿ) 194 il:typesof (Function) 313 il:whereis (Function) 313 ÿIÿÿmagestream 5 ÿIÿÿnclude all files, both deleted and undeleted 75 Individual mode 239 INFO menu 74 Info Options window 87 Input ÿcÿÿonventions for FileBrowser ÿcÿÿommands 75 Inserting a segment 59 install-form (Function) 299 INTENSITIESFROM (Functiÿon) 36 INTERACT&ADD.BORDER.TO.BITMAP (Function) 66 INTERACT&SHIFT.BITMAP.DOWN (Function) 66 INTERACT&SHIFT.BITMAP.LEFT (Function) 66 INTERACT&SHIFT.BITMAP.RIGHT (Function) 66 Interactive File Transfers With Kermit or Modem 146 Interactive Terminal Service 27 Internal fields 241 Internet layer 260 INTERPRESSFONTDIRECTORIES (Variable) 19 Interpreter 239 Interrupt character 234 INVERT.BITMAP.B/W (Function) 65 INVERT.BITMAP.DIAGONALLY (Function) 65 INVERT.BITMAP.HORIZONTALLY (Function) 65 INVERT.BITMAP.VERTICALLY (Function) 65 Invisible characters 288 IP addresses 262 networks primer 261 packet building 274 packet sending 275 socket access 272 IP.ADD.PROTOCOL (Function) 273 IP.APPEND.BYTE (Function) 275 IP.APPEND.CELL (Function) 275 IP.APPEND.STRING (Function) 275 IP.APPEND.WORD (Function) 275 IP.CLOSE.SOCKET (Function) 274 IP.DELETE.PROTOCOL (Function) 274 IP.OPEN.SOCKET (Function) 274 IP.SETUPIP (Function) 275 IP.TRANSMIT (Function) 275 IPHOSTNAME (Function) 273 IPINIT (Function) 272 IPTRACE (Function) 273 Iterative statement operator 177 J join-comments (Variable) 292 K Kermit 144,226 Kermit menu 146 KERMIT.RECEIVE (Function) 145 KERMIT.SEND (Function) 144 KEYACTION (Function) 153 Keyboard editor menus 150 KeyboardEditor 149 L Landscape mode 1 Landscape printing 103 Lattices 111 Laying out a graph for display 112 LAYOUTGRAPH (Function) 112 LAYOUTSEXPR (Function) 115 LDESHELL (Variable) 303 Library module changes 5-9 summary 5-9 Library module dependencies 9 Linguistic tree 120 Link layer 260 Lisp interrupts 22 LISPUSERSDIRECTORIES (Variable) 258 LISPXREAD (Function) 53 List of nodes 112 List structure editor 51 LISTFILES (Function) 3,213 LOAD (Command) 84 LOAD (Function) 49 Load New Keyboards 310 load-textmodule (Function) 290 LOADDB (Function) 50 LOADDBFLG (Variable) 50 LOADFROM (Function) 49,85 Loading TCP 258 LOOKUPHASHFILE (Function) 129 Lost characters 224 Low-level TCP Functions 272 M Macro 177 Macro Expansion 170 MAINSCREEN (Function) 39 Maintenance panel halt 279 make-cash-file (Function) 15 make-hash-file (Function) 133 MAKE-HOMOGENEOUS-3-BY-3 (Function) 193 MAKE-HOMOGENEOUS-3-VECTOR (Function) 193 MAKE-HOMOGENEOUS-4-VECTOR (Function) 194 MAKE-HOMOGENEOUS-N-BY-3 (Function) 193 MAKE-HOMOGENEOUS-N-BY-4 (Function) 194 make-specifier (Function) 297 make-textmodule (Function) 291 MAKEFILE (Function) 49,78,231 MAKEFILEFORMS (Function) 231 Making a sysout that contains TCP-IP 259 Manipulating domains 208 groups 207 remote Vmem 284 MAP-ARRAY (Function) 29 MAPGC (Function) 110 MAPHASHFILE (Function) 130 MAPOFACOLOR (Function) 37 MAPRELATION (Function) 176 MASTERSCOPE (Function) 175 MasterScope 11,49,157 Commands 158 database 157 entries 175 relations 161 set specifications 164 templates 164 Match 183 MatMult 193 MATMULT-133 (Function) 195 MATMULT-144 (Function) 195 MATMULT-331 (Function) 195 MATMULT-333 (Function) 195 MATMULT-441 (Function) 195 MATMULT-444 (Function) 196 MATMULT-N33 (Function) 195 MATMULT-N44 (Function) 196 Matrix Creation Functions 193 Matrix multiplication 193 Matrix Multiplication Functions 195 Merged node 237 MIGRATIONS (Variable) 231 MiniServe 199 mlFloatArray 196 Modem 145,226 MODEM.RECEIVE (Function) 145 MODEM.SEND (Function) 145 Moving an expression 59 MSMACROPROPS (Variable) 170 MSMARKCHANGED (Function) 177 MSNEEDUNSAVE (Function) 176 Multiple DEdit commands 58 Multiple streams 9 MY.NSHOSTNUMBER (Variable) 200 N Network addresses 261 Network protocols 21,26 NETWORKOSTYPES (Variable) 257 NEW INFO FileBrowser Command 87 NODECREATE (Function) 112 Notecards 9 Noticing changes that require recompiling 177 NS characters 213 NS Chat 26 NS Records 69 NS.TO.PUP.ALIST (Variable) 200 NS.TO.PUP.FILE (Variable) 200 NSHOSTNUMBER (record) 69 NSMaintain 203 NSMAINTAIN (Function) 204 NSTIMESERVER (Function) 199 NTERACT&SHIFT.BITMAP.UP (Function) 66 NUMBERPAD.READ (Function) 216 O Objects 203 creating 206 deleting 206 Obtaining information in NSMaintain 204 Obtaining network addresses 254 open-hash-file (Function) 133 OPENHASHFILE (Function) 128 OPENIMAGESTREAM (Function) 9,101 Opening a 4045 Stream 7 a Centronics Stream 17 a Chat Connection 22 OPENP (Function) 222 OPENSTREAM (Function) 222 OPENWINDOWS (Function) 42 Operations on Multiple Items 249 Organization 203 OVERFLOWS (Function) 108 P Packages 124, 286 Parents 114 parity errors 224 PARSERELATION (Function) 176 PATLISPCHECK (Variable) 184 Pattern elements 185 match compiler 184 match expressions 185 PATVARDEFAULT (Variable) 185 PERSPECTIVE-4-BY-4 (Function) 195 Place Markers 189 Portrait mode 1 PORTSTRING (Function) 4,280 PPTCB (Function) 266 Press 213 PRESSFONTWIDTHFILES (Variable) 213 Primitive relationship 178 PRIMTERMTABLE (Variable) 288 PRIN3 (Function) 124 Print a file 101,102 source code in high-quality mode 103 source code on fast FX-80 103 TEdit file in fast FX-80 mode 103 TEdit file in high-quality mode 104 text and graphics in high-quality mode 103 print-filecom (Function) 299 Printer drivers 99 Printer's point 139 Printing in fast mode 101 in high-quality mode 102 source or TEdit Files 3 speed 9 via FTPserver 4 windows 4 Programmer's Assistant 288 PROJECT-AND-FIX-3-VECTOR (Function) 196 PROJECT-AND-FIX-4-VECTOR (Function) 196 PROJECT-AND-FIX-N-BY-3 (Function) 196 PROJECT-AND-FIX-N-BY-4 (Function) 196 PROMPT window 73 Properties 203 Protocol number 273 PUP (record) 70 PUP Chat 26 FTP 97,232 ID service 200 records 70 time service 200 PUP.ID.SERVER (Function) 199 PUPADDRESS (record) 70 PUPNUMBER (Variable) 200 PUPTIMESERVER (Function) 199 PUTHASHFILE (Function) 128 PUTHASHTEXT (Function) 129 Q QABLEITEM (record) 69 Query Mode 45 Queue multiple arguments 60 Quick-scrolling 74 Quitting the FileBrowser 76 R RANDACCESSP (Function) 272 READ-BYTE (Function) 219 READ-CHAR (Function) 219 READGRAPH (Function) 121 Reading the Remote Vmem 284 ReadNumber 215 ReadNumber window 66 READP (Function) 222 READSYS (Function) 284 REALFRAMEP (Function) 239 RECOMPILEDEFAULT (Variable) 178 RECOMPUTE (Command) 86 Reconstruction 190 Record declaration 177 Recursive loads ÿÿ 97 Redefine Existing Keyboards 310 REDUCE-ARRAY (ÿFunctionÿÿ) 30 Redï$Greenï$Blue Triples 34 REFCNT (Function) 108 ÿRÿÿeference counting 284 REHASHFILE (Function) 130 REHASHGAG (Variable) 131 ÿRÿÿelations between sets 157 RELDRAWTO (Function) 43 Remote ÿ ÿÿKermit in Server Mode 144 ÿ ÿÿKermit not in Server Mode 144 ÿ sÿÿystem ÿaÿÿdministration 27 ÿ sÿÿystem ÿeÿÿxecutive 27 Removing Keyboards From the Menu 310 RENAME (ÿCommandÿÿ) 81 REPACKFILENAME.NEW.TRANSLATION (ÿFunction) 269 REPACKFILENAME.OSTYPE.TABLE (Variable) 269 REPACKFILENAME.STRING (Function) 268 Replace All Known Keyboards 310 Replacements 190 RESET/NODE/BORDER (Function) 120 RESET/NODE/LABELSHADE (Function) 120 RESETDEDIT (Function) 54 Resetting 4045XLPstream 8 Restarting MiniServe 201 RGB (Record) 34 RGBCOLORMAP (Function) 36 RGBP (Function) 35 RNUMBER (Function) 215 Ross referencing user programs 157 ROTATE-3-BY-3 (Function) 194 ROTATE-4-BY-4-ABOUT-X (Function) 194 ROTATE-4-BY-4-ABOUT-Y (Function) 194 ROTATE-4-BY-4-ABOUT-Z (Function) 194 ROTATE.BITMAP.LEFT (Function) 65 ROTATE.BITMAP.RIGHT (Function) 65 ROTATECOLORMAP (Function) 37 RS232 143,219 RS232 Chat 27 port 219 RS232C port 1 RS232C.CLOSE-STREAM (Function) 222 RS232C.DEFAULT.INIT.INFO (Variable) 220 RS232C.ERROR.STREAM (Variable) 224 RS232C.GET.PARAMETERS (Function) 221 RS232C.INIT (Function) 220 RS232C.OTHER.STREAM (Function) 222 RS232C.OUTPUT.PACKET.LENGTH (Function) 222 RS232C.READP.EVENT (Function) 223 RS232C.REPORT.STATUS (Function) 224 RS232C.SET.PARAMETERS (Function) 220 RS232C.SHUTDOWN (Function) 221 RS232CHAT 225 RS232CMENU 225,228 RS232MODEMCONTROL (Function) 223 RS232MODEMHANGUP (Function) 224 RS232MODEMSTATUSP (Function) 223 RS232MODIFYMODEMCONTROL (Function) 223 RS232SENDBREAK (Function) 223 RS232TRACE 224 S S-expression 115 SameDir 231 Sampler 233 SAVEDBFLG (Variable) 50 Scale factors 9 SCALE-3-BY-3 (Function) 194 SCALE-4-BY-4 (Function) 195 SCALEDBITBLT (Function) 9 SCREENBITMAP (Function) 39 SCREENCOLORMAP (Function) 36 SCREENPOSITION (Record) 39 SCREENREGION (Record) 39 Scroll bar 74 SEE (Command) 82 Segment Patterns 186 Segment selection and manipulation 59 Selecting Files 74 Selecting Objects and Lists 52 Selection stack 53 Send text output to fast FX-80 103 SEND.FILE.TO.PRINTER (Function) 3,213 Serial interface card 99 Server mode 144 SET DEPTH (Command) 88 Set destination 102 determiners 167 FX-80 Destination 101 FX-80 Page Size 101 HQ Mode 102 page Size 102 specifications by Blocktypes 167 specifications by Relation 166 types 167 SETCOLORINTENSITY (Function) 37 SETSYNONYM (Function) 175 SETTEMPLATE (Function) 174 SETTIME (Function) 199 SHIFT.BITMAP.DOWN (Function) 65 SHIFT.BITMAP.LEFT (Function) 66 SHIFT.BITMAP.RIGHT (Function) 66 SHIFT.BITMAP.UP (Function) 66 SHOW PATHS 180 SHOW PATHS (Command) 169 SHOW PATHS (Function) 11 SHOW.CLOSED.WINDOWS (Function) 110 SHOWCIRCULARITY (Function) 110 SHOWCOLORTESTPATTERN (Function) 44 SHOWCOMMONCSETS (Function) 20 SHOWCSET (Function) 20 SHOWCSETLIST (Function) 20 SHOWCSETRANGE (Function) 20 SHOWGC (Function) 107 SHOWGRAPH (Function) 116,125 SHOWZOOMGRAPH (Function) 125 Simple item operations 248 SINGLEFILEINDEX (Function) 10 Sketch 10 SORT (Command) 89 Special characters 307 specifiers (Variable) 297 Specifying the files to browse 72 Spy 233 SPY.BORDERS (Variable) 239 SPY.BUTTON (Function) 234 SPY.END (Function) 234 SPY.FONT (Variable) 239 SPY.FREQUENCY (Variable) 239 SPY.LEGEND (Function) 239 SPY.MAXLINES (Variable) 239 SPY.NOMERGEFNS (Variable) 239 SPY.START (Function) 234 SPY.TOGGLE (Function) 234 SPY.TREE (Function) 235 SPY.TREE (Variable) 239 Stack 280 Stack architecture 58 Stacking several rules in a single object 140 Starting FileBrowser 71 Starting TExec 287 STARTMINISERVE (Function) 199 Static structure 233 stderr 305 stdin 305 stdout 305 STOPIP (Function) 272 STORAGE (Function) 105 Store keyboards 309 SUBNETMASK (Variable) 262 Subnetworks 262 Sun,TCP to a 254 SunOS, interface to 305 Switch & Display a Keyboard 308 Switch A-2 2 Switch Keyboards 308 Switch settings 2 SWITCHKEYBOARDS (Function) 311 SysEdit 241 SYSHASHFILE (Variable) 131 SYSHASHFILELST (Variable) 131 System sources 241 T TableBrowser 243 TABLEBROWSER (record) 244 TABLEITEM (record) 243 Tally window 73 Target-source-Command 59 TB.BROWSER.BUSY (Function) 248 TB.CLEAR.LINE (Function) 249 TB.COLLECT.ITEMS (Function) 250 TB.DELETE.ITEM (Function) 248 TB.FIND.ITEM (Function) 250 TB.FINISH.CLOSE (Function) 248 TB.INSERT.ITEM (Function) 249 TB.ITEM.DELETED? (Function) 251 TB.ITEM.SELECTED? (Function) 251 TB.MAKE.BROWSER (Function) 247 TB.MAP.DELETED.ITEMS (Function) 250 TB.MAP.ITEMS (Function) 250 TB.MAP.SELECTED.ITEMS (Function) 250 TB.NORMALIZE.ITEM (Function) 249 TB.NTH.ITEM (Function) 250 TB.NUMBER.OF.ITEMS (Function) 249 TB.REDISPLAY.ITEMS (Function) 249 TB.REMOVE.ITEM (Function) 249 TB.REPLACE.ITEMS (Function) 248 TB.SELECT.ITEM (Function) 248 TB.SET.FONT (Function) 248 TB.UNDELETE.ITEM (Function) 248 TB.USERDATA (Function) 251 TB.WINDOW (Function) 251 TCP and directory enumeration 254 Chat 27 debugging aids 277 segment 264 TCP-IP 253 protocol 47 protocol layers 260 TCP.BYE (Function) 268 TCP.CLOSE.SENDER (Function) 265 TCP.DEFAULT.RECEIVE.WINDOW (Variable) 265 TCP.DEFAULT.USER.TIMEOUT (Variable) 265 TCP.DEFAULTFILETYPE (Variable) 267 TCP.ECHO.SERVER (Function) 266 TCP.ECHOTEST (Function) 266 TCP.FAUCET (Function) 267 TCP.INIT (Function) 265 TCP.OPEN (Function) 264 TCP.OTHER.STREAM (Function) 265 TCP.SINK.SERVER (Function) 266 TCP.STOP (Function) 265 TCP.URGENT.EVENT (Function) 265 TCP.URGENT.MARK (Function) 265 TCP.URGENTP (Function) 265 TCPCHAT.TELNET.TTY.TYPES (Variable) 269 TCPCHAT.TRACEFILE (Variable) 269 TCPCHAT.TRACEFLG (Variable) 269 TCPFTP.DEFAULT.FILETYPES (Variable) 267 TCPFTP.EOL.CONVENTION 267 TCPFTP.INIT (Function) 268 TCPFTP.SERVER (Function) 268 TCPFTP.SERVER.USE.TOPS20.SYNTAX (Variable) 268 TCPTRACE (Function) 266 TEdit 9,21,139,287,307 TEdit Chat 28 TeleRaid 279 TELERAID (Function) 280 TeleRaid Commands 280 Teletype editor 51 TELNET protocol 261,269 Ten-key calculator pad 215 Terminal emulators 21 Testing the connection between two Xerox Lisp machines 228 TESTRELATION (Function) 176 TExec 287 TEXEC (Function) 287 TEXTMODULES 289 TFTP.CLOSEFILE (Function) 272 TFTP.GET (Function) 272 TFTP.OPENFILE (Function) 272 TFTP.PUT (Function) 271 TFTP.SERVER (Function) 272 Thumbing 74 TIMEZONECOMP (Variable) 200 Tracing and test Functions 265 Trailer encapsulation 277 Transferring files 143,258 TRANSLATE-3-BY-3 (Function) 195 TRANSLATE-4-BY-4 (Function) 195 Translating between the file-naming conventions 268 Transport layer 260 Transport control protocol 264 Trees 111 TRIM.BITMAP (Function) 66 Trivial file transfer protocol 271 Troubleshooting Problems With FileBrowser 94 TTY port 1,219 TTY.DEFAULT.INIT.INFO (Variable) 226 TTY.GET.PARAMETERS (Function) 228 TTY.INIT (Function) 226 TTY.SET.PARAMETERS (Function) 227 TTY.SHUTDOWN (Function) 228 TTYCHAT 228 Typing Characters to DEdit 53 U UDP.APPEND.BYTE (Function) 271 UDP.APPEND.CELL (Function) 271 UDP.APPEND.STRING (Function) 271 UDP.APPEND.WORD (Function) 271 UDP.CLOSE.SOCKET (Function) 270 UDP.EXCHANGE (Function) 271 UDP.GET (Function) 270 UDP.INIT (Function) 270 UDP.OPEN.SOCKET (Function) 270 UDP.SEND (Function) 271 UDP.SETUP (Function) 270 UDP.SOCKET.EVENT (Function) 270 UDP.SOCKET.NUMBER (Function) 270 UDP.STOP (Function) 270 UNCOLORIZEBITMAP (Function) 44 UNDELETE (Command) 77 Unechoed input mode 288 UNIX 232,272 UNIX-STREAM-CLOSE (Function) 305 UNIXChat 303 UNIXComm 305 Unread 54 UNSAVEFNS (Function) 177 UPDATECHANGED (Function) 177 UPDATEFN (Function) 177 Updating the MasterScope Data Base 174 upgrade-semicolon-comments (Variable) 292 User Commands for NSMaintain 204 User datagram protocol 270 USERWORDS (Function) 288 Using 4045XLP stream 8 4045 as a default printing host 3 FileBrowser window 73 Keyboard editor 150 modems 223 RS232 streams 222 TExec 288 TTY port 226 TTY streams 228 V Verifying TCP connections 258 Version Control 46 VFIND.PACKAGE (Function) 286 VFIND.SYMBOL (Function) 286 VGETBASE0 (Function) 285 VGETDEFN (Function) 285 VGETPROPLIST (Function) 285 VGETTOPVAL (Function) 285 VGETVAL (Function) 285 Viewing an existing bitmap 64 frames from a stack 281 system stack 282 Violation of the IP standard 262 Virtual graph nodes 113 Virtual memory 279 Virtual terminal I/O 269 VirtualKeyboards 149,307 VKBD.CONFIGURATIONS (Variable) 154 VKBD.KNOWN-KEYBOARDS (Variable) 311 VLOADFNS (Function) 283 VLOADVAR (Function) 283 VPUTBASE0 (Function) 286 VRAID (Function) 284 VSAVEWORK (Function) 283 VSETTOPVAL (Function) 285 VT100 Chat 28 VTYPENAME (Function) 285 VUNSAVEDEF (Function) 283 VVAG2 (Function) 285 VYANKDEF (Function) 283 V\COPY (Function) 285 V\UNCOPY (Function) 285 W Weitek floating-point chip set 29 When To Copy 46 Where-Is 313 Wild cards 72 WINDOWPROP (Function) 42 WORPCURSOR (Function) 43 Wrapper Functions 193 X XCVR interface cable 253 Xerox 2700-II laser printer 1 Xerox 4045 Laser CP 1 Xerox Character Codes 19 Xerox/Diablo 630 1 XIP (record) 69 XNS host number 200 XNS Time Service 199 ( (GETSCREENREGION (Function) 40 (MAKE-HOMOGENEOUS-4-BY-4 (Function) 194 4 4045 configuration cartridge 2 4045 Emulation Mode Selection 2 4045 Fonts 9 4045 Parameter Names and Values 5 4045 Port Initialization 3 4045 Port Selection 2 4045 PROM and Software Compatibility 1 4045XLP.CHANGE.MODE (Function) 5 4045XLP.DEFAULTS (Variable) 5 4045XLP.GET.PARAMETERS (Function) 7 4045XLP.PARAMETERS (record) 5 4045XLP.SET.PARAMETERS (Function) 6 4045XLPStream 1 4045XLPstream Options 5 4045XLPSTREAM.VERSION (Variable) 1 (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "INDEX-" "") STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "INDEX-" "")) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE TITLEHEAD) (54 762 558 36) NIL) (HEADING NIL (HEADINGTYPE TITLEHEADRULE) (54 753 558 36) NIL) (TEXT NIL NIL (54 54 241 666) NIL) (TEXT NIL NIL (320 54 241 666) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "INDEX-" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "INDEX-" "")) (54 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 241 684) NIL) (TEXT NIL NIL (320 54 241 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "INDEX-" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "INDEX-" "")) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 241 684) NIL) (TEXT NIL NIL (319 54 241 684) NIL)))))-KT-KT,K2$$-KTJàà PAGEHEADING TITLEHEADRULEFàà PAGEHEADING TITLEHEADFøø PAGEHEADING VERSOHEADFøø PAGEHEADING RECTOHEADEøø PAGEHEADINGFOOTINGVEøø PAGEHEADINGFOOTINGR,K-K T,KMODERN +MODERN +CLASSIC + HELVETICA HELVETICA +OPTIMA +CLASSIC +MODERN +  HRULE.GETFNMODERN + ( + HRULE.GETFNCLASSIC + +)   HRULE.GETFNCLASSIC + HRULE.GETFNCLASSIC + HRULE.GETFNOPTIMA +  +    # '       +      (                                                                             +     #      + +  +       + + +                 %        + +       +  + +      +    +                       +  +   !  +  +   +                           "               +          +    +        +   *               %               +                      +  + D" + " + _"* 9*"    1                               +      +  +             +               +  + & +              +   +                   !               +             + +%            +               # "*  + +        +                              : + 0)119!D  @                                                      $      +                      +                   +           +  + +                                             +            +  +    +            !  +   + + 8     +   +    +   1   + +   +             +   +      +   +   + +    + $   "       +          +  +               +   +   +         !&      tùzº \ No newline at end of file diff --git a/library/CENTRONICS.TEDIT b/library/CENTRONICS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..f9a46a4f26b7554fd973ec5e6c210549ec6d0f45 GIT binary patch literal 6294 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 literal 0 HcmV?d00001 diff --git a/library/CHAT.TEDIT b/library/CHAT.TEDIT new file mode 100644 index 00000000..279b2ef7 --- /dev/null +++ b/library/CHAT.TEDIT @@ -0,0 +1,107 @@ +1 Lisp Library Modules, Medley Release 1.15, CHAT 1 Lisp Library Modules, Medley Release 1.15, CHAT CHAT 1 CHAT 1 CHAT 6 Chat(CHAT NIL Chat NIL NIL 21) is a remote terminal facility that allows you to communicate with other machines while inside Lisp. Chat sets up a Chat connection to a remote machine, so that everything you type is sent to the remote machine, and everything the remote machine prints is displayed in a Chat window. Chat is an extensible terminal emulation facility. Its core supplies both terminal- and network-protocol- independent functionality; new terminal types and new Chat protocols, based on this core, can be added to Chat at any time. You can choose any terminal type to be used with any network protocol type. There are currently terminal emulators for the following terminals: Datamedia 2500(DATAMEDIA% 2500 NIL Datamedia% 2500 NIL NIL 21) DEC VT100(DIGITAL% VT100 NIL Digital% VT100 NIL NIL 21) TEdit(TEDIT NIL TEdit NIL NIL 21) (this is actually a TEdit-based Chat window, supporting scrolling and copy-select operations as in standard TEdit). A number of different network protocol interfaces can be used with Chat. The following protocols are available: PUP Chat NS Chat (using the GAP protocol) TCP (ARPANET) TELNET RS232 Chat (using either the RS232 or TTY ports of the 1108 and 1186 processors) Each of these is available by loading the corresponding module. Requirements 1 DMCHAT CHATTERMINAL One of the network protocols:(NETWORK% PROTOCOLS NIL network% protocols NIL NIL 21) PUPCHAT or NSCHAT or RS232CHAT or TTYCHAT or TCPCHAT. One of the terminal emulators:(TERMINAL% EMULATORS NIL terminal% emulators NIL NIL 21) DMCHAT or VTCHAT or TEDITCHAT. The applicable file dependencies enumerated in the Introduction of this manual. Installation 1 Load CHAT.LCOM from the library. In addition, you must load at least one of the Chat network protocol modules. If you want a terminal emulator different from the default DM2500, you must also load it. User Interface 1 Chat prompts for a new window for each new connection. It saves the first window to reuse once the connection in that window is closed (other windows just go away when their connections are closed). Multiple, simultaneous Chat connections(CHAT% CONNECTIONS NIL Chat% connections NIL NIL 22) are possible. To switch between typing to different Chat connections, press the left button within the Chat window you want to use. Opening a Chat Connection(OPENING% A% CHAT% CONNECTION NIL Opening% a% Chat% Connection NIL NIL 22) The simplest way to open a Chat connection is to select the CHAT option of the right-button (background) menu. The first time you do this, you are prompted in the system's prompt window for the name of a host to which to connect. Subsequently, you are prompted with a menu of all hosts to which you have opened Chat connections; the last entry in this menu is OTHER, and provides a way for you to connect to new Chat hosts. The other method of opening a Chat connection is to call the CHAT function directly: (CHAT(CHAT (function) NIL NIL NIL 22) HOST LOGOPTION INITSTREAM WINDOW) [Function] Opens a Chat connection to HOST, or to the value of DEFAULTCHATHOST(DEFAULTCHATHOST (variable) NIL NIL NIL 22). If HOST requires login, Chat supplies a login sequence. You may alternatively specify one of the following values for LOGOPTION: Login Always perform a login. Attach Always perform an attach (this is likely to be useful only when opening Chat connections to hosts running the Tops-20 or Tenex operating systems). This fails if you do not have exactly one detached job. None Do not attempt to log in or attach. Note: It is important that you supply information about the types of hosts to which you chat by setting the variable NETWORKOSTYPES (see IRM) or DEFAULT.OSTYPE (see Lisp Release Notes), as CHAT uses that information to determine whether and how to log in. An incorrect login sequence can inadvertantly expose your password. If INITSTREAM is supplied, it is either a string or the name of a file whose contents are read as type-in. When the string/file is exhausted, input is taken from the keyboard. If WINDOW is supplied, it is the window to use for the connection; otherwise, you are prompted for a window. While Chat is in control, all Lisp interrupts(LISP% INTERRUPTS NIL Lisp% interrupts NIL NIL 22) are turned off, so that control characters can be transmitted to the remote host. Chat does not turn off interrupt characters until after creating the Chat window, so you can abort the call to Chat by typing Control-E while specifying the Chat window region. If you press the left button in an Executive window, the system's focus-of-attention is switched to that window. At the same time, keyboard interrupts, such as Control-E, are reenabled. Whenever you select an open Chat window, the focus-of-attention is returned to the Chat window, and keyboard interrupts are disabled. Chat Menu(CHAT% MENU NIL Chat% Menu NIL NIL 23) Commands can be given to an active Chat connection by pressing the middle mouse button in the Chat window to get a command menu. Note: The left mouse button, when pressed inside an active Chat window, holds output as long as the button is down. Holding down the middle button coincidentally does this too, but not on purpose; since the menu handler does not yield control to other processes, it is possible to kill the connection by keeping the menu up too long. CLOSE Closes this connection. Once the connection is closed, control is handed over to the main Lisp Executive window. Closes the Chat window unless it is the primary Chat window. SUSPEND Same as CLOSE, but always leaves the window open. NEW Closes the current connection and prompts for a new host to which to open a connection in the same window. FREEZE Holds type-out from this Chat window. Pressing a mouse button in the window in any way releases the hold. This is most useful if you want to switch to another, overlapping window and there is type-out in this window that would compete for screen space. DRIBBLE Opens a typescript file for this Chat connection (closing any previous dribble file for the window). You are prompted for a file name. If you want to close an open dribble file (without opening a new one), just type a carriage return. INPUT Prompts for a file from which to take input. When the end of the file is reached, input reverts to the keyboard. CLEAR Clears the window and resets the simulated terminal to its default state. This is useful if undesired terminal commands have been received from the remote host that place the simulated terminal into an indeterminate state. EMACS Turns on or off the Chat EMACS feature, which provides a convenient way to use the workstation's mouse to move the cursor on the remote machine when using the EMACS text editor. When this feature is turned on, pressing the left mouse button in the Chat window causes a sequence of commands to be sent to the remote machine that cause EMACS to move its cursor to the mouse location. Use of this feature assumes you know the keystrokes to perform cursor-moving commands; see CHAT.EMACSCOMMANDS if your EMACS does not use the standard ones. Also, it assumes that you are pointing where there is actually text in your document (not white space beyond the end of a line) and that there are no tabs in your text; otherwise, the cursor position may not be where you expect. RECONNECT In an inactive Chat window, pressing the middle mouse button brings up a menu of one item, RECONNECT, whose selection reopens a connection to the same host as was last in the window. This is the primary motivation for the SUSPEND menu command. MODE The Chat menu also contains a command of this form for each terminal emulator that you have loaded. The MODE commands are intended to let you dynamically switch between terminal emulators. However, this feature is currently defective and should not be used. You must also choose your emulator type, by setting CHAT.DISPLAYTYPES, before opening the Chat connection. Customizing Chat(CUSTOMIZING% CHAT NIL Customizing% Chat NIL NIL 24) 1 CHAT.DISPLAYTYPES(CHAT.DISPLAYTYPES (variable) NIL NIL NIL 24) [Variable] This variable contains a list that assigns the terminal emulators to be used with the hosts. Each entry on the list is of the form: () HostName When Chat opens a connection, it scans CHAT.DISPLAYTYPES to find an entry whose HostName field matches the name of the Chat host. If no matching entry is found, it scans the list again, looking for an entry whose HostName field is NIL. TerminalTypeNumber Is only important when the Chat protocol in use is PUP Chat. This number identifies the terminal type to the Chat host's operating system. Currently, only Tops-20 and Tenex hosts make use of this facility; if the Chat host does not support this feature, the number in the TerminalTypeNumber field is ignored. TerminalEmulator Chat uses this field of the entry it finds to choose which terminal type to emulate. Typical terminal emulator names are DM2500, VT100, and TEDIT. CHAT.KEYACTIONS(CHAT.KEYACTIONS (variable) NIL NIL NIL 24) [Variable] This variable controls the remapping of the keyboard when the system's focus-of-attention is an active Chat window. The format of this list is: ((KEYNAME . ACTIONS) (KEYNAME . ACTIONS) ... ) For example, if you prefer the backspace key to send the rubout character (octal 177), you would set CHAT.KEYACTIONS to be: ((BS (177Q 177Q NOLOCKSHIFT) . IGNORE)) The key actions are assigned when a Chat process is initiated; i.e., changing CHAT.KEYACTIONS only affects new Chat connections. CHAT.INTERRUPTS(CHAT.INTERRUPTS (variable) NIL NIL NIL 24) [Variable] A list of interrupts to pass to INTERRUPTCHAR to assign keyboard interrupts; e.g., ((177Q. HELP)) causes the DELETE character (code 177) to run the HELP interrupt. Like CHAT.KEYACTIONS, this variable only affects new Chat connections. CHAT.ALLHOSTS(CHAT.ALLHOSTS (variable) NIL NIL NIL 25) [Variable] A list of host names, as uppercase symbols, to which you want to chat. Chatting to a host not on the list adds it to the list. These names are placed in the menu used by the background Chat command prompts. CLOSECHATWINDOWFLG(CLOSECHATWINDOWFLG (variable) NIL NIL NIL 25) [Variable] If true, every Chat window is closed on exit. If NIL, the initial setting, then the primary Chat window is not closed. DEFAULTCHATHOST(DEFAULTCHATHOST (variable) NIL NIL NIL 25) [Variable] The host to which CHAT connects when it is called with no HOST argument. CHAT.FONT(CHAT.FONT (variable) NIL NIL NIL 25) [Variable] If non-NIL, the font used to create Chat windows. If CHAT.FONT is NIL, Chat windows are created with (DEFAULTFONT 'DISPLAY). Note: To work well with the DM2500 and VT100 terminal emulators, you should use fixedÿÿï$width fonts (e.g., Gacha or Terminal).ÿ CHAT.WINDOW.SIZE(CHAT.WINDOW.SIZE (variable) NIL NIL NIL 25) [Variable] This variable is either NIL or a dotted pair of (WIDTH . HEIGHT). The value of the WIDTH field indicates the desired width of the Chat window, in pixels. The value of the HEIGHT field indicates the desired HEIGHT of the window, also in pixels. Note: Before a new value of CHAT.WINDOW.SIZE is used, CHAT.WINDOW must be set to NIL or NOBIND. If CHAT.WINDOW.SIZE is changed after chat has already been called, and chat is then called, the window is not changed because the information is cached. CHAT.WINDOW must be set to NIL and the window recreated anew before this takes place. CHAT.WINDOW.REGION(CHAT.WINDOW.REGION (variable) NIL NIL NIL 25) [Variable] This variable is either NIL or an instance of a REGION. When CHAT.WINDOW.REGION is non-NIL, its value is used as the region in which to create the first Chat window. Subsequent windows are created by prompting for the position of a window of CHAT.WINDOW.SIZE dimensions, or, if that variable is NIL, for an arbitrary window region. CHAT.TTY.PROCESS(CHAT.TTY.PROCESS (variable) NIL NIL NIL 25) [Variable] When you start up CHAT, it takes the TTY immediately if the value is T. (The initial value is T.) CHAT.EMACSCOMMANDS(CHAT.EMACSCOMMANDS (variable) NIL NIL NIL 25) [Variable] A list of five character codes; initially the value of (CHARCODE (^U ^P ^N ^F ^A)). These character codes are used by the EMACS Argument command in changing the position of the cursor: Up one line Down one line Forward one character Backward one character Beginning of line CHAT.IN.EMACS?(CHAT.IN.EMACS? (variable) NIL NIL NIL 26) [Variable] The initial state of the EMACS feature when a Chat connection is started. Initially NIL, meaning the feature is off. CHAT.PROTOCOLTYPES(CHAT.PROTOCOLTYPES (variable) NIL NIL NIL 26) [Variable] Each Chat emulator (TTYCHAT, RS232CHAT, PUPCHAT ...) adds an entry onto CHAT.PROTOCOLTYPES which recognizes host names for the appropriate protocol. For example, loading PUPCHAT adds an entry (PUP . PUPCHAT.HOST.FILTER) and TCPCHAT adds an entry (TCP . TCP.HOST.FILTER). Site administrators of complex networks may want to reorganize these entries when there are hosts which are running multiple servers, each running different protocols. Network Protocols(NETWORK% PROTOCOLS NIL Network% Protocols NIL NIL 26) 1 For the most part, you should not notice too many differences in the behavior of Chat when using one network protocol versus another. The following are unique features of each of the Chat network protocols. PUP Chat(PUP% CHAT NIL PUP% Chat NIL NIL 26) PUP Chat is in the file PUPCHAT.LCOM. Implementations of PUP Chat servers exist for Tops-20, Tenex, VAX/UNIX, and VAX/VMS operating systems. The PUP Chat protocol contains provisions for automatically setting your terminal type, width, and height whenever you establish a connection or reshape your Chat window. NS Chat(NS% CHAT NIL NS% Chat NIL NIL 26) The NS Chat protocol (also known as GAP, or Gateway Access Protocol(GATEWAY% ACCESS% PROTOCOL NIL Gateway% Access% Protocol NIL NIL 26)) is used to communicate with hosts running GapTelnet(GAPTELNET NIL GapTelnet NIL NIL 26) service, including VAX/UNIX and the VAX/VMS service XNS/DEC VAX, and also with Xerox 8000-series network services such as 8040 print servers or 8030 file servers. This protocol is contained on the file NSCHAT.LCOM. The NS Chat protocol differentiates among a number of virtual terminal services. When you chat to an NS host, the NS Chat module queries the Clearinghouse(CLEARINGHOUSE NIL Clearinghouse NIL NIL 26) for information about the specified host. This information permits the NS Chat module to determine which of the following virtual terminal services are appropriate for the host. The NS Chat module uses a small set of heuristics to choose which virtual terminal service to invoke, based on information returned by the Clearinghouse. If the Clearinghouse information indicates that only one service type is possible, NS Chat opens a connection to the Chat host and invokes the proper virtual terminal service. If the Clearinghouse returns information indicating that more than one virtual terminal service is supported by the specified host, you are prompted to choose a service from a menu of the possible service types. If NS Chat guesses an incorrect service type, or you choose an incorrect service type, you are prompted to choose a service from a menu of all known virtual service types. If this fails, NS Chat abandons its attempts to connect to the specified host. Remote System Administration(REMOTE% SYSTEM% ADMINISTRATION NIL Remote% System% Administration NIL NIL 27) This service lets you log onto print servers and clearinghouse servers, and issue appropriate commands. NS Chat automatically chooses this service when the specified host is registered in the Clearinghouse as any type of server machine. Remote System Executive(REMOTE% SYSTEM% EXECUTIVE NIL Remote% System% Executive NIL NIL 27) This service is currently supported by VAX/VMS systems running XNS/DEC VAX, by UNIX systems running GapTelnet service, by Lisp workstations running CHATSERVER from the library, and by XDE workstations. Interactive Terminal Service(INTERACTIVE% TERMINAL% SERVICE NIL Interactive% Terminal% Service NIL NIL 27) The ITS is a TTY-based interface to NS mail. External Communication Service(EXTERNAL% COMMUNICATION% SERVICE NIL External% Communication% Service NIL NIL 27) The External Communication Service (ECS) enables Chat connections to external hosts accessible only by use of a modem. When you open a Chat connection to an ECS, you are prompted for a telephone number; the ECS dials that number and completes the connection if a compatible modem answers. ECS hosts typically support a variety of modem connection characteristics (specific combinations of parity, character length, baud rate, and flow control settings). Each connection type is known by a different Chat host name; check with your system administrator to determine the Chat host name you should use to connect to a particular external host. TCP Chat(TCP% CHAT NIL TCP% Chat NIL NIL 27) TCPCHAT.LCOM is the interface to the TCP-based TELNET protocol, which is the protocol in use throughout the ARPANET. It loads and initializes the TCP-IP module, if necessary. Read the TCP-IP module in this manual for more information. RS232 Chat(RS232% CHAT NIL RS232% Chat NIL NIL 27) RS232 Chat is contained on the files RS232CHAT.LCOM and TTYCHAT.LCOM. RS232 Chat enables use of the 1108, 1185, and 1186 RS232 ports; TTY Chat enables use of the 1108, 1185, and 1186 TTY ports. Read the RS232 module in this manual for more information. Terminal Emulators 1 DM2500 Chat(DM2500% CHAT NIL DM2500% Chat NIL NIL 27) The Datamedia 2500 terminal emulator is contained in DMCHAT.LCOM. To use it, load DMCHAT.LCOM and add entries to CHAT.DISPLAYTYPES in the form: ( DM2500) VT100 Chat(VT100% CHAT NIL VT100% Chat NIL NIL 28) The VT100 emulator is contained in VTCHAT. To use it, load VTCHAT.DFASL and add entries to CHAT.DISPLAYTYPES in the form: ( VT100) Currently, the VT100 emulator does not emulate the following features of the actual Digital VT100 terminal: Dual-width or dual-height characters Graphics character set Remotely initiated switching between 80- and 132-column mode TEdit Chat(TEDIT% CHAT NIL TEdit% Chat NIL NIL 28) TEdit Chat supplies a ªglass TTYº terminal emulator with a TEdit stream storing all characters received during the Chat session. As a result, you can scroll back and forth through a transcript of your session, and you can use the standard TEdit copy-select command to copy blocks of characters from the Chat window to another TEdit window, a Lisp Executive, etc. To use TEdit Chat, load TEDITCHAT.LCOM, and add entries to CHAT.DISPLAYTYPES in the form: ( TEDIT) Note that since TEdit already uses the middle mouse button, you must click in the window's title bar in order to get the usual Chat menu. [This page intentionally left blank] (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "") STARTINGPAGE# 21) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (TEXT NIL NIL (54 54 504 702) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (54 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY HELVETICA OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (270 15 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))))&-$$àT-HHàT3HHà +àT6´à¢´T5´à¢´.$$àTT-àT,à,à5H¨àœ¨2Hlàl5ÌàÀÌ2llà2là,à,à,llà2àÈ,à,$$à +,HHà,$$à2HHà +à2$$àl2HHà +l2llàl2HHàl,HHà,HHà +3ààT2øø2øø-T-øäìTFøø PAGEHEADING VERSOHEADFøø PAGEHEADING RECTOHEADEøø PAGEHEADINGFOOTINGVEøø PAGEHEADINGFOOTINGR HELVETICA HELVETICA +TITAN TITAN +CLASSIC +CLASSIC + HELVETICA  HELVETICAMODERN +MODERN +MODERNMODERNMODERN +MODERN & HRULE.GETFNTITAN +&/% HRULE.GETFNTITAN +%0$$ HRULE.GETFNTITAN +## HRULE.GETFNTITAN + HRULE.GETFNMODERN IM.INDEX.GETFN5E0IM.INDEX.GETFN +.IM.INDEX.GETFNIM.INDEX.GETFNwr "R@  HRULE.GETFNMODERN  6IM.INDEX.GETFN78IM.INDEX.GETFN"O   HRULE.GETFNMODERN  OY  HRULE.GETFNMODERN È'4IM.INDEX.GETFNˆJIM.INDEX.GETFN<*;= IM.INDEX.GETFNMODERN +    +IM.INDEX.GETFNMODERN + + 3=   + + + + + + +Ì + +$ t +  + +„ + £  b -2IM.INDEX.GETFNB &IM.INDEX.GETFNƒ P  ° + +$ + + +k + +ÿ + +í  r + +á + +] + +Z + { +  + + +g + +P +z$ + 4IM.INDEX.GETFN HRULE.GETFNMODERN -IM.INDEX.GETFNMODERN +  … 4  + +& + +¯ +  +8  + +“ ++IM.INDEX.GETFNMODERN +  ’ 0 d   * N #+IM.INDEX.GETFNMODERN + +  ! &D 3 )IM.INDEX.GETFNMODERN + +  Ñ.IM.INDEX.GETFNMODERN +  2C+IM.INDEX.GETFNMODERN + + +  %  %IM.INDEX.GETFNMODERN + +  6   UQ,IM.INDEX.GETFNMODERN + +   T  + +   + + + + +… +  + +7.IM.INDEX.GETFNMODERN +     LK + +$",IM.INDEX.GETFNMODERN + + /   .IM.INDEX.GETFNMODERN + + 6  &: *IM.INDEX.GETFNMODERN + + T  .IM.INDEX.GETFNMODERN +  +H<,¨6IM.INDEX.GETFN HRULE.GETFNMODERN Ð$IM.INDEX.GETFN "IM.INDEX.GETFNCDIM.INDEX.GETFN5$IM.INDEX.GETFNÌ Ÿ,IM.INDEX.GETFN´KÔüNIM.INDEX.GETFN îDIM.INDEX.GETFN ” +,NIM.INDEX.GETFN -RIM.INDEX.GETFN "a$IM.INDEX.GETFN á +(IM.INDEX.GETFN% º   HRULE.GETFNMODERN  *IM.INDEX.GETFN5  ) +(IM.INDEX.GETFN= )l%= +(IM.INDEX.GETFNn)Š"%! +!K°zº \ No newline at end of file diff --git a/library/CMLFLOATARRAY.TEDIT b/library/CMLFLOATARRAY.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..ab11f0776c8d2006554d189b898f57757e168c7c GIT binary patch literal 12412 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 literal 0 HcmV?d00001 diff --git a/library/COLOR1.TEDIT b/library/COLOR1.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..061cc10ce7b3565df245cc716dc6492364ecbfef GIT binary patch literal 50717 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 V3%prCrb1bN ¯  &           HRULE.GETFNMODERN  ¿   + ¤     ?   =     Ë     "      "  HRULE.GETFNMODERN  HRULE.GETFNMODERNy    D + q  B  -  i  (  _    L    *  X = ¥    * £    ?  N    ã  HRULE.GETFNMODERN _    +8 -   + Z    +& 8 ,   S       =     m + +) + +  +   + /  ê à µ ; è –  HRULE.GETFNMODERN HRULE.GETFNMODERNž      v 4       ) E ß   ¡  HRULE.GETFNMODERN HRULE.GETFN, HRULE.GETFNMODERN•  HRULE.GETFNMODERN ¾      2  "  1  HRULE.GETFNMODERN +  + +    HRULE.GETFNMODERN  + ª ' ) Þ ) HRULE.GETFNMODERN‘    HRULE.GETFNMODERN + ë ? "  4  HRULE.GETFNMODERN + -  HRULE.GETFNMODERN + Š  ˆ ? "  a  HRULE.GETFNMODERN + C  HRULE.GETFNMODERN +  ( BMOBJ.GETFN3Í H Ê , BMOBJ.GETFN3Ü 1 @      HRULE.GETFNMODERN + '  HRULE.GETFNMODERN + ð  HRULE.GETFNMODERN +  HRULE.GETFNMODERN HRULE.GETFNMODERNï ). Menus are a special type of window provided by the window system, used for displaying a set of items to the user, and having the user select one using the mouse and cursor. The menu facility also allows users to create and use menus in interactive programs (see ("Menus" . TERM)). As of the LUTE release of Xerox Lisp, it is possible for the user to create and use windows and menus on the color display. (CREATEW REGION TITLE BORDERSIZE NOOPENFLG) [Function] 1 Creates a new window. REGION indicates where and how large the window should be by specifying the exterior screenregion of the window. In a user environment with multiple screens, such as a black and white screen and color screen both connected to the same machine, there is a new special problem in indicating which screen the REGION is supposed to be a region of. This problem is solved by allowing CREATEW to take screenregion arguments as REGION. For example, (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) creates a window titled "FOO WINDOW" on the color screen. To create a window on the black and white screen, the user should use SCREEN _ (MAINSCREEN) in the CREATE SCREENREGION expression. Note that it is still perfectly legal to pass in a REGION that is a region, not a screenregion, to CREATEW, but it is preferable to be passing screenregions rather than regions to CREATEW. This is because when REGION is a region, REGION is disambiguated in a somewhat arbitrary manner that may not always turn out to be what the user was hoping for. When REGION is a region, REGION is disambiguated by coercing REGION to be a screenregion on the screen which currently contains the cursor. This is so that software calling CREATEW with regions instead of screenregions tends to do the right thing in a user environment with multiple screens. 1 (WINDOWPROP WINDOW PROP NEWVALUE) [NoSpread Function] 1 If PROP='SCREEN, then WINDOWPROP returns the screen WINDOW is on. If NEWVALUE is given, (even if given as NIL), with PROP='SCREEN, then WINDOWPROP will generate an error. Any other PROP name is handled in the usual way. 1 (OPENWINDOWS SCREEN) [Function] 1 Returns a list of all open windows on SCREEN if SCREEN is a screen datatype such as (MAINSCREEN) or (COLORSCREEN). If SCREEN=NIL, then SCREEN will default to the screen containing the cursor. If SCREEN=T, then a list of all open windows on all screens is returned. 1 2 Color Fonts 1 The user can create color fonts and specify in the font profile that certain color fonts be used when printing in color. Color Font Creation 1 The user can create and manipulate color fonts through the same functions that are used to create and manipulate black and white fonts. This is made possible in some cases by there being new ways to call familiar font functions. (FONTCREATE FAMILY SIZE FACE ROTATION DEVICE NOERRORFLG CHARSET) [Function] 1 In addition to creating black and white fonts, FONTCREATE can be used to create color fonts. For example, (FONTCREATE 'GACHA 10 '(BOLD REGULAR REGULAR YELLOW BLUE) 0 '8DISPLAY) will create an 8 bit per pixel font with blue letters on a yellow background. The user indicates the color and bits per pixel of the font by the FACE and DEVICE arguments passed to FONTCREATE. DEVICE='8DISPLAY means to create an 8bpp font and DEVICE='4DISPLAY means to create a 4bpp font. A color font face is a 5 tuple, (WEIGHT SLOPE EXPANSION BACKCOLOR FORECOLOR) whereas a black and white font face is just a 3 tuple, (WEIGHT SLOPE EXPANSION) The FORECOLOR is the color of the characters of the font and the BACKCOLOR is the color of the background behind the characters that gets printed along with the characters. Both BACKCOLOR and FORECOLOR are allowed to a color name, color number, or any other legal color representation. A color font face can also be represented as a LITATOM. A three character atom such as MRR or any of the special atoms STANDARD, ITALIC, BOLD, BOLDITALIC can optionally be continued by hyphenating on BACKCOLOR and FORECOLOR suffixes. For example, MRR-YELLOW-BLUE BOLD-YELLOW-RED ITALIC-90-200 BRR-100-53 are acceptable color font faces. Hence, (FONTCREATE 'GACHA 10 'BOLD-YELLOW-BLUE 0 '8DISPLAY) will create a color font. LITATOM FACE arguments fall into one of the following patterns: wse wse-backcolor-forecolor STANDARD STANDARD-backcolor-forecolor ITALIC ITALIC-backcolor-forecolor BOLD BOLD-backcolor-forecolor BOLDITALIC BOLDITALIC-backcolor-forecolor where w=B, M, or L; s=I or R; e=R, C, or E; backcolor=a color name or color number; and forecolor=a color name or color number. 1 (FONTPROP FONT PROP) [Function] 1 Returns the value of the PROP property of font FONT. Besides black and white font properties, the following font properties are recognized: FORECOLOR The color of the characters of the font, represented as a color number. This is the color in which the characters of the font will print. BACKCOLOR The color of the background of the characters of the font, represented as a color number. This is the color in which the the background of characters of the font will print. A font with red characters on a yellow background would have a red FORECOLOR and a yellow BACKCOLOR. Color Font Profiles 1 Font profiles are the facility PRETTYPRINT uses to print different elements (user functions, system functions, clisp words, comments, etc.) in different fonts to emphasize (or deemphasize) their importance, and in general to provide for a more pleasing appearance. The user can specify that different colors of fonts be used for different kinds of elements when printing in color. A well chosen font profile will allows user to DEDIT functions, PP functions, and SEE source files in color, for example. A FONTPROFILE such as ((DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8) (4DISPLAY (GACHA 10 MRR-WHITE-RED)) (8DISPLAY (GACHA 10 MRR-WHITE-RED))) (BOLDFONT 2 (HELVETICA 10 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR) (4DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA)) (8DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA))) (LITTLEFONT 3 (HELVETICA 8) (HELVETICA 6 MIR) (MODERN 8 MIR) (4DISPLAY (HELVETICA 8 MRR-WHITE-GREEN)) (8DISPLAY (HELVETICA 8 MRR-WHITE-GREEN))) (BIGFONT 4 (HELVETICA 12 BRR) (HELVETICA 10 BRR) (MODERN 10 BRR) (4DISPLAY (HELVETICA 12 BRR-WHITE-BLUE)) (8DISPLAY (HELVETICA 12 BRR-WHITE-BLUE))) (USERFONT BOLDFONT) (COMMENTFONT LITTLEFONT) (LAMBDAFONT BIGFONT) (SYSTEMFONT) (CLISPFONT BOLDFONT) ...) would have comments print in green and clisp words print in blue while ordinairy atoms would print in red. Not all combinations of fonts will be aesthetically pleasing and the user may have to experiment to find a compatible set. The user should indicate what font is to be used for each font class by calling the function FONTPROFILE: (FONTPROFILE PROFILE) [Function] 1 Sets up the font classes as determined by PROFILE, a list of elements which defines the correspondence between font classes and specific fonts. Each element of PROFILE is a list of the form: (FONTCLASS FONT# DISPLAYFONT PRESSFONT INTERPRESSFONT (OTHERDEVICE1 OTHERFONT1) ... (OTHERDEVICEn OTHERFONTn)) FONTCLASS is the font class name and FONT# is the font number for that class. DISPLAYFONT, PRESSFONT, and INTERPRESSFONT are font specifications (of the form accepted by FONTCREATE) for the fonts to use when printing to the black and white display and to Press and Interpress printers respectively. The appearance of color fonts can be affected by including an (OTHERDEVICEi OTHERFONTi) entry where OTHERDEVICEi is either 4DISPLAY or 8DISPLAY for a 4 bits per pixel or 8 bits per pixel color font and OTHERFONTi is a color font specification such as (GACHA 10 MRR-WHITE-RED). 1 FONTPROFILE [Variable] 1 This is the variable used to store the current font profile, in the form accepted by the function FONTPROFILE. Note that simply editing this value will not change the fonts used for the various font classes; it is necessary to execute (FONTPROFILE FONTPROFILE) to install the value of this variable. 1 2 Using Color 1 The current color implementation allows display streams to operate on color bitmaps. The two functions DSPCOLOR and DSPBACKCOLOR set the color in which a stream draws when the user defaults a color argument to a drawing function. (DSPCOLOR COLOR STREAM) [Function] sets the foreground color of a stream. It returns the previous foreground color. If COLOR is NIL, it returns the current foreground color without changing anything. The default foreground color is MINIMUMCOLOR=0, which is white in the default color maps. (DSPBACKCOLOR COLOR STREAM) [Function] sets the background color of a stream. It returns the previous background color. If COLOR is NIL, it returns the current background color without changing anything. The default background color is (MAXIMUMCOLOR BITSPERPIXEL)=15 or 255, which is black in the default color maps. The BITBLT, line-drawing routines, and curve-drawing routines routines know how to operate on a color-capable stream. Following are some notes about them. 2 BITBLTing in Color 1 If BITBLTing from a color bitmap onto another color bitmap of the same bpp, the operations PAINT, INVERT, and ERASE are done on a bit level, not on a pixel level. Thus painting color 3 onto color 10 results in color 11. If BITBLTing from a black-and-white bitmap onto a color bitmap, the one bits appear in the DSPCOLOR, and the zero bits in DSPBACKCOLOR. BLTing from black-and-white to color is fairly expensive; if the same bitmap is going to be put up several times in the same color, it is faster to create a color copy and then BLT the color copy. If the source type is TEXTURE and the destination bitmap is a color bitmap, the Texture argument is taken to be a color. Thus to fill an area with the color BLUE assuming COLORSTR is a stream whose destination is the color screen, use (BITBLT NIL NIL NIL COLORSTR 50 75 100 200 'TEXTURE 'REPLACE 'BLUE). 2 Drawing Curves and Lines in Color 1 For the functions DRAWCIRCLE, DRAWELLIPSE, and DRAWCURVE, the notion of a brush has been extended to include a color. A BRUSH is now (BRUSHSHAPE BRUSHSIZE BRUSHCOLOR). Also, a brush can be a bitmap (which can be a color bitmap). Line-drawing routines take a color argument which is the color the line is to appear in if the destination of the display stream is a color bitmap. (DRAWLINE X1 Y1 X2 Y2 WIDTH OPERATION STREAM COLOR) [Function] (DRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (RELDRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (DRAWBETWEEN POS1 POS2 WIDTH OPERATION STREAM COLOR) [Function] If the COLOR argument is NIL, the DSPCOLOR of the stream is used. 2 Printing in Color 1 Printing only works in REPLACE mode. The characters have a background color and a foreground color determined by the font face of the font the characters are being printed with. Example of printing to an 8bpp color screen: (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) (DSPFONT (FONTCREATE 'GACHA 10 'MRR-YELLOW-GREEN 0 '8DISPLAY) FOO) (PRINT 'HELLO FOO) ; will print in green against a yellow background. 2 Operating the Cursor on the Color Screen 1 The cursor can be moved to the color screen. The cursor can be moved to the color screen by sliding the cursor off the left or right edge of the black and white screen on to the color screen or by calling function CURSORPOSITION or CURSORSCREEN. (CURSORPOSITION NEWPOSITION - -) [Function] 1 NEWPOSITION can be a position or a screenposition. (CURSORSCREEN SCREEN XCOORD YCOORD) [Function] 1 Moves the cursor to the screenposition determined by SCREEN, XCOORD, and YCOORD. SCREEN should be the value of either (COLORSCREEN) or (MAINSCREEN). While on the color screen, the cursor is placed by doing BITBLTs in software rather than with microcode and hardware as with the black and white cursor. It is automatically taken down whenever an operation is performed that changes any bits on the color screen. The speed of the color cursor compares well with that of the black and white cursor but there can be a noticeable flicker when there is much input/output to the color screen. While the cursor is on the color screen, the black-and-white cursor is cleared giving the appearance that there is never more than one cursor at a given time. 2 Miscellaneous Color Functions 1 (COLORIZEBITMAP BITMAP 0COLOR 1COLOR BITSPERPIXEL) [Function] creates a color bitmap from a black and white bitmap. The returned bitmap has color number 1COLOR in those pixels of BITMAP that were one and 0COLOR in those pixels of BITMAP that were zero. This provides a way of producing a color bitmap from a black and white bitmap. (UNCOLORIZEBITMAP BITMAP COLORMAP) [Function] creates a black and white bitmap from a color bitmap. (SHOWCOLORTESTPATTERN BARSIZE) [Function] displays a pattern of colors on the color display. This is useful when editing a color map. The pattern has squares of the 16 possible colors laid out in two rows at the top of the screen. Colors 0 through 7 are in the top row, and colors 8 through 15 are in the next row. The bottom part of the screen is filled with bars of BARSIZE width with consecutive color numbers. The pattern is designed so that every color has a border with every other color (unless BARSIZE is too large to allow room for every colorÿÿï%ÿabout 20). (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 2) (0 0 612 792) ((FOLIO NIL ( PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) ( 54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 618) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (558 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) ( PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) ( HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))))7ÌÌø ˜Ôø8ÌÌø ˜ÔøT(ÌÌø1ÌøºÌ(ÌÌø)KKøT/KÌøøT(ÌÌø5ÌÌø nøT/ÌÌøøT/ÌÌøøT/ÌÌøÈT/ÌÌøÈT/ÌÌø øT/ø2øT/øÈT/øøT/øøT.ÌÌøø.ÌÌø ø/øÈT/ø2ÈT.ÌÌøÈ.ÌÌø È<ø PAGEHEADING VERSOHEAD<ø PAGEHEADING RECTOHEAD;ø PAGEHEADINGFOOTINGV;ø PAGEHEADINGFOOTINGR ?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) +MODERNMODERN MODERNMODERNMODERN +MODERN +MODERN +MODERN + HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN HRULE.GETFNMODERN  HRULE.GETFNMODERN× ü ž ã f   • f +Ý  HRULE.GETFNMODERN. HRULE.GETFNMODERNî   @   +   W ï (   " ‚ =  HRULE.GETFNMODERN  HRULE.GETFNMODERNô É  `   HRULE.GETFNMODERN  ë   + ]  + > ¯  &           HRULE.GETFNMODERN  ¿   + ¤     ?   =     Ë     "      "  HRULE.GETFNMODERN  HRULE.GETFNMODERNy    D + q  B  -  i  (  _    L    *  X = ¥    * £    ?  N    ã  HRULE.GETFNMODERN _    +8 -   + Z    +& 8 ,   S       =     m + +) + +  +   + /  ê à µ ; è –  HRULE.GETFNMODERN HRULE.GETFNMODERNž      v 4       ) E ß   ¡  HRULE.GETFNMODERN HRULE.GETFN, HRULE.GETFNMODERN•  HRULE.GETFNMODERN ¾      2  "  1  HRULE.GETFNMODERN +  + +    HRULE.GETFNMODERN  + ª ' ) Þ ) HRULE.GETFNMODERN‘    HRULE.GETFNMODERN + ë ? "  4  HRULE.GETFNMODERN + -  HRULE.GETFNMODERN + Š  ˆ ? "  a  HRULE.GETFNMODERN + C  HRULE.GETFNMODERN +  ( BMOBJ.GETFN3Í H Ê , BMOBJ.GETFN3Ü 1 @      HRULE.GETFNMODERN + '  HRULE.GETFNMODERN + ð  HRULE.GETFNMODERN +  HRULE.GETFNMODERN HRULE.GETFNMODERNï  IRM.GET.CREF ). As of the LUTE release of Xerox Lisp, it is possible for the user to create and use windows and menus on the color display. (CREATEW REGION TITLE BORDERSIZE NOOPENFLG) [Function] 1 Creates a new window. REGION indicates where and how large the window should be by specifying the exterior screenregion of the window. In a user environment with multiple screens, such as a black and white screen and color screen both connected to the same machine, there is a new special problem in indicating which screen the REGION is supposed to be a region of. This problem is solved by allowing CREATEW to take screenregion arguments as REGION. For example, (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) creates a window titled "FOO WINDOW" on the color screen. To create a window on the black and white screen, the user should use SCREEN _ (MAINSCREEN) in the CREATE SCREENREGION expression. Note that it is still perfectly legal to pass in a REGION that is a region, not a screenregion, to CREATEW, but it is preferable to be passing screenregions rather than regions to CREATEW. This is because when REGION is a region, REGION is disambiguated in a somewhat arbitrary manner that may not always turn out to be what the user was hoping for. When REGION is a region, REGION is disambiguated by coercing REGION to be a screenregion on the screen which currently contains the cursor. This is so that software calling CREATEW with regions instead of screenregions tends to do the right thing in a user environment with multiple screens. 1 (WINDOWPROP WINDOW PROP NEWVALUE) [NoSpread Function] 1 If PROP='SCREEN, then WINDOWPROP returns the screen WINDOW is on. If NEWVALUE is given, (even if given as NIL), with PROP='SCREEN, then WINDOWPROP will generate an error. Any other PROP name is handled in the usual way. 1 (OPENWINDOWS SCREEN) [Function] 1 Returns a list of all open windows on SCREEN if SCREEN is a screen datatype such as (MAINSCREEN) or (COLORSCREEN). If SCREEN=NIL, then SCREEN will default to the screen containing the cursor. If SCREEN=T, then a list of all open windows on all screens is returned. 1 2 Color Fonts 1 The user can create color fonts and specify in the font profile that certain color fonts be used when printing in color. Color Font Creation 1 The user can create and manipulate color fonts through the same functions that are used to create and manipulate black and white fonts. This is made possible in some cases by there being new ways to call familiar font functions. (FONTCREATE FAMILY SIZE FACE ROTATION DEVICE NOERRORFLG CHARSET) [Function] 1 In addition to creating black and white fonts, FONTCREATE can be used to create color fonts. For example, (FONTCREATE 'GACHA 10 '(BOLD REGULAR REGULAR YELLOW BLUE) 0 '8DISPLAY) will create an 8 bit per pixel font with blue letters on a yellow background. The user indicates the color and bits per pixel of the font by the FACE and DEVICE arguments passed to FONTCREATE. DEVICE='8DISPLAY means to create an 8bpp font and DEVICE='4DISPLAY means to create a 4bpp font. A color font face is a 5 tuple, (WEIGHT SLOPE EXPANSION BACKCOLOR FORECOLOR) whereas a black and white font face is just a 3 tuple, (WEIGHT SLOPE EXPANSION) The FORECOLOR is the color of the characters of the font and the BACKCOLOR is the color of the background behind the characters that gets printed along with the characters. Both BACKCOLOR and FORECOLOR are allowed to a color name, color number, or any other legal color representation. A color font face can also be represented as a LITATOM. A three character atom such as MRR or any of the special atoms STANDARD, ITALIC, BOLD, BOLDITALIC can optionally be continued by hyphenating on BACKCOLOR and FORECOLOR suffixes. For example, MRR-YELLOW-BLUE BOLD-YELLOW-RED ITALIC-90-200 BRR-100-53 are acceptable color font faces. Hence, (FONTCREATE 'GACHA 10 'BOLD-YELLOW-BLUE 0 '8DISPLAY) will create a color font. LITATOM FACE arguments fall into one of the following patterns: wse wse-backcolor-forecolor STANDARD STANDARD-backcolor-forecolor ITALIC ITALIC-backcolor-forecolor BOLD BOLD-backcolor-forecolor BOLDITALIC BOLDITALIC-backcolor-forecolor where w=B, M, or L; s=I or R; e=R, C, or E; backcolor=a color name or color number; and forecolor=a color name or color number. 1 (FONTPROP FONT PROP) [Function] 1 Returns the value of the PROP property of font FONT. Besides black and white font properties, the following font properties are recognized: FORECOLOR The color of the characters of the font, represented as a color number. This is the color in which the characters of the font will print. BACKCOLOR The color of the background of the characters of the font, represented as a color number. This is the color in which the the background of characters of the font will print. A font with red characters on a yellow background would have a red FORECOLOR and a yellow BACKCOLOR. Color Font Profiles 1 Font profiles are the facility PRETTYPRINT uses to print different elements (user functions, system functions, clisp words, comments, etc.) in different fonts to emphasize (or deemphasize) their importance, and in general to provide for a more pleasing appearance. The user can specify that different colors of fonts be used for different kinds of elements when printing in color. A well chosen font profile will allows user to DEDIT functions, PP functions, and SEE source files in color, for example. A FONTPROFILE such as ((DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8) (4DISPLAY (GACHA 10 MRR-WHITE-RED)) (8DISPLAY (GACHA 10 MRR-WHITE-RED))) (BOLDFONT 2 (HELVETICA 10 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR) (4DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA)) (8DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA))) (LITTLEFONT 3 (HELVETICA 8) (HELVETICA 6 MIR) (MODERN 8 MIR) (4DISPLAY (HELVETICA 8 MRR-WHITE-GREEN)) (8DISPLAY (HELVETICA 8 MRR-WHITE-GREEN))) (BIGFONT 4 (HELVETICA 12 BRR) (HELVETICA 10 BRR) (MODERN 10 BRR) (4DISPLAY (HELVETICA 12 BRR-WHITE-BLUE)) (8DISPLAY (HELVETICA 12 BRR-WHITE-BLUE))) (USERFONT BOLDFONT) (COMMENTFONT LITTLEFONT) (LAMBDAFONT BIGFONT) (SYSTEMFONT) (CLISPFONT BOLDFONT) ...) would have comments print in green and clisp words print in blue while ordinairy atoms would print in red. Not all combinations of fonts will be aesthetically pleasing and the user may have to experiment to find a compatible set. The user should indicate what font is to be used for each font class by calling the function FONTPROFILE: (FONTPROFILE PROFILE) [Function] 1 Sets up the font classes as determined by PROFILE, a list of elements which defines the correspondence between font classes and specific fonts. Each element of PROFILE is a list of the form: (FONTCLASS FONT# DISPLAYFONT PRESSFONT INTERPRESSFONT (OTHERDEVICE1 OTHERFONT1) ... (OTHERDEVICEn OTHERFONTn)) FONTCLASS is the font class name and FONT# is the font number for that class. DISPLAYFONT, PRESSFONT, and INTERPRESSFONT are font specifications (of the form accepted by FONTCREATE) for the fonts to use when printing to the black and white display and to Press and Interpress printers respectively. The appearance of color fonts can be affected by including an (OTHERDEVICEi OTHERFONTi) entry where OTHERDEVICEi is either 4DISPLAY or 8DISPLAY for a 4 bits per pixel or 8 bits per pixel color font and OTHERFONTi is a color font specification such as (GACHA 10 MRR-WHITE-RED). 1 FONTPROFILE [Variable] 1 This is the variable used to store the current font profile, in the form accepted by the function FONTPROFILE. Note that simply editing this value will not change the fonts used for the various font classes; it is necessary to execute (FONTPROFILE FONTPROFILE) to install the value of this variable. 1 2 Using Color 1 The current color implementation allows display streams to operate on color bitmaps. The two functions DSPCOLOR and DSPBACKCOLOR set the color in which a stream draws when the user defaults a color argument to a drawing function. (DSPCOLOR COLOR STREAM) [Function] sets the foreground color of a stream. It returns the previous foreground color. If COLOR is NIL, it returns the current foreground color without changing anything. The default foreground color is MINIMUMCOLOR=0, which is white in the default color maps. (DSPBACKCOLOR COLOR STREAM) [Function] sets the background color of a stream. It returns the previous background color. If COLOR is NIL, it returns the current background color without changing anything. The default background color is (MAXIMUMCOLOR BITSPERPIXEL)=15 or 255, which is black in the default color maps. The BITBLT, line-drawing routines, and curve-drawing routines routines know how to operate on a color-capable stream. Following are some notes about them. 2 BITBLTing in Color 1 If BITBLTing from a color bitmap onto another color bitmap of the same bpp, the operations PAINT, INVERT, and ERASE are done on a bit level, not on a pixel level. Thus painting color 3 onto color 10 results in color 11. If BITBLTing from a black-and-white bitmap onto a color bitmap, the one bits appear in the DSPCOLOR, and the zero bits in DSPBACKCOLOR. BLTing from black-and-white to color is fairly expensive; if the same bitmap is going to be put up several times in the same color, it is faster to create a color copy and then BLT the color copy. If the source type is TEXTURE and the destination bitmap is a color bitmap, the Texture argument is taken to be a color. Thus to fill an area with the color BLUE assuming COLORSTR is a stream whose destination is the color screen, use (BITBLT NIL NIL NIL COLORSTR 50 75 100 200 'TEXTURE 'REPLACE 'BLUE). 2 Drawing Curves and Lines in Color 1 For the functions DRAWCIRCLE, DRAWELLIPSE, and DRAWCURVE, the notion of a brush has been extended to include a color. A BRUSH is now (BRUSHSHAPE BRUSHSIZE BRUSHCOLOR). Also, a brush can be a bitmap (which can be a color bitmap). Line-drawing routines take a color argument which is the color the line is to appear in if the destination of the display stream is a color bitmap. (DRAWLINE X1 Y1 X2 Y2 WIDTH OPERATION STREAM COLOR) [Function] (DRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (RELDRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (DRAWBETWEEN POS1 POS2 WIDTH OPERATION STREAM COLOR) [Function] If the COLOR argument is NIL, the DSPCOLOR of the stream is used. 2 Printing in Color 1 Printing only works in REPLACE mode. The characters have a background color and a foreground color determined by the font face of the font the characters are being printed with. Example of printing to an 8bpp color screen: (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) (DSPFONT (FONTCREATE 'GACHA 10 'MRR-YELLOW-GREEN 0 '8DISPLAY) FOO) (PRINT 'HELLO FOO) ; will print in green against a yellow background. 2 Operating the Cursor on the Color Screen 1 The cursor can be moved to the color screen. The cursor can be moved to the color screen by sliding the cursor off the left or right edge of the black and white screen on to the color screen or by calling function CURSORPOSITION or CURSORSCREEN. (CURSORPOSITION NEWPOSITION - -) [Function] 1 NEWPOSITION can be a position or a screenposition. (CURSORSCREEN SCREEN XCOORD YCOORD) [Function] 1 Moves the cursor to the screenposition determined by SCREEN, XCOORD, and YCOORD. SCREEN should be the value of either (COLORSCREEN) or (MAINSCREEN). While on the color screen, the cursor is placed by doing BITBLTs in software rather than with microcode and hardware as with the black and white cursor. It is automatically taken down whenever an operation is performed that changes any bits on the color screen. The speed of the color cursor compares well with that of the black and white cursor but there can be a noticeable flicker when there is much input/output to the color screen. While the cursor is on the color screen, the black-and-white cursor is cleared giving the appearance that there is never more than one cursor at a given time. 2 Miscellaneous Color Functions 1 (COLORIZEBITMAP BITMAP 0COLOR 1COLOR BITSPERPIXEL) [Function] creates a color bitmap from a black and white bitmap. The returned bitmap has color number 1COLOR in those pixels of BITMAP that were one and 0COLOR in those pixels of BITMAP that were zero. This provides a way of producing a color bitmap from a black and white bitmap. (UNCOLORIZEBITMAP BITMAP COLORMAP) [Function] creates a black and white bitmap from a color bitmap. (SHOWCOLORTESTPATTERN BARSIZE) [Function] displays a pattern of colors on the color display. This is useful when editing a color map. The pattern has squares of the 16 possible colors laid out in two rows at the top of the screen. Colors 0 through 7 are in the top row, and colors 8 through 15 are in the next row. The bottom part of the screen is filled with bars of BARSIZE width with consecutive color numbers. The pattern is designed so that every color has a border with every other color (unless BARSIZE is too large to allow room for every colorÿÿï%ÿabout 20). (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 2) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 618) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (558 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))));ÌÌø ˜Ôø<ÌÌø ˜ÔøT,ÌÌø5ÌøºÌ,ÌÌø-KKøT3KÌøøT,ÌÌø9ÌÌø nøT3ÌÌøøT3ÌÌøøT3ÌÌøÈT3ÌÌøÈT3ÌÌø øT3ø2øT3øÈT3øøT3øøT2ÌÌøø2ÌÌø ø3øÈT3ø2ÈT2ÌÌøÈ2ÌÌø È@ø PAGEHEADING VERSOHEAD@ø PAGEHEADING RECTOHEAD?ø PAGEHEADINGFOOTINGV?ø PAGEHEADINGFOOTINGR ?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) +MODERNMODERN MODERNMODERNMODERN +MODERN +MODERN +MODERN + HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN HRULE.GETFNMODERN  HRULE.GETFNMODERN ü ž ô K f   •  HRULE.GETFNMODERN' HRULE.GETFNMODERN + @ ú š  HRULE.GETFNMODERN. HRULE.GETFNMODERNî   @   +   W ü (   " ‚ =  HRULE.GETFNMODERN  HRULE.GETFNMODERNó +Ý ô É  `   HRULE.GETFNMODERN  ë   + ]  + > ¯  &           HRULE.GETFNMODERN  ¿   + ¤     ?   =     Ë     "      "  HRULE.GETFNMODERN  HRULE.GETFNMODERNy    D + q  B  -  i  (  _    L    *  X = ¥    * £    ?  N    ã  HRULE.GETFNMODERN _    +8 -   + Z    +& 8 ,   S       =     m + +) + +  +   + /  ê à µ ; è –  HRULE.GETFNMODERN HRULE.GETFNMODERNž      v 4       ) E ß   ¡  HRULE.GETFNMODERN HRULE.GETFN, HRULE.GETFNMODERN•  HRULE.GETFNMODERN ¾      2  "  1  HRULE.GETFNMODERN +  + +    HRULE.GETFNMODERN  + ª ' ) Þ ) HRULE.GETFNMODERN‘    HRULE.GETFNMODERN + ë ? "  4  HRULE.GETFNMODERN + -  HRULE.GETFNMODERN + Š  ˆ ? "  a  HRULE.GETFNMODERN + C  HRULE.GETFNMODERN +  ( BMOBJ.GETFN3Í H Ê , BMOBJ.GETFN3Ü 1 @      HRULE.GETFNMODERN + '  HRULE.GETFNMODERN + ð  HRULE.GETFNMODERN +  HRULE.GETFNMODERN HRULE.GETFNMODERNï a). Menus are a special type of window provided by the window system, used for displaying a set of items to the user, and having the user select one using the mouse and cursor. The menu facility also allows users to create and use menus in interactive programs (see ("Menus" . TERM)). As of the LUTE release of Xerox Lisp, it is possible for the user to create and use windows and menus on the color display. (CREATEW REGION TITLE BORDERSIZE NOOPENFLG) [Function] 1 Creates a new window. REGION indicates where and how large the window should be by specifying the exterior screenregion of the window. In a user environment with multiple screens, such as a black and white screen and color screen both connected to the same machine, there is a new special problem in indicating which screen the REGION is supposed to be a region of. This problem is solved by allowing CREATEW to take screenregion arguments as REGION. For example, (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) creates a window titled "FOO WINDOW" on the color screen. To create a window on the black and white screen, the user should use SCREEN _ (MAINSCREEN) in the CREATE SCREENREGION expression. Note that it is still perfectly legal to pass in a REGION that is a region, not a screenregion, to CREATEW, but it is preferable to be passing screenregions rather than regions to CREATEW. This is because when REGION is a region, REGION is disambiguated in a somewhat arbitrary manner that may not always turn out to be what the user was hoping for. When REGION is a region, REGION is disambiguated by coercing REGION to be a screenregion on the screen which currently contains the cursor. This is so that software calling CREATEW with regions instead of screenregions tends to do the right thing in a user environment with multiple screens. 1 (WINDOWPROP WINDOW PROP NEWVALUE) [NoSpread Function] 1 If PROP='SCREEN, then WINDOWPROP returns the screen WINDOW is on. If NEWVALUE is given, (even if given as NIL), with PROP='SCREEN, then WINDOWPROP will generate an error. Any other PROP name is handled in the usual way. 1 (OPENWINDOWS SCREEN) [Function] 1 Returns a list of all open windows on SCREEN if SCREEN is a screen datatype such as (MAINSCREEN) or (COLORSCREEN). If SCREEN=NIL, then SCREEN will default to the screen containing the cursor. If SCREEN=T, then a list of all open windows on all screens is returned. 1 2 Color Fonts 1 The user can create color fonts and specify in the font profile that certain color fonts be used when printing in color. Color Font Creation 1 The user can create and manipulate color fonts through the same functions that are used to create and manipulate black and white fonts. This is made possible in some cases by there being new ways to call familiar font functions. (FONTCREATE FAMILY SIZE FACE ROTATION DEVICE NOERRORFLG CHARSET) [Function] 1 In addition to creating black and white fonts, FONTCREATE can be used to create color fonts. For example, (FONTCREATE 'GACHA 10 '(BOLD REGULAR REGULAR YELLOW BLUE) 0 '8DISPLAY) will create an 8 bit per pixel font with blue letters on a yellow background. The user indicates the color and bits per pixel of the font by the FACE and DEVICE arguments passed to FONTCREATE. DEVICE='8DISPLAY means to create an 8bpp font and DEVICE='4DISPLAY means to create a 4bpp font. A color font face is a 5 tuple, (WEIGHT SLOPE EXPANSION BACKCOLOR FORECOLOR) whereas a black and white font face is just a 3 tuple, (WEIGHT SLOPE EXPANSION) The FORECOLOR is the color of the characters of the font and the BACKCOLOR is the color of the background behind the characters that gets printed along with the characters. Both BACKCOLOR and FORECOLOR are allowed to a color name, color number, or any other legal color representation. A color font face can also be represented as a LITATOM. A three character atom such as MRR or any of the special atoms STANDARD, ITALIC, BOLD, BOLDITALIC can optionally be continued by hyphenating on BACKCOLOR and FORECOLOR suffixes. For example, MRR-YELLOW-BLUE BOLD-YELLOW-RED ITALIC-90-200 BRR-100-53 are acceptable color font faces. Hence, (FONTCREATE 'GACHA 10 'BOLD-YELLOW-BLUE 0 '8DISPLAY) will create a color font. LITATOM FACE arguments fall into one of the following patterns: wse wse-backcolor-forecolor STANDARD STANDARD-backcolor-forecolor ITALIC ITALIC-backcolor-forecolor BOLD BOLD-backcolor-forecolor BOLDITALIC BOLDITALIC-backcolor-forecolor where w=B, M, or L; s=I or R; e=R, C, or E; backcolor=a color name or color number; and forecolor=a color name or color number. 1 (FONTPROP FONT PROP) [Function] 1 Returns the value of the PROP property of font FONT. Besides black and white font properties, the following font properties are recognized: FORECOLOR The color of the characters of the font, represented as a color number. This is the color in which the characters of the font will print. BACKCOLOR The color of the background of the characters of the font, represented as a color number. This is the color in which the the background of characters of the font will print. A font with red characters on a yellow background would have a red FORECOLOR and a yellow BACKCOLOR. Color Font Profiles 1 Font profiles are the facility PRETTYPRINT uses to print different elements (user functions, system functions, clisp words, comments, etc.) in different fonts to emphasize (or deemphasize) their importance, and in general to provide for a more pleasing appearance. The user can specify that different colors of fonts be used for different kinds of elements when printing in color. A well chosen font profile will allows user to DEDIT functions, PP functions, and SEE source files in color, for example. A FONTPROFILE such as ((DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8) (4DISPLAY (GACHA 10 MRR-WHITE-RED)) (8DISPLAY (GACHA 10 MRR-WHITE-RED))) (BOLDFONT 2 (HELVETICA 10 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR) (4DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA)) (8DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA))) (LITTLEFONT 3 (HELVETICA 8) (HELVETICA 6 MIR) (MODERN 8 MIR) (4DISPLAY (HELVETICA 8 MRR-WHITE-GREEN)) (8DISPLAY (HELVETICA 8 MRR-WHITE-GREEN))) (BIGFONT 4 (HELVETICA 12 BRR) (HELVETICA 10 BRR) (MODERN 10 BRR) (4DISPLAY (HELVETICA 12 BRR-WHITE-BLUE)) (8DISPLAY (HELVETICA 12 BRR-WHITE-BLUE))) (USERFONT BOLDFONT) (COMMENTFONT LITTLEFONT) (LAMBDAFONT BIGFONT) (SYSTEMFONT) (CLISPFONT BOLDFONT) ...) would have comments print in green and clisp words print in blue while ordinairy atoms would print in red. Not all combinations of fonts will be aesthetically pleasing and the user may have to experiment to find a compatible set. The user should indicate what font is to be used for each font class by calling the function FONTPROFILE: (FONTPROFILE PROFILE) [Function] 1 Sets up the font classes as determined by PROFILE, a list of elements which defines the correspondence between font classes and specific fonts. Each element of PROFILE is a list of the form: (FONTCLASS FONT# DISPLAYFONT PRESSFONT INTERPRESSFONT (OTHERDEVICE1 OTHERFONT1) ... (OTHERDEVICEn OTHERFONTn)) FONTCLASS is the font class name and FONT# is the font number for that class. DISPLAYFONT, PRESSFONT, and INTERPRESSFONT are font specifications (of the form accepted by FONTCREATE) for the fonts to use when printing to the black and white display and to Press and Interpress printers respectively. The appearance of color fonts can be affected by including an (OTHERDEVICEi OTHERFONTi) entry where OTHERDEVICEi is either 4DISPLAY or 8DISPLAY for a 4 bits per pixel or 8 bits per pixel color font and OTHERFONTi is a color font specification such as (GACHA 10 MRR-WHITE-RED). 1 FONTPROFILE [Variable] 1 This is the variable used to store the current font profile, in the form accepted by the function FONTPROFILE. Note that simply editing this value will not change the fonts used for the various font classes; it is necessary to execute (FONTPROFILE FONTPROFILE) to install the value of this variable. 1 2 Using Color 1 The current color implementation allows display streams to operate on color bitmaps. The two functions DSPCOLOR and DSPBACKCOLOR set the color in which a stream draws when the user defaults a color argument to a drawing function. (DSPCOLOR COLOR STREAM) [Function] sets the foreground color of a stream. It returns the previous foreground color. If COLOR is NIL, it returns the current foreground color without changing anything. The default foreground color is MINIMUMCOLOR=0, which is white in the default color maps. (DSPBACKCOLOR COLOR STREAM) [Function] sets the background color of a stream. It returns the previous background color. If COLOR is NIL, it returns the current background color without changing anything. The default background color is (MAXIMUMCOLOR BITSPERPIXEL)=15 or 255, which is black in the default color maps. The BITBLT, line-drawing routines, and curve-drawing routines routines know how to operate on a color-capable stream. Following are some notes about them. 2 BITBLTing in Color 1 If BITBLTing from a color bitmap onto another color bitmap of the same bpp, the operations PAINT, INVERT, and ERASE are done on a bit level, not on a pixel level. Thus painting color 3 onto color 10 results in color 11. If BITBLTing from a black-and-white bitmap onto a color bitmap, the one bits appear in the DSPCOLOR, and the zero bits in DSPBACKCOLOR. BLTing from black-and-white to color is fairly expensive; if the same bitmap is going to be put up several times in the same color, it is faster to create a color copy and then BLT the color copy. If the source type is TEXTURE and the destination bitmap is a color bitmap, the Texture argument is taken to be a color. Thus to fill an area with the color BLUE assuming COLORSTR is a stream whose destination is the color screen, use (BITBLT NIL NIL NIL COLORSTR 50 75 100 200 'TEXTURE 'REPLACE 'BLUE). 2 Drawing Curves and Lines in Color 1 For the functions DRAWCIRCLE, DRAWELLIPSE, and DRAWCURVE, the notion of a brush has been extended to include a color. A BRUSH is now (BRUSHSHAPE BRUSHSIZE BRUSHCOLOR). Also, a brush can be a bitmap (which can be a color bitmap). Line-drawing routines take a color argument which is the color the line is to appear in if the destination of the display stream is a color bitmap. (DRAWLINE X1 Y1 X2 Y2 WIDTH OPERATION STREAM COLOR) [Function] (DRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (RELDRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (DRAWBETWEEN POS1 POS2 WIDTH OPERATION STREAM COLOR) [Function] If the COLOR argument is NIL, the DSPCOLOR of the stream is used. 2 Printing in Color 1 Printing only works in REPLACE mode. The characters have a background color and a foreground color determined by the font face of the font the characters are being printed with. Example of printing to an 8bpp color screen: (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) (DSPFONT (FONTCREATE 'GACHA 10 'MRR-YELLOW-GREEN 0 '8DISPLAY) FOO) (PRINT 'HELLO FOO) ; will print in green against a yellow background. 2 Operating the Cursor on the Color Screen 1 The cursor can be moved to the color screen. The cursor can be moved to the color screen by sliding the cursor off the left or right edge of the black and white screen on to the color screen or by calling function CURSORPOSITION or CURSORSCREEN. (CURSORPOSITION NEWPOSITION - -) [Function] 1 NEWPOSITION can be a position or a screenposition. (CURSORSCREEN SCREEN XCOORD YCOORD) [Function] 1 Moves the cursor to the screenposition determined by SCREEN, XCOORD, and YCOORD. SCREEN should be the value of either (COLORSCREEN) or (MAINSCREEN). While on the color screen, the cursor is placed by doing BITBLTs in software rather than with microcode and hardware as with the black and white cursor. It is automatically taken down whenever an operation is performed that changes any bits on the color screen. The speed of the color cursor compares well with that of the black and white cursor but there can be a noticeable flicker when there is much input/output to the color screen. While the cursor is on the color screen, the black-and-white cursor is cleared giving the appearance that there is never more than one cursor at a given time. 2 Miscellaneous Color Functions 1 (COLORIZEBITMAP BITMAP 0COLOR 1COLOR BITSPERPIXEL) [Function] creates a color bitmap from a black and white bitmap. The returned bitmap has color number 1COLOR in those pixels of BITMAP that were one and 0COLOR in those pixels of BITMAP that were zero. This provides a way of producing a color bitmap from a black and white bitmap. (UNCOLORIZEBITMAP BITMAP COLORMAP) [Function] creates a black and white bitmap from a color bitmap. (SHOWCOLORTESTPATTERN BARSIZE) [Function] displays a pattern of colors on the color display. This is useful when editing a color map. The pattern has squares of the 16 possible colors laid out in two rows at the top of the screen. Colors 0 through 7 are in the top row, and colors 8 through 15 are in the next row. The bottom part of the screen is filled with bars of BARSIZE width with consecutive color numbers. The pattern is designed so that every color has a border with every other color (unless BARSIZE is too large to allow room for every colorÿÿï%ÿabout 20). (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 2) (0 0 612 792) ((FOLIO NIL ( PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) ( 54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 618) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (558 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) ( PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) ( HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))))7ÌÌø ˜Ôø8ÌÌø ˜ÔøT(ÌÌø1ÌøºÌ(ÌÌø)KKøT/KÌøøT(ÌÌø5ÌÌø nøT/ÌÌøøT/ÌÌøøT/ÌÌøÈT/ÌÌøÈT/ÌÌø øT/ø2øT/øÈT/øøT/øøT.ÌÌøø.ÌÌø ø/øÈT/ø2ÈT.ÌÌøÈ.ÌÌø È<ø PAGEHEADING VERSOHEAD<ø PAGEHEADING RECTOHEAD;ø PAGEHEADINGFOOTINGV;ø PAGEHEADINGFOOTINGR ?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) +MODERNMODERN MODERNMODERNMODERN +MODERN +MODERN +MODERN + HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN HRULE.GETFNMODERN  HRULE.GETFNMODERN× ü ž ã f   • f +Ý  HRULE.GETFNMODERN. HRULE.GETFNMODERNî   @   +   W ï (   " ‚ =  HRULE.GETFNMODERN  HRULE.GETFNMODERNô É  `   HRULE.GETFNMODERN  ë   + ]  + > ¯  &           HRULE.GETFNMODERN  ¿   + ¤     ?   =     Ë     "      "  HRULE.GETFNMODERN  HRULE.GETFNMODERNy    D + q  B  -  i  (  _    L    *  X = ¥    * £    ?  N    ã  HRULE.GETFNMODERN _    +8 -   + Z    +& 8 ,   S       =     m + +) + +  +   + /  ê à µ ; è –  HRULE.GETFNMODERN HRULE.GETFNMODERNž      v 4       ) E ß   ¡  HRULE.GETFNMODERN HRULE.GETFN, HRULE.GETFNMODERN•  HRULE.GETFNMODERN ¾      2  "  1  HRULE.GETFNMODERN +  + +    HRULE.GETFNMODERN  + ª ' ) Þ ) HRULE.GETFNMODERN‘    HRULE.GETFNMODERN + ë ? "  4  HRULE.GETFNMODERN + -  HRULE.GETFNMODERN + Š  ˆ ? "  a  HRULE.GETFNMODERN + C  HRULE.GETFNMODERN +  ( BMOBJ.GETFN3Í H Ê , BMOBJ.GETFN3Ü 1 @      HRULE.GETFNMODERN + '  HRULE.GETFNMODERN + ð  HRULE.GETFNMODERN +  HRULE.GETFNMODERN HRULE.GETFNMODERNï  IRM.GET.CREF ). As of the LUTE release of Xerox Lisp, it is possible for the user to create and use windows and menus on the color display. (CREATEW REGION TITLE BORDERSIZE NOOPENFLG) [Function] 1 Creates a new window. REGION indicates where and how large the window should be by specifying the exterior screenregion of the window. In a user environment with multiple screens, such as a black and white screen and color screen both connected to the same machine, there is a new special problem in indicating which screen the REGION is supposed to be a region of. This problem is solved by allowing CREATEW to take screenregion arguments as REGION. For example, (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) ""FOO WINDOW")) creates a window titled "FOO WINDOW" on the color screen. To create a window on the black and white screen, the user should use SCREEN _ (MAINSCREEN) in the0CREATE SCREENREGION expression. Note that it is still perfectly legal to pass in a REGION that is a region, not a screenregion, to CREATEW, but it is preferable to be passing screenregions rather than regions to CREATEW. This is because when REGION is a region, REGION is disambiguated in a somewhat arbitrary manner that may not always turn out to be what the user was hoping for. When REGION is a region, REGION is disambiguated by coercing REGION to be a screenregion on the screen which currently contains the cursor. This is so that software calling CREATEW with regions instead of screenregions tends to do the right thing in a user environment with multiple screens. 1 (WINDOWPROP WINDOW PROP NEWVALUE) [NoSpread Function] 1 If PROP='SCREEN, then WINDOWPROP returns the screen WINDOW is on. If NEWVALUE is given, (even if given as NIL), with PROP='SCREEN, then WINDOWPROP will generate an error. Any other PROP name is handled in the usual way. 1 (OPENWINDOWS SCREEN) [Function] 1 Returns a list of all open windows on SCREEN if SCREEN is a screen datatype such as (MAINSCREEN) or (COLORSCREEN). If SCREEN=NIL, then SCREEN will default to the screen containing the cursor. If SCREEN=T, then a list of all open windows on all screens is returned. 1 2 Color Fonts 1 The user can create color fonts and specify in the font profile that certain color fonts be used when printing in color. Color Font Creation 1 The user can create and manipulate color fonts through the same functions that are used to create and manipulate black and white fonts. This is made possible in some cases by there being new ways to call familiar font functions. (FONTCREATE FAMILY SIZE FACE ROTATION DEVICE NOERRORFLG CHARSET) [Function] 1 In addition to creating black and white fonts, FONTCREATE can be used to create color fonts. For example, (FONTCREATE 'GACHA 10 '(BOLD REGULAR REGULAR YELLOW BLUE) 0 '8DISPLAY) will create an 8 bit per pixel font with blue letters on a yellow background. The user indicates the color and bits per pixel of the font by the FACE and DEVICE arguments passed to FONTCREATE. DEVICE='8DISPLAY means to create an 8bpp font and DEVICE='4DISPLAY means to create a 4bpp font. A color font face is a 5 tuple, (WEIGHT SLOPE EXPANSION BACKCOLOR FORECOLOR) whereas a black and white font face is just a 3 tuple, (WEIGHT SLOPE EXPANSION) The FORECOLOR is the color of the characters of the font and the BACKCOLOR is the color of the background behind the characters that gets printed along with the characters. Both BACKCOLOR and FORECOLOR are allowed to a color name, color number, or any other legal color representation. A color font face can also be represented as a LITATOM. A three character atom such as MRR or any of the special atoms STANDARD, ITALIC, BOLD, BOLDITALIC can optionally be continued by hyphenating on BACKCOLOR and FORECOLOR suffixes. For example, MRR-YELLOW-BLUE BOLD-YELLOW-RED ITALIC-90-200 BRR-100-53 are acceptable color font faces. Hence, (FONTCREATE 'GACHA 10 'BOLD-YELLOW-BLUE 0 '8DISPLAY) will create a color font. LITATOM FACE arguments fall into one of the following patterns: wse wse-backcolor-forecolor STANDARD STANDARD-backcolor-forecolor ITALIC ITALIC-backcolor-forecolor BOLD BOLD-backcolor-forecolor BOLDITALIC BOLDITALIC-backcolor-forecolor where w=B, M, or L; s=I or R; e=R, C, or E; backcolor=a color name or color number; and forecolor=a color name or color number. 1 (FONTPROP FONT PROP) [Function] 1 Returns the value of the PROP property of font FONT. Besides black and white font properties, the following font properties are recognized: FORECOLOR The color of the characters of the font, represented as a color number. This is the color in which the characters of the font will print. BACKCOLOR The color of the background of the characters of the font, represented as a color number. This is the color in which the the background of characters of the font will print. A font with red characters on a yellow background would have a red FORECOLOR and a yellow BACKCOLOR. Color Font Profiles 1 Font profiles are the facility PRETTYPRINT uses to print different elements (user functions, system functions, clisp words, comments, etc.) in different fonts to emphasize (or deemphasize) their importance, and in general to provide for a more pleasing appearance. The user can specify that different colors of fonts be used for different kinds of elements when printing in color. A well chosen font profile will allows user to DEDIT functions, PP functions, and SEE source files in color, for example. A FONTPROFILE such as ((DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8) (4DISPLAY (GACHA 10 MRR-WHITE-RED)) (8DISPLAY (GACHA 10 MRR-WHITE-RED))) (BOLDFONT 2 (HELVETICA 10 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR) (4DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA)) (8DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA))) (LITTLEFONT 3 (HELVETICA 8) (HELVETICA 6 MIR) (MODERN 8 MIR) (4DISPLAY (HELVETICA 8 MRR-WHITE-GREEN)) (8DISPLAY (HELVETICA 8 MRR-WHITE-GREEN))) (BIGFONT 4 (HELVETICA 12 BRR) (HELVETICA 10 BRR) (MODERN 10 BRR) (4DISPLAY (HELVETICA 12 BRR-WHITE-BLUE)) (8DISPLAY (HELVETICA 12 BRR-WHITE-BLUE))) (USERFONT BOLDFONT) (COMMENTFONT LITTLEFONT) (LAMBDAFONT BIGFONT) (SYSTEMFONT) (CLISPFONT BOLDFONT) ...) would have comments print in green and clisp words print in blue while ordinairy atoms would print in red. Not all combinations of fonts will be aesthetically pleasing and the user may have to experimåL to find a compatible set. The user should indicate what font is to be used for each font class by calling the function FONTPROFILE: (FONTPROFILE PROFILE) [Function] 1 Sets up the font classes as determined by PROFILE, a list of elements which defines the correspondence between font classes and specific fonts. Each element of PROFILE is a list of the form: (FONTCLASS FONT# DISPLAYFONT PRESSFONT INTERPRESSFONT (OTHERDEVICE1 OTHERFONT1) ... (OTHERDEVICEn OTHERFONTn)) FONTCLASS is the font class name and FONT# is the font number for that class. DISPLAYFONT, PRESSFONT, and INTERPRESSFONT are font specifications (of the form accepted by FONTCREATE) for the fonts to use when printing to the black and white display and to Press and Interpress printers respectively. The appearance of color fonts can be affected by including an (OTHERDEVICEi OTHERFONTi) entry where OTHERDEVICEi is either 4DISPLAY or 8DISPLAY for a 4 bits per pixel or 8 bits per pixel color font and OTHERFONTi is a color font specification such as (GACHA 10 MRR-WHITE-RED). 1 FONTPROFILE [Variable] 1 This is the variable used to store the current font profile, in the form accepted by the function FONTPROFILE. Note that simply editing this value will not change the fonts used for the various font classes; it is necessary to execute (FONTPROFILE FONTPROFILE) to install the value of this variable. 1 2 Using Color 1 The current color implementation allows display streams to operate on color bitmaps. The two functions DSPCOLOR and DSPBACKCOLOR set the color in which a stream draws when the user defaults a color argument to a drawing function. (DSPCOLOR COLOR STREAM) [Function] sets the foreground color of a stream. It returns the previous foreground color. If COLOR is NIL, it returns the current foreground color without changing anything. The default foreground color is MINIMUMCOLOR=0, which is white in the default color maps. (DSPBACKCOLOR COLOR STREAM) [Function] sets the background color of a stream. It returns the previous background color. If COLOR is NIL, it returns the current background color without changing anything. The default background color is (MAXIMUMCOLOR BITSPERPIXEL)=15 or 255, which is black in the default color maps. The BITBLT, line-drawing routines, and curve-drawing routines routines know how to operate on a color-capable stream. Following are some notes about them. 2 BITBLTing in Color 1 If BITBLTing from a color bitmap onto another color bitmap of the same bpp, the operations PAINT, INVERT, and ERASE are done on a bit level, not on a pixel level. Thus painting color 3 onto color 10 results in color 11. If BITBLTing from a black-and-white bitmap onto a color bitmap, the one bits appear in the DSPCOLOR, and the zero bits in DSPBACKCOLOR. BLTing from black-and-white to color is fairly expensive; if the same bitmap is going to be put up several times in the same color, it is faster to create a color copy and then BLT the color copy. If the source type is TEXTURE and the destination bitmap is a color bitmap, the Texture argument is taken to be a color. Thus to fill an area with the color BLUE assuming COLORSTR is a stream whose destination is the color screen, use (BITBLT NIL NIL NIL COLORSTR 50 75 100 200 'TEXTURE 'REPLACE 'BLUE). 2 Drawing Curves and Lines in Color 1 For the functions DRAWCIRCLE, DRAWELLIPSE, and DRAWCURVE, the notion of a brush has been extended to include a color. A BRUSH is now (BRUSHSHAPE BRUSHSIZE BRUSHCOLOR). Also, a brush can be a bitmap (which can be a color bitmap). Line-drawing routines take a color argument which is the color the line is to appear in if the destination of the display stream is a color bitmap. (DRAWLINE X1 Y1 X2 Y2 WIDTH OPERATION STREAM COLOR) [Function] (DRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (RELDRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (DRAWBETWEEN POS1 POS2 WIDTH OPERATION STREAM COLOR) [Function] If the COLOR argument is NIL, the DSPCOLOR of the stream is used. 2 Printing in Color 1 Printing only works in REPLACE mode. The characters have a background color and a foreground color determined by the font face of the font the characters are being printed with. Example of printing to an 8bpp color screen: (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) @# ª°ªºººººººººººººººººº¾tCõcõûú¢ººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººº«ìC¬àõcõûú¢ºººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººýwCýõcõû¿ú¢ºººººººººººººººººººººººººººººººººººººººººººººººººººººººººº  D + q  B  -  i  (  _    L    *  X = ¥    * £    ?  N    ã  HRULE.GETFNMODERN _    +8 -   + Z    +& 8 ,   S       =     m + +) + +  +   + /  ê à µ ; è –  HRULE.GETFNMODERN HRULE.GETFNMODERNž      v 4       ) E ß   ¡  HRULE.GETFNMODERN HRULE.GETFN, HRULE.GETFNMODERN•  HRULE.GETFNMODERN ¾      2  "  1  HRULE.GETFNMODERN +  + +    HRULE.GETFNMODERN  + ª ' ) Þ ) HRULE.GETFNMODERN‘    HRULE.GETFNMODERN + ë ? "  4  HRULE.GETFNMODERN + -  HRULE.GETFNMODERN + Š  ˆ ? "  a IOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))));ÌÌø ˜Ôø<ÌÌø ˜ÔøT,ÌÌø5ÌøºÌ,ÌÌø-KKøT3KÌøøT,ÌÌø9ÌÌø nøT3ÌÌøøT3ÌÌøøT3ÌÌøÈT3ÌÌøÈT3ÌÌø øT3ø2øT3øÈT3øøT3øøT2ÌÌøø2ÌÌø ø3øÈT3ø2ÈT2ÌÌøÈ2ÌÌø È@ø PAGEHEADING VERSOHEAD@ø PAGEHEADING RECTOHEAD?ø PAGEHEADINGFOOTINGV?ø PAGEHEADINGFOOTINGR ?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) +MODERNMODERN MODERNMODERNMODERN +MODERN +MODERN +MODERN + HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN +   HRULE.GETFNMODERN +    HRULE.GETFNMODERN HRULE.GETFNMODERN  HRULE.GETFNMODERN ü ž ô K f   •  HRULE.GETFNMODERN' HRULE.GETFNMODERN + @ ú š  HRULE.GETFNMODERN. HRULE.GETFNMODERNî   @   +   W ü (   " ‚ =  HRULE.GETFNMODERN  HRULE.GETFNMODERNó +Ý ô É  `   HRULE.GETFNMODERN  ë   + ]  + > ¯  &           HRULE.GETFNMODERN  ¿   + ¤     ?   =     Ë     "      "  HRULE.GETFNMODERN  HRULE.GETFNMODERNy    D + q  B  -  i  (  _    L    *  X = ¥    * £    ?  N    ã  HRULE.GETFNMODERN _    +8 -   + Z    +& 8 ,   S       =     m + +) + +  +   + /  ê à µ ; è –  HRULE.GETFNMODERN HRULE.GETFNMODERNž      v 4       ) E ß   ¡  HRULE.GETFNMODERN HRULE.GETFN, HRULE.GETFNMODERN•  HRULE.GETFNMODERN ¾      2  "  1  HRULE.GETFNMODERN +  + +    HRULE.GETFNMODERN  + ª ' ) Þ ) HRULE.GETFNMODERN‘    HRULE.GETFNMODERN + ë ? "  4  HRULE.GETFNMODERN + -  HRULE.GETFNMODERN + Š  ˆ ? "  a  HRULE.GETFNMODERN + C  HRULE.GETFNMODERN +  ( BMOBJ.GETFN3Í H Ê , BMOBJ.GETFN3Ü 1 @      HRULE.GETFNMODERN + '  HRULE.GETFNMODERN + ð  HRULE.GETFNMODERN +  HRULE.GETFNMODERN HRULE.GETFNMODERNï a IRM.GET.CREF ` ). As of the LUTE release of Xerox Lisp, it is possible for the user to create and use windows and menus on the color display. (CREATEW REGION TITLE BORDERSIZE NOOPENFLG) [Function] 1 Creates a new window. REGION indicates where and how large the window should be by specifying the exterior screenregion of the window. In a user environment with multiple screens, such as a black and white screen and color screen both connected to the same machine, there is a new special problem in indicating which screen the REGION is supposed to be a region of. This problem is solved by allowing CREATEW to take screenregion arguments as REGION. For example, (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) creates a window titled "FOO WINDOW" on the color screen. To create a window on the black and white screen, the user should use SCREEN _ (MAINSCREEN) in the CREATE SCREENREGION expression. Note that it is still perfectly legal to pass in a REGION that is a region, not a screenregion, to CREATEW, but it is preferable to be passing screenregions rather than regions to CREATEW. This is because when REGION is a region, REGION is disambiguated in a somewhat arbitrary manner that may not always turn out to be what the user was hoping for. When REGION is a region, REGION is disambiguated by coercing REGION to be a screenregion on the screen which currently contains the cursor. This is so that software calling CREATEW with regions instead of screenregions tends to do the right thing in a user environment with multiple screens. 1 (WINDOWPROP WINDOW PROP NEWVALUE) [NoSpread Function] 1 If PROP='SCREEN, then WINDOWPROP returns the screen WINDOW is on. If NEWVALUE is given, (even if given as NIL), with PROP='SCREEN, then WINDOWPROP will generate an error. Any other PROP name is handled in the usual way. 1 (OPENWINDOWS SCREEN) [Function] 1 Returns a list of all open windows on SCREEN if SCREEN is a screen datatype such as (MAINSCREEN) or (COLORSCREEN). If SCREEN=NIL, then SCREEN will default to the screen containing the cursor. If SCREEN=T, then a list of all open windows on all screens is returned. 1 2 Color Fonts 1 The user can create color fonts and specify in the font profile that certain color fonts be used when printing in color. Color Font Creation 1 The user can create and manipulate color fonts through the same functions that are used to create and manipulate black and white fonts. This is made possible in some cases by there being new ways to call familiar font functions. (FONTCREATE FAMILY SIZE FACE ROTATION DEVICE NOERRORFLG CHARSET) [Function] 1 In addition to creating black and white fonts, FONTCREATE can be used to create color fonts. For example, (FONTCREATE 'GACHA 10 '(BOLD REGULAR REGULAR YELLOW BLUE) 0 '8DISPLAY) will create an 8 bit per pixel font with blue letters on a yellow background. The user indicates the color and bits per pixel of the font by the FACE and DEVICE arguments passed to FONTCREATE. DEVICE='8DISPLAY means to create an 8bpp font and DEVICE='4DISPLAY means to create a 4bpp font. A color font face is a 5 tuple, (WEIGHT SLOPE EXPANSION BACKCOLOR FORECOLOR) whereas a black and white font face is just a 3 tuple, (WEIGHT SLOPE EXPANSION) The FORECOLOR is the color of the characters of the font and the BACKCOLOR is the color of the background behind the characters that gets printed along with the characters. Both BACKCOLOR and FORECOLOR are allowed to a color name, color number, or any other legal color representation. A color font face can also be represented as a LITATOM. A three character atom such as MRR or any of the special atoms STANDARD, ITALIC, BOLD, BOLDITALIC can optionally be continued by hyphenating on BACKCOLOR and FORECOLOR suffixes. For example, MRR-YELLOW-BLUE BOLD-YELLOW-RED ITALIC-90-200 BRR-100-53 are acceptable color font faces. Hence, (FONTCREATE 'GACHA 10 'BOLD-YELLOW-BLUE 0 '8DISPLAY) will create a color font. LITATOM FACE arguments fall into one of the following patterns: wse wse-backcolor-forecolor STANDARD STANDARD-backcolor-forecolor ITALIC ITALIC-backcolor-forecolor BOLD BOLD-backcolor-forecolor BOLDITALIC BOLDITALIC-backcolor-forecolor where w=B, M, or L; s=I or R; e=R, C, or E; backcolor=a color name or color number; and forecolor=a color name or color number. 1 (FONTPROP FONT PROP) [Function] 1 Returns the value of the PROP property of font FONT. Besides black and white font properties, the following font properties are recognized: FORECOLOR The color of the characters of the font, represented as a color number. This is the color in which the characters of the font will print. BACKCOLOR The color of the background of the characters of the font, represented as a color number. This is the color in which the the background of characters of the font will print. A font with red characters on a yellow background would have a red FORECOLOR and a yellow BACKCOLOR. Color Font Profiles 1 Font profiles are the facility PRETTYPRINT uses to print different elements (user functions, system functions, clisp words, comments, etc.) in different fonts to emphasize (or deemphasize) their importance, and in general to provide for a more pleasing appearance. The user can specify that different colors of fonts be used for different kinds of elements when printing in color. A well chosen font profile will allows user to DEDIT functions, PP functions, and SEE source files in color, for example. A FONTPROFILE such as ((DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8) (4DISPLAY (GACHA 10 MRR-WHITE-RED)) (8DISPLAY (GACHA 10 MRR-WHITE-RED))) (BOLDFONT 2 (HELVETICA 10 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR) (4DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA)) (8DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA))) (LITTLEFONT 3 (HELVETICA 8) (HELVETICA 6 MIR) (MODERN 8 MIR) (4DISPLAY (HELVETICA 8 MRR-WHITE-GREEN)) (8DISPLAY (HELVETICA 8 MRR-WHITE-GREEN))) (BIGFONT 4 (HELVETICA 12 BRR) (HELVETICA 10 BRR) (MODERN 10 BRR) (4DISPLAY (HELVETICA 12 BRR-WHITE-BLUE)) (8DISPLAY (HELVETICA 12 BRR-WHITE-BLUE))) (USERFONT BOLDFONT) (COMMENTFONT LITTLEFONT) (LAMBDAFONT BIGFONT) (SYSTEMFONT) (CLISPFONT BOLDFONT) ...) would have comments print in green and clisp words print in blue while ordinairy atoms would print in red. Not all combinations of fonts will be aesthetically pleasing and the user may have to experiment to find a compatible set. The user should indicate what font is to be used for each font class by calling the function FONTPROFILE: (FONTPROFILE PROFILE) [Function] 1 Sets up the font classes as determined by PROFILE, a list of elements which defines the correspondence between font classes and specific fonts. Each element of PROFILE is a list of the form: (FONTCLASS FONT# DISPLAYFONT PRESSFONT INTERPRESSFONT (OTHERDEVICE1 OTHERFONT1) ... (OTHERDEVICEn OTHERFONTn)) FONTCLASS is the font class name and FONT# is the font number for that class. DISPLAYFONT, PRESSFONT, and INTERPRESSFONT are font specifications (of the form accepted by FONTCREATE) for the fonts to use when printing to the black and white display and to Press and Interpress printers respectively. The appearance of color fonts can be affected by including an (OTHERDEVICEi OTHERFONTi) entry where OTHERDEVICEi is either 4DISPLAY or 8DISPLAY for a 4 bits per pixel or 8 bits per pixel color font and OTHERFONTi is a color font specification such as (GACHA 10 MRR-WHITE-RED). 1 FONTPROFILE [Variable] 1 This is the variable used to store the current font profile, in the form accepted by the function FONTPROFILE. Note that simply editing this value will not change the fonts used for the various font classes; it is necessary to execute (FONTPROFILE FONTPROFILE) to install the value of this variable. 1 2 Using Color 1 The current color implementation allows display streams to operate on color bitmaps. The two functions DSPCOLOR and DSPBACKCOLOR set the color in which a stream draws when the user defaults a color argument to a drawing function. (DSPCOLOR COLOR STREAM) [Function] sets the foreground color of a stream. It returns the previous foreground color. If COLOR is NIL, it returns the current foreground color without changing anything. The default foreground color is MINIMUMCOLOR=0, which is white in the default color maps. (DSPBACKCOLOR COLOR STREAM) [Function] sets the background color of a stream. It returns the previous background color. If COLOR is NIL, it returns the current background color without changing anything. The default background color is (MAXIMUMCOLOR BITSPERPIXEL)=15 or 255, which is black in the default color maps. The BITBLT, line-drawing routines, and curve-drawing routines routines know how to operate on a color-capable stream. Following are some notes about them. 2 BITBLTing in Color 1 If BITBLTing from a color bitmap onto another color bitmap of the same bpp, the operations PAINT, INVERT, and ERASE are done on a bit level, not on a pixel level. Thus painting color 3 onto color 10 results in color 11. If BITBLTing from a black-and-white bitmap onto a color bitmap, the one bits appear in the DSPCOLOR, and the zero bits in DSPBACKCOLOR. BLTing from black-and-white to color is fairly expensive; if the same bitmap is going to be put up several times in the same color, it is faster to create a color copy and then BLT the color copy. If the source type is TEXTURE and the destination bitmap is a color bitmap, the Texture argument is taken to be a color. Thus to fill an area with the color BLUE assuming COLORSTR is a stream whose destination is the color screen, use (BITBLT NIL NIL NIL COLORSTR 50 75 100 200 'TEXTURE 'REPLACE 'BLUE). 2 Drawing Curves and Lines in Color 1 For the functions DRAWCIRCLE, DRAWELLIPSE, and DRAWCURVE, the notion of a brush has been extended to include a color. A BRUSH is now (BRUSHSHAPE BRUSHSIZE BRUSHCOLOR). Also, a brush can be a bitmap (which can be a color bitmap). Line-drawing routines take a color argument which is the color the line is to appear in if the destination of the display stream is a color bitmap. (DRAWLINE X1 Y1 X2 Y2 WIDTH OPERATION STREAM COLOR) [Function] (DRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (RELDRAWTO X Y WIDTH OPERATION STREAM COLOR) [Function] (DRAWBETWEEN POS1 POS2 WIDTH OPERATION STREAM COLOR) [Function] If the COLOR argument is NIL, the DSPCOLOR of the stream is used. 2 Printing in Color 1 Printing only works in REPLACE mode. The characters have a background color and a foreground color determined by the font face of the font the characters are being printed with. Example of printing to an 8bpp color screen: (SETQ FOO (CREATEW (CREATE SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ 20 BOTTOM _ 210 WIDTH _ 290 HEIGHT _ 170) "FOO WINDOW")) (DSPFONT (FONTCREATE 'GACHA 10 'MRR-YELLOW-GREEN 0 '8DISPLAY) FOO) (PRINT 'HELLO FOO) ; will print in green against a yellow background. 2 Operating the Cursor on the Color Screen 1 The cursor can be moved to the color screen. The cursor can be moved to the color screen by sliding the cursor off the left or right edge of the black and white screen on to the color screen or by calling function CURSORPOSITION or CURSORSCREEN. (CURSORPOSITION NEWPOSITION - -) [Function] 1 NEWPOSITION can be a position or a screenposition. (CURSORSCREEN SCREEN XCOORD YCOORD) [Function] 1 Moves the cursor to the screenposition determined by SCREEN, XCOORD, and YCOORD. SCREEN should be the value of either (COLORSCREEN) or (MAINSCREEN). While on the color screen, the cursor is placed by doing BITBLTs in software rather than with microcode and hardware as with the black and white cursor. It is automatically taken down whenever an operation is performed that changes any bits on the color screen. The speed of the color cursor compares well with that of the black and white cursor but there can be a noticeable flicker when there is much input/output to the color screen. While the cursor is on the color screen, the black-and-white cursor is cleared giving the appearance that there is never more than one cursor at a given time. 2 Miscellaneous Color Functions 1 (COLORIZEBITMAP BITMAP 0COLOR 1COLOR BITSPERPIXEL) [Function] creates a color bitmap from a black and white bitmap. The returned bitmap has color number 1COLOR in those pixels of BITMAP that were one and 0COLOR in those pixels of BITMAP that were zero. This provides a way of producing a color bitmap from a black and white bitmap. (UNCOLORIZEBITMAP BITMAP COLORMAP) [Function] creates a black and white bitmap from a color bitmap. (SHOWCOLORTESTPATTERN BARSIZE) [Function] displays a pattern of colors on the color display. This is useful when editing a color map. The pattern has squares of the 16 possible colors laid out in two rows at the top of the screen. Colors 0 through 7 are in the top row, and colors 8 through 15 are in the next row. The bottom part of the screen is filled with bars of BARSIZE width with consecutive color numbers. The pattern is designed so that every color has a border with every other color (unless BARSIZE is too large to allow room for every colorÿÿï%ÿabout 20). (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 2) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 618) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (558 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL)))));ÌÌø ˜Ôø<ÌÌø ˜ÔøT,ÌÌø5ÌøºÌ,ÌÌø-KKøT3KÌøøT,ÌÌø9ÌÌø nøT3ÌÌøøT3ÌÌøøT3ÌÌøÈT3ÌÌøÈT3ÌÌø øT3ø2øT3øÈT3øøT3øøT2ÌÌøø2ÌÌø ø3øÈT3ø2ÈT2ÌÌøÈ2ÌÌø È@ø PAGEHEADING VERSOHEAD@ø PAGEHEADING RECTOHEAD?ø PAGEHEADINGFOOTINGV?ø PAGEHEADINGFOOTINGROPTIMA OPTIMAOPTIMA +OPTIMA +OPTIMA +OPTIMAOPTIMAOPTIMA + HRULE.GETFNOPTIMA +- HRULE.GETFNOPTIMA +- HRULE.GETFNOPTIMA + HRULE.GETFNOPTIMA +   HRULE.GETFNOPTIMA HRULE.GETFNOPTIMA  HRULE.GETFNOPTIMAüžôKf • HRULE.GETFNOPTIMA' HRULE.GETFNOPTIMA +@úš HRULE.GETFNOPTIMA. HRULE.GETFNOPTIMAî  @  + Wü("‚= HRULE.GETFNOPTIMA  HRULE.GETFNOPTIMAó +ÝôÉ` HRULE.GETFNOPTIMA ë  +] +>¯ & HRULE.GETFNOPTIMA ¿  +¤  ?=Ë  "  " HRULE.GETFNOPTIMA  HRULE.GETFNOPTIMAy   D +q B - k ( a   N  *  X = ¥   *£  ? N   ã HRULE.GETFNOPTIMA _  +8 -  + Z  +&8, S  =  m + +) + +   +  + /êàµ;è– HRULE.GETFNOPTIMA HRULE.GETFNOPTIMAž  v 4   ) Eß  ¡ HRULE.GETFNOPTIMA HRULE.GETFN, HRULE.GETFNOPTIMA• HRULE.GETFNOPTIMA ¾    2 "1 HRULE.GETFNOPTIMA +Â++  HRULE.GETFNOPTIMA  +ª')Þ) HRULE.GETFNOPTIMA‘  HRULE.GETFNOPTIMA +ë?"4 HRULE.GETFNOPTIMA +- HRULE.GETFNOPTIMA +Š ˆ?"a HRULE.GETFNOPTIMA +C HRULE.GETFNOPTIMA +( BMOBJ.GETFN3ÍHÊ, BMOBJ.GETFN3Ü1@     HRULE.GETFNOPTIMA +' HRULE.GETFNOPTIMA +ð HRULE.GETFNOPTIMA + HRULE.GETFNOPTIMA HRULE.GETFNOPTIMAï#4 IRM.GET.CREF Á? IRM.GET.CREF€ ! HRULE.GETFNOPTIMA +-n(`SVUWEò›sâ HRULE.GETFNOPTIMA +  HRULE.GETFNOPTIMA +- (=" HRULE.GETFNOPTIMA +  HRULE.GETFNOPTIMA +&A 7@ HRULE.GETFNOPTIMA + HRULE.GETFNOPTIMA  HRULE.GETFNOPTIMAy HRULE.GETFNOPTIMA è 3 HRULE.GETFNOPTIMA +kK4D27):[81863€ HRULE.GETFNOPTIMA + +  HRULE.GETFNOPTIMA +Z Œ  HRULE.GETFNOPTIMA ý    78%"<="$!;<$"89 k{k  HRULE.GETFNOPTIMA +*p    %  ò  [ +C HRULE.GETFNOPTIMA +  HRULE.GETFNOPTIMA + EÍ HRULE.GETFNOPTIMA + HRULE.GETFNOPTIMA  HRULE.GETFNOPTIMAç  V¨ W¾œ HRULE.GETFNOPTIMA HRULE.GETFNOPTIMAÝNPä HRULE.GETFNOPTIMA" HRULE.GETFNOPTIMAç”  +&     + +-   +5 5 HRULE.GETFNOPTIMA HRULE.GETFNOPTIMAµ-(`SVUWE=M=GF HRULE.GETFNOPTIMA) HRULE.GETFNOPTIMA÷  HRULE.GETFNOPTIMA + ( HRULE.GETFNOPTIMA +5>W HRULE.GETFNOPTIMA HRULE.GETFNOPTIMA ! \a  6  J€+}éÍzº \ No newline at end of file diff --git a/library/COPYFILES.TEDIT b/library/COPYFILES.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a2682989768cbec4b98f43a2107ff738ae9e8470 GIT binary patch literal 12885 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 T7(y_CzexONPw#5~!tecWI1s$b literal 0 HcmV?d00001 diff --git a/library/EDITBITMAP.TEDIT b/library/EDITBITMAP.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..0830a2cdcd4dcdfd77d8919ffaa8be537b6236a4 GIT binary patch literal 44353 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 F|34|gxeEXQ literal 0 HcmV?d00001 diff --git a/library/ETHERRECORDS.TEDIT b/library/ETHERRECORDS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a920cb461879fc24084a9f9d5425b1b0c4daf5ad GIT binary patch literal 8451 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 U;nZ8@3cBN9_3zq0zx&630H#vJYybcN literal 0 HcmV?d00001 diff --git a/library/FILEBROWSER.TEDIT b/library/FILEBROWSER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..2ba2aa6cfa7692775a1d754ac75d6da877421a41 GIT binary patch literal 216971 zcmeFa4|G)5c`tfqG@ubhFcRbj-^g$@2wU(lmF>n>ZJs<5BWXl1V36zZlG`#!1B@+c z291QE#`cjIMS9{k>E_D##)M;M> zqJ9bR2x=#hQ8(1F2YVt?iM%v2BBHd&bvv@4