antoine-source/appleworksgs/Pict/Src/text.aii

1 line
14 KiB
Plaintext
Executable File

LOAD 'Macros.dump'
INCLUDE 'Pict.equ'
INCLUDE 'Driver.equ'
IMPORT Q_ChangePictSize
IMPORT Q_Copy2
IMPORT Q_Copy4
IMPORT D_KillFont
IMPORT D_NeedHandle
IMPORT Q_Nop
IMPORT Q_PixRect
IMPORT D_SelectFont
IMPORT Q_addbytes
IMPORT count
IMPORT oldptr
IMPORT Q_pictSCB
IMPORT Q_picterr
IMPORT temp
IMPORT Q_theBGcolor
IMPORT Q_theChExtra
IMPORT Q_theFGcolor
IMPORT Q_theFontFlags
IMPORT Q_theMask
IMPORT Q_thePnSize
IMPORT Q_theSpExtra
IMPORT Q_theTxFont
IMPORT Q_theTxLoc
IMPORT Q_theTxMode
IMPORT Q_txtBounds
IMPORT Q_txtHandle
IMPORT Q_txtHsize
IMPORT Q_txtImage
IMPORT Q_txtPort
IMPORT Q_txtPortLoc
IMPORT Q_txtRect
IMPORT Q_txtSCB
IMPORT Q_txtWidth
ENTRY Q_MakeTextImage
****************************************************************
* ;
* Q_Text rotating and flipping routines ;
*______________________________________________________________*
* ;
* FUTURE EXTENSIONS: ;
* ;
* -- Don't actually record Q_Text size, style, ;
* font, color, and flags opcodes in the ;
* mangled picture ;
* ;
* -- Record them as part of a PicComment, along ;
* with the orientation of the Q_Text image, so ;
* that they can be restored as actual Q_Text ;
* call if the picture is restored to its ;
* original orientation. ;
* ;
* -- Add PostScript PicComments so that the ;
* rotated/flipped Q_Text still prints out nice ;
* and pretty. ;
* ;
****************************************************************
****************************************************************
*
* Q_TextOps -- handle picture opcodes for Q_Text
*
****************************************************************
Q_TextOps PROC EXPORT
;Using Q_PictData
EXPORT Q_FgColor
EXPORT Q_BgColor
EXPORT Q_TxFont
EXPORT Q_TxFace
EXPORT Q_TxSize
EXPORT Q_TxMode
EXPORT Q_ChExtra
EXPORT Q_SpExtra
EXPORT Q_FontFlags
EXPORT Q_Text
EXPORT Q_DhText
EXPORT Q_DvText
EXPORT Q_DhDvText
EXPORT Q_LongText
*--------------------------------------------------------------*
* Remember the foreground color ;
*--------------------------------------------------------------*
Q_FgColor ;
jsl Q_Nop ; move the opcode
moveword [<oldptr],Q_theFGcolor
jmp Q_Copy2 ; move the color
*--------------------------------------------------------------*
* Remember the background color ;
*--------------------------------------------------------------*
Q_BgColor ;
jsl Q_Nop
moveword [<oldptr],Q_theBGcolor
jmp Q_Copy2
*--------------------------------------------------------------*
* Remember the current font ;
*--------------------------------------------------------------*
Q_TxFont ;
jsl Q_Nop
movelong [<oldptr],Q_theTxFont
jmp Q_Copy4
*--------------------------------------------------------------*
* Remember the current style ;
*--------------------------------------------------------------*
Q_TxFace ;
jsl Q_Nop
movebyte [<oldptr],Q_theTxFont+2
jmp Q_Copy2
*--------------------------------------------------------------*
* Remember the current Q_Text size ;
*--------------------------------------------------------------*
Q_TxSize ;
jsl Q_Nop
movebyte [<oldptr],Q_theTxFont+3
jmp Q_Copy2
*--------------------------------------------------------------*
* Remember the current Q_Text mode ;
*--------------------------------------------------------------*
Q_TxMode ;
jsl Q_Nop
moveword [<oldptr],Q_theTxMode
jmp Q_Copy2
*--------------------------------------------------------------*
* Remember the current char extra ;
*--------------------------------------------------------------*
Q_ChExtra ;
jsl Q_Nop
moveword [<oldptr],Q_theChExtra
jmp Q_Copy2
*--------------------------------------------------------------*
* Remember the current space extra ;
*--------------------------------------------------------------*
Q_SpExtra ;
jsl Q_Nop
movelong [<oldptr],Q_theSpExtra
jmp Q_Copy2
*--------------------------------------------------------------*
* Remember the current Q_Text mode ;
*--------------------------------------------------------------*
Q_FontFlags ;
jsl Q_Nop
moveword [<oldptr],Q_theFontFlags
jmp Q_Copy2
****************************************************************
* ;
* Q_Text DRAWING OPCODES ;
* ;
****************************************************************
*--------------------------------------------------------------*
* Handle a Q_LongText opcode ;
*--------------------------------------------------------------*
Q_Text ;
movelong [<oldptr]:#2,Q_theTxLoc
moveword #7,txtparams
brl doText
*--------------------------------------------------------------*
* Handle a DHLongText opcode ;
*--------------------------------------------------------------*
Q_DhText ;
moveword [<oldptr]:#2,a ; get DH
and #$ff
clc
adc Q_theTxLoc+2
sta Q_theTxLoc+2
moveword #4,txtparams
brl DoText
*--------------------------------------------------------------*
* Handle a DVLongText opcode ;
*--------------------------------------------------------------*
Q_DvText ;
moveword [<oldptr]:#2,a ; get DV
and #$ff
clc
adc Q_theTxLoc
sta Q_theTxLoc
moveword #4,txtparams
brl DoText
*--------------------------------------------------------------*
* Handle a DHDVLongText opcode ;
*--------------------------------------------------------------*
Q_DhDvText ;
moveword [<oldptr]:#2,a ; get DV
and #$ff
clc
adc Q_theTxLoc
sta Q_theTxLoc
moveword [<oldptr]:#3,a ; get DH
and #$ff
clc
adc Q_theTxLoc+2
sta Q_theTxLoc+2
moveword #5,txtparams
brl DoText
*--------------------------------------------------------------*
* Handle a RealLongText opcode ;
*--------------------------------------------------------------*
Q_LongText ;
movelong [<oldptr]:#2,Q_theTxLoc
moveword #6,txtparams
ldy #5
lda [<oldptr],y
brl gotcount ; More than just a byte!
*--------------------------------------------------------------*
* Generalized Q_Text stuff ;
*--------------------------------------------------------------*
DoText ldy txtparams ; how much room does this opcode use?
dey
lda [<oldptr],y
and #$ff ; low byte only
gotcount sta <count
clc
adc txtparams
eor #$ffff
inc a
sta Q_addbytes ; Don't copy the Q_Text stuff!
moveword #$ffff,Q_addbytes+2
jsl Q_ChangePictSize
jcs byebye
addwl txtparams,<oldptr ; Q_Point oldptr at the Q_Text
ldx Q_theTxMode ; ---- look at the Q_Text mode ----
txa ; (keep it in x for a while)
and #4 ; fore-something?
jne foresomething
moveword Q_theTxMode,themode ; set the obvious parameters...
moveword Q_theFGcolor,fore
moveword Q_theBGcolor,back
jsr StuffText ; ...and stuff it!
jcs byebye
brl stuffed
foresomething txa
and #3 ; (not)forecopy?
jeq forecopy
txa
and #$fffB ; take out the fore-
sta themode
moveword Q_theFGcolor,fore
txa
and #$8000 ; not-foresomething?
bne notfore
moveword #0,back ; Set the background color so that
bra gotbg ; the background Q_Pixels have no
notfore moveword #15,back ; effect with the current mode
gotbg jsr StuffText ; stuff it!
jcs byebye
brl stuffed
forecopy txa
and #$8000 ; is it notforecopy?
jne not_forecopy
moveword #3,theMode ; srcBIC -- erase the Q_Text before
moveword #15,fore ; drawing again with the right colors
moveword #0,back
jsr StuffText
jcs byebye
moveword #1,theMode ; srcOr
moveword Q_theFGcolor,fore
jsr StuffText
jcs byebye
brl stuffed
not_forecopy moveword #$8003,theMode ; notBIC
moveword #0,fore
moveword #15,back
jsr StuffText
jcs byebye
moveword #$8001,themode ; notOr
moveword Q_theFGcolor,fore
jsr StuffText
jcs byebye
brl stuffed
stuffed addwl <count,<oldptr ; adjust the src pointer
byebye rtl
*--------------------------------------------------------------*
* Now that we have all the Q_Text params, use them to D_Create ;
* something for the D_New picture! ;
*--------------------------------------------------------------*
StuffText pushword <count
pushlong <oldptr
pushword themode ; mode
pushword fore ; fg color
pushword back ; bg color
jsl Q_MakeTextImage
jcs nostuff
cmpl Q_txtHsize,#0 ; if zero size, put nothing in the pict
jeq nostuff
movelong Q_txtHsize,Q_addbytes
jsl Q_ChangePictSize
jcs nostuff
pushlong <oldptr ; hide this for a minute
movelong Q_txtHandle,<temp ; pull data from the FAKE picture
movelong [<temp],<oldptr
jsl Q_PixRect ; FINALLY put the image into the pict
pulllong <oldptr ; okay, give it back.
pushlong Q_txtHandle
_DisposeHandle
nostuff pushlong #Q_txtPort
_ClosePort
rts
*--------------------------------------------------------------*
txtparams DS.B 2 ; size of Q_Text params + opcode
themode DS.B 2
fore DS.B 2
back DS.B 2
ENDP
****************************************************************
*
* Q_MakeTextImage(txtcount:w,txtptr:l,mode:l,fg:w,bg:w) --
* creates a pixel image of the input Q_Text and fills in
* TxPortLoc with port location information, Q_txtHandle
* handles a record containing reasonable Q_PixRect
* information (including the actual Q_Text image), and
* Q_txtHsize contains the size of Q_txtHandle.
*_______________________________________________________________
*
* Inputs:
* txtcount number of characters in the Q_Text
* txtptr pointer to the Q_Text
* mode mode to be used in Q_PixRect info
* fg foreground color of the Q_Text
* bg background color of the Q_Text
*
****************************************************************
Q_MakeTextImage PROC EXPORT
;Using Q_PictData
input txtcount:w,txtptr:l,mode:w,fg:w,bg:w
local txtpoint:l,ihand:l,iptr:l
begin
spacelong ; D_Save the port
_GetPort
pushlong #Q_txtPort
_OpenPort
pushlong #Q_txtPort
_SetPort
pushlong #Q_txtPortLoc
_GetPortLoc
jsl D_KillFont
movelong Q_theTxFont,ax
moveword #0,y ; black...it doesn't matter.
jsl D_SelectFont
_PenNormal
pushlong Q_theSpExtra
_SetSpaceExtra
pushlong Q_theChExtra
_SetCharExtra
pushlong #0 ; move to 0,0
_MoveTo
pushlong txtptr ; how big is the Q_Text?
pushword txtcount
pushlong #Q_txtRect
_TextBounds
lda Q_txtRect ; find out where to move to before
eor #$ffff ; drawing the Q_Text into the pixel map
inc a
sta txtPoint
lda Q_txtRect+2
eor #$ffff
inc a
sta txtPoint+2
subword Q_txtRect+4,Q_txtRect,Q_txtRect+4 ; adjust to 0,0
subword Q_txtRect+6,Q_txtRect+2,Q_txtRect+6
movelong #0,Q_txtRect
lda Q_txtRect+6 ; zero width?
jeq notext
lda Q_txtRect+4 ; height?
jeq notext
movelong #0,Q_txtBounds
moveword Q_txtRect+4,Q_txtBounds+4 ; store height of bounds Q_Rect
lda Q_txtRect+6 ; compute the ;byte* width
dec a
lsr a
ldx Q_txtSCB ; same as MasterSCB??
beq shifted ; am I in 640 mode?
lsr a
shifted inc a
sta Q_txtWidth ; got it!
eor #7 ; well, almost.
inc a ; It has to be a multiple of 8 <sigh>
and #7
clc
adc Q_txtWidth
sta Q_txtWidth ; NOW I've got it.
asl a ; compute the adjusted ;pixel* width
ldx Q_txtSCB ; 320 or 640?
beq gotbnds
asl a
gotbnds sta Q_txtBounds+6 ; got it!
spacelong
pushword Q_txtWidth
pushword Q_txtBounds+4
_Multiply
addlong s,#34,Q_txtHsize ; (34 bytes for Q_PixRect parameters)
spacelong ; allocate image handle
pushlong Q_txtHsize
pushword #$8010 ; lock it within one bank
jsl D_NeedHandle
sta Q_picterr ; store the error code
pulllong ihand
jcs abort ; (uh oh.)
movelong [ihand],iptr
addlong iptr,#34,Q_txtImage ; Adjust ptr back for portLoc
movelong ihand,Q_txtHandle
pushlong #Q_txtPortLoc
_SetPortLoc
_PenNormal
pushword bg
_SetSolidPenPat
pushlong #Q_txtBounds
_PaintRect
pushlong Q_thePnSize
_SetPenSize
pushlong #Q_theMask
_SetPenMask
pushword fg
_SetForeColor
pushword bg
_SetBackColor
pushword Q_theFontFlags
_SetFontFlags
pushword #4 ; foreCopy
_SetTextMode
pushlong txtPoint
_MoveTo
pushlong txtPtr ; FINALLY! Draw the Q_Text!
pushword txtCount
_DrawText
jsl D_KillFont
*--------------------------------------------------------------*
* Set up the fake BitsRect opcode structure ;
*--------------------------------------------------------------*
moveword #$90,[iptr] ; BitsRect opcode
moveword Q_pictSCB,[iptr]:#2 ; SCB (MUST be same as picture's)
moveword #0,[iptr]:#4 ; BWvsColor
moveword Q_txtWidth,[iptr]:#6 ; width
movelong #0,[iptr]:#8 ; top left of bounds Q_Rect
moveword Q_txtBounds+4,[iptr]:#12 ; bottom of bounds Q_Rect
lda Q_txtWidth
asl a ; recompute the adjusted pixel width
ldx Q_pictSCB ; 320 or 640?
beq gotbnds2
asl a
gotbnds2 moveword a,[iptr]:#14 ; store it
movelong Q_txtRect,[iptr]:#16 ; top left of src Q_Rect (ADJUST?)
moveword Q_txtRect+4,[iptr]:#20 ; bottom of src Q_Rect
lda Q_txtRect+6 ; ---- ADJUST SOURCE Q_Rect RIGHT ----
ldx Q_txtSCB ; what mode was the Q_Text in?
beq was320
ldx Q_pictSCB ; 640. Is the picture?
bne putright
dec a ; nope. adjust the source bounds
lsr a
inc a
bra putright
was320 ldx Q_pictSCB ; 320. Is the picture?
beq putright
asl a ; nope. adjust it.
putright moveword a,[iptr]:#22 ; store it.
subword Q_theTxLoc,txtPoint,[iptr]:#24 ; top of dest.
subword Q_theTxLoc+2,txtPoint+2,[iptr]:#26 ; left of dest.
addword [iptr]:#20,[iptr]:#24,[iptr]:#28 ; bot. of dest.
addword [iptr]:#22,[iptr]:#26,[iptr]:#30 ; right of dest.
moveword mode,[iptr]:#32 ; mode
bra abort
notext movelong #0,Q_txtHsize
abort _SetPort ; restore the old port
return Q_picterr
ENDP
END