BitmapDisplay.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare.
  2. // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines!
  3. //
  4. // Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html
  5. //
  6. // Author: Jean-Marc Zingg
  7. //
  8. // Version: see library.properties
  9. //
  10. // Library: https://github.com/ZinggJM/GxEPD2
  11. //
  12. // Purpose: show uses of GxEPD2_GFX base class for references to a display instance
  13. //
  14. // BitmapDisplay shows the use of the display instance reference as a class member
  15. #include "BitmapDisplay.h"
  16. #if !defined(__AVR) && !defined(_BOARD_GENERIC_STM32F103C_H_)
  17. // note 16.11.2019: the compiler may exclude code based on constant if statements (display.epd2.panel == constant),
  18. // therefore bitmaps may get optimized out by the linker
  19. // but here display.epd2.panel is not known at compile time.
  20. // comment out unused bitmaps to reduce code space used
  21. #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
  22. #include "bitmaps/Bitmaps104x212.h" // 2.13" b/w flexible GDEW0213I5F
  23. #include "bitmaps/Bitmaps128x250.h" // 2.13" b/w
  24. #include "bitmaps/Bitmaps128x296.h" // 2.9" b/w
  25. #include "bitmaps/Bitmaps152x296.h" // 2.6" b/w
  26. #include "bitmaps/Bitmaps176x264.h" // 2.7" b/w
  27. #include "bitmaps/Bitmaps240x416.h" // 3.71" b/w
  28. #include "bitmaps/Bitmaps400x300.h" // 4.2" b/w
  29. #include "bitmaps/Bitmaps640x384.h" // 7.5" b/w
  30. //#include "bitmaps/Bitmaps800x480.h" // 7.5" b/w
  31. // 3-color
  32. #include "bitmaps/Bitmaps3c200x200.h" // 1.54" b/w/r
  33. #include "bitmaps/Bitmaps3c104x212.h" // 2.13" b/w/r
  34. #include "bitmaps/Bitmaps3c128x296.h" // 2.9" b/w/r
  35. #include "bitmaps/Bitmaps3c176x264.h" // 2.7" b/w/r
  36. #include "bitmaps/Bitmaps3c400x300.h" // 4.2" b/w/r
  37. #if defined(ESP8266) || defined(ESP32)
  38. #include "bitmaps/Bitmaps3c800x480.h" // 7.5" b/w/r
  39. #endif
  40. #if defined(ESP32)
  41. #include "bitmaps/WS_Bitmaps800x600.h" // 6.0" grey
  42. #endif
  43. #elif !defined(__AVR) // Sketch too big for AVR
  44. // select only one to fit in code space
  45. #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w
  46. //#include "bitmaps/Bitmaps104x212.h" // 2.13" b/w flexible GDEW0213I5F
  47. //#include "bitmaps/Bitmaps128x250.h" // 2.13" b/w
  48. //#include "bitmaps/Bitmaps128x296.h" // 2.9" b/w
  49. //#include "bitmaps/Bitmaps176x264.h" // 2.7" b/w
  50. ////#include "bitmaps/Bitmaps400x300.h" // 4.2" b/w // not enough code space
  51. ////#include "bitmaps/Bitmaps640x384.h" // 7.5" b/w // not enough code space
  52. // 3-color
  53. //#include "bitmaps/Bitmaps3c200x200.h" // 1.54" b/w/r
  54. //#include "bitmaps/Bitmaps3c104x212.h" // 2.13" b/w/r
  55. //#include "bitmaps/Bitmaps3c128x296.h" // 2.9" b/w/r
  56. //#include "bitmaps/Bitmaps3c176x264.h" // 2.7" b/w/r
  57. ////#include "bitmaps/Bitmaps3c400x300.h" // 4.2" b/w/r // not enough code space
  58. #endif
  59. void BitmapDisplay::drawBitmaps()
  60. {
  61. display.setFullWindow();
  62. #ifdef _GxBitmaps104x212_H_
  63. drawBitmaps104x212();
  64. #endif
  65. #ifdef _GxBitmaps128x250_H_
  66. drawBitmaps128x250();
  67. #endif
  68. #ifdef _GxBitmaps128x296_H_
  69. drawBitmaps128x296();
  70. #endif
  71. #ifdef _GxBitmaps176x264_H_
  72. drawBitmaps176x264();
  73. #endif
  74. #ifdef _GxBitmaps400x300_H_
  75. drawBitmaps400x300();
  76. #endif
  77. #ifdef _GxBitmaps640x384_H_
  78. drawBitmaps640x384();
  79. #endif
  80. #ifdef _GxBitmaps800x480_H_
  81. drawBitmaps800x480();
  82. #endif
  83. #ifdef _WS_Bitmaps800x600_H_
  84. drawBitmaps800x600();
  85. #endif
  86. // 3-color
  87. #ifdef _GxBitmaps3c104x212_H_
  88. drawBitmaps3c104x212();
  89. #endif
  90. #ifdef _GxBitmaps3c128x296_H_
  91. drawBitmaps3c128x296();
  92. #endif
  93. #ifdef _GxBitmaps152x296_H_
  94. drawBitmaps152x296();
  95. #endif
  96. #ifdef _GxBitmaps3c176x264_H_
  97. drawBitmaps3c176x264();
  98. #endif
  99. #ifdef _GxBitmaps240x416_H_
  100. drawBitmaps240x416();
  101. #endif
  102. #ifdef _GxBitmaps3c400x300_H_
  103. drawBitmaps3c400x300();
  104. #endif
  105. #ifdef _GxBitmaps3c800x480_H_
  106. drawBitmaps3c800x480();
  107. #endif
  108. // show these after the specific bitmaps
  109. #ifdef _GxBitmaps200x200_H_
  110. drawBitmaps200x200();
  111. #endif
  112. // 3-color
  113. #ifdef _GxBitmaps3c200x200_H_
  114. drawBitmaps3c200x200();
  115. #endif
  116. }
  117. #ifdef _GxBitmaps200x200_H_
  118. void BitmapDisplay::drawBitmaps200x200()
  119. {
  120. #if defined(ARDUINO_AVR_PRO)
  121. const unsigned char* bitmaps[] =
  122. {
  123. logo200x200
  124. };
  125. #elif defined(__AVR)
  126. const unsigned char* bitmaps[] =
  127. {
  128. logo200x200, first200x200
  129. };
  130. #elif defined(_BOARD_GENERIC_STM32F103C_H_)
  131. const unsigned char* bitmaps[] =
  132. {
  133. logo200x200, first200x200, second200x200, third200x200, fourth200x200, fifth200x200 //, sixth200x200, senventh200x200, eighth200x200
  134. };
  135. #else
  136. const unsigned char* bitmaps[] =
  137. {
  138. logo200x200, first200x200, second200x200, third200x200, fourth200x200, fifth200x200, sixth200x200, senventh200x200, eighth200x200
  139. };
  140. #endif
  141. if ((display.epd2.panel == GxEPD2::GDEP015OC1) || (display.epd2.panel == GxEPD2::GDEH0154D67))
  142. {
  143. bool m = display.mirror(true);
  144. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  145. {
  146. display.firstPage();
  147. do
  148. {
  149. display.fillScreen(GxEPD_WHITE);
  150. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  151. }
  152. while (display.nextPage());
  153. delay(2000);
  154. }
  155. display.mirror(m);
  156. }
  157. //else
  158. {
  159. bool mirror_y = (display.epd2.panel != GxEPD2::GDE0213B1);
  160. display.clearScreen(); // use default for white
  161. int16_t x = (int16_t(display.epd2.WIDTH) - 200) / 2;
  162. int16_t y = (int16_t(display.epd2.HEIGHT) - 200) / 2;
  163. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  164. {
  165. display.drawImage(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
  166. delay(2000);
  167. }
  168. }
  169. bool mirror_y = (display.epd2.panel != GxEPD2::GDE0213B1);
  170. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  171. {
  172. int16_t x = -60;
  173. int16_t y = -60;
  174. for (uint16_t j = 0; j < 10; j++)
  175. {
  176. display.writeScreenBuffer(); // use default for white
  177. display.writeImage(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
  178. display.refresh(true);
  179. if (display.epd2.hasFastPartialUpdate)
  180. {
  181. // for differential update: set previous buffer equal to current buffer in controller
  182. display.epd2.writeScreenBufferAgain(); // use default for white
  183. display.epd2.writeImageAgain(bitmaps[i], x, y, 200, 200, false, mirror_y, true);
  184. }
  185. delay(2000);
  186. x += 40;
  187. y += 40;
  188. if ((x >= int16_t(display.epd2.WIDTH)) || (y >= int16_t(display.epd2.HEIGHT))) break;
  189. }
  190. if (!display.epd2.hasFastPartialUpdate) break; // comment out for full show
  191. break; // comment out for full show
  192. }
  193. display.writeScreenBuffer(); // use default for white
  194. display.writeImage(bitmaps[0], int16_t(0), 0, 200, 200, false, mirror_y, true);
  195. display.writeImage(bitmaps[0], int16_t(int16_t(display.epd2.WIDTH) - 200), int16_t(display.epd2.HEIGHT) - 200, 200, 200, false, mirror_y, true);
  196. display.refresh(true);
  197. delay(2000);
  198. }
  199. #endif
  200. #ifdef _GxBitmaps104x212_H_
  201. void BitmapDisplay::drawBitmaps104x212()
  202. {
  203. #if !defined(__AVR)
  204. const unsigned char* bitmaps[] =
  205. {
  206. WS_Bitmap104x212, Bitmap104x212_1, Bitmap104x212_2, Bitmap104x212_3
  207. };
  208. #else
  209. const unsigned char* bitmaps[] =
  210. {
  211. WS_Bitmap104x212, Bitmap104x212_1, Bitmap104x212_2, Bitmap104x212_3
  212. };
  213. #endif
  214. if (display.epd2.panel == GxEPD2::GDEW0213I5F)
  215. {
  216. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  217. {
  218. display.firstPage();
  219. do
  220. {
  221. display.fillScreen(GxEPD_WHITE);
  222. display.drawBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  223. }
  224. while (display.nextPage());
  225. delay(2000);
  226. }
  227. }
  228. }
  229. #endif
  230. #ifdef _GxBitmaps128x250_H_
  231. void BitmapDisplay::drawBitmaps128x250()
  232. {
  233. #if !defined(__AVR)
  234. const unsigned char* bitmaps[] =
  235. {
  236. Bitmap128x250_1, logo128x250, first128x250, second128x250, third128x250
  237. };
  238. #else
  239. const unsigned char* bitmaps[] =
  240. {
  241. Bitmap128x250_1, logo128x250, first128x250, second128x250, third128x250
  242. };
  243. #endif
  244. if ((display.epd2.panel == GxEPD2::GDE0213B1) || (display.epd2.panel == GxEPD2::GDEH0213B72))
  245. {
  246. bool m = display.mirror(true);
  247. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  248. {
  249. display.firstPage();
  250. do
  251. {
  252. display.fillScreen(GxEPD_WHITE);
  253. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  254. }
  255. while (display.nextPage());
  256. delay(2000);
  257. }
  258. display.mirror(m);
  259. }
  260. }
  261. #endif
  262. #ifdef _GxBitmaps128x296_H_
  263. void BitmapDisplay::drawBitmaps128x296()
  264. {
  265. #if !defined(__AVR)
  266. const unsigned char* bitmaps[] =
  267. {
  268. Bitmap128x296_1, logo128x296, first128x296, second128x296, third128x296
  269. };
  270. #else
  271. const unsigned char* bitmaps[] =
  272. {
  273. Bitmap128x296_1, logo128x296 //, first128x296, second128x296, third128x296
  274. };
  275. #endif
  276. if (display.epd2.panel == GxEPD2::GDEH029A1)
  277. {
  278. bool m = display.mirror(true);
  279. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  280. {
  281. display.firstPage();
  282. do
  283. {
  284. display.fillScreen(GxEPD_WHITE);
  285. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  286. }
  287. while (display.nextPage());
  288. delay(2000);
  289. }
  290. display.mirror(m);
  291. }
  292. }
  293. #endif
  294. #ifdef _GxBitmaps152x296_H_
  295. void BitmapDisplay::drawBitmaps152x296()
  296. {
  297. #if !defined(__AVR)
  298. const unsigned char* bitmaps[] =
  299. {
  300. Bitmap152x296_1, Bitmap152x296_2, Bitmap152x296_3
  301. };
  302. #else
  303. const unsigned char* bitmaps[] =
  304. {
  305. Bitmap152x296_1, Bitmap152x296_2, Bitmap152x296_3
  306. };
  307. #endif
  308. if (display.epd2.panel == GxEPD2::GDEW026T0)
  309. {
  310. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  311. {
  312. display.firstPage();
  313. do
  314. {
  315. display.fillScreen(GxEPD_WHITE);
  316. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  317. }
  318. while (display.nextPage());
  319. delay(2000);
  320. }
  321. }
  322. }
  323. #endif
  324. #ifdef _GxBitmaps176x264_H_
  325. void BitmapDisplay::drawBitmaps176x264()
  326. {
  327. #if !defined(__AVR)
  328. const unsigned char* bitmaps[] =
  329. {
  330. Bitmap176x264_1, Bitmap176x264_2, Bitmap176x264_3, Bitmap176x264_4, Bitmap176x264_5
  331. };
  332. #else
  333. const unsigned char* bitmaps[] =
  334. {
  335. Bitmap176x264_1, Bitmap176x264_2 //, Bitmap176x264_3, Bitmap176x264_4, Bitmap176x264_5
  336. };
  337. #endif
  338. if (display.epd2.panel == GxEPD2::GDEW027W3)
  339. {
  340. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  341. {
  342. display.firstPage();
  343. do
  344. {
  345. display.fillScreen(GxEPD_WHITE);
  346. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  347. }
  348. while (display.nextPage());
  349. delay(2000);
  350. }
  351. }
  352. }
  353. #endif
  354. #ifdef _GxBitmaps240x416_H_
  355. void BitmapDisplay::drawBitmaps240x416()
  356. {
  357. #if !defined(__AVR)
  358. const unsigned char* bitmaps[] =
  359. {
  360. Bitmap240x416_1, Bitmap240x416_2, Bitmap240x416_3
  361. };
  362. #else
  363. const unsigned char* bitmaps[] =
  364. {
  365. Bitmap240x460_1, Bitmap240x460_2, Bitmap240x460_3
  366. };
  367. #endif
  368. if (display.epd2.panel == GxEPD2::GDEW0371W7)
  369. {
  370. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  371. {
  372. display.firstPage();
  373. do
  374. {
  375. display.fillScreen(GxEPD_WHITE);
  376. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  377. }
  378. while (display.nextPage());
  379. delay(2000);
  380. }
  381. }
  382. }
  383. #endif
  384. #ifdef _GxBitmaps400x300_H_
  385. void BitmapDisplay::drawBitmaps400x300()
  386. {
  387. #if !defined(__AVR)
  388. const unsigned char* bitmaps[] =
  389. {
  390. Bitmap400x300_1, Bitmap400x300_2
  391. };
  392. #else
  393. const unsigned char* bitmaps[] = {}; // not enough code space
  394. #endif
  395. if (display.epd2.panel == GxEPD2::GDEW042T2)
  396. {
  397. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  398. {
  399. display.firstPage();
  400. do
  401. {
  402. display.fillScreen(GxEPD_WHITE);
  403. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  404. }
  405. while (display.nextPage());
  406. delay(2000);
  407. }
  408. }
  409. }
  410. #endif
  411. #ifdef _GxBitmaps640x384_H_
  412. void BitmapDisplay::drawBitmaps640x384()
  413. {
  414. #if !defined(__AVR)
  415. const unsigned char* bitmaps[] =
  416. {
  417. Bitmap640x384_1, Bitmap640x384_2
  418. };
  419. #else
  420. const unsigned char* bitmaps[] = {}; // not enough code space
  421. #endif
  422. if ((display.epd2.panel == GxEPD2::GDEW075T8) || (display.epd2.panel == GxEPD2::GDEW075Z09))
  423. {
  424. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  425. {
  426. display.firstPage();
  427. do
  428. {
  429. display.fillScreen(GxEPD_WHITE);
  430. display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  431. }
  432. while (display.nextPage());
  433. delay(2000);
  434. }
  435. }
  436. }
  437. #endif
  438. #ifdef _GxBitmaps800x480_H_
  439. void BitmapDisplay::drawBitmaps800x480()
  440. {
  441. #if !defined(__AVR)
  442. const unsigned char* bitmaps[] =
  443. {
  444. Bitmap800x480_1, Bitmap800x480_2, Bitmap800x480_3, Bitmap800x480_4
  445. };
  446. #else
  447. const unsigned char* bitmaps[] = {}; // not enough code space
  448. #endif
  449. if ((display.epd2.panel == GxEPD2::GDEW075T7) || (display.epd2.panel == GxEPD2::GDEW075Z08))
  450. {
  451. for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++)
  452. {
  453. display.firstPage();
  454. do
  455. {
  456. display.fillScreen(GxEPD_WHITE);
  457. //display.drawInvertedBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  458. display.drawBitmap(0, 0, bitmaps[i], display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  459. }
  460. while (display.nextPage());
  461. delay(2000);
  462. }
  463. if (display.epd2.panel == GxEPD2::GDEW075T7)
  464. {
  465. // avoid ghosting caused by OTP waveform
  466. display.clearScreen();
  467. display.refresh(false); // full update
  468. }
  469. }
  470. }
  471. #endif
  472. #ifdef _WS_Bitmaps800x600_H_
  473. void BitmapDisplay::drawBitmaps800x600()
  474. {
  475. #if defined(ESP8266) || defined(ESP32)
  476. if (display.epd2.panel == GxEPD2::ED060SCT)
  477. {
  478. // Serial.print("sizeof(WS_zoo_800x600) is "); Serial.println(sizeof(WS_zoo_800x600));
  479. display.drawNative(WS_zoo_800x600, 0, 0, 0, 800, 600, false, false, true);
  480. delay(2000);
  481. // Serial.print("sizeof(WS_pic_1200x825) is "); Serial.println(sizeof(WS_pic_1200x825));
  482. // display.drawNative((const uint8_t*)WS_pic_1200x825, 0, 0, 0, 1200, 825, false, false, true);
  483. // delay(2000);
  484. // Serial.print("sizeof(WS_acaa_1024x731) is "); Serial.println(sizeof(WS_acaa_1024x731));
  485. // display.drawNative(WS_acaa_1024x731, 0, 0, 0, 1024, 731, false, false, true);
  486. // delay(2000);
  487. }
  488. #endif
  489. }
  490. #endif
  491. struct bitmap_pair
  492. {
  493. const unsigned char* black;
  494. const unsigned char* red;
  495. };
  496. #ifdef _GxBitmaps3c200x200_H_
  497. void BitmapDisplay::drawBitmaps3c200x200()
  498. {
  499. bitmap_pair bitmap_pairs[] =
  500. {
  501. //{Bitmap3c200x200_black, Bitmap3c200x200_red},
  502. {WS_Bitmap3c200x200_black, WS_Bitmap3c200x200_red}
  503. };
  504. if (display.epd2.panel == GxEPD2::GDEW0154Z04)
  505. {
  506. display.firstPage();
  507. do
  508. {
  509. display.fillScreen(GxEPD_WHITE);
  510. // Bitmap3c200x200_black has 2 bits per pixel
  511. // taken from Adafruit_GFX.cpp, modified
  512. int16_t byteWidth = (display.epd2.WIDTH + 7) / 8; // Bitmap scanline pad = whole byte
  513. uint8_t byte = 0;
  514. for (int16_t j = 0; j < display.epd2.HEIGHT; j++)
  515. {
  516. for (int16_t i = 0; i < display.epd2.WIDTH; i++)
  517. {
  518. if (i & 3) byte <<= 2;
  519. else
  520. {
  521. #if defined(__AVR) || defined(ESP8266) || defined(ESP32)
  522. byte = pgm_read_byte(&Bitmap3c200x200_black[j * byteWidth * 2 + i / 4]);
  523. #else
  524. byte = Bitmap3c200x200_black[j * byteWidth * 2 + i / 4];
  525. #endif
  526. }
  527. if (!(byte & 0x80))
  528. {
  529. display.drawPixel(i, j, GxEPD_BLACK);
  530. }
  531. }
  532. }
  533. display.drawInvertedBitmap(0, 0, Bitmap3c200x200_red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  534. }
  535. while (display.nextPage());
  536. delay(2000);
  537. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  538. {
  539. display.firstPage();
  540. do
  541. {
  542. display.fillScreen(GxEPD_WHITE);
  543. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].black, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  544. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  545. }
  546. while (display.nextPage());
  547. delay(2000);
  548. }
  549. }
  550. if (display.epd2.hasColor)
  551. {
  552. display.clearScreen(); // use default for white
  553. int16_t x = (int16_t(display.epd2.WIDTH) - 200) / 2;
  554. int16_t y = (int16_t(display.epd2.HEIGHT) - 200) / 2;
  555. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  556. {
  557. display.drawImage(bitmap_pairs[i].black, bitmap_pairs[i].red, x, y, 200, 200, false, false, true);
  558. delay(2000);
  559. }
  560. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  561. {
  562. int16_t x = -60;
  563. int16_t y = -60;
  564. for (uint16_t j = 0; j < 10; j++)
  565. {
  566. display.writeScreenBuffer(); // use default for white
  567. display.writeImage(bitmap_pairs[i].black, bitmap_pairs[i].red, x, y, 200, 200, false, false, true);
  568. display.refresh();
  569. delay(1000);
  570. x += 40;
  571. y += 40;
  572. if ((x >= int16_t(display.epd2.WIDTH)) || (y >= int16_t(display.epd2.HEIGHT))) break;
  573. }
  574. }
  575. display.writeScreenBuffer(); // use default for white
  576. display.writeImage(bitmap_pairs[0].black, bitmap_pairs[0].red, 0, 0, 200, 200, false, false, true);
  577. display.writeImage(bitmap_pairs[0].black, bitmap_pairs[0].red, int16_t(display.epd2.WIDTH) - 200, int16_t(display.epd2.HEIGHT) - 200, 200, 200, false, false, true);
  578. display.refresh();
  579. delay(2000);
  580. }
  581. }
  582. #endif
  583. #ifdef _GxBitmaps3c104x212_H_
  584. void BitmapDisplay::drawBitmaps3c104x212()
  585. {
  586. #if !defined(__AVR)
  587. bitmap_pair bitmap_pairs[] =
  588. {
  589. {Bitmap3c104x212_1_black, Bitmap3c104x212_1_red},
  590. {Bitmap3c104x212_2_black, Bitmap3c104x212_2_red},
  591. {WS_Bitmap3c104x212_black, WS_Bitmap3c104x212_red}
  592. };
  593. #else
  594. bitmap_pair bitmap_pairs[] =
  595. {
  596. {Bitmap3c104x212_1_black, Bitmap3c104x212_1_red},
  597. //{Bitmap3c104x212_2_black, Bitmap3c104x212_2_red},
  598. {WS_Bitmap3c104x212_black, WS_Bitmap3c104x212_red}
  599. };
  600. #endif
  601. if (display.epd2.panel == GxEPD2::GDEW0213Z16)
  602. {
  603. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  604. {
  605. display.firstPage();
  606. do
  607. {
  608. display.fillScreen(GxEPD_WHITE);
  609. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].black, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  610. if (bitmap_pairs[i].red == WS_Bitmap3c104x212_red)
  611. {
  612. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  613. }
  614. else display.drawBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  615. }
  616. while (display.nextPage());
  617. delay(2000);
  618. }
  619. }
  620. }
  621. #endif
  622. #ifdef _GxBitmaps3c128x296_H_
  623. void BitmapDisplay::drawBitmaps3c128x296()
  624. {
  625. #if !defined(__AVR)
  626. bitmap_pair bitmap_pairs[] =
  627. {
  628. {Bitmap3c128x296_1_black, Bitmap3c128x296_1_red},
  629. {Bitmap3c128x296_2_black, Bitmap3c128x296_2_red},
  630. {WS_Bitmap3c128x296_black, WS_Bitmap3c128x296_red}
  631. };
  632. #else
  633. bitmap_pair bitmap_pairs[] =
  634. {
  635. //{Bitmap3c128x296_1_black, Bitmap3c128x296_1_red},
  636. //{Bitmap3c128x296_2_black, Bitmap3c128x296_2_red},
  637. {WS_Bitmap3c128x296_black, WS_Bitmap3c128x296_red}
  638. };
  639. #endif
  640. if (display.epd2.panel == GxEPD2::GDEW029Z10)
  641. {
  642. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  643. {
  644. display.firstPage();
  645. do
  646. {
  647. display.fillScreen(GxEPD_WHITE);
  648. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].black, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  649. if (bitmap_pairs[i].red == WS_Bitmap3c128x296_red)
  650. {
  651. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  652. }
  653. else display.drawBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  654. }
  655. while (display.nextPage());
  656. delay(2000);
  657. }
  658. }
  659. }
  660. #endif
  661. #ifdef _GxBitmaps3c176x264_H_
  662. void BitmapDisplay::drawBitmaps3c176x264()
  663. {
  664. bitmap_pair bitmap_pairs[] =
  665. {
  666. {Bitmap3c176x264_black, Bitmap3c176x264_red}
  667. };
  668. if (display.epd2.panel == GxEPD2::GDEW027C44)
  669. {
  670. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  671. {
  672. display.firstPage();
  673. do
  674. {
  675. display.fillScreen(GxEPD_WHITE);
  676. display.drawBitmap(0, 0, bitmap_pairs[i].black, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  677. display.drawBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  678. }
  679. while (display.nextPage());
  680. delay(2000);
  681. }
  682. }
  683. }
  684. #endif
  685. #ifdef _GxBitmaps3c400x300_H_
  686. void BitmapDisplay::drawBitmaps3c400x300()
  687. {
  688. #if !defined(__AVR)
  689. bitmap_pair bitmap_pairs[] =
  690. {
  691. {Bitmap3c400x300_1_black, Bitmap3c400x300_1_red},
  692. {Bitmap3c400x300_2_black, Bitmap3c400x300_2_red},
  693. {WS_Bitmap3c400x300_black, WS_Bitmap3c400x300_red}
  694. };
  695. #else
  696. bitmap_pair bitmap_pairs[] = {}; // not enough code space
  697. #endif
  698. if (display.epd2.panel == GxEPD2::GDEW042Z15)
  699. {
  700. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  701. {
  702. display.firstPage();
  703. do
  704. {
  705. display.fillScreen(GxEPD_WHITE);
  706. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].black, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  707. display.drawInvertedBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  708. }
  709. while (display.nextPage());
  710. delay(2000);
  711. }
  712. }
  713. }
  714. #endif
  715. #ifdef _GxBitmaps3c800x480_H_
  716. void BitmapDisplay::drawBitmaps3c800x480()
  717. {
  718. #if !defined(__AVR)
  719. bitmap_pair bitmap_pairs[] =
  720. {
  721. {Bitmap3c800x480_1_black, Bitmap3c800x480_1_red}
  722. };
  723. #else
  724. bitmap_pair bitmap_pairs[] = {}; // not enough code space
  725. #endif
  726. if (display.epd2.panel == GxEPD2::GDEW075Z08)
  727. {
  728. for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
  729. {
  730. display.firstPage();
  731. do
  732. {
  733. display.fillScreen(GxEPD_WHITE);
  734. display.drawBitmap(0, 0, bitmap_pairs[i].black, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_BLACK);
  735. display.drawBitmap(0, 0, bitmap_pairs[i].red, display.epd2.WIDTH, display.epd2.HEIGHT, GxEPD_RED);
  736. }
  737. while (display.nextPage());
  738. delay(2000);
  739. }
  740. }
  741. }
  742. #endif