home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / education / a / identikey / !IdentiKey / DrawLib (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1996-04-19  |  43KB  |  1,282 lines

  1.  >Module DrawLib
  2.  -----------------------------------------------------------------------
  3.  DrawFile Handling Routines (version 1.07 19-Apr-96)
  4.  This library contains routines that handle the creation and display
  5.  of DrawFiles.
  6.  -----------------------------------------------------------------------
  7.  Public Methods Supported:
  8.    FNshell_DrawLoadFile
  9.    FNshell_DrawGetFileSize
  10.    FNshell_DrawTextCoord
  11.    PROCshell_DrawCreateFile
  12.    PROCshell_DrawOutlineFont
  13.    PROCshell_DrawSetPathWidth
  14.    PROCshell_DrawSetPathColour
  15.    PROCshell_DrawSetPathNoColour
  16.    PROCshell_DrawSetFillColour
  17.    PROCshell_DrawSetNoFillColour
  18.    PROCshell_DrawStartGroup
  19.    PROCshell_DrawEndGroup
  20.    PROCshell_DrawDestroyFile
  21.    PROCshell_DrawSaveFile
  22.    PROCshell_DrawEllipse
  23.    PROCshell_DrawCircle
  24.    PROCshell_DrawBox
  25.    PROCshell_DrawPathStart
  26.    PROCshell_DrawPathDrawTo
  27.    PROCshell_DrawPathEnd
  28.    PROCshell_DrawPathCloseLine
  29.    PROCshell_DrawLine
  30.    PROCshell_DrawSetFont
  31.    PROCshell_DrawInitFont
  32.    PROCshell_DrawSetUnitsMM
  33.    PROCshell_DrawSetUnitsCM
  34.    PROCshell_DrawSetUnitsIN
  35.    PROCshell_DrawSetUnitsOS
  36.    PROCshell_DrawSetUnitsPT
  37.    PROCshell_DrawSetPathPattern
  38.    PROCshell_DrawGetBoundingBox
  39.    PROCshell_DrawRenderFile
  40.    PROCshell_DrawSetJoinStyleNone
  41.    PROCshell_DrawSetJoinStyleRound
  42.    PROCshell_DrawSetJoinStyleBevelled
  43.    PROCshell_DrawSetEndCapNone
  44.    PROCshell_DrawSetEndCapRound
  45.    PROCshell_DrawSetEndCapSquare
  46.    PROCshell_DrawSetEndCapTriangle
  47.    PROCshell_DrawSetStartCapNone
  48.    PROCshell_DrawSetStartCapRound
  49.    PROCshell_DrawSetStartCapSquare
  50.    PROCshell_DrawSetStartCapTriangle
  51.    PROCshell_DrawSetScale
  52.    PROCshell_DrawGetScale
  53.    PROCshell_DrawResizeWindow
  54.    PROCshell_DrawScaleToWindow
  55.    PROCshell_DrawSpriteArea
  56.  Responses to events raised by other modules
  57.  Private Methods Supported:
  58.    FNshell_DrawFontName
  59.    PROCshell_DrawPutString
  60.    PROCshell_DrawPutCoords
  61.    PROCshell_DrawPutWord
  62.    PROCshell_DrawUpdateObjectBBox
  63.    PROCshell_DrawUpdateBounds
  64.    PROCshell_DrawUpdateGroupBounds
  65.    PROCshell_DrawTextSpace
  66.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  67.  Public routines..
  68.  :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  69. T$*|Start PROCshell_DrawCreateFile
  70. shell_DrawCreateFile(
  71.  buffer%)
  72.  creator$,style_blk%,trans_matrix%
  73.  EvntShell drawfiles in memory have a 60 byte 'pre-header' which keeps
  74.  track of current settings. The 'pre-header' must not be saved to disk
  75.  as the file will not be a valid drawfile!
  76. Z*buffer% = 
  77. shell_HeapBlockFetch(60+24)
  78. [Ibuffer%!00   = -1      :
  79.  Number of current outline font (-1 if none)
  80. \:buffer%!04   = 60      :
  81.  Size of EvntShell pre-header
  82. ]Sbuffer%!08   = 0       :
  83.  File offset to next free address (from start of file)
  84. ^O|(buffer%+12)=1814.1732:
  85.  Current unit multiplier factor (real nr, 5 bytes)
  86. _1buffer%!20   = 7       :
  87.  Current path colour
  88. `1buffer%!24   = -1      :
  89.  Current fill colour
  90. aNbuffer%!28   = 0       :
  91.  File offset to start of current group definition
  92. b0buffer%!32   = 0       :
  93.  Current path width
  94. c-buffer%!36   = 0       :
  95.  Current end cap
  96. dMbuffer%!40   = -1      :
  97.  Number of outline fonts declared   (-1 if none)
  98. eVbuffer%!44   = -1      :
  99.  File offset to start of font table (-1 if no font table)
  100. fEbuffer%!48   = 0       :
  101.  Pointer to path style description block
  102. g,buffer%!52   = 
  103. shell_HeapBlockFetch(24)
  104. hG$(buffer% + (buffer%!04))= "Draw"  :
  105.  Required to tag as a drawfile
  106. i>buffer%!(buffer%!04 + 4) = 201     :
  107.  Major version number
  108. j>buffer%!(buffer%!04 + 8) = 0       :
  109.  Minor version number
  110. kW$(buffer% + (buffer%!04 + 12)) = 
  111. shell_StringPadTrailing(
  112. shell_GetAppName," ",11)
  113. lLbuffer%!08 = buffer%!04 + 24       :
  114.  24 is length of DrawFile so far...
  115.  Set extent words of DrawFile to be 0,0,1,1...
  116. shell_DrawPutWord(0,buffer%)
  117. shell_DrawPutWord(0,buffer%)
  118. shell_DrawPutWord(0,buffer%)
  119. shell_DrawPutWord(0,buffer%)
  120. r*buffer%!48 = 
  121. shell_HeapBlockFetch(16)
  122. style_blk% = buffer%!48
  123. style_blk%!00 = 0
  124. style_blk%!04 = 0
  125. style_blk%!08 = 0
  126. style_blk%!12 = 0
  127. x*buffer%!52 = 
  128. shell_HeapBlockFetch(24)
  129. trans_matrix% = buffer%!52
  130. z)trans_matrix%!00 = 1 << 16 :
  131.  x scale
  132. {*trans_matrix%!04 = 0       :
  133.  rotation
  134. |*trans_matrix%!08 = 0       :
  135.  rotation
  136. })trans_matrix%!12 = 1 << 16 :
  137.  y scale
  138. ~3trans_matrix%!16 = 0       :
  139.  x position offset
  140. 3trans_matrix%!20 = 0       :
  141.  y position offset
  142. "DRW_PATH_START%    = buffer%!8
  143. DRW_PATH_SCALE_FAC = 1
  144. DRW_PATH_XMIN = 0
  145. DRW_PATH_YMIN = 0
  146. DRW_PATH_XMAX = 0
  147. DRW_PATH_YMAX = 0
  148. #*|Stop PROCshell_DrawCreateFile
  149. %*|Start PROCshell_DrawOutlineFont
  150. shell_DrawOutlineFont( 
  151.  buffer%, text$, ptsize, pthigh, xorigin ,yorigin )
  152.  start%,ptr%,lx%,by%,rx%,ty%,font%,scl_fac
  153. scl_fac = |(buffer%+12)
  154. font% = !buffer%
  155.  text$ <> "" 
  156. 3  buffer% = 
  157. shell_HeapBlockExtend(buffer%,256)
  158. #  ptr%    = buffer% + buffer%!8
  159.   start%  = ptr%
  160. /  !ptr%   =   1              :
  161.  Text object
  162. D  ptr%    += 24              :
  163.  Skip size, object bounds for now
  164. #  lx%     = (xorigin * scl_fac)
  165. #  by%     = (yorigin * scl_fac)
  166.  PROCshell_Tracef0("DEBUG::font is "+STR$font%)
  167.  PROCshell_Tracef0("DEBUG::font is "+FNshell_DrawFontName(buffer%,font%))
  168.  "Font_FindFont",,
  169. shell_DrawFontName(buffer%,font%),ptsize * 16, pthigh * 16 
  170.  handle%
  171.  "Font_SetFont",handle%
  172.  "Font_StringBBox",,text$ 
  173.  ,r1%,r2%,r3%,r4%
  174.  "Font_LoseFont",handle%
  175.  PROCshell_Tracef0("DEBUG::r1% = "+STR$r1%)
  176.  PROCshell_Tracef0("DEBUG::r2% = "+STR$r2%)
  177.  PROCshell_Tracef0("DEBUG::r3% = "+STR$r3%)
  178.  PROCshell_Tracef0("DEBUG::r4% = "+STR$r4%)
  179. &  rx%     = lx% + ((r3%/1000)*640)
  180. &  ty%     = by% + ((r4%/1000)*640)
  181.  PROCshell_Tracef0("DEBUG::lx%="+STR$lx%)
  182.  PROCshell_Tracef0("DEBUG::by%="+STR$by%)
  183.  PROCshell_Tracef0("DEBUG::rx%="+STR$rx%)
  184.  PROCshell_Tracef0("DEBUG::ty%="+STR$ty%)
  185. shell_DrawPutCoords(start% + 8,lx%,by%,rx%,ty%)
  186. '  !ptr%   = buffer%!20   :ptr% += 4
  187. '  !ptr%   = buffer%!24   :ptr% += 4
  188. '  !ptr%   = font%        :ptr% += 4
  189. '  !ptr%   = ptsize * 640 :ptr% += 4
  190. '  !ptr%   = pthigh * 640 :ptr% += 4
  191. 1  !ptr%   = xorigin * |(buffer%+12):ptr% += 4
  192. 1  !ptr%   = yorigin * |(buffer%+12):ptr% += 4
  193. shell_DrawPutString(text$,ptr%)
  194.   start%!4 = ptr% - start%
  195. shell_DrawUpdateBounds(buffer%,lx%,by%,rx%,ty%)
  196. >  buffer% = 
  197. shell_HeapBlockExtend(buffer%,start%!4 - 256)
  198.   buffer%!8 += start%!4
  199. $*|Stop PROCshell_DrawOutlineFont
  200. &*|Start PROCshell_DrawSetPathWidth
  201. shell_DrawSetPathWidth(buffer%,width)
  202. 1buffer%!32 = 
  203. ((width * |(buffer%+12)) + 0.5)
  204. %*|Stop PROCshell_DrawSetPathWidth
  205. '*|Start PROCshell_DrawSetPathColour
  206. shell_DrawSetPathColour( buffer%, R%, G%, B% )
  207.  ( ( R% = -1 ) 
  208.  ( G% = -1 ) 
  209.  ( B% = -1 ) )
  210. shell_DrawSetPathNoColour( buffer% )
  211.   buffer%?20 = 0
  212.   buffer%?21 = R%
  213.   buffer%?22 = G%
  214.   buffer%?23 = B%
  215. &*|Stop PROCshell_DrawSetPathColour
  216. )*|Start PROCshell_DrawSetPathNoColour
  217. shell_DrawSetPathNoColour( buffer% )
  218. buffer%!20 = -1
  219. (*|Stop PROCshell_DrawSetPathNoColour
  220. '*|Start PROCshell_DrawSetFillColour
  221. shell_DrawSetFillColour( buffer%, R%, G%, B% )
  222.  ( ( R% = -1 ) 
  223.  ( G% = -1 ) 
  224.  ( B% = -1 ) ) 
  225. shell_DrawSetNoFillColour( buffer% )
  226.   buffer%?24 = 0
  227.   buffer%?25 = R%
  228.   buffer%?26 = G%
  229.   buffer%?27 = B%
  230. &*|Stop PROCshell_DrawSetFillColour
  231. )*|Start PROCshell_DrawSetNoFillColour
  232. shell_DrawSetNoFillColour( buffer% )
  233. buffer%!24 = -1
  234. (*|Stop PROCshell_DrawSetNoFillColour
  235. $*|Start PROCshell_DrawStartGroup
  236. shell_DrawStartGroup(
  237.  buffer%,name$)
  238.  next%
  239.  buffer%!28 > 0 
  240. shell_DrawEndGroup( buffer% )
  241. Kbuffer%!28 = buffer%!08:
  242.  Store file offset to current group definition
  243.  PROCshell_Tracef0("DEBUG::bb_offset = "+STR$~buffer%!28)
  244. shell_DrawPutWord(06,buffer%) :
  245.  Object type 6 (group)
  246. shell_DrawPutWord(36,buffer%) :
  247.  Current size of group object
  248. shell_DrawPutWord(-1,buffer%) :
  249.  Bounding box xmin
  250. shell_DrawPutWord(-1,buffer%) :
  251.  Bounding box ymin
  252. shell_DrawPutWord(1,buffer%)  :
  253.  Bounding box xmax
  254. shell_DrawPutWord(1,buffer%)  :
  255.  Bounding box ymax
  256. 0buffer% = 
  257. shell_HeapBlockExtend(buffer%,12)
  258. "next%   = buffer% + buffer%!08
  259. $next%  = name$
  260. Abuffer%!08 += 12 :
  261.  Update file offset to next free address..
  262. #*|Stop PROCshell_DrawStartGroup
  263. "*|Start PROCshell_DrawEndGroup
  264. shell_DrawEndGroup( buffer% )
  265.  start%
  266.  buffer%!28 > 0 
  267. %  start% = buffer% + (buffer%!28)
  268. /  start%!4 = (buffer% + buffer%!8) - start%
  269.   buffer%!28 = 0
  270. !*|Stop PROCshell_D