home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / utilities / utilsd / drawpersp / !DrawPersp / DrawLib (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1995-01-29  |  38KB  |  1,167 lines

  1.  >Module DrawLib
  2. $*|Start PROCshell_DrawCreateFile
  3. shell_DrawCreateFile(
  4.  buffer%)
  5.  creator$,style_blk%,trans_matrix%
  6.  EvntShell drawfiles in memory have a 60 byte 'pre-header' which keeps
  7.  track of current settings. The 'pre-header' must not be saved to disk
  8.  as the file will not be a valid drawfile!
  9.     *buffer% = 
  10. shell_HeapBlockFetch(60+24)
  11. Ibuffer%!00   = -1      :
  12.  Number of current outline font (-1 if none)
  13. :buffer%!04   = 60      :
  14.  Size of EvntShell pre-header
  15. Sbuffer%!08   = 0       :
  16.  File offset to next free address (from start of file)
  17. O|(buffer%+12)=1814.1732:
  18.  Current unit multiplier factor (real nr, 5 bytes)
  19. 1buffer%!20   = 7       :
  20.  Current path colour
  21. 1buffer%!24   = -1      :
  22.  Current fill colour
  23. Nbuffer%!28   = 0       :
  24.  File offset to start of current group definition
  25. 0buffer%!32   = 0       :
  26.  Current path width
  27. -buffer%!36   = 0       :
  28.  Current end cap
  29. Mbuffer%!40   = -1      :
  30.  Number of outline fonts declared   (-1 if none)
  31. Vbuffer%!44   = -1      :
  32.  File offset to start of font table (-1 if no font table)
  33. Ebuffer%!48   = 0       :
  34.  Pointer to path style description block
  35. $buffer%!52   = 0       :
  36.  Unused
  37. G$(buffer% + (buffer%!04))= "Draw"  :
  38.  Required to tag as a drawfile
  39. >buffer%!(buffer%!04 + 4) = 201     :
  40.  Major version number
  41. >buffer%!(buffer%!04 + 8) = 0       :
  42.  Minor version number
  43. W$(buffer% + (buffer%!04 + 12)) = 
  44. shell_StringPadTrailing(
  45. shell_GetAppName," ",11)
  46. Lbuffer%!08 = buffer%!04 + 24       :
  47.  24 is length of DrawFile so far...
  48.  Set extent words of DrawFile to be 0,0,1,1...
  49. shell_DrawPutWord(0,buffer%)
  50. shell_DrawPutWord(0,buffer%)
  51. shell_DrawPutWord(0,buffer%)
  52. shell_DrawPutWord(0,buffer%)
  53. !*buffer%!48 = 
  54. shell_HeapBlockFetch(16)
  55. style_blk% = buffer%!48
  56. style_blk%!00 = 0
  57. style_blk%!04 = 0
  58. style_blk%!08 = 0
  59. style_blk%!12 = 0
  60. '*buffer%!52 = 
  61. shell_HeapBlockFetch(24)
  62. trans_matrix% = buffer%!52
  63. ))trans_matrix%!00 = 1 << 16 :
  64.  x scale
  65. **trans_matrix%!04 = 0       :
  66.  rotation
  67. +*trans_matrix%!08 = 0       :
  68.  rotation
  69. ,)trans_matrix%!12 = 1 << 16 :
  70.  y scale
  71. -3trans_matrix%!16 = 0       :
  72.  x position offset
  73. .3trans_matrix%!20 = 0       :
  74.  y position offset
  75. 0"DRW_PATH_START%    = buffer%!8
  76. DRW_PATH_SCALE_FAC = 1
  77. DRW_PATH_XMIN = 0
  78. DRW_PATH_YMIN = 0
  79. DRW_PATH_XMAX = 0
  80. DRW_PATH_YMAX = 0
  81. 9#*|Stop PROCshell_DrawCreateFile
  82. ;%*|Start PROCshell_DrawOutlineFont
  83. shell_DrawOutlineFont(
  84.  buffer%,text$,ptsize,pthigh,xorigin%,yorigin%)
  85.  start%,ptr%,lx%,by%,rx%,ty%,font%,scl_fac
  86. scl_fac = |(buffer%+12)
  87. font% = !buffer%
  88.  text$ <> "" 
  89. A3  buffer% = 
  90. shell_HeapBlockExtend(buffer%,256)
  91. B#  ptr%    = buffer% + buffer%!8
  92.   start%  = ptr%
  93. D/  !ptr%   =   1              :
  94.  Text object
  95. ED  ptr%    += 24              :
  96.  Skip size, object bounds for now
  97. F$  lx%     = (xorigin% * scl_fac)
  98. G$  by%     = (yorigin% * scl_fac)
  99.  PROCshell_Tracef0("DEBUG::font is "+STR$font%)
  100.  PROCshell_Tracef0("DEBUG::font is "+FNshell_DrawFontName(buffer%,font%))
  101.  "Font_FindFont",,
  102. shell_DrawFontName(buffer%,font%),ptsize * 16, pthigh * 16 
  103.  handle%
  104.  "Font_SetFont",handle%
  105.  "Font_StringBBox",,text$ 
  106.  ,r1%,r2%,r3%,r4%
  107.  "Font_LoseFont",handle%
  108.  PROCshell_Tracef0("DEBUG::r1% = "+STR$r1%)
  109.  PROCshell_Tracef0("DEBUG::r2% = "+STR$r2%)
  110.  PROCshell_Tracef0("DEBUG::r3% = "+STR$r3%)
  111.  PROCshell_Tracef0("DEBUG::r4% = "+STR$r4%)
  112. S&  rx%     = lx% + ((r3%/1000)*640)
  113. T&  ty%     = by% + ((r4%/1000)*640)
  114.  PROCshell_Tracef0("DEBUG::lx%="+STR$lx%)
  115.  PROCshell_Tracef0("DEBUG::by%="+STR$by%)
  116.  PROCshell_Tracef0("DEBUG::rx%="+STR$rx%)
  117.  PROCshell_Tracef0("DEBUG::ty%="+STR$ty%)
  118. shell_DrawPutCoords(start% + 8,lx%,by%,rx%,ty%)
  119. Z'  !ptr%   = buffer%!20   :ptr% += 4
  120. ['  !ptr%   = buffer%!24   :ptr% += 4
  121. \'  !ptr%   = font%        :ptr% += 4
  122. ]'  !ptr%   = ptsize * 640 :ptr% += 4
  123. ^'  !ptr%   = pthigh * 640 :ptr% += 4
  124. _2  !ptr%   = xorigin% * |(buffer%+12):ptr% += 4
  125. `2  !ptr%   = yorigin% * |(buffer%+12):ptr% += 4
  126. shell_DrawPutString(text$,ptr%)
  127.   start%!4 = ptr% - start%
  128. shell_DrawUpdateBounds(buffer%,lx%,by%,rx%,ty%)
  129. d>  buffer% = 
  130. shell_HeapBlockExtend(buffer%,start%!4 - 256)
  131.   buffer%!8 += start%!4
  132. i$*|Stop PROCshell_DrawOutlineFont
  133. k#*|Start PROCshell_DrawPutString
  134. shell_DrawPutString(S$,
  135.  ptr%)
  136. $ptr% = S$
  137. ptr% += 
  138.   ?ptr% = 0
  139.   ptr% += 1
  140.  ptr% 
  141.  4 = 0
  142. u"*|Stop PROCshell_DrawPutString
  143. w#*|Start PROCshell_DrawPutCoords
  144. shell_DrawPutCoords(start%,lx%,by%,rx%,ty%)
  145. start%!00 = lx%
  146. start%!04 = by%
  147. start%!08 = rx%
  148. start%!12 = ty%
  149. "*|Stop PROCshell_DrawPutCoords
  150. &*|Start PROCshell_DrawSetPathWidth
  151. shell_DrawSetPathWidth(buffer%,width)
  152. 1buffer%!32 = 
  153. ((width * |(buffer%+12)) + 0.5)
  154. %*|Stop PROCshell_DrawSetPathWidth
  155. '*|Start PROCshell_DrawSetPathColour
  156. shell_DrawSetPathColour(buffer%,R%,G%,B%)
  157. buffer%?20 = 0
  158. buffer%?21 = R%
  159. buffer%?22 = G%
  160. buffer%?23 = B%
  161. &*|Stop PROCshell_DrawSetPathColour
  162. )*|Start PROCshell_DrawSetPathNoColour
  163. shell_DrawSetPathNoColour(buffer%)
  164. buffer%!20 = -1
  165. (*|Stop PROCshell_DrawSetPathNoColour
  166. '*|Start PROCshell_DrawSetFillColour
  167. shell_DrawSetFillColour(buffer%,R%,G%,B%)
  168. buffer%?24 = 0
  169. buffer%?25 = R%
  170. buffer%?26 = G%
  171. buffer%?27 = B%
  172. &*|Stop PROCshell_DrawSetFillColour
  173. )*|Start PROCshell_DrawSetNoFillColour
  174. shell_DrawSetNoFillColour(buffer%)
  175. buffer%!24 = -1
  176. (*|Stop PROCshell_DrawSetNoFillColour
  177. !*|Start PROCshell_DrawPutWord
  178. shell_DrawPutWord(k%,
  179.  buffer%)
  180.  next%
  181. /buffer% = 
  182. shell_HeapBlockExtend(buffer%,4)
  183.  next% = buffer% + buffer%!08
  184. !next% = k%
  185. buffer%!08 += 4
  186.  *|Stop PROCshell_DrawPutWord
  187. $*|Start PROCshell_DrawStartGroup
  188. shell_DrawStartGroup(
  189.  buffer%,name$)
  190.  next%
  191.  buffer%!28 > 0 
  192. shell_DrawEndGroup(buffer%)
  193. Kbuffer%!28 = buffer%!08:
  194.  Store file offset to current group definition
  195.  PROCshell_Tracef0("DEBUG::bb_offset = "+STR$~buffer%!28)
  196. shell_DrawPutWord(06,buffer%) :
  197.  Object type 6 (group)
  198. shell_DrawPutWord(36,buffer%) :
  199.  Current size of group object
  200. shell_DrawPutWord(-1,buffer%) :
  201.  Bounding box xmin
  202. shell_DrawPutWord(-1,buffer%) :
  203.  Bounding box ymin
  204. shell_DrawPutWord(1,buffer%)  :
  205.  Bounding box xmax
  206. shell_DrawPutWord(1,buffer%)  :
  207.  Bounding box ymax
  208. 0buffer% = 
  209. shell_HeapBlockExtend(buffer%,12)
  210. "next%   = buffer% + buffer%!08
  211. $next%  = name$
  212. Abuffer%!08 += 12 :
  213.  Update file offset to next free address..
  214. #*|Stop PROCshell_DrawStartGroup
  215. "*|Start PROCshell_DrawEndGroup
  216. shell_DrawEndGroup(buffer%)
  217.  start%
  218.  buffer%!28 > 0 
  219. %  start% = buffer% + (buffer%!28)
  220. /  start%!4 = (buffer% + buffer%!8) - start%
  221.   buffer%!28 = 0
  222. !*|Stop PROCshell_DrawEndGroup
  223. %*|Start PROCshell_DrawDestroyFile
  224. shell_DrawDestroyFile(buffer%)
  225. shell_HeapBlockExists(buffer%!48) 
  226. shell_HeapBlockReturn(buffer%!48)
  227. shell_HeapBlockReturn(buffer%)
  228. $*|Stop PROCshell_DrawDestroyFile
  229. "*|Start PROCshell_DrawSaveFile
  230. shell_DrawSaveFile(buffer%,file$)
  231.  Add some error trapping here...
  232. X% = 
  233. (file$)
  234.  PROCshell_Tracef0("DEBUG::size is "+STR$(buffer%!8 - buffer%!4))
  235.  "OS_GBPB",2,X%,buffer% + (buffer%!4),buffer%!8 - buffer%!4
  236. ("SetType "+file$+ " &AFF")
  237. !*|Stop PROCshell_DrawSaveFile
  238.  *|Start FNshell_DrawLoadFile
  239. shell_DrawLoadFile(name$)
  240.  buff%,X%,size%
  241. shell_DrawCreateFile(buff%)
  242. ,buff%!8 -= 40 :
  243.  don't need the header..
  244. $size% = 
  245. shell_FileLength(name$)
  246. /buff% = 
  247. shell_HeapBlockExtend(buff%,size%)
  248. X% = 
  249. (name$)
  250.  "OS_GBPB",4,X%,buff% + buff%!4,size%
  251. buff%!8 = size% + buff%!4
  252. shell_DrawSetScale(buffer%,1,1)
  253. = buff%
  254. *|Stop FNshell_DrawLoadFile
  255. !*|Start PROCshell_DrawEllipse
  256. shell_DrawEllipse(
  257.  buffer%,X,Y,Xm,Ym)
  258.  start%,A,B,C,D,E,K,Xs,Ys
  259. start% = buffer%!8
  260. X  = X  * |(buffer%+12)
  261. Y  = Y  * |(buffer%+12)
  262. Xm = Xm * |(buffer%+12)
  263. Ym = Ym * |(buffer%+12)
  264.  PROCshell_Tracef0("DEBUG::X="+STR$X)
  265.  PROCshell_Tracef0("DEBUG::Y="+STR$Y)
  266.  PROCshell_Tracef0("DEBUG::Xm="+STR$Xm)
  267.  PROCshell_Tracef0("DEBUG::Ym="+STR$Ym)
  268.  Xm >= Ym 
  269.   A = Xm / Xm / 10 + 0.5
  270.  Xm / Ym < 2 
  271.  A = 0.7
  272.  Xm / Ym > 4.5 
  273.  A = 0.95
  274.   Xs = A * Xm
  275. (  Ys = 
  276. (1 - Xs * Xs / Xm / Xm) * Ym
  277.  Ym > Xm 
  278.   A = Ym / Xm / 10 + 0.5
  279.  Ym / Xm < 2 
  280.  A = 0.7
  281.  Ym / Xm > 4.5 
  282.  A = 0.95
  283.   Ys = A * Ym
  284. (  Xs = 
  285. (1 - Ys * Ys / Ym / Ym) * Xm
  286. B = Ym + (Ym - Ys) / 3
  287. %K = Xs * Xs + (B - Ys) * (B - Ys)
  288. .C = (
  289. (4 * Xs * Xs + 12 * K) - 2 * Xs) / 6
  290. D = Xm + (Xm - Xs) / 3
  291. %K = Ys * Ys + (D - Xs) * (D - Xs)
  292. .E = (
  293. (4 * Ys * Ys + 12 * K) - 2 * Ys) / 6
  294. shell_DrawPutWord(2,buffer%)           :
  295.  Object type 2 (path)
  296. shell_DrawPutWord(0,buffer%)           :
  297.  Size of object (dummy value)
  298. shell_D