imagegadget.pas 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. PROGRAM ImageGadget;
  2. {
  3. An example on how to use GadTools gadgets,
  4. on the same time how to use images.
  5. 20 Sep 1998.
  6. Changed the code to use TAGS, now also use
  7. pas2c for strings-pchar.
  8. 1 Nov 1998.
  9. Removed opening of gadtools.library.
  10. Will be opened by unit gadtools.
  11. 16 Jul 2000.
  12. Update to use systemvartags. Not a
  13. very nice demo, needs to rewrite to
  14. handle more bitplanes.
  15. 28 Nov 2002.
  16. [email protected]
  17. }
  18. USES Intuition, Exec, AGraphics, GadTools, Utility;
  19. CONST
  20. MSG_NO_PS : PChar = 'Can''t lock Public Screen';
  21. MSG_NO_VI : PChar = 'Can''t get Visual Info';
  22. MSG_NO_MEM : PChar = 'Not enough memory free';
  23. MSG_NO_WP : PChar = 'Can''t open window';
  24. WIN_TITLE : PChar = 'Images-Example';
  25. OK_TEXT : PChar = 'OK';
  26. type
  27. data = array[1..176] of word;
  28. pdata = ^data;
  29. const
  30. renderd : data = (
  31. {* Plane 0 *}
  32. $0000,$0000,
  33. $0000,$0010,
  34. $0000,$0010,
  35. $0000,$0010,
  36. $01C0,$0010,
  37. $03E0,$0010,
  38. $07F0,$0010,
  39. $0000,$0010,
  40. $0000,$0810,
  41. $039A,$C810,
  42. $0000,$0810,
  43. $031E,$0810,
  44. $0000,$4810,
  45. $03E6,$0810,
  46. $0000,$0810,
  47. $0000,$0810,
  48. $07FF,$F810,
  49. $0000,$0010,
  50. $0000,$0010,
  51. $0000,$0010,
  52. $0000,$0010,
  53. $7FFF,$FFF0,
  54. {* Plane 1 *}
  55. $FFFF,$FFE0,
  56. $8000,$0000,
  57. $8000,$0000,
  58. $8000,$0000,
  59. $81C0,$0000,
  60. $83E0,$0000,
  61. $87F0,$0000,
  62. $8000,$0000,
  63. $87FF,$E000,
  64. $8465,$2000,
  65. $87FF,$E000,
  66. $84E1,$E000,
  67. $87FF,$A000,
  68. $8419,$E000,
  69. $87FF,$E000,
  70. $8400,$0000,
  71. $8000,$0000,
  72. $8000,$0000,
  73. $8000,$0000,
  74. $8000,$0000,
  75. $8000,$0000,
  76. $0000,$0000,
  77. {* Plane 2 *}
  78. $0000,$0000,
  79. $0000,$0020,
  80. $0000,$0020,
  81. $0000,$0020,
  82. $0000,$0020,
  83. $01C0,$0020,
  84. $03E0,$0020,
  85. $0FFF,$F820,
  86. $0800,$1020,
  87. $0800,$1020,
  88. $0800,$1020,
  89. $0800,$1020,
  90. $0800,$1020,
  91. $0800,$1020,
  92. $0800,$1020,
  93. $0BFF,$F020,
  94. $0800,$0020,
  95. $0000,$0020,
  96. $0000,$0020,
  97. $0000,$0020,
  98. $7FFF,$FFE0,
  99. $0000,$0000,
  100. $0000,$0000,
  101. $0000,$0000,
  102. $0000,$0000,
  103. $0000,$0000,
  104. $0000,$0000,
  105. $0000,$0000,
  106. $0000,$0000,
  107. $0000,$0000,
  108. $0000,$0000,
  109. $0000,$0000,
  110. $0000,$0000,
  111. $0000,$0000,
  112. $0000,$0000,
  113. $0000,$0000,
  114. $0000,$0000,
  115. $0000,$0000,
  116. $0000,$0000,
  117. $0000,$0000,
  118. $0000,$0000,
  119. $0000,$0000,
  120. $0000,$0000,
  121. $0000,$0000
  122. );
  123. selectd : data = (
  124. { Plane 0 }
  125. $FFFF,$FFE0,
  126. $8000,$0000,
  127. $8000,$0000,
  128. $8000,$0000,
  129. $8000,$0000,
  130. $80E0,$0000,
  131. $81F0,$0000,
  132. $83F8,$0000,
  133. $8000,$0000,
  134. $8000,$0400,
  135. $81CD,$6400,
  136. $8000,$0400,
  137. $818F,$0400,
  138. $8000,$2400,
  139. $81F3,$0400,
  140. $8000,$0400,
  141. $8000,$0400,
  142. $83FF,$FC00,
  143. $8000,$0000,
  144. $8000,$0000,
  145. $8000,$0000,
  146. $0000,$0000,
  147. { Plane 1 }
  148. $0000,$0000,
  149. $0000,$0010,
  150. $0000,$0010,
  151. $0000,$0010,
  152. $0000,$0010,
  153. $00E0,$0010,
  154. $01F0,$0010,
  155. $03F8,$0010,
  156. $0000,$0010,
  157. $03FF,$F010,
  158. $0232,$9010,
  159. $03FF,$F010,
  160. $0270,$F010,
  161. $03FF,$D010,
  162. $020C,$F010,
  163. $03FF,$F010,
  164. $0200,$0010,
  165. $0000,$0010,
  166. $0000,$0010,
  167. $0000,$0010,
  168. $0000,$0010,
  169. $7FFF,$FFF0,
  170. { Plane 2 }
  171. $0000,$0000,
  172. $0000,$0020,
  173. $0000,$0020,
  174. $0000,$0020,
  175. $0000,$0020,
  176. $0000,$0020,
  177. $00E0,$0020,
  178. $01F0,$0020,
  179. $07FF,$FC20,
  180. $0400,$0820,
  181. $0400,$0820,
  182. $0400,$0820,
  183. $0400,$0820,
  184. $0400,$0820,
  185. $0400,$0820,
  186. $0400,$0820,
  187. $05FF,$F820,
  188. $0400,$0020,
  189. $0000,$0020,
  190. $0000,$0020,
  191. $7FFF,$FFE0,
  192. $0000,$0000,
  193. $0000,$0000,
  194. $0000,$0000,
  195. $0000,$0000,
  196. $0000,$0000,
  197. $0000,$0000,
  198. $0000,$0000,
  199. $0000,$0000,
  200. $0000,$0000,
  201. $0000,$0000,
  202. $0000,$0000,
  203. $0000,$0000,
  204. $0000,$0000,
  205. $0000,$0000,
  206. $0000,$0000,
  207. $0000,$0000,
  208. $0000,$0000,
  209. $0000,$0000,
  210. $0000,$0000,
  211. $0000,$0000,
  212. $0000,$0000,
  213. $0000,$0000,
  214. $0000,$0000
  215. );
  216. VAR
  217. ps : pScreen;
  218. vi : Pointer;
  219. ng : tNewGadget;
  220. xoff, yoff,i : Longint;
  221. gl,g : pGadget;
  222. firstimage : pdata;
  223. secondimage : pdata;
  224. renderi,
  225. selecti : tImage;
  226. wp : pWindow;
  227. function NewGadget(left,top,width,height : Integer; txt : PChar; txtattr: pTextAttr;
  228. id : word; flags: Longint; visinfo, userdata : Pointer):
  229. tNewGadget;
  230. var
  231. ng : tNewGadget;
  232. begin
  233. with ng do begin
  234. ng_LeftEdge := left;
  235. ng_TopEdge := top;
  236. ng_Width := width;
  237. ng_Height := height;
  238. ng_GadgetText := txt;
  239. ng_TextAttr := txtattr;
  240. ng_GadgetID := id;
  241. ng_Flags := flags;
  242. ng_VisualInfo := visinfo;
  243. ng_UserData := userdata;
  244. END;
  245. NewGadget := ng;
  246. end;
  247. function Image(left,top,width,height,depth: Integer; imdata : pointer;
  248. ppick, ponoff: byte; nextim : pImage): tImage;
  249. var
  250. im : tImage;
  251. begin
  252. im.LeftEdge := left;
  253. im.TopEdge := top;
  254. im.Width := width;
  255. im.Height := height;
  256. im.Depth := depth;
  257. im.ImageData := imdata;
  258. im.PlanePick := ppick;
  259. im.PlaneOnOff := ponoff;
  260. im.NextImage := nextim;
  261. Image := im;
  262. end;
  263. FUNCTION EasyReq(wp : pWindow; title,body,gad : PChar) : Longint;
  264. VAR
  265. es : tEasyStruct;
  266. Res: LongWord;
  267. BEGIN
  268. es.es_StructSize:=SizeOf(tEasyStruct);
  269. es.es_Flags:=0;
  270. es.es_Title:=title;
  271. es.es_TextFormat:=body;
  272. es.es_GadgetFormat:=gad;
  273. EasyReq := EasyRequestArgs(wp,@es,@Res,NIL);
  274. END;
  275. PROCEDURE CleanUp(why : PChar; rc : BYTE);
  276. BEGIN
  277. IF assigned(wp) THEN CloseWindow(wp);
  278. IF assigned(gl) THEN FreeGadgets(gl);
  279. IF assigned(vi) THEN FreeVisualInfo(vi);
  280. IF assigned(firstimage) THEN FreeVec(firstimage);
  281. IF assigned(secondimage) THEN FreeVec(secondimage);
  282. IF why <> nil THEN i := EasyReq(NIL,WIN_TITLE,why,OK_TEXT);
  283. HALT(rc);
  284. END;
  285. { Clones some datas from default pubscreen for fontsensitive
  286. placing of gadgets. }
  287. PROCEDURE CloneDatas;
  288. BEGIN
  289. ps := LockPubScreen(NIL);
  290. IF ps = NIL THEN CleanUp(MSG_NO_PS,20)
  291. ELSE
  292. BEGIN
  293. xoff := ps^.WBorLeft;
  294. yoff := ps^.WBorTop + ps^.Font^.ta_YSize + 1;
  295. vi := GetVisualInfoA(ps,NIL);
  296. UnLockPubScreen(NIL, ps);
  297. IF vi = NIL THEN CleanUp(MSG_NO_VI, 20);
  298. END;
  299. END;
  300. procedure AllocateImages;
  301. begin
  302. firstimage := Pointer(AllocVec(SizeOf(data),MEMF_CLEAR OR MEMF_CHIP));
  303. if firstimage = nil then CleanUp(MSG_NO_MEM,20);
  304. firstimage^ := renderd;
  305. renderi := Image(0,0,28,22,3,firstimage,$ff,$0,nil);
  306. secondimage := Pointer(AllocVec(SizeOf(data),MEMF_CLEAR OR MEMF_CHIP));
  307. if secondimage = nil then CleanUp(MSG_NO_MEM,20);
  308. secondimage^ := selectd;
  309. selecti := Image(0,0,28,22,3,secondimage,$ff,$0,nil);
  310. END;
  311. PROCEDURE GenerateWindow;
  312. BEGIN
  313. gl := NIL; gl := CreateContext(addr(gl));
  314. IF gl = NIL THEN CleanUp(MSG_NO_MEM, 20);
  315. ng := NewGadget(xoff+1,yoff+1,28,22,nil,nil,1,0,vi,nil);
  316. g := CreateGadgetA(GENERIC_KIND,gl,@ng,NIL);
  317. IF g = NIL THEN CleanUp(MSG_NO_MEM, 20);
  318. g^.GadgetType := GTYP_BOOLGADGET;
  319. g^.Flags := GFLG_GADGIMAGE OR GFLG_GADGHIMAGE; { 2 Images }
  320. g^.Activation := GACT_RELVERIFY; { Verhalten wie ein BUTTON_KIND-Gadget }
  321. g^.GadgetRender := @renderi;
  322. g^.SelectRender := @selecti;
  323. wp := OpenWindowTags(NIL,[
  324. WA_Gadgets, AsTag(gl),
  325. WA_Title, AsTag('Images in Gadgets'),
  326. WA_Flags, WFLG_SMART_REFRESH OR WFLG_NOCAREREFRESH OR
  327. WFLG_DEPTHGADGET OR WFLG_DRAGBAR OR WFLG_CLOSEGADGET OR
  328. WFLG_ACTIVATE,
  329. WA_Idcmp, IDCMP_GADGETUP OR IDCMP_CLOSEWINDOW,
  330. WA_InnerWidth, 100,
  331. WA_InnerHeight, 50,
  332. TAG_DONE]);
  333. IF wp = NIL THEN CleanUp(MSG_NO_WP, 20);
  334. END;
  335. PROCEDURE MainWait;
  336. VAR
  337. msg : pIntuiMessage;
  338. iclass : LONG;
  339. ende : BOOLEAN;
  340. BEGIN
  341. ende := FALSE;
  342. REPEAT
  343. msg := pIntuiMessage(WaitPort(wp^.UserPort));
  344. msg := GT_GetIMsg(wp^.UserPort);
  345. WHILE msg <> NIL DO
  346. BEGIN
  347. iclass := msg^.IClass;
  348. GT_ReplyIMsg(msg);
  349. CASE iclass OF
  350. IDCMP_CLOSEWINDOW : ende := TRUE;
  351. IDCMP_GADGETUP :
  352. i := EasyReq(wp,WIN_TITLE, 'You have clicked on the Gadget!', 'Wheeew!');
  353. ELSE END;
  354. msg := GT_GetIMsg(wp^.UserPort);
  355. END;
  356. UNTIL ende;
  357. END;
  358. BEGIN
  359. new(gl);
  360. CloneDatas;
  361. AllocateImages;
  362. GenerateWindow;
  363. MainWait;
  364. CleanUp(nil,0);
  365. END.