home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 4
/
DATAFILE_PDCD4.iso
/
utilities
/
utilsd
/
drawpersp
/
!DrawPersp
/
DrawLib
(
.txt
)
< prev
next >
Wrap
RISC OS BBC BASIC V Source
|
1995-01-29
|
38KB
|
1,167 lines
>Module DrawLib
$*|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!
*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
Nbuffer%!28 = 0 :
File offset to start of current group definition
0buffer%!32 = 0 :
Current path width
-buffer%!36 = 0 :
Current end cap
Mbuffer%!40 = -1 :
Number of outline fonts declared (-1 if none)
Vbuffer%!44 = -1 :
File offset to start of font table (-1 if no font table)
Ebuffer%!48 = 0 :
Pointer to path style description block
$buffer%!52 = 0 :
Unused
G$(buffer% + (buffer%!04))= "Draw" :
Required to tag as a drawfile
>buffer%!(buffer%!04 + 4) = 201 :
Major version number
>buffer%!(buffer%!04 + 8) = 0 :
Minor version number
W$(buffer% + (buffer%!04 + 12)) =
shell_StringPadTrailing(
shell_GetAppName," ",11)
Lbuffer%!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%)
!*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
'*buffer%!52 =
shell_HeapBlockFetch(24)
trans_matrix% = buffer%!52
))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
0"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
9#*|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$ <> ""
A3 buffer% =
shell_HeapBlockExtend(buffer%,256)
B# ptr% = buffer% + buffer%!8
start% = ptr%
D/ !ptr% = 1 :
Text object
ED ptr% += 24 :
Skip size, object bounds for now
F$ lx% = (xorigin% * scl_fac)
G$ 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%)
S& rx% = lx% + ((r3%/1000)*640)
T& 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%)
Z' !ptr% = buffer%!20 :ptr% += 4
[' !ptr% = buffer%!24 :ptr% += 4
\' !ptr% = font% :ptr% += 4
]' !ptr% = ptsize * 640 :ptr% += 4
^' !ptr% = pthigh * 640 :ptr% += 4
_2 !ptr% = xorigin% * |(buffer%+12):ptr% += 4
`2 !ptr% = yorigin% * |(buffer%+12):ptr% += 4
shell_DrawPutString(text$,ptr%)
start%!4 = ptr% - start%
shell_DrawUpdateBounds(buffer%,lx%,by%,rx%,ty%)
d> buffer% =
shell_HeapBlockExtend(buffer%,start%!4 - 256)
buffer%!8 += start%!4
i$*|Stop PROCshell_DrawOutlineFont
k#*|Start PROCshell_DrawPutString
shell_DrawPutString(S$,
ptr%)
$ptr% = S$
ptr% +=
?ptr% = 0
ptr% += 1
ptr%
4 = 0
u"*|Stop PROCshell_DrawPutString
w#*|Start PROCshell_DrawPutCoords
shell_DrawPutCoords(start%,lx%,by%,rx%,ty%)
start%!00 = lx%
start%!04 = by%
start%!08 = rx%
start%!12 = ty%
"*|Stop PROCshell_DrawPutCoords
&*|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%)
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%)
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_DrawPutWord
shell_DrawPutWord(k%,
buffer%)
next%
/buffer% =
shell_HeapBlockExtend(buffer%,4)
next% = buffer% + buffer%!08
!next% = k%
buffer%!08 += 4
*|Stop PROCshell_DrawPutWord
$*|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_DrawEndGroup
%*|Start PROCshell_DrawDestroyFile
shell_DrawDestroyFile(buffer%)
shell_HeapBlockExists(buffer%!48)
shell_HeapBlockReturn(buffer%!48)
shell_HeapBlockReturn(buffer%)
$*|Stop PROCshell_DrawDestroyFile
"*|Start PROCshell_DrawSaveFile
shell_DrawSaveFile(buffer%,file$)
Add some error trapping here...
X% =
(file$)
PROCshell_Tracef0("DEBUG::size is "+STR$(buffer%!8 - buffer%!4))
"OS_GBPB",2,X%,buffer% + (buffer%!4),buffer%!8 - buffer%!4
("SetType "+file$+ " &AFF")
!*|Stop PROCshell_DrawSaveFile
*|Start FNshell_DrawLoadFile
shell_DrawLoadFile(name$)
buff%,X%,size%
shell_DrawCreateFile(buff%)
,buff%!8 -= 40 :
don't need the header..
$size% =
shell_FileLength(name$)
/buff% =
shell_HeapBlockExtend(buff%,size%)
X% =
(name$)
"OS_GBPB",4,X%,buff% + buff%!4,size%
buff%!8 = size% + buff%!4
shell_DrawSetScale(buffer%,1,1)
= buff%
*|Stop FNshell_DrawLoadFile
!*|Start PROCshell_DrawEllipse
shell_DrawEllipse(
buffer%,X,Y,Xm,Ym)
start%,A,B,C,D,E,K,Xs,Ys
start% = buffer%!8
X = X * |(buffer%+12)
Y = Y * |(buffer%+12)
Xm = Xm * |(buffer%+12)
Ym = Ym * |(buffer%+12)
PROCshell_Tracef0("DEBUG::X="+STR$X)
PROCshell_Tracef0("DEBUG::Y="+STR$Y)
PROCshell_Tracef0("DEBUG::Xm="+STR$Xm)
PROCshell_Tracef0("DEBUG::Ym="+STR$Ym)
Xm >= Ym
A = Xm / Xm / 10 + 0.5
Xm / Ym < 2
A = 0.7
Xm / Ym > 4.5
A = 0.95
Xs = A * Xm
( Ys =
(1 - Xs * Xs / Xm / Xm) * Ym
Ym > Xm
A = Ym / Xm / 10 + 0.5
Ym / Xm < 2
A = 0.7
Ym / Xm > 4.5
A = 0.95
Ys = A * Ym
( Xs =
(1 - Ys * Ys / Ym / Ym) * Xm
B = Ym + (Ym - Ys) / 3
%K = Xs * Xs + (B - Ys) * (B - Ys)
.C = (
(4 * Xs * Xs + 12 * K) - 2 * Xs) / 6
D = Xm + (Xm - Xs) / 3
%K = Ys * Ys + (D - Xs) * (D - Xs)
.E = (
(4 * Ys * Ys + 12 * K) - 2 * Ys) / 6
shell_DrawPutWord(2,buffer%) :
Object type 2 (path)
shell_DrawPutWord(0,buffer%) :
Size of object (dummy value)
shell_D