#include #include #include #define PYTHAG_HANDLE 0 #define GAUSS_HANDLE 1 #define ASSETS_END 1024UL static const PROGMEM uint8_t __assets[927] = { 0, 0, 0, 5, 0, 0, 0, 1, 1, 0, 0, 8, 1, 0, 28, 7, 1, 0, 0, 5, 0, 2, 0, 1, 1, 0, 0, 8, 1, 0, 28, 7, 34, 255, 255, 255, 0, 0, 0, 0, 120, 218, 99, 96, 96, 100, 98, 102, 97, 101, 99, 231, 224, 228, 226, 230, 225, 229, 227, 23, 16, 20, 18, 22, 17, 21, 21, 19, 151, 144, 148, 146, 150, 145, 149, 149, 147, 87, 80, 84, 82, 86, 86, 81, 85, 83, 215, 208, 208, 212, 210, 214, 209, 213, 213, 211, 55, 48, 48, 52, 50, 54, 49, 49, 53, 51, 55, 183, 176, 180, 178, 178, 182, 177, 181, 181, 179, 183, 119, 112, 116, 116, 114, 118, 113, 113, 117, 115, 115, 247, 240, 240, 244, 242, 242, 246, 246, 241, 245, 245, 243, 247, 15, 8, 8, 12, 10, 10, 14, 14, 9, 13, 13, 11, 11, 15, 143, 136, 136, 140, 138, 138, 142, 142, 137, 137, 141, 141, 139, 139, 143, 79, 72, 72, 76, 76, 74, 74, 78, 78, 73, 73, 73, 77, 77, 75, 75, 79, 207, 200, 200, 200, 204, 204, 202, 202, 202, 206, 206, 201, 201, 201, 205, 205, 203, 203, 203, 207, 207, 47, 40, 40, 40, 44, 44, 44, 42, 42, 42, 46, 46, 46, 1, 130, 210, 210, 210, 50, 32, 40, 7, 130, 10, 32, 168, 4, 129, 42, 16, 168, 6, 131, 26, 48, 168, 133, 130, 58, 36, 80, 79, 0, 32, 171, 133, 233, 135, 152, 6, 49, 25, 108, 9, 216, 58, 144, 189, 32, 251, 65, 238, 0, 58, 7, 228, 42, 160, 227, 128, 78, 4, 58, 20, 232, 92, 160, 163, 129, 78, 207, 205, 5, 122, 34, 59, 27, 232, 157, 204, 76, 160, 199, 210, 211, 211, 210, 82, 83, 129, 94, 77, 78, 78, 74, 74, 76, 76, 72, 136, 143, 143, 139, 139, 141, 141, 137, 137, 142, 142, 138, 138, 140, 136, 8, 15, 15, 11, 11, 13, 13, 9, 14, 14, 10, 10, 12, 8, 240, 247, 247, 243, 245, 245, 241, 246, 246, 242, 242, 244, 240, 112, 119, 115, 115, 117, 113, 113, 118, 114, 116, 116, 176, 183, 183, 179, 181, 181, 177, 182, 178, 178, 180, 48, 55, 55, 51, 53, 49, 49, 54, 50, 52, 48, 208, 215, 211, 213, 213, 209, 214, 210, 212, 208, 80, 87, 83, 85, 81, 86, 86, 82, 84, 144, 151, 147, 149, 149, 145, 150, 146, 148, 16, 23, 19, 21, 21, 17, 22, 18, 20, 224, 231, 227, 229, 225, 230, 226, 228, 96, 103, 99, 101, 97, 102, 98, 100, 96, 136, 141, 3, 197, 0, 40, 252, 65, 129, 15, 10, 249, 108, 80, 160, 231, 3, 131, 187, 168, 24, 24, 204, 101, 229, 192, 192, 173, 170, 174, 1, 6, 98, 125, 67, 99, 83, 115, 115, 75, 107, 91, 123, 71, 71, 103, 87, 119, 79, 111, 111, 95, 255, 132, 137, 147, 38, 79, 158, 50, 117, 218, 244, 25, 51, 103, 206, 154, 61, 103, 238, 188, 249, 243, 23, 44, 92, 180, 120, 201, 210, 165, 203, 150, 175, 88, 185, 106, 245, 234, 53, 107, 215, 173, 223, 176, 97, 227, 166, 205, 91, 182, 110, 221, 182, 125, 199, 206, 93, 187, 118, 239, 217, 187, 111, 223, 254, 3, 7, 15, 29, 58, 124, 228, 232, 177, 99, 199, 79, 156, 60, 121, 234, 244, 153, 51, 103, 207, 157, 63, 127, 225, 226, 165, 75, 151, 175, 92, 185, 122, 237, 250, 245, 27, 55, 111, 222, 186, 125, 251, 206, 221, 187, 247, 238, 223, 127, 240, 224, 225, 163, 71, 143, 31, 63, 121, 250, 244, 217, 179, 231, 47, 94, 188, 124, 249, 234, 213, 235, 215, 111, 222, 188, 125, 251, 238, 221, 251, 247, 31, 62, 124, 252, 248, 241, 211, 167, 207, 159, 191, 124, 249, 242, 245, 235, 215, 111, 223, 190, 127, 255, 254, 3, 8, 126, 254, 252, 249, 11, 8, 126, 3, 193, 31, 16, 248, 11, 1, 255, 80, 193, 255, 255, 104, 2, 80, 101, 96, 45, 32, 189, 32, 51, 128, 70, 129, 76, 4, 26, 252, 237, 27, 208, 10, 160, 69, 159, 63, 127, 250, 4, 180, 246, 195, 135, 247, 239, 223, 189, 123, 251, 246, 205, 155, 215, 175, 95, 189, 122, 249, 242, 197, 139, 231, 207, 158, 61, 125, 250, 228, 241, 227, 71, 143, 30, 62, 120, 112, 255, 254, 189, 187, 119, 239, 220, 190, 125, 235, 230, 205, 27, 215, 175, 95, 187, 122, 229, 202, 229, 75, 151, 46, 94, 56, 127, 254, 220, 217, 51, 103, 78, 159, 58, 121, 242, 196, 241, 99, 199, 142, 30, 57, 124, 232, 208, 193, 3, 251, 247, 237, 219, 187, 103, 247, 174, 93, 59, 119, 108, 223, 182, 117, 235, 150, 205, 155, 54, 110, 216, 176, 126, 221, 218, 53, 171, 87, 175, 90, 185, 98, 249, 178, 165, 75, 151, 44, 94, 180, 112, 193, 252, 249, 243, 230, 206, 153, 61, 107, 230, 204, 25, 211, 167, 77, 157, 50, 121, 242, 164, 137, 19, 250, 251, 122, 123, 123, 186, 187, 58, 59, 58, 218, 219, 90, 91, 154, 155, 155, 26, 27, 128, 137, 184, 182, 166, 26, 152, 74, 43, 202, 129, 41, 179, 164, 24, 152, 34, 11, 242, 65, 73, 49, 27, 148, 10, 65, 73, 16, 148, 254, 64, 169, 47, 46, 22, 0, 212, 3, 36, 81 }; #define LOAD_ASSETS() (GD.copy(__assets, sizeof(__assets)), GD.loadptr = ASSETS_END) void setup() { GD.begin(); LOAD_ASSETS(); GD.BitmapHandle(PYTHAG_HANDLE); GD.BitmapSize(BILINEAR, REPEAT, REPEAT, GD.w, GD.h); GD.BitmapHandle(GAUSS_HANDLE); GD.BitmapSize(BILINEAR, REPEAT, REPEAT, GD.w, GD.h); } // Set the bitmap transform for horizonal (dir=0) or vertical (dir=1) void align(int dir, int w, int h) { GD.cmd32(0xffffff21UL); // bitmap transform GD.cmd32( 0); GD.cmd32( 0); GD.cmd32( w); GD.cmd32( 0); GD.cmd32( 0); GD.cmd32( h); GD.cmd32(0); GD.cmd32(0); if (dir == 0) { GD.cmd32(511); GD.cmd32(0); GD.cmd32(0); GD.cmd32(511); } else { GD.cmd32(0); GD.cmd32(511); GD.cmd32(511); GD.cmd32(0); } GD.cmd32(0); } void circular(int x0, int y0, int x1, int y1, uint32_t c0, uint32_t c1) { int handle = GAUSS_HANDLE; GD.SaveContext(); GD.Begin(BITMAPS); int w = x1 - x0; int h = y1 - y0; GD.ScissorXY(x0, y0); GD.ScissorSize(w, h); GD.ColorMask(0, 0, 0, 1); // Only touch the alpha channel GD.BitmapHandle(handle); GD.BlendFunc(ONE, ZERO); // Draw the X bitmap into alpha align(0, w, h); GD.Vertex2f(PIXELS(x0), PIXELS(y0)); if (handle == PYTHAG_HANDLE) GD.BlendFunc(ONE, ONE); // For pythagorean, want alpha addition else GD.BlendFunc(DST_ALPHA, ZERO); // But for Gaussian, multiplication align(1, w, h); // Blend the Y bitmap into alpha GD.Vertex2f(PIXELS(x0), PIXELS(y0)); GD.ColorMask(1, 1, 1, 0); // Now use the alpha buffer GD.Begin(RECTS); GD.ColorRGB(c0); GD.BlendFunc(ONE, ZERO); GD.Vertex2f(PIXELS(x0), PIXELS(y0)); GD.Vertex2f(PIXELS(x1), PIXELS(y1)); GD.ColorRGB(c1); GD.BlendFunc(DST_ALPHA, ONE_MINUS_DST_ALPHA); GD.Vertex2f(PIXELS(x0), PIXELS(y0)); GD.Vertex2f(PIXELS(x1), PIXELS(y1)); GD.RestoreContext(); } uint32_t rand32() { return ((uint32_t)GD.random() << 16) ^ GD.random(); } void loop1() { GD.Clear(); for (int y = 0; y < GD.h; y += 55) for (int x = 0; x < GD.w; x += 96) circular(x, y, x + 90, y + 50, rand32(), rand32()); GD.swap(); } void loop2() { circular(0, 0, GD.w, GD.h, 0x772b55, 0xef8619); GD.cmd_text(GD.w / 2, GD.h / 2, 31, OPT_CENTER, "Hello world"); GD.swap(); } void loop() { loop2(); }