examples.ino 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. #include <EEPROM.h>
  2. #include <SPI.h>
  3. #include <GD2.h>
  4. #include "examples_assets.h"
  5. #include "examples2_assets.h"
  6. void setup()
  7. {
  8. Serial.begin(1000000); // JCB
  9. GD.begin();
  10. }
  11. void f1()
  12. {
  13. }
  14. // Apply a rotation around pixel (64, 64) //' rota{
  15. static void rotate_64_64(uint16_t a)
  16. {
  17. GD.cmd_translate(F16(64),F16(64));
  18. GD.cmd_rotate(a);
  19. GD.cmd_translate(F16(-64), F16(-64));
  20. } //' }rota
  21. // Apply a scale (s, t) around pixel (64, 64) //' scalea{
  22. static void scale_64_64(uint32_t s, uint32_t t)
  23. {
  24. GD.cmd_translate(F16(64),F16(64));
  25. GD.cmd_scale(s, t);
  26. GD.cmd_translate(F16(-64), F16(-64));
  27. } //' }scalea
  28. static void zigzag(const char *title, int x)
  29. {
  30. for (int i = 0; i < 3; i++) {
  31. GD.Vertex2ii(x - 14, 25 + i * 90, SPRITES_HANDLE, 2);
  32. GD.Vertex2ii(x + 14, 25 + 45 + i * 90, SPRITES_HANDLE, 2);
  33. }
  34. GD.cmd_text(x, 0, 27, OPT_CENTERX, title);
  35. }
  36. static void button(int x, int y, byte label);
  37. void loop()
  38. {
  39. GD.ClearColorRGB(0x103000); //' a{
  40. GD.Clear();
  41. GD.cmd_text(240, 136, 31, OPT_CENTER, "Hello world");
  42. GD.Begin(POINTS);
  43. GD.Vertex2ii(220, 100);
  44. GD.Vertex2ii(260, 170);
  45. GD.swap(); //' }a
  46. GD.ClearColorRGB(0x103000); //' b{
  47. GD.Clear();
  48. GD.cmd_text(240, 136, 31, OPT_CENTER, "Hello world");
  49. GD.PointSize(16 * 30); // means 30 pixels
  50. GD.Begin(POINTS);
  51. GD.Vertex2ii(220, 100);
  52. GD.Vertex2ii(260, 170);
  53. GD.swap(); //' }b
  54. GD.ClearColorRGB(0x103000); //' c{
  55. GD.Clear();
  56. GD.cmd_text(240, 136, 31, OPT_CENTER, "Hello world");
  57. GD.PointSize(16 * 30);
  58. GD.Begin(POINTS);
  59. GD.ColorRGB(0xff8000); // orange
  60. GD.Vertex2ii(220, 100);
  61. GD.ColorRGB(0x0080ff); // teal
  62. GD.Vertex2ii(260, 170);
  63. GD.swap(); //' }c
  64. GD.ClearColorRGB(0x103000); //' d{
  65. GD.Clear();
  66. GD.cmd_text(240, 136, 31, OPT_CENTER, "Hello world");
  67. GD.PointSize(16 * 30);
  68. GD.Begin(POINTS);
  69. GD.ColorA(128); // 50% transparent
  70. GD.ColorRGB(0xff8000); // orange
  71. GD.Vertex2ii(220, 100);
  72. GD.ColorRGB(0x0080ff); // teal
  73. GD.Vertex2ii(260, 170);
  74. GD.swap(); //' }d
  75. GD.ColorRGB(0, 128, 255); // teal //' triplet{
  76. GD.Vertex2ii(260, 170); //' }triplet
  77. GD.play(PIANO, 60); //' e{
  78. delay(1000);
  79. GD.play(ORGAN, 64); //' }e
  80. GD.ClearColorRGB(0x103000); //' f{
  81. GD.Clear();
  82. GD.cmd_text(240, 136, 31, OPT_CENTER, "Hello world");
  83. GD.PointSize(16 * 30);
  84. GD.Begin(POINTS);
  85. GD.ColorRGB(0xff8000);
  86. GD.Tag(100);
  87. GD.Vertex2ii(220, 100);
  88. GD.ColorRGB(0x0080ff);
  89. GD.Tag(101);
  90. GD.Vertex2ii(260, 170);
  91. GD.swap(); //' }f
  92. #ifndef DUMPDEV // JCB
  93. Serial.begin(9600);
  94. for (;;) { //' g{
  95. GD.get_inputs();
  96. Serial.println(GD.inputs.tag);
  97. } //' }g
  98. #endif // JCB
  99. GD.Clear(); //' h{
  100. for (int i = 0; i <= 254; i++) {
  101. GD.Tag(i);
  102. GD.cmd_number((i % 16) * 30, (i / 16) * 17, 26, 0, i);
  103. }
  104. GD.swap();
  105. #ifndef DUMPDEV // JCB
  106. GD.get_inputs(); //' }h
  107. Serial.println(GD.inputs.tag);
  108. #endif // JCB
  109. GD.cmd_loadimage(0, 0);
  110. GD.load("healsky3.jpg");
  111. GD.Clear(); //' i{
  112. GD.Begin(BITMAPS);
  113. GD.Vertex2ii(0, 0);
  114. GD.Vertex2ii(100, 100);
  115. GD.Vertex2ii(200, 0);
  116. GD.Vertex2ii(300, 100);
  117. GD.swap(); //' }i
  118. GD.Clear(); //' j{
  119. GD.Begin(BITMAPS);
  120. GD.BitmapSize(NEAREST, BORDER, BORDER, 64, 64);
  121. GD.Vertex2ii(0, 0);
  122. GD.swap(); //' }j
  123. GD.Clear(); //' k{
  124. GD.Begin(BITMAPS);
  125. GD.BitmapSize(NEAREST, BORDER, BORDER, 480, 272);
  126. GD.Vertex2ii(0, 0);
  127. GD.swap(); //' }k
  128. GD.Clear(); //' l{
  129. GD.Begin(BITMAPS);
  130. GD.BitmapSize(NEAREST, REPEAT, REPEAT, 480, 272);
  131. GD.Vertex2ii(0, 0);
  132. GD.swap(); //' }l
  133. GD.BitmapHandle(0);
  134. GD.cmd_loadimage(0, 0);
  135. GD.load("sunrise.jpg");
  136. GD.BitmapHandle(1);
  137. GD.cmd_loadimage(-1, 0);
  138. GD.load("healsky3.jpg");
  139. GD.Clear(); //' m{
  140. GD.Begin(BITMAPS);
  141. for (int i = 0; i < 100; i++)
  142. GD.Vertex2ii(GD.random(480), GD.random(272), GD.random(2));
  143. GD.swap(); //' }m
  144. GD.Clear(); //' n{
  145. GD.Begin(BITMAPS);
  146. GD.ColorRGB(0x00ff00); // pure green
  147. GD.Vertex2ii(240 - 130, 136 - 130, 1);
  148. GD.ColorRGB(0xff8080); // pinkish
  149. GD.Vertex2ii(240 , 136 - 130, 1);
  150. GD.ColorRGB(0xffff80); // yellowish
  151. GD.Vertex2ii(240 - 130, 136 , 1);
  152. GD.ColorRGB(0xffffff); // white
  153. GD.Vertex2ii(240 , 136 , 1);
  154. GD.swap(); //' }n
  155. GD.cmd_gradient(0, 0, 0x0060c0, //' grad{
  156. 0, 271, 0xc06000);
  157. GD.cmd_text(240, 136, 31, OPT_CENTER, "READY PLAYER ONE");
  158. GD.swap(); //' }grad
  159. #define WIDGET(c) do { \
  160. GD.ClearColorRGB(0x404040); \
  161. GD.Clear(); \
  162. (c); \
  163. GD.swap(); \
  164. } while (0)
  165. WIDGET(GD.cmd_clock(240, 136, 120, 0, 8, 27, 13, 0));
  166. WIDGET(GD.cmd_dial(240, 136, 120, 0, 5333));
  167. WIDGET(GD.cmd_gauge(240, 136, 120, 0, 4, 2, 5333, 65535));
  168. WIDGET(GD.cmd_keys(0, 136 - 40, 480, 80, 31, 'u', "qwertyuiop"));
  169. WIDGET((
  170. GD.cmd_number(240, 45, 31, OPT_CENTER, 42),
  171. GD.cmd_number(240, 136, 31, OPT_CENTER | 4, 42),
  172. GD.cmd_number(240, 226, 31, OPT_CENTER | 8, 42)
  173. ));
  174. WIDGET(GD.cmd_progress(10, 136, 460, 10, 0, 25333, 65535));
  175. WIDGET(GD.cmd_scrollbar(30, 136, 420, 30, 0, 25333, 10000, 65535));
  176. WIDGET(GD.cmd_slider(30, 136, 420, 30, 0, 25333, 65535));
  177. WIDGET(GD.cmd_spinner(240, 136, 0, 1));
  178. WIDGET((
  179. GD.cmd_toggle(180, 20, 120, 31, 0, 0, "yes\xffno"),
  180. GD.cmd_toggle(180, 120, 120, 31, 0, 32768, "yes\xffno"),
  181. GD.cmd_toggle(180, 220, 120, 31, 0, 65535, "yes\xffno")
  182. ));
  183. WIDGET(GD.cmd_button(240 - 100, 136 - 40, 200, 80, 31, 0, "1 UP"));
  184. GD.cmd_gradient(0, 0, 0x0060c0, //' dropshadow{
  185. 0, 271, 0xc06000);
  186. GD.ColorRGB(0x000000);
  187. GD.cmd_text(237, 139, 31, OPT_CENTER, "READY PLAYER ONE");
  188. GD.ColorRGB(0xffffff);
  189. GD.cmd_text(240, 136, 31, OPT_CENTER, "READY PLAYER ONE");
  190. GD.swap(); //' }dropshadow
  191. int x, y;
  192. GD.Clear();
  193. GD.Begin(LINES); //' linewidth{
  194. for (int i = 0; i < 136; i++) {
  195. GD.ColorRGB(GD.random(255), GD.random(255), GD.random(255));
  196. GD.LineWidth(i);
  197. GD.polar(x, y, i, i * 2500);
  198. GD.Vertex2ii(240 + x, 136 + y);
  199. } //' }linewidth
  200. GD.swap();
  201. GD.Clear();
  202. GD.Begin(POINTS); //' pointsize{
  203. for (int i = 0; i < 136; i++) {
  204. GD.ColorRGB(GD.random(255), GD.random(255), GD.random(255));
  205. GD.PointSize(i);
  206. GD.polar(x, y, i, i * 2500);
  207. GD.Vertex2ii(240 + x, 136 + y);
  208. } //' }pointsize
  209. GD.swap();
  210. GD.Clear();
  211. GD.Begin(RECTS); //' colorrgb{
  212. GD.ColorRGB(255, 128, 30); // orange
  213. GD.Vertex2ii(10, 10); GD.Vertex2ii(470, 130);
  214. GD.ColorRGB(0x4cc417); // apple green
  215. GD.Vertex2ii(10, 140); GD.Vertex2ii(470, 260); //' }colorrgb
  216. GD.swap();
  217. GD.Clear();
  218. GD.Begin(POINTS); //' colora{
  219. GD.PointSize(12 * 16);
  220. for (int i = 0; i < 255; i += 5) {
  221. GD.ColorA(i);
  222. GD.Vertex2ii(2 * i, 136 + GD.rsin(120, i << 8));
  223. } //' }colora
  224. GD.swap();
  225. GD.ClearColorRGB(0x008080); // teal //' clearcolorrgb{
  226. GD.Clear();
  227. GD.ScissorSize(100, 200);
  228. GD.ScissorXY(10, 20);
  229. GD.ClearColorRGB(0xf8, 0x80, 0x17); // orange
  230. GD.Clear(); //' }clearcolorrgb
  231. GD.swap();
  232. GD.Clear();
  233. GD.Begin(POINTS); //' blendfunc{
  234. GD.ColorRGB(0xf88017);
  235. GD.PointSize(80 * 16);
  236. GD.BlendFunc(SRC_ALPHA, ONE_MINUS_SRC_ALPHA);
  237. GD.Vertex2ii(150, 76); GD.Vertex2ii(150, 196);
  238. GD.BlendFunc(SRC_ALPHA, ONE);
  239. GD.Vertex2ii(330, 76); GD.Vertex2ii(330, 196);
  240. //' }blendfunc
  241. GD.swap();
  242. LOAD_ASSETS();
  243. GD.Clear();
  244. GD.Begin(BITMAPS); //' alphafunc{
  245. GD.Vertex2ii(110, 6); // Top left: ALWAYS
  246. GD.AlphaFunc(EQUAL, 255); // Top right: (A == 255)
  247. GD.Vertex2ii(240, 6);
  248. GD.AlphaFunc(LESS, 160); // Bottom left: (A < 160)
  249. GD.Vertex2ii(110, 136);
  250. GD.AlphaFunc(GEQUAL, 160); // Bottom right: (A >= 160)
  251. GD.Vertex2ii(240, 136); //' }alphafunc
  252. GD.swap();
  253. GD.Clear();
  254. GD.PointSize(135 * 16); //' colormask{
  255. GD.Begin(POINTS); //' colormask{
  256. GD.ColorMask(1, 0, 0, 0); // red only
  257. GD.Vertex2ii(240 - 100, 136);
  258. GD.ColorMask(0, 1, 0, 0); // green only
  259. GD.Vertex2ii(240, 136);
  260. GD.ColorMask(0, 0, 1, 0); // blue only
  261. GD.Vertex2ii(240 + 100, 136); //' }colormask
  262. GD.swap();
  263. GD.ClearColorRGB(0x003000);
  264. GD.Clear();
  265. GD.BitmapHandle(CARDS_HANDLE); // CARDS has 53 cells, 0-52 //' cell{
  266. GD.Begin(BITMAPS);
  267. for (int i = 1; i <= 52; i++) {
  268. GD.Cell(i);
  269. GD.Vertex2f(GD.random(16 * 480), GD.random(16 * 272));
  270. } //' }cell
  271. GD.swap();
  272. GD.ClearColorRGB(0x0000ff); // Clear color to blue //' clear{
  273. GD.ClearStencil(0x80); // Clear stencil to 0x80
  274. GD.ClearTag(100); // Clear tag to 100
  275. GD.Clear(1, 1, 1); // Go! //' }clear
  276. GD.swap();
  277. GD.Clear();
  278. GD.cmd_text(240, 64, 31, OPT_CENTER, "WHITE"); //' context{
  279. GD.SaveContext();
  280. GD.ColorRGB(0xff0000);
  281. GD.cmd_text(240, 128, 31, OPT_CENTER, "RED");
  282. GD.RestoreContext();
  283. GD.cmd_text(240, 196, 31, OPT_CENTER, "WHITE AGAIN"); //' }context
  284. GD.swap();
  285. GD.Clear();
  286. GD.ScissorSize(400, 100); //' scissor{
  287. GD.ScissorXY(35, 36);
  288. GD.ClearColorRGB(0x008080); GD.Clear();
  289. GD.cmd_text(240, 136, 31, OPT_CENTER, "Scissor Example");
  290. GD.ScissorXY(45, 140);
  291. GD.ClearColorRGB(0xf88017); GD.Clear();
  292. GD.cmd_text(240, 136, 31, OPT_CENTER, "Scissor Example"); //' }scissor
  293. GD.swap();
  294. GD.Clear();
  295. GD.StencilOp(INCR, INCR); // incrementing stencil //' stencil{
  296. GD.PointSize(135 * 16);
  297. GD.Begin(POINTS); // Draw three white circles
  298. GD.Vertex2ii(240 - 100, 136);
  299. GD.Vertex2ii(240, 136);
  300. GD.Vertex2ii(240 + 100, 136);
  301. GD.ColorRGB(0xff0000); // Draw pixels with stencil==2 red
  302. GD.StencilFunc(EQUAL, 2, 255);
  303. GD.Begin(RECTS); // Visit every pixel on the screen
  304. GD.Vertex2ii(0,0); GD.Vertex2ii(480,272); //' }stencil
  305. GD.swap();
  306. GD.Clear(); //' rects{
  307. GD.Begin(RECTS);
  308. GD.Vertex2ii(30, 30);
  309. GD.Vertex2ii(450, 50);
  310. GD.LineWidth(10 * 16); // corner radius 10.0 pixels
  311. GD.Vertex2ii(30, 120);
  312. GD.Vertex2ii(450, 140);
  313. GD.LineWidth(20 * 16); // corner radius 20.0 pixels
  314. GD.Vertex2ii(30, 220);
  315. GD.Vertex2ii(450, 230);
  316. GD.swap(); //' }rects
  317. GD.Clear();
  318. GD.Begin(POINTS); // draw 50-pixel wide green circles //' blend1{
  319. GD.ColorRGB(20, 91, 71);
  320. GD.PointSize(50 * 16);
  321. for (int x = 100; x <= 380; x += 40)
  322. GD.Vertex2ii(x, 72);
  323. GD.BlendFunc(SRC_ALPHA, ONE); // additive blending
  324. for (int x = 100; x <= 380; x += 40)
  325. GD.Vertex2ii(x, 200); //' }blend1
  326. GD.swap();
  327. GD.cmd_loadimage(0, 0);
  328. GD.load("tree.jpg");
  329. GD.Begin(BITMAPS);
  330. GD.ColorRGB(0xc0c0c0);
  331. GD.Vertex2ii(0, 0);
  332. GD.ColorRGB(0xffffff);
  333. GD.Begin(POINTS); //' comp1{
  334. GD.PointSize(16 * 120); // White outer circle
  335. GD.Vertex2ii(136, 136);
  336. GD.ColorRGB(0x000000);
  337. GD.PointSize(16 * 110); // Black inner circle
  338. GD.Vertex2ii(136, 136);
  339. GD.ColorRGB(0xffffff);
  340. GD.cmd_clock(136, 136, 130,
  341. OPT_NOTICKS | OPT_NOBACK, 8, 41, 39, 0); //' }comp1
  342. GD.swap();
  343. GD.ColorRGB(0xc0c0c0);
  344. GD.Clear(); // now alpha is all zeroes //' comp2{
  345. GD.ColorMask(1,1,1,0); // draw tree, but leave alpha zero
  346. GD.Begin(BITMAPS);
  347. GD.Vertex2ii(0, 0);
  348. GD.ColorMask(0,0,0,1); //' comp2a{
  349. GD.BlendFunc(ONE, ONE_MINUS_SRC_ALPHA); //' }comp2a
  350. GD.Begin(POINTS); //' comp2b{
  351. GD.PointSize(16 * 120); // outer circle
  352. GD.Vertex2ii(136, 136); //' }comp2b
  353. GD.BlendFunc(ZERO, ONE_MINUS_SRC_ALPHA); //' comp2c{
  354. GD.PointSize(16 * 110); // inner circle
  355. GD.Vertex2ii(136, 136); //' }comp2c
  356. GD.BlendFunc(ONE, ONE_MINUS_SRC_ALPHA); //' comp2d{
  357. GD.cmd_clock(136, 136, 130,
  358. OPT_NOTICKS | OPT_NOBACK, 8, 41, 39, 0); //' }comp2d
  359. GD.ColorMask(1,1,1,0); //' comp2e{
  360. GD.BlendFunc(DST_ALPHA, ONE);
  361. GD.ColorRGB(0x808080);
  362. GD.Begin(RECTS); // Visit every pixel on the screen
  363. GD.Vertex2ii(0,0);
  364. GD.Vertex2ii(480,272); //' }comp2 }comp2e
  365. GD.swap();
  366. GD.cmd_loadimage(0, 0);
  367. GD.load("healsky3.jpg");
  368. GD.ClearColorRGB(0x602010); //' rot1{
  369. GD.Clear();
  370. GD.Begin(BITMAPS);
  371. GD.Vertex2ii(10, 72);
  372. GD.cmd_rotate(DEGREES(22.5));
  373. GD.cmd_setmatrix();
  374. GD.Vertex2ii(176, 72);
  375. GD.cmd_rotate(DEGREES(22.5));
  376. GD.cmd_setmatrix();
  377. GD.Vertex2ii(342, 72);
  378. GD.swap(); //' }rot1
  379. GD.ClearColorRGB(0x602010);
  380. GD.Clear(); //' rot2{
  381. GD.BlendFunc(SRC_ALPHA, ZERO);
  382. GD.Begin(BITMAPS);
  383. GD.Vertex2ii(10, 72);
  384. GD.cmd_rotate(DEGREES(22.5));
  385. GD.cmd_setmatrix();
  386. GD.Vertex2ii(176, 72);
  387. GD.cmd_rotate(DEGREES(22.5));
  388. GD.cmd_setmatrix();
  389. GD.Vertex2ii(342, 72);
  390. GD.swap(); //' }rot2
  391. GD.ClearColorRGB(0x602010); //' rot3{
  392. GD.Clear();
  393. GD.BlendFunc(SRC_ALPHA, ZERO);
  394. GD.Begin(BITMAPS);
  395. GD.Vertex2ii(10, 72);
  396. rotate_64_64(DEGREES(22.5));
  397. GD.cmd_setmatrix();
  398. GD.Vertex2ii(176, 72);
  399. rotate_64_64(DEGREES(22.5));
  400. GD.cmd_setmatrix();
  401. GD.Vertex2ii(342, 72);
  402. GD.swap(); //' }rot3
  403. GD.BitmapSize(NEAREST, BORDER, BORDER, 128, 128);
  404. GD.ClearColorRGB(0x602010); //' zoom{
  405. GD.Clear();
  406. GD.Begin(BITMAPS);
  407. GD.cmd_scale(F16(2), F16(2));
  408. GD.cmd_setmatrix();
  409. GD.Vertex2ii(10, 8);
  410. GD.BitmapSize(NEAREST, BORDER, BORDER, 256, 256);
  411. GD.Vertex2ii(200, 8);
  412. GD.swap(); //' }zoom
  413. LOAD_ASSETS();
  414. GD.Clear();
  415. GD.LineWidth(20);
  416. GD.PointSize(20);
  417. GD.Begin(BITMAPS);
  418. zigzag("BITMAPS", 48);
  419. GD.Begin(POINTS);
  420. zigzag("POINTS", 48 + 1 * 96);
  421. GD.Begin(LINES);
  422. zigzag("LINES", 48 + 2 * 96);
  423. GD.Begin(LINE_STRIP);
  424. zigzag("LINE_STRIP", 48 + 3 * 96);
  425. GD.Begin(RECTS);
  426. zigzag("RECTS", 48 + 4 * 96);
  427. GD.swap();
  428. for (int j = 0; j < 2; j++) {
  429. uint32_t rgb[2] = {0x00ff00, 0x60c030};
  430. uint32_t color = rgb[j];
  431. GD.ColorRGB(color);
  432. GD.seed(0x947a);
  433. GD.Clear(); //' additive{
  434. GD.BlendFunc(SRC_ALPHA, ONE);
  435. GD.PointSize(8 * 16);
  436. GD.Begin(POINTS);
  437. for (int i = 0; i < 1000; i++)
  438. GD.Vertex2ii(20 + GD.random(440), 20 + GD.random(232));
  439. GD.swap(); //' }additive
  440. }
  441. GD.Clear(); //' polygon{
  442. GD.ColorRGB(0xf3d417);
  443. Poly po;
  444. po.begin();
  445. po.v(16 * 154, 16 * 262);
  446. po.v(16 * 256, 16 * 182);
  447. po.v(16 * 312, 16 * 262);
  448. po.v(16 * 240, 16 * 10);
  449. po.draw();
  450. GD.swap(); //' }polygon
  451. GD.cmd_gradient(0, 0, 0x82670e, 272, 272, 0xa78512);
  452. GD.SaveContext();
  453. GD.ColorRGB(0xf3d417);
  454. po.begin();
  455. po.v(16 * 154, 16 * 262);
  456. po.v(16 * 256, 16 * 182);
  457. po.v(16 * 312, 16 * 262);
  458. po.v(16 * 240, 16 * 10);
  459. po.draw();
  460. GD.RestoreContext();
  461. GD.ColorRGB(0x000000); //' polygon2{
  462. GD.LineWidth(3 * 16);
  463. po.outline(); //' }polygon2
  464. GD.swap();
  465. GD.Clear();
  466. GD.BitmapLayout(L8, 1, 1); //' 1x1{
  467. GD.BlendFunc(ONE, ZERO);
  468. GD.BitmapSize(NEAREST, REPEAT, REPEAT, 60, 30);
  469. GD.Begin(BITMAPS);
  470. GD.Vertex2ii(10, 10); // each vertex draws a 60X30 rectangle
  471. GD.Vertex2ii(110, 110);
  472. GD.Vertex2ii(210, 210);
  473. GD.swap(); //' }1x1
  474. GD.BitmapHandle(SPECTRUM_HANDLE); //' 1d{
  475. GD.BitmapSize(NEAREST, REPEAT, REPEAT, 512, 512);
  476. GD.Begin(BITMAPS);
  477. GD.Vertex2ii(0, 0, SPECTRUM_HANDLE); //' }1d
  478. GD.swap();
  479. GD.cmd_rotate(DEGREES(73)); //' 1d-twist{
  480. GD.cmd_scale(F16(0.3), F16(1));
  481. GD.cmd_setmatrix(); //' }1d-twist
  482. GD.Begin(BITMAPS);
  483. GD.Vertex2ii(0, 0, SPECTRUM_HANDLE);
  484. GD.swap();
  485. GD.ClearColorRGB(0x00324d); //' 2bit{
  486. GD.Clear();
  487. GD.ColorMask(0, 0, 0, 1);
  488. GD.Begin(BITMAPS);
  489. GD.BlendFunc(ONE, ONE);
  490. GD.ColorA(0xaa); // draw bit 1 into A
  491. GD.Vertex2ii(240 - ABE_WIDTH / 2, 0, ABE_HANDLE, 1);
  492. GD.ColorA(0x55); // draw bit 0 into A
  493. GD.Vertex2ii(240 - ABE_WIDTH / 2, 0, ABE_HANDLE, 0);
  494. // Now draw the same pixels, controlled by DST_ALPHA
  495. GD.ColorMask(1, 1, 1, 1);
  496. GD.ColorRGB(0xfce4a8);
  497. GD.BlendFunc(DST_ALPHA, ONE_MINUS_DST_ALPHA);
  498. GD.Vertex2ii(240 - ABE_WIDTH / 2, 0, ABE_HANDLE, 1);
  499. GD.swap(); //' }2bit
  500. EX2_LOAD_ASSETS();
  501. GD.cmd_gradient(0, 0, 0x8080c0, //' dropshadow2{
  502. 0, 271, 0xc0d080);
  503. GD.ColorRGB(0x000000);
  504. GD.ColorA(128);
  505. GD.Begin(BITMAPS);
  506. GD.Vertex2ii(240 - 12 - EX2_GAMEDUINO_WIDTH / 2,
  507. 136 + 12 - EX2_GAMEDUINO_HEIGHT / 2,
  508. EX2_GAMEDUINO_HANDLE);
  509. GD.ColorRGB(0xffffff);
  510. GD.ColorA(0xff);
  511. GD.Vertex2ii(240 - EX2_GAMEDUINO_WIDTH / 2,
  512. 136 - EX2_GAMEDUINO_HEIGHT / 2,
  513. EX2_GAMEDUINO_HANDLE);
  514. GD.swap(); //' }dropshadow2
  515. {
  516. int w = 65;
  517. GD.Begin(LINES);
  518. GD.LineWidth(28 * 16);
  519. GD.Vertex2ii(240 - w, 136, 0, 0);
  520. GD.Vertex2ii(240 + w, 136, 0, 0);
  521. GD.ColorRGB(0x000480);
  522. GD.LineWidth(24 * 16);
  523. GD.Vertex2ii(240 - w, 136, 0, 0);
  524. GD.Vertex2ii(240 + w, 136, 0, 0);
  525. GD.ColorRGB(0xffffff);
  526. GD.cmd_text(240, 132, 31, OPT_CENTER, "upvote");
  527. GD.swap();
  528. }
  529. int WALK_HANDLE = EX2_WALK_HANDLE;
  530. GD.ClearColorRGB(0x80c2dd);
  531. GD.Clear();
  532. GD.Begin(BITMAPS); //' cell{
  533. GD.Vertex2ii( 0, 10, WALK_HANDLE, 0);
  534. GD.Vertex2ii( 50, 10, WALK_HANDLE, 1);
  535. GD.Vertex2ii(100, 10, WALK_HANDLE, 2);
  536. GD.Vertex2ii(150, 10, WALK_HANDLE, 3);
  537. GD.Vertex2ii(200, 10, WALK_HANDLE, 4);
  538. GD.Vertex2ii(250, 10, WALK_HANDLE, 5);
  539. GD.Vertex2ii(300, 10, WALK_HANDLE, 6);
  540. GD.Vertex2ii(350, 10, WALK_HANDLE, 7); //' }cell
  541. GD.swap();
  542. int STRIPE_HANDLE = EX2_STRIPE_HANDLE;
  543. GD.BitmapHandle(STRIPE_HANDLE); //' stripe1{
  544. GD.BitmapSize(NEAREST, REPEAT, REPEAT, 480, 272);
  545. GD.Begin(BITMAPS);
  546. GD.Vertex2ii(0, 0, STRIPE_HANDLE); //' }stripe1
  547. GD.swap();
  548. GD.BitmapHandle(STRIPE_HANDLE); //' stripe2{
  549. GD.BitmapSize(NEAREST, REPEAT, REPEAT, 480, 272);
  550. GD.ClearColorRGB(0x103000);
  551. GD.Clear();
  552. GD.ColorMask(0, 0, 0, 1); // write A only
  553. GD.BlendFunc(ONE, ONE);
  554. GD.cmd_text(240, 136, 31, OPT_CENTER,
  555. "STRIPES ARE IN, BABY!");
  556. GD.ColorMask(1, 1, 1, 0); // write R,G,B only
  557. GD.BlendFunc(DST_ALPHA, ONE_MINUS_DST_ALPHA);
  558. GD.Begin(BITMAPS);
  559. GD.Vertex2ii(0, 0, STRIPE_HANDLE); //' }stripe2
  560. GD.swap();
  561. GD.ClearColorRGB(0x80c2dd);
  562. GD.Clear();
  563. GD.Begin(BITMAPS); //' mirror{
  564. GD.Vertex2ii( 0, 10, WALK_HANDLE, 0);
  565. GD.cmd_translate(F16(16), F16(0));
  566. GD.cmd_scale(F16(-1), F16(1));
  567. GD.cmd_translate(F16(-16), F16(0));
  568. GD.cmd_setmatrix();
  569. GD.Vertex2ii( 30, 10, WALK_HANDLE, 0);
  570. GD.swap(); //' }mirror
  571. if (0) {
  572. GD.play(PIANO, 60); //' waitnote{
  573. while (GD.rd(REG_PLAY) != 0)
  574. ; //' }waitnote
  575. }
  576. GD.cmd_loadimage(0, 0);
  577. GD.load("healsky3.jpg");
  578. GD.BlendFunc(SRC_ALPHA, ZERO);
  579. GD.ClearColorRGB(0x602010); //' scale1{
  580. GD.Clear();
  581. GD.Begin(BITMAPS);
  582. GD.Vertex2ii(10, 72);
  583. scale_64_64(F16(2.0), F16(2.0));
  584. GD.cmd_setmatrix();
  585. GD.Vertex2ii(176, 72);
  586. GD.cmd_loadidentity();
  587. scale_64_64(F16(0.4), F16(0.4));
  588. GD.cmd_setmatrix();
  589. GD.Vertex2ii(342, 72);
  590. GD.swap(); //' }scale1
  591. #define draw_left_circle() (GD.Begin(POINTS), GD.PointSize(16 * 60), GD.Vertex2ii(200, 136))
  592. #define draw_right_circle() (GD.Begin(POINTS), GD.PointSize(16 * 70), GD.Vertex2ii(280, 136))
  593. #define PAINT_ALPHA() GD.BlendFunc(ONE, ONE_MINUS_SRC_ALPHA) //' alpha1{
  594. #define CLEAR_ALPHA() GD.BlendFunc(ZERO, ONE_MINUS_SRC_ALPHA)
  595. GD.ClearColorA(0x80);
  596. GD.Clear();
  597. PAINT_ALPHA();
  598. draw_left_circle();
  599. CLEAR_ALPHA();
  600. draw_right_circle(); //' }alpha1
  601. GD.BlendFunc(DST_ALPHA, ZERO);
  602. GD.Begin(RECTS);
  603. GD.Vertex2ii(0, 0);
  604. GD.Vertex2ii(480, 272);
  605. GD.swap();
  606. GD.cmd_loadimage(0, 0);
  607. GD.load("healsky3.jpg");
  608. GD.cmd_gradient(0, 0, 0x403040,
  609. 0, 272, 0xd8bfd8);
  610. GD.Begin(BITMAPS); //' corners{
  611. GD.Vertex2ii( 52, 50); // left bitmap
  612. GD.ColorMask(0, 0, 0, 1); // only draw A
  613. GD.Clear();
  614. int r = 20; // corner radius
  615. GD.LineWidth(16 * r);
  616. GD.Begin(RECTS);
  617. GD.Vertex2ii(300 + r, 50 + r); // top-left
  618. GD.Vertex2ii(300 + 127 - r, 50 + 127 - r); // bottom-right
  619. GD.ColorMask(1, 1, 1, 0); // draw bitmap
  620. GD.BlendFunc(DST_ALPHA, ONE_MINUS_DST_ALPHA);
  621. GD.Begin(BITMAPS);
  622. GD.Vertex2ii( 300, 50); //' }corners
  623. GD.swap();
  624. GD.Clear();
  625. GD.LineWidth(16 * r);
  626. GD.Begin(RECTS);
  627. GD.Vertex2ii(300 + r, 50 + r); // top-left
  628. GD.Vertex2ii(300 + 127 - r, 50 + 127 - r); // bottom-right
  629. GD.swap();
  630. GD.ColorRGB(0x808080);
  631. GD.cmd_loadimage(0, 0); //' keypad{
  632. GD.load("tree.jpg");
  633. GD.Clear();
  634. GD.ColorMask(1, 1, 1, 0);
  635. GD.Begin(BITMAPS);
  636. GD.Vertex2ii(0, 0);
  637. GD.ColorMask(0, 0, 0, 1);
  638. int x0 = 160, x1 = 240, x2 = 320;
  639. int y0 = 56, y1 = 136, y2 = 216;
  640. button(x0, y0, 1); button(x1, y0, 2); button(x2, y0, 3);
  641. button(x0, y1, 4); button(x1, y1, 5); button(x2, y1, 6);
  642. button(x0, y2, 7); button(x1, y2, 8); button(x2, y2, 9);
  643. GD.ColorMask(1, 1, 1, 1);
  644. GD.ColorRGB(0xffffff);
  645. GD.BlendFunc(DST_ALPHA, ONE_MINUS_DST_ALPHA);
  646. GD.Begin(RECTS);
  647. GD.Vertex2ii(0, 0); GD.Vertex2ii(480, 272); //' }keypad
  648. GD.swap();
  649. GD.cmd_memwrite(0, 8); //' handmade{
  650. static const PROGMEM uint8_t picture[] = {
  651. 0b01110111,
  652. 0b11100010,
  653. 0b11000001,
  654. 0b10100011,
  655. 0b01110111,
  656. 0b00111010,
  657. 0b00011100,
  658. 0b00101110,
  659. };
  660. GD.copy(picture, 8);
  661. GD.BitmapSource(0);
  662. GD.BitmapSize(NEAREST, REPEAT, REPEAT, 480, 272);
  663. GD.BitmapLayout(L1, 1, 8);
  664. GD.Clear();
  665. GD.Begin(BITMAPS);
  666. GD.Vertex2ii(0, 0); //' }handmade
  667. GD.swap();
  668. GD.ColorRGB(176, 224, 230);
  669. GD.Clear();
  670. GD.PointSize(32);
  671. GD.Begin(POINTS);
  672. for (int i = 0; i < 16; i++)
  673. GD.Vertex2f(64 + 16 * i * 7, 64 + i);
  674. GD.swap();
  675. GD.ClearColorRGB(0x103000); //' replace{
  676. GD.Clear();
  677. GD.BlendFunc(SRC_ALPHA, ZERO); // replace operation
  678. GD.cmd_text(240, 136, 31, OPT_CENTER, "Hello world");
  679. GD.swap(); //' }replace
  680. GD.cmd_loadimage(0, 0);
  681. GD.load("healsky3.jpg");
  682. GD.finish();
  683. }
  684. static void button(int x, int y, byte label) //' button{
  685. {
  686. int sz = 18; // button size in pixels
  687. GD.Tag(label);
  688. PAINT_ALPHA();
  689. GD.Begin(RECTS);
  690. GD.LineWidth(16 * 20);
  691. GD.Vertex2ii(x - sz, y - sz);
  692. GD.Vertex2ii(x + sz, y + sz);
  693. CLEAR_ALPHA();
  694. GD.ColorA(200);
  695. /* JCB
  696. GD.ColorA(200);
  697. JCB */
  698. GD.LineWidth(16 * 15);
  699. GD.Vertex2ii(x - sz, y - sz);
  700. GD.Vertex2ii(x + sz, y + sz);
  701. GD.ColorA(0xff);
  702. PAINT_ALPHA();
  703. GD.cmd_number(x, y, 31, OPT_CENTER, label);
  704. } //' }button