home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 5
/
DATAFILE_PDCD5.iso
/
education
/
a
/
identikey
/
!IdentiKey
/
DrawLib
(
.txt
)
< prev
next >
Wrap
RISC OS BBC BASIC V Source
|
1996-04-19
|
43KB
|
1,282 lines
>Module DrawLib
-----------------------------------------------------------------------
DrawFile Handling Routines (version 1.07 19-Apr-96)
This library contains routines that handle the creation and display
of DrawFiles.
-----------------------------------------------------------------------
Public Methods Supported:
FNshell_DrawLoadFile
FNshell_DrawGetFileSize
FNshell_DrawTextCoord
PROCshell_DrawCreateFile
PROCshell_DrawOutlineFont
PROCshell_DrawSetPathWidth
PROCshell_DrawSetPathColour
PROCshell_DrawSetPathNoColour
PROCshell_DrawSetFillColour
PROCshell_DrawSetNoFillColour
PROCshell_DrawStartGroup
PROCshell_DrawEndGroup
PROCshell_DrawDestroyFile
PROCshell_DrawSaveFile
PROCshell_DrawEllipse
PROCshell_DrawCircle
PROCshell_DrawBox
PROCshell_DrawPathStart
PROCshell_DrawPathDrawTo
PROCshell_DrawPathEnd
PROCshell_DrawPathCloseLine
PROCshell_DrawLine
PROCshell_DrawSetFont
PROCshell_DrawInitFont
PROCshell_DrawSetUnitsMM
PROCshell_DrawSetUnitsCM
PROCshell_DrawSetUnitsIN
PROCshell_DrawSetUnitsOS
PROCshell_DrawSetUnitsPT
PROCshell_DrawSetPathPattern
PROCshell_DrawGetBoundingBox
PROCshell_DrawRenderFile
PROCshell_DrawSetJoinStyleNone
PROCshell_DrawSetJoinStyleRound
PROCshell_DrawSetJoinStyleBevelled
PROCshell_DrawSetEndCapNone
PROCshell_DrawSetEndCapRound
PROCshell_DrawSetEndCapSquare
PROCshell_DrawSetEndCapTriangle
PROCshell_DrawSetStartCapNone
PROCshell_DrawSetStartCapRound
PROCshell_DrawSetStartCapSquare
PROCshell_DrawSetStartCapTriangle
PROCshell_DrawSetScale
PROCshell_DrawGetScale
PROCshell_DrawResizeWindow
PROCshell_DrawScaleToWindow
PROCshell_DrawSpriteArea
Responses to events raised by other modules
Private Methods Supported:
FNshell_DrawFontName
PROCshell_DrawPutString
PROCshell_DrawPutCoords
PROCshell_DrawPutWord
PROCshell_DrawUpdateObjectBBox
PROCshell_DrawUpdateBounds
PROCshell_DrawUpdateGroupBounds
PROCshell_DrawTextSpace
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Public routines..
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
T$*|Start PROCshell_DrawCreateFile
shell_DrawCreateFile(
buffer%)
creator$,style_blk%,trans_matrix%
EvntShell drawfiles in memory have a 60 byte 'pre-header' which keeps
track of current settings. The 'pre-header' must not be saved to disk
as the file will not be a valid drawfile!
Z*buffer% =
shell_HeapBlockFetch(60+24)
[Ibuffer%!00 = -1 :
Number of current outline font (-1 if none)
\:buffer%!04 = 60 :
Size of EvntShell pre-header
]Sbuffer%!08 = 0 :
File offset to next free address (from start of file)
^O|(buffer%+12)=1814.1732:
Current unit multiplier factor (real nr, 5 bytes)
_1buffer%!20 = 7 :
Current path colour
`1buffer%!24 = -1 :
Current fill colour
aNbuffer%!28 = 0 :
File offset to start of current group definition
b0buffer%!32 = 0 :
Current path width
c-buffer%!36 = 0 :
Current end cap
dMbuffer%!40 = -1 :
Number of outline fonts declared (-1 if none)
eVbuffer%!44 = -1 :
File offset to start of font table (-1 if no font table)
fEbuffer%!48 = 0 :
Pointer to path style description block
g,buffer%!52 =
shell_HeapBlockFetch(24)
hG$(buffer% + (buffer%!04))= "Draw" :
Required to tag as a drawfile
i>buffer%!(buffer%!04 + 4) = 201 :
Major version number
j>buffer%!(buffer%!04 + 8) = 0 :
Minor version number
kW$(buffer% + (buffer%!04 + 12)) =
shell_StringPadTrailing(
shell_GetAppName," ",11)
lLbuffer%!08 = buffer%!04 + 24 :
24 is length of DrawFile so far...
Set extent words of DrawFile to be 0,0,1,1...
shell_DrawPutWord(0,buffer%)
shell_DrawPutWord(0,buffer%)
shell_DrawPutWord(0,buffer%)
shell_DrawPutWord(0,buffer%)
r*buffer%!48 =
shell_HeapBlockFetch(16)
style_blk% = buffer%!48
style_blk%!00 = 0
style_blk%!04 = 0
style_blk%!08 = 0
style_blk%!12 = 0
x*buffer%!52 =
shell_HeapBlockFetch(24)
trans_matrix% = buffer%!52
z)trans_matrix%!00 = 1 << 16 :
x scale
{*trans_matrix%!04 = 0 :
rotation
|*trans_matrix%!08 = 0 :
rotation
})trans_matrix%!12 = 1 << 16 :
y scale
~3trans_matrix%!16 = 0 :
x position offset
3trans_matrix%!20 = 0 :
y position offset
"DRW_PATH_START% = buffer%!8
DRW_PATH_SCALE_FAC = 1
DRW_PATH_XMIN = 0
DRW_PATH_YMIN = 0
DRW_PATH_XMAX = 0
DRW_PATH_YMAX = 0
#*|Stop PROCshell_DrawCreateFile
%*|Start PROCshell_DrawOutlineFont
shell_DrawOutlineFont(
buffer%, text$, ptsize, pthigh, xorigin ,yorigin )
start%,ptr%,lx%,by%,rx%,ty%,font%,scl_fac
scl_fac = |(buffer%+12)
font% = !buffer%
text$ <> ""
3 buffer% =
shell_HeapBlockExtend(buffer%,256)
# ptr% = buffer% + buffer%!8
start% = ptr%
/ !ptr% = 1 :
Text object
D ptr% += 24 :
Skip size, object bounds for now
# lx% = (xorigin * scl_fac)
# by% = (yorigin * scl_fac)
PROCshell_Tracef0("DEBUG::font is "+STR$font%)
PROCshell_Tracef0("DEBUG::font is "+FNshell_DrawFontName(buffer%,font%))
"Font_FindFont",,
shell_DrawFontName(buffer%,font%),ptsize * 16, pthigh * 16
handle%
"Font_SetFont",handle%
"Font_StringBBox",,text$
,r1%,r2%,r3%,r4%
"Font_LoseFont",handle%
PROCshell_Tracef0("DEBUG::r1% = "+STR$r1%)
PROCshell_Tracef0("DEBUG::r2% = "+STR$r2%)
PROCshell_Tracef0("DEBUG::r3% = "+STR$r3%)
PROCshell_Tracef0("DEBUG::r4% = "+STR$r4%)
& rx% = lx% + ((r3%/1000)*640)
& ty% = by% + ((r4%/1000)*640)
PROCshell_Tracef0("DEBUG::lx%="+STR$lx%)
PROCshell_Tracef0("DEBUG::by%="+STR$by%)
PROCshell_Tracef0("DEBUG::rx%="+STR$rx%)
PROCshell_Tracef0("DEBUG::ty%="+STR$ty%)
shell_DrawPutCoords(start% + 8,lx%,by%,rx%,ty%)
' !ptr% = buffer%!20 :ptr% += 4
' !ptr% = buffer%!24 :ptr% += 4
' !ptr% = font% :ptr% += 4
' !ptr% = ptsize * 640 :ptr% += 4
' !ptr% = pthigh * 640 :ptr% += 4
1 !ptr% = xorigin * |(buffer%+12):ptr% += 4
1 !ptr% = yorigin * |(buffer%+12):ptr% += 4
shell_DrawPutString(text$,ptr%)
start%!4 = ptr% - start%
shell_DrawUpdateBounds(buffer%,lx%,by%,rx%,ty%)
> buffer% =
shell_HeapBlockExtend(buffer%,start%!4 - 256)
buffer%!8 += start%!4
$*|Stop PROCshell_DrawOutlineFont
&*|Start PROCshell_DrawSetPathWidth
shell_DrawSetPathWidth(buffer%,width)
1buffer%!32 =
((width * |(buffer%+12)) + 0.5)
%*|Stop PROCshell_DrawSetPathWidth
'*|Start PROCshell_DrawSetPathColour
shell_DrawSetPathColour( buffer%, R%, G%, B% )
( ( R% = -1 )
( G% = -1 )
( B% = -1 ) )
shell_DrawSetPathNoColour( buffer% )
buffer%?20 = 0
buffer%?21 = R%
buffer%?22 = G%
buffer%?23 = B%
&*|Stop PROCshell_DrawSetPathColour
)*|Start PROCshell_DrawSetPathNoColour
shell_DrawSetPathNoColour( buffer% )
buffer%!20 = -1
(*|Stop PROCshell_DrawSetPathNoColour
'*|Start PROCshell_DrawSetFillColour
shell_DrawSetFillColour( buffer%, R%, G%, B% )
( ( R% = -1 )
( G% = -1 )
( B% = -1 ) )
shell_DrawSetNoFillColour( buffer% )
buffer%?24 = 0
buffer%?25 = R%
buffer%?26 = G%
buffer%?27 = B%
&*|Stop PROCshell_DrawSetFillColour
)*|Start PROCshell_DrawSetNoFillColour
shell_DrawSetNoFillColour( buffer% )
buffer%!24 = -1
(*|Stop PROCshell_DrawSetNoFillColour
$*|Start PROCshell_DrawStartGroup
shell_DrawStartGroup(
buffer%,name$)
next%
buffer%!28 > 0
shell_DrawEndGroup( buffer% )
Kbuffer%!28 = buffer%!08:
Store file offset to current group definition
PROCshell_Tracef0("DEBUG::bb_offset = "+STR$~buffer%!28)
shell_DrawPutWord(06,buffer%) :
Object type 6 (group)
shell_DrawPutWord(36,buffer%) :
Current size of group object
shell_DrawPutWord(-1,buffer%) :
Bounding box xmin
shell_DrawPutWord(-1,buffer%) :
Bounding box ymin
shell_DrawPutWord(1,buffer%) :
Bounding box xmax
shell_DrawPutWord(1,buffer%) :
Bounding box ymax
0buffer% =
shell_HeapBlockExtend(buffer%,12)
"next% = buffer% + buffer%!08
$next% = name$
Abuffer%!08 += 12 :
Update file offset to next free address..
#*|Stop PROCshell_DrawStartGroup
"*|Start PROCshell_DrawEndGroup
shell_DrawEndGroup( buffer% )
start%
buffer%!28 > 0
% start% = buffer% + (buffer%!28)
/ start%!4 = (buffer% + buffer%!8) - start%
buffer%!28 = 0
!*|Stop PROCshell_D