home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / EGS / egssys71.lha / EGSClusterInc.lha / IntuiGfx.def < prev    next >
Encoding:
Text File  |  1994-12-13  |  32.7 KB  |  745 lines

  1. |##########|
  2. |#MAGIC   #|DBBCMEAF
  3. |#PROJECT #|""
  4. |#PATHS   #|"EGSProject"
  5. |#FLAGS   #|xx---x--x---xxx-----------------
  6. |#USERSW  #|--------------------------------
  7. |#USERMASK#|--------------------------------
  8. |#SWITCHES#|x--x-x----------
  9. |##########|
  10. DEFINITION MODULE IntuiGfx;
  11. |
  12. |  +---------------------------------------------------------------------+
  13. |  |                                                                     |##
  14. |  |                egsintui.library v0.7, © '91 StoneWare               |##
  15. |  |                    EXTENDED - GRAPHICS - STANDARD                   |##
  16. |  |                        support : IntuiGfx                           |##
  17. |  |                                                                     |##
  18. |  +---------------------------------------------------------------------+##
  19. |    #######################################################################
  20. |
  21. |  Um die Ausgabe von Grafiken in Windows, Menues und Gadgets möglichst flexibel,
  22. |  effizient und Mächtig zu gestallten verfügt die egsintui.library über einen
  23. |  Interpreter, mit dem Programme einer einfachen Stack-Graphik-Sprache
  24. |  ausgeführt werden können.
  25. |
  26. |  Porgramme in dieser Sprache werden für alle Intuition typischen Grafiken
  27. |  verwendet, wie Gadgets, Menüs und "Requester". Da innerhalb dieser Programme
  28. |  auch Unterprogramme mit Parametern verwendet werden können, ist diese Technik
  29. |  wesentlich flexibler als die bekannte mit getrennten Border, Text und Image
  30. |  Listen.
  31. |
  32. |  Beispiele:
  33. |
  34. |   - Werden für einen Requester oder Menü mehrmals ähnliche Textzüge mit
  35. |     Schatten benötigt, muß nur eine Prozedur definiert werden, mit der
  36. |     ein derartiger Text ausgegeben wird. Später muß dann nur noch diese
  37. |     Prozedur mit dem Text als Parameter aufgerufen werden.
  38. |
  39. |   - Werden Gadgets mit dreidimensionalen Rahmen verwendet, so genügt es
  40. |     diesen Rahmen ein einziges mal zu Programmieren, da bei aufruf der
  41. |     .select und .release Grafiken von Requestern und Menüs Position und
  42. |     Größe des Gadgets mit übergeben wird.
  43. |
  44. |   - Wird für eine Grafik mehrfach das selbe Element benötigt, z.B. in
  45. |     Farbauswahlrequester, können diese mit einer Programmschleife
  46. |     ausgeführt werden.
  47. |
  48. |   - Häufig benötigte Grafikelemente können in einem Modul gesammelt,
  49. |     und immer wieder benutzt werden.
  50. |
  51. |   - Da innerhalb eines Gfx-Programmes auch auf die Standard-Farben eines
  52. |     Fensters (Screens) zugegriffen werden kann, können die selben Requester
  53. |     ohne Änderung bei verschiedenen Farbtiefen und Paletten benutzt werden.
  54. |
  55. |
  56. |
  57. FROM EGSGfx  IMPORT RastPortPtr;
  58. |
  59. | WinColors...
  60. |
  61. | Um Requestern etc. slebst bei verschiedenen Farbtiefen eine möglichst ideale
  62. | Farbgebung zu verpassen, wird für jeden Screen (oder auch Window) eine
  63. | Struktur definiert, in der die üblichen Farben mit ihren Werten definiert
  64. | sind. Auf diese Farben kann innerhalb der  Gfx-Programme zugegriffen werden.
  65. | Diese Farben werden ausserdem innerhalb von Gadgets (String-Gadgets)
  66. | verwendet.
  67. |
  68. | .light     : Eine helle Farbe, für 3D-Strukturen
  69. | .normal    : Die Farbe eines nicht ausgewählten Fensterrahmens
  70. | .dark      : Eine dunkle Farbe für Schatteneffekte
  71. | .select    : Die Farbe eines ausgewählten Fensterrahmens
  72. | .back      : Die Hintergrundfarbe eines Fensters
  73. | .txtFront  : Farbe, in der Text ausgegeben werden soll
  74. | .txtBack   : Hintergrundfarbe für Textausgaben
  75. |
  76. TYPE
  77.   WinColors     = RECORD
  78.                     light,
  79.                     normal,
  80.                     dark,
  81.                     select,
  82.                     back,
  83.                     txtFront,
  84.                     txtBack   : LONGINT;
  85.                   END;
  86.  
  87. CONST
  88. |
  89. | Ein IntuiGfx-Programm besteht aus einer Folge von Langwörtern, die Konstanten,
  90. | Adressen oder Befehle enthalten können. Befehle und Konstanten unterscheiden
  91. | sich von Adressen dadurch, daß ihr höchstes Bit-gesetzt ist (Commo-verwendet
  92. | ebenfalls dieses oberste Bit, so daß keine Kompatibilitätsprobleme auftreten
  93. | solten). Das Ende eines Programms ist durch einen Speziellen Befehl 'RTS'
  94. | gegeben.
  95. |
  96. | Die Sprache ist Stack-orientiert, d.h. Befehle und Prozeduren beziehen sich
  97. | immer auf Parameter, die vorher auf den Stack aufgebracht wurden. Neben dem
  98. | Stackpointer (SP) ist noch ein Framepointer (FP) implementiert, über den sich
  99. | Parameter und lokale Variablen adressieren lassen. Durch den Befehl 'FRAME'
  100. | lässt sich dieser Variablenbereich vergrößern.
  101. |
  102. | Viele Befehle, die Konstante Daten benötigen, bekommen die Konstante auf ihren
  103. | Token-Wert aufaddiert.
  104. |
  105. | Der Stack arbeitet mit  Predecrement (PUSH) und Postincrement (POP), so
  106. | daß ältere Elemente mit positivem Displacement adressiert werden.
  107. |
  108. | Alle Befehle, die einen Wert zurückliefern tun dies auf dem Stack, ebenso
  109. | erwarten alle Befehle und Prozeduren ihre Parameter auf dem Stack, und
  110. | deallozieren sie selbsständig.
  111. |
  112. | Alle Graphikkoordinaten in einem IntuiGfx-Programm beziehen sich auf den Punkt
  113. | als Ursprung, auf dem beim Aufruf der Cursor stand. Dem Interpreter können
  114. | Parameter mitgegeben werden, die dann für die Programme wie normale Parameter
  115. | auf dem Stack liegen. Dies geschieht auch durch Intuition, z.B. die .activate
  116. | und .release Aufrufe bei Gadgets und Menüs.
  117. |
  118. |###############################################################################
  119. |
  120. | Befehlsübersicht:
  121. |
  122. |
  123. | (1). Stack- und framespezifische Anweissungen
  124. |
  125. |
  126. |  POP   : Entfernt das oberste Element vom Stack
  127. |          INC(SP)
  128. |
  129. |  POPN  : Entfernt soviele Elemente vom Stack wie SP[0] anzeigt
  130. |          INC(SP,SP[0]+1)
  131. |
  132. |  DUP   : Verdoppelt das oberste Element auf dem Stack
  133. |          SP-^:=SP[0]
  134. |
  135. |  DUPN  : Verdoppelt soviele Elemente wie in SP[0] angegeben
  136. |          x:=SP+^;SP-^:=SP[0..x]
  137. |
  138. |  DUPI  : Verdoppelt soviele Elemente, wie in DUPI angegeben
  139. |          x:='DUPI';SP-^:=SP[0..x]
  140. |
  141. |  SWAP  : Tauscht die beiden obersten Elemente auf dem Stack
  142. |          PS[1] <-> SP[0];
  143. |
  144. |  ROT3  : Rotiert die obersten drei Elemente
  145. |          SP[2] -> SP[0] -> SP[1] -> SP[2]
  146. |
  147. |  ROTN  : Roitert soviele Elemente wie in SP[0] angegeben
  148. |          x:=SP+^;SP[x] -> SP[0] -> SP[1] -...-> SP[x]
  149. |
  150. |  VAL   : Liest ein Wort aus dem Speicher an der Adresse von SP^
  151. |          SP[0]:=IntPtr(SP[0])^
  152. |
  153. |  ADR   : Liest ein Langwort aus dem Speicher, an der Adresse von SP^
  154. |          SP[0]:=LongPtr(SP[0])^
  155. |
  156. |  GET1  : Liefert das zweitoberste Element des Stacks
  157. |          SP-^:=SP[1]
  158. |
  159. |  GET2  : Liefert das drittoberste Element des Stacks
  160. |          SP-^:=SP[2]
  161. |
  162. |  GETN  : Liefert das SP[0]'te Element des Stacks
  163. |          SP[0]:=SP[SP[0]+1]
  164. |
  165. |  GETSI : Liefert das in GETSI angegebene Element des Stacks
  166. |          SP-^:=SP['GETSI']
  167. |
  168. |  GETF  : Liefert das SP[0]'te Element des Frames
  169. |          SP[0]:=FP[SP[0]]
  170. |
  171. |  GETFI : Liefert das in GETFI angegebene Element des Frames
  172. |          SP-^:=FP['GETFI']
  173. |
  174. |  PUTF  : Schreibt den SP[1] in das durch SP[0] gegebene Element des Frames
  175. |          FP[SP[0]]:=SP[1];INC(SP,2)
  176. |
  177. |  PUTFI : Schreibt den SP[0] in das durch PUTFI gegebene Element des Frames
  178. |          FP['PUTFI']:=SP[0];INC(SP)
  179. |
  180. |  Const : Schreibt die Konstante in Const auf den Stack
  181. |          SP-^:='Const'
  182. |
  183. |  Const24:Schreibt die Konstante in Const24 um acht Bits nach links verschoben
  184. |          auf den Stack (für 24Bit Farben.
  185. |          SP-^:='Const24' SHL 8
  186. |
  187. |
  188. | (2). Arithmetische und logische Anweissungen
  189. |
  190. |
  191. |  ADD   : Addiert die beiden obersten Stackelemente
  192. |          SP[1]:=SP[1]+SP[0];INC(SP)
  193. |
  194. |  ADDI  : Addiert die in ADDI gegebene Konstante zum SP[0]
  195. |          SP[0]:=SP[0]+'ADDI'
  196. |
  197. |  SUB   : Zieht das oberste Stackelement vom zweitobersten ab
  198. |          SP[1]:=SP[1]-SP[0];INC(SP)
  199. |
  200. |  NEG   : Negiert das oberste Stackelement
  201. |          SP[0]:=-SP[0]
  202. |
  203. |  MUL   : Multipliziert das zweitoberste Stackelement zum obersten
  204. |          SP[1]:=SP[1]*SP[0];INC(SP)
  205. |
  206. |  SEQ   : Testet, ob SP[1] gleich SP[0] ist, liefert -1 falls wahr, sonst 0
  207. |          IF SP[1]=SP[0] THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  208. |
  209. |  SNE   : Testet, ob SP[1] ungleich SP[0] ist, liefert -1 falls wahr, sonst 0
  210. |          IF SP[1]#SP[0] THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  211. |
  212. |  SGT   : Testet, ob SP[1] größer als SP[0] ist, liefert -1 falls wahr, sonst 0
  213. |          IF SP[1]>SP[0] THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  214. |
  215. |  SLT   : Testet, ob SP[1] kleiner als SP[0] ist
  216. |          IF SP[1]<SP[0] THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  217. |
  218. |  SGE   : Testet, ob SP[1] größer oder gleich SP[0] ist
  219. |          IF SP[1]>=SP[0] THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  220. |
  221. |  SLE   : Testet, ob SP[1] kleiner oder gleich SP[0] ist
  222. |          IF SP[1]<=SP[0] THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  223. |
  224. |  SNOT  : Liefert 0, falls SP[0] ungleich 0 ist, sonst -1
  225. |          IF SP[0]=0 THEN SP[0]:=-1 ELSE SP[0]:=0 END;
  226. |
  227. |  SAND  : Liefert -1, falls SP[0] und SP[1] ungleich 0 sind, 0 sonst
  228. |          IF SP[0]#0 AND SP[1]#0 THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  229. |
  230. |  SOR   : Liefert -1, falls SP[0] oder SP[1] ungleich 0 sind, 0 sonst
  231. |          IF SP[0]#0 OR SP[1]#0 THEN SP[1]:=-1 ELSE SP[1]:=0 END;INC(SP)
  232. |
  233. |
  234. | (3). Programmsteueranweissungen
  235. |
  236. |
  237. |  JMP   : Springt an die Adresse die in SP[0] steht
  238. |          PC:=SP[0];INC(SP)
  239. |
  240. |  RTS   : Rückkehr aus einem Unterprogramm, ohne Framedeallozierung
  241. |          POP(PC)
  242. |
  243. |  RTF   : Rückkehr aus einem Unterprogramm, mit Framedeallozierung
  244. |          SP:=FP+'RTF';POP(PC)
  245. |
  246. |  JSR   : Springt in ein Unterprogramm an der angegebenen Stelle
  247. |          PUSH(PC);PC:=SP[0];INC(SP)
  248. |
  249. |  While S1 Do S2 End : führt die Programmteile S1 und S2 solange aus, wie
  250. |                       nach S1 ein Wert ungleich 0 auf dem Stack liegt.
  251. |                       Dieser Wert wird dealloziert
  252. |
  253. |  If S1 Else S2 End  : führt den Programmteil S1 aus, wenn bei If ein Wert
  254. |                       ungleich null auf dem Stack liegt, sonst S2. Der Wert
  255. |                       auf dem Stack wird dealloziert.
  256. |
  257. |  Repeat S1 Until    : führt den Programmteil S1 solange aus, bis danach ein
  258. |                       Wert ungleich null auf dem Stack liegt. Dieser Wert
  259. |                       wird dealloziert.
  260. |
  261. |
  262. | (4). Zeichenbefehle
  263. |
  264. |
  265. |  Color : Setzt die aktuelle Zeichenfarbe mit dem Wert in SP[0]
  266. |          SetAPen(r,SP[0]);INC(SP)
  267. |
  268. |  Back  : Setzt die Hintergrundfarbe mit dem Wert in SP[0]#
  269. |          SetBPen(r,SP[0]);INC(SP)
  270. |
  271. |  ModeA : Setzt Zeichenmodus 'drawAPen'
  272. |          SetDrMd(r,drawAPen)
  273. |
  274. |  ModeAB: Setzt Zeichenmodus 'drawABPen'
  275. |          SetDrMd(r,drawABPen)
  276. |
  277. |  Image : Kopiert den Inhalt einer durch SP[0] gegebenen BitMap an die
  278. |          aktuelle Zeichenposition
  279. |          map:=BitMapPtr(SP[0]);INC(SP);
  280. |          CopyBitMapRastPort(map,r,0,0,map.^width,map.^height,r^.cx,r^.cy);
  281. |
  282. |  Packed: Packt ein Image aus der BitPlane Form aus, und kopiert es an
  283. |          die aktuelle Cursorposition.
  284. |          image:=ImagePtr(SP[0]);col:=ColorTablePtr(SP[1]);INC(SP,2);
  285. |          IF UnpackImage(map,image^,r^.depth,col^) THEN
  286. |            CopyBitMapRastPort(map'PTR,r,0,0,map.width,map.height...
  287. |            DisposeBitMap(map)
  288. |          END
  289. |
  290. |  Move  : Verschiebt den Graphikcursor um die Strecke in (SP[1],SP[0])
  291. |          INC(r^.cx,SP[1]);INC(r^.cy,SP[0]);INC(SP,2)
  292. |
  293. |  Locate: Setzt den Graphikcursor an die Position (SP[1],SP[0])
  294. |          Move(r,SP[1],SP[0]);INC(SP,2)
  295. |
  296. |  Locate00: Setzt den Graphikcursor an die Startposition zurück
  297. |            Move(r,0,0)
  298. |
  299. |  Draw  : Zeichnet vom Graphikcursor aus die Strecke (SP[1],SP[0])
  300. |          Draw(r,r^.cx+SP[1],r^.cy+SP[0]);INC(SP,2);
  301. |
  302. |  DrawAbs:Zeichnet vom Graphikcursor aus die Strecke zum Punkt (SP[1],SP[0])
  303. |          Draw(r,SP[1],SP[0]);INC(SP,2)
  304. |
  305. |  Box   : Zeichnet ein ausgefülltes Rechteck mit den Kanten SP[1], SP[0]
  306. |          RectangleFill(r,r^.cx,r^.cy,SP[1],SP[0]);INC(SP,2)
  307. |
  308. |  Write : Gibt einen Text an der aktuellen Cursorposition aus. In SP[0]
  309. |          befindet sich ein Zeiger auf einen String, wobei das erste
  310. |          Wort die Länge, alle weiteren Bytes die Zeichen enthalten
  311. |          Text(r,SP[0]^.data'PTR,SP[0]^.len);INC(SP)
  312. |
  313. |  Text  : Gibt einen Text an der aktuellen Cursorposition aus. In SP[0]
  314. |          befindet sich ein Zeiger auf das erste Zeichen. Die Zeichenkette
  315. |          wird durch ein Null-Byte abgeschlossen.
  316. |          Text(r,SP[0],Length(SP[0]^));
  317. |
  318. |  Font  : Setzt den Font, der durch SP[0] gegeben ist. SP[0] muß einen
  319. |          Zeiger auf eine geöffnetet EFont enthalten.
  320. |          r^.font:=EFontPtr(SP[0]);INC(SP)
  321. |
  322. |
  323. | (5). Graphikfunktionen
  324. |
  325. |
  326. |  GetPosX: Liefert die aktuelle X-Koordinate des Graphikcursors
  327. |           INC(SP);SP[0]:=r^.cx
  328. |
  329. |  GetPosY: Liefert die aktuelle Y-Koordinate des Graphikcursors
  330. |           INC(SP);SP[0]:=r^.cy;
  331. |
  332. |  GetColor: Liefert die aktuelle Zeichenfarbe
  333. |            INC(SP);SP[0]:=r^.aPen
  334. |
  335. |  GetBack : Liefert die aktuelle Hintergrundfarbe
  336. |            INC(SP);SP[0]:=r^.bPen
  337. |
  338. |  CLight    : Liefert die helle Farbe des Fensters
  339. |  CNormal   : Liefert die normale Rahmenfarbe des Fensters
  340. |  CDark     : Liefert die dunkle Farbe des Fensters
  341. |  CSelect   : Liefert die Auswahlfarbe des Fensters
  342. |  CBack     : Liefert die Hintergrundfarbe des Fenster
  343. |  CTxtFront : Liefert die Empfohlene Textvordergrundfarbe des Fensters
  344. |  CTxtBack  : Liefert die Empfohlene Texthintergrundfarbe des Fensters
  345. |
  346. |
  347. |
  348. |
  349.   |
  350.   | Programmsteueranweissungen
  351.   |
  352.   JMP         = $80000001;  | adr JMP     : Sprung nach adr
  353.   RTS         = $80000002;  | RTS         : Ende der Liste
  354.   JSR         = $80000003;  | adr JSR     : Unterprogramm bei adr
  355.   CALL        = $80000004;  | adr CALL    : Proceduraufruf
  356.   |
  357.   | Stacksteueranweissungen
  358.   |
  359.   POP         = $80000011;  | POP         : oberstes Element vom Stapel
  360.                             |               nehmen
  361.   DUP         = $80000012;  | DUP         : oberstes Element Duplizieren
  362.   SWAP        = $80000013;  | SWAP        : oberste Elemente tauschen
  363.   ROT3        = $80000014;  | ROT3        : oberste drei Elemente rotieren
  364.                             |               [2]->[0]->[1]->[2]
  365.   ROTN        = $80000015;  | val ROTN    : beliebig viele Element rotieren
  366.                             |               [val]->[0]->[1]..->[val]
  367.   VAL         = $80000016;  | adr VAL     : Inhalt der Adresse adr holen,
  368.                             |               und als INTEGER handhaben
  369.   ADR         = $80000017;  | adr ADR     : Inhalt der Adresse adr holen,
  370.                             |               und als Zeiger handhaben
  371.   GET1        = $80000018;  | GET1        : zweitoberstes Element holen
  372.   GET2        = $80000019;  | GET2        : drittoberstes Element holen
  373.   GETN        = $8000001A;  | val GETN    : beliebiges Element holen
  374.   POPN        = $8000001B;  | val POPN    : beliebig viele Elemente vom
  375.                             |               Stapel werfen
  376.   DUPN        = $8000001C;  | val DUPN    : kopiert beliegig viele Elemente
  377.                             |               des Stapels
  378.   GETF        = $8000001D;  | val GETF    : nimmt ein Element aus dem Frame
  379.   PUTF        = $8000001E;  | val PUTF    : schreibt ein Element auf den Frame
  380.  
  381.   STKADR      = $8000001F;  | STKADR      : Adresse des Stackpointers oben auf
  382.                             |               den Stack legen.
  383.   BYTE        = $80000111;  | adr BYTE    : Inhalt der Adresse adr holen
  384.                             |               und als Byte interpretieren
  385.   POKEB       = $80000113;  | val adr POKEB : Schreibt das LSB von val an die
  386.                             |                 Adresse adr
  387.   POKEW       = $80000114;  | val adr POKEB : Schreibt das LSW von val an die
  388.                             |                 Adresse adr
  389.   POKE        = $80000115;  | val adr POKEB : Schreibt val an die Adresse adr
  390.  
  391.   |
  392.   | Arithmetische Operationen
  393.   |
  394.   ADD         = $80000021;  | val val ADD : Summe der obersten beinen
  395.                             |               Elemente
  396.   NEG         = $80000022;  | val NEG     : Oberstes Element negieren
  397.   SUB         = $80000023;  | val val SUB : Oberstes Element vom
  398.                             |               zweitobersten abziehen
  399.   MUL         = $80000024;  | val val MUL : Produkt der beiden obersten
  400.                             |               Elemente bilden
  401.   SEQ         = $80000025;  | val1 val2 SEQ  : -1, falls val1=val2, sonst 0
  402.   SNE         = $80000026;  | val1 val2 SNE  : -1, falls val1#val2, sonst 0
  403.   SGT         = $80000027;  | val1 val2 SGT  : -1, falls val1>val2, sonst 0
  404.   SLT         = $80000028;  | val1 val2 SLT  : -1, falls val1<val2, sonst 0
  405.   SGE         = $80000029;  | val1 val2 SGE  : -1, falls val1>=val2, sonst 0
  406.   SLE         = $8000002A;  | val1 val2 SLE  : -1, falls val1<=val2, sonst 0
  407.   SNOT        = $8000002B;  | val SNOT       : -1, falls val=0, sonst 0
  408.   SAND        = $8000002C;  | val1 val2 SAND : -1, falls val1#0 & val2#0
  409.   SOR         = $8000002D;  | val1 val2 SOR  : -1, falls val1#0 | val2#0
  410.  
  411.   IDIV        = $8000002E;  | val val IDIV : Integerdivision
  412.   IMOD        = $8000002F;  | val val IMOD : Integermodulo
  413.   |
  414.   | Zeichenfunktionen
  415.   |
  416.   GetPosX     = $80000031;  | GetPosX     : X-Koordinate des Zeichen-
  417.                             |               Cursors holen
  418.   GetPosY     = $80000032;  | GetPosY     : Y-Koordinate des Zeichen-
  419.                             |               Cursors holen
  420.   GetColor    = $80000033;  | GetColor    : aktuelle Zeichenfarbe holen
  421.   GetBack     = $80000034;  | GetBack     : aktuelle Hintergrundfarbe holen
  422.   |
  423.   | Zeichenbefehle
  424.   |
  425.   Color       = $80000041;  | val Color   : aktuelle Zeichenfarbe setzen
  426.   Back        = $80000042;  | val Color   : aktuelle Hintergrundfarbe setzen
  427.   ModeA       = $80000043;  | ModeA       : Mode A setzen
  428.   ModeAB      = $80000044;  | ModeAB      : Mose AB setzen
  429.   Image       = $80000045;  | adr Image   : Image an angegebener Adresse
  430.                             |               Zeichnen
  431.   Move        = $80000046;  | dx dy Move  : Zeichen-Cursor relativ bewegen
  432.   Draw        = $80000047;  | dx dy Draw  : Linie ziehen, bis Cursor
  433.   Write       = $80000048;  | adr Write   : Text ausgeben
  434.   Text        = $8000004F;  | adr Text    : Text ausgeben
  435.   Box         = $80000049;  | b h Box     : Ausgefülltes Rechteck ausgeben
  436.   Locate      = $8000004A;  | x y Locate  : Zeichen-Cursor absolut bewegen
  437.   Locate00    = $8000004B;  | Locate00    : Zeichen-Cursor nach 00 bewegen
  438.   Packed      = $8000004C;  | col imm Packed : gepacktes Image ausgeben
  439.   Font        = $8000004D;  | font Font   : Textfont setzen
  440.   DrawAbs     = $8000004E;  | x y Draw    : Linie ziehen, bis Cursor
  441.   ModeInvers  = $80000112;  | ModeInvers  : Mode Invers setzen
  442.  
  443.   Box3d       = $80000401;  | br ul w h Box3d : 3d Box zeichnen, ersetzt routine
  444.   Rect3d      = $80000402;  | in br ul w h Rect3d : gefüllte 3d Box zeichnen
  445.   Box2d       = $80000403;  | w h Box2d
  446.   Box3df      = $80000404;
  447.   Rect3df     = $80000405;
  448.  
  449.   CLight      = $80000050;  | CLight      : Helle Fensterfarbe
  450.   CNormal     = $80000051;  | CNormal     : Normale Farbe
  451.   CDark       = $80000052;  | CDark       : Dunkle Fensterfarbe
  452.   CSelect     = $80000053;  | CSelect     : Auswahlfarbe
  453.   CBack       = $80000054;  | CBack       : Hintergrundfarbe
  454.   CTxtFront   = $80000055;  | CTxtFront   : Text-Vordergrundfarbe
  455.   CTxtBack    = $80000056;  | CTxtBack    : Text-Hintergrundfarbe
  456.   |
  457.   | Skalierungs befehle
  458.   |
  459.   SetScale    = $80000300;  | w h SetScale: Setzt skalierung
  460.   SetRatio    = $80000301;  | w h SetRatio
  461.   |
  462.   SMove       = $80000311;  | dx dy SMove
  463.   SLocate     = $80000312;  | x y SLocate
  464.   SDraw       = $80000313;  | dx dy SDraw
  465.   SDrawAbs    = $80000314;  | x y SDrawAbs
  466.   SCurve      = $80000315;  | vx1 vy1 vx2 vy2 dx dy SCurve
  467.   SCurveAbs   = $80000316;  | vx1 vy1 vx2 vy2 x y SCurveAbs
  468.   SEllipse    = $80000317;  | a b SEllipse
  469.  
  470.   SAMove      = $80000321;  | dx dy SAMove
  471.   SALocate    = $80000322;  | x y SALocate
  472.   SADraw      = $80000323;  | dx dy SADraw
  473.   SADrawAbs   = $80000324;  | x y SADrawAbs
  474.   SACurve     = $80000325;  | vx1 vy1 vx2 vy2 dx dy SACurve
  475.   SACurveAbs  = $80000326;  | vx1 vy1 vx2 vy2 x y SACurveAbs
  476.   SAEllipse   = $80000327;  | a b SAEllipse
  477.  
  478.   SAEnd       = $8000033F;  | SAEnd
  479.   |
  480.   |
  481.   While       = $80000101;  | While val Do ... End
  482.   Do          = $80000102;  |             : Der Teil von While bis End
  483.                             |               wird solange ausgeführt, bis
  484.                             |               die Bedingung in val =0 wird
  485.   If          = $80000103;  | val If ... Else ... End
  486.   Else        = $80000104;  |             : Der Teil zwischen If und Else
  487.   End         = $80000105;  |               wird durchgeführt, falls val#0.
  488.                             |               sonst der Teil von Else bis End.
  489.   Repeat      = $80000106;  | Repeat ... val Until
  490.   Until       = $80000107;  |             : Der Teil zwischen Repeat und Until
  491.                             |               wird ausgeführt, und solange
  492.                             |               wiederholt, bis val#0 ist.
  493.   |
  494.   |
  495.   |
  496.   Debug       = $80000200;
  497.  
  498.   Const       = $81008000;  | +val Konstante
  499.   Const24     = $89000000;  | +val Konstante SHR 8 !!!
  500.  
  501.   GETFI       = $82000000;  | +i   aus fester Frameposition holen
  502.   PUTFI       = $83000000;  | +i   an feste Frameposition schreiben
  503.   GETSI       = $84000000;  | +i   von fester Stackposition holen
  504.  
  505.   FRAME       = $85000000;  | +n   Frame erzeugen
  506.   RTF         = $86000000;  | +n   Frame zerstören und Rücksprung
  507.  
  508.   ADDI        = $87008000;  | +val Direkte Summe
  509.   DUPI        = $88000000;  | +n   feste Anzahl von Elementen verdoppeln
  510.   POPI        = $8A000000;  | +n   feste Anzahl von Elementen entfernen
  511.  
  512. GROUP Commands = JMP,RTS,JSR,CALL,
  513.                  POP,DUP,SWAP,ROT3,ROTN,VAL,ADR,GET1,GET2,GETN,
  514.                  POPN,DUPN,GETF,PUTF,ADD,NEG,SUB,MUL,POPI,
  515.                  SEQ,SNE,SGT,SLT,SGE,SLE,SNOT,SAND,SOR,
  516.                  GetPosX,GetPosY,GetColor,GetBack,Color,
  517.                  Back,ModeA,ModeAB,Image,
  518.                  Move,Draw,Write,Box,Locate,Locate00,Packed,Text,
  519.                  While,Do,If,Else,End,Repeat,Until,
  520.                  Const,GETFI,PUTFI,GETSI,FRAME,RTF,ADDI,DUPI;
  521.  
  522. TYPE
  523.   IntuiGfxPtr   = POINTER TO LONGINT;
  524.   IntuiGfx      = ARRAY OF LONGINT;
  525.  
  526.   PROC          = PROCEDURE(rast : RastPortPtr;tof : IntuiGfxPtr;x,y : INTEGER);
  527.  
  528. CONST
  529.   |
  530.   | Beispiele:
  531.   |
  532.   |   - Box3d       : Zeichnen eines Rechtecks in zwei Farben. Um einen
  533.   |                   3D-Effekt zu erzielen werden die obere und die
  534.   |                   linke Linie in anderen Farben dargestellt wie die
  535.   |                   untere und die rechte.
  536.   |                   Übergabeparameter sind also zwei Farben,
  537.   |                   'bottomRight' und 'topLeft' sowie die Breite 'width'
  538.   |                   und die Höhe 'height'.
  539.   |
  540.   |                   Parameter:
  541.   |
  542.   |                      - bottomRight (FP+3) : Farbe für links und oben
  543.   |                      - topLeft     (FP+2) : Farbe für rechts und unten
  544.   |                      - width       (FP+1) : Breite
  545.   |                      - height      (FP+0) : Höhe
  546.   |
  547.   |
  548.   (*
  549.   Box3d       = IntuiGfx:(ADDI-1,                  | Höhe um eins vermindern
  550.                           SWAP,                    | Breite und Höhe tauschen
  551.                           ADDI-1,                  | breite um eins vermindern
  552.                           SWAP,                    | wieder Rücktauschen
  553.                           GETFI+2,Color,           | Farbe für oben und links
  554.                                                    | holen und setzten
  555.                           GETFI+1,Const+0,Draw,    | Eine Linie um Breite nach
  556.                                                    | rechts zeichnen
  557.                           GETFI+3,Color,           | Farbe für unten und rechts
  558.                                                    | holen und setzten
  559.                           Const+0,GETFI+0,Draw,    | Linie um Höhe nach unten
  560.                                                    | zeichnen
  561.                           GETFI+1,NEG,Const+0,Draw,| Linie um Breite nach rechts
  562.                                                    | ziehen. Dazu wird die
  563.                                                    | Breite negiert.
  564.                           GETFI+2,Color,           | Farbe für oben und links
  565.                                                    | wieder setzen
  566.                           Const+0,GETFI+0,NEG,Draw,| Linie um Höhe nach oben
  567.                                                    | ziehen.
  568.                           RTF+4);                  | Stack bereinigen und
  569.                                                    | Rücksprung zum Aufrufer.
  570.   |
  571.   |
  572.   |   - Border3d    : Zeichnen eines doppelt umrandeten 3D-Rechtecks, mit
  573.   |                   der Prozedur 'Box3d'. Da nicht sicher ist, ob das
  574.   |                   Rechteck herausschauen, oder hineingedrückt sein soll,
  575.   |                   müssen wiederum zwei Farben angegeben werden.
  576.   |                   Die Routine 'Box3d' wird zweimal aufgerufen, einmal
  577.   |                   mit den Parameter von Border3d, und mit vertauschten
  578.   |                   Farben sowie einem versetzten und verkleinerten
  579.   |                   Rechteck.
  580.   |
  581.   |                   Parameter:
  582.   |
  583.   |                      - dark        (FP+3) : Erste Farbe
  584.   |                      - light       (FP+2) : Zweite Farbe
  585.   |                      - width       (FP+1) : Breite
  586.   |                      - height      (FP+0) : Höhe
  587.   |
  588.   |
  589.   *)
  590.   Border3d    = IntuiGfx:(GETFI+2,GETFI+3,         | Farben umgekehrt auf den
  591.                                                    | Stack ablegen.
  592.                           GETFI+1,ADDI-2,          | Breite holen und um zwei
  593.                                                    | vermindern, damit das
  594.                                                    | innere Rechteck direkt
  595.                                                    | im äusseren liegt
  596.                           GETFI+0,ADDI-2,          | Höhe holen un um zwei
  597.                                                    | vermindern
  598.                           Const+1,Const+1,Move,    | Cursor einen Punkt nach
  599.                                                    | unten und links bewegen.
  600.                           Box3d,                   | 'Box3d' mit diesen
  601.                                                    | modifizierten Parametern
  602.                                                    | aufrufen.
  603.                           Locate00,                | Cursor wieder oben links
  604.                                                    | in die Ecke setzten
  605.                           Box3d,                   | 'Box3d' mit den originalen
  606.                                                    | Parametern aufrufen, für
  607.                                                    | äussere Rechteck
  608.                           RTS);                    | Prozedur verlassen, keine
  609.                                                    | Parameter Deallozierung,
  610.                                                    | da dies bereits durch
  611.                                                    | 'Box3d' geschehen ist.
  612.                                                    | (dirty trick :-) )
  613.   |
  614.   |
  615.   |   - Rect3d      : Ausgefülltes 3D-Rechteck zeichnen. Diese Routine benutzt
  616.   |                   ebenfalls 'Box3d', um den Rahmen um das Rechteck zu
  617.   |                   zeichnen. Diesmal ist noch eine dritte Farbe nötig, da
  618.   |                   auch das innere des Rechtecks eingefärbt wird.
  619.   |
  620.   |                   Parameter:
  621.   |
  622.   |                      - inner       (FP+4) : Farbe des inneren
  623.   |                      - bottomRight (FP+3) : Farbe unten und rechts
  624.   |                      - leftTop     (FP+2) : Farbe für oben und links
  625.   |                      - width       (FP+1) : Breite
  626.   |                      - height      (FP+0) : Höhe
  627.   |
  628.   |
  629. (*
  630.   Rect3d      = IntuiGfx:(GETFI+4,Color,           | Innenfarbe setzten
  631.                           Const+1,Const+1,Move,    | einen Punkt nach unten
  632.                                                    | und rechts gehen
  633.                           GETFI+1,ADDI-2,          | Breite holen, und für
  634.                                                    | inneres Rechteck um zwei
  635.                                                    | vermindern
  636.                           GETFI+0,ADDI-2,          | Höhe holen und um zwei
  637.                                                    | vermindern
  638.                           Box,                     | Ausgefülltes mittleres
  639.                                                    | Rechteck zeichnen
  640.                           Locate00,                | Wieder zurück zum
  641.                                                    | Ursprung
  642.                           DUPI+4,                  | Daten für 'Box3d' holen.
  643.                                                    | Da diese die selbe
  644.                                                    | Reihenfolge haben, könnte
  645.                                                    | man auch die Parameter auf
  646.                                                    | dem Stack benutzen, dies
  647.                                                    | ist die sauber Lösung.
  648.                           Box3d'ADR,JSR,           | 'Box3d' aufrufen
  649.                           RTF+5);                  | Rücksprung und Stack
  650.                                                    | breinigen
  651. *)
  652.   |
  653.   |
  654.   |   - BigBorder3d : Breiten ausgefüllten 3D-Rahmen Zeichnen. Die Parameter
  655.   |                   sind die seleben wie bei 'Rect3d'
  656.   |
  657.   |                   Parameter:
  658.   |
  659.   |                      - inner       (FP+4) : Farbe des Rahmeninneren
  660.   |                      - bottomRight (FP+3) : Farbe unten und rechts
  661.   |                      - leftTop     (FP+2) : Farbe für oben und links
  662.   |                      - width       (FP+1) : Breite
  663.   |                      - height      (FP+0) : Höhe
  664.   |
  665.   |
  666.   BigBorder3d = IntuiGfx:(DUPI+4,Box3d,            | Äusseren Rahmen zeichnen
  667.  
  668.                           GETFI+2,GETFI+3,         | Inneren Rahmen zeichnen
  669.                           GETFI+1,ADDI-30,         |
  670.                           GETFI+0,ADDI-30,         |
  671.                           Const+15,Const+15,Move,  |
  672.                           Box3d,                   |
  673.  
  674.                           GETFI+4,Color,           | Farbe für innen setzen
  675.  
  676.                           Const+1,Const+1,Locate,  | Balken oben zeichnen
  677.                           GETFI+1,ADDI-16,         |
  678.                           Const+14,Box,            |
  679.  
  680.                           Const+0,Const-14,Move,   | Balken rechts zeichnen
  681.                           Const+14,                |
  682.                           GETFI+0,ADDI-16,Box,     |
  683.  
  684.                           Const+1,Const+15,Locate, | Balken links zeichnen
  685.                           Const+14,                |
  686.                           GETFI+0,ADDI-16,Box,     |
  687.  
  688.                           Const+0,Const-14,Move,   | Balken unten zeichnen
  689.                           GETFI+1,ADDI-16,         |
  690.                           Const+14,Box,            |
  691.  
  692.                           Locate00,                | aufräumen
  693.                           RTF+5);                  |
  694.   |
  695.   |  - Write3d      : Text mit Schlagschatten ausgeben. Dazu wird der Text
  696.   |                   zuerst leicht versetzt in einem dunkleren Farbton
  697.   |                   gezeichnet, danach in einem helleren an der gewünschten
  698.   |                   Stelle.
  699.   |
  700.   |                   Parameter:
  701.   |
  702.   |                      - light       (FP+2) : Helle Farbe
  703.   |                      - shade       (FP+1) : Schattenfarbe
  704.   |                      - text        (FP+0) : Auszugebender Text
  705.   |
  706.   |
  707.   Write3d     = IntuiGfx:(ModeA,                   | Auf Zeichenmodus
  708.                                                    | 'drawAPen' umschalten
  709.                           GETFI+1,Color,           | dunkle Farbe setzen
  710.                           Const+1,Const+1,Move,    | leichter Versatz für
  711.                                                    | Schlagschatten
  712.                           GETFI+0,Write,           | dunklen Text ausgeben
  713.                           Locate00,                | Zurück an gewünschte
  714.                                                    | Koordinaten
  715.                           GETFI+2,Color,           | helle Farbe setzen
  716.                           GETFI+0,Write,           | Text ausgeben
  717.                           RTF+3);                  | aufräumen.
  718.  
  719. PROCEDURE Interpret(    rast     : RastPortPtr;
  720.                     VAR colors   : WinColors;
  721.                     VAR toff     : IntuiGfxPtr;
  722.                         prog     : IntuiGfxPtr;
  723.                         x,y      : INTEGER);
  724.  
  725. PROCEDURE InterpretStacked(    rast   : RastPortPtr;
  726.                            VAR colors : WinColors;
  727.                                prog   : IntuiGfxPtr;
  728.                                x,y    : INTEGER);
  729.  
  730. PROCEDURE Interpret1Param(    rast   : RastPortPtr;
  731.                           VAR colors : WinColors;
  732.                               prog   : IntuiGfxPtr;
  733.                               x,y    : INTEGER;
  734.                               para1  : LONGINT);
  735.  
  736. PROCEDURE Interpret2Param(    rast   : RastPortPtr;
  737.                           VAR colors : WinColors;
  738.                               prog   : IntuiGfxPtr;
  739.                               x,y    : INTEGER;
  740.                               para1,
  741.                               para2  : LONGINT);
  742.  
  743. END IntuiGfx.
  744.  
  745.