summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2004-05-19 08:21:30 +0000
committerJens Arnold <amiconn@rockbox.org>2004-05-19 08:21:30 +0000
commite4c1667979b9c320b1e24acb6c5db84711b3862e (patch)
tree11f90400047c65f44254462ea36e0b32510ba2f8 /apps
parenta05c41377469f52fc8c76494c1e9d8d5a2094f9a (diff)
Grayscale demo plugin, now using the grayscale library
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4642 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/grayscale.c259
1 files changed, 259 insertions, 0 deletions
diff --git a/apps/plugins/grayscale.c b/apps/plugins/grayscale.c
new file mode 100644
index 0000000000..0231541761
--- /dev/null
+++ b/apps/plugins/grayscale.c
@@ -0,0 +1,259 @@
+/***************************************************************************
+* __________ __ ___.
+* Open \______ \ ____ ____ | | _\_ |__ _______ ___
+* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+* \/ \/ \/ \/ \/
+* $Id$
+*
+* Grayscale demo plugin
+*
+* Copyright (C) 2004 Jens Arnold
+*
+* All files in this archive are subject to the GNU General Public License.
+* See the file COPYING in the source tree root for full license agreement.
+*
+* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+* KIND, either express or implied.
+*
+****************************************************************************/
+
+#ifndef SIMULATOR /* not for simulator by now */
+#include "plugin.h"
+
+#ifdef HAVE_LCD_BITMAP /* and also not for the Player */
+#include "gray.h"
+
+/******************************* Globals ***********************************/
+
+static struct plugin_api* rb; /* global api struct pointer */
+static char pbuf[32]; /* global printf buffer */
+static unsigned char *gbuf;
+static unsigned int gbuf_size = 0;
+
+/**************************** main function ********************************/
+
+/* this is only a demo of what the framework can do */
+int main(void)
+{
+ int shades, time;
+ int x, y, i;
+ int button, scroll_amount;
+ bool black_border;
+
+ static unsigned char rockbox[] = {
+ /* ...........................................
+ * .####...###...###..#...#.####...###..#...#.
+ * .#...#.#...#.#...#.#..#..#...#.#...#..#.#..
+ * .####..#...#.#.....###...####..#...#...#...
+ * .#..#..#...#.#...#.#..#..#...#.#...#..#.#..
+ * .#...#..###...###..#...#.####...###..#...#.
+ * ...........................................
+ * 43 x 7 pixel, 1 bpp
+ */
+ 0x00, 0x3E, 0x0A, 0x0A, 0x1A, 0x24, 0x00, 0x1C, 0x22, 0x22,
+ 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x14, 0x00, 0x3E,
+ 0x08, 0x08, 0x14, 0x22, 0x00, 0x3E, 0x2A, 0x2A, 0x2A, 0x14,
+ 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x22, 0x14, 0x08,
+ 0x14, 0x22, 0x00
+ };
+
+ static unsigned char showing[] = {
+ /* .......................................
+ * ..####.#...#..###..#...#.#.#...#..####.
+ * .#.....#...#.#...#.#...#.#.##..#.#.....
+ * ..###..#####.#...#.#.#.#.#.#.#.#.#..##.
+ * .....#.#...#.#...#.#.#.#.#.#..##.#...#.
+ * .####..#...#..###...#.#..#.#...#..####.
+ * .......................................
+ * 39 x 7 pixel, 1 bpp
+ */
+ 0x00, 0x24, 0x2A, 0x2A, 0x2A, 0x12, 0x00, 0x3E, 0x08, 0x08,
+ 0x08, 0x3E, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x1E,
+ 0x20, 0x18, 0x20, 0x1E, 0x00, 0x3E, 0x00, 0x3E, 0x04, 0x08,
+ 0x10, 0x3E, 0x00, 0x1C, 0x22, 0x22, 0x2A, 0x3A, 0x00
+ };
+
+ static unsigned char grayscale_gray[] = {
+ /* .......................................................
+ * ..####.####...###..#...#..####..###...###..#.....#####.
+ * .#.....#...#.#...#.#...#.#.....#...#.#...#.#.....#.....
+ * .#..##.####..#####..#.#...###..#.....#####.#.....####..
+ * .#...#.#..#..#...#...#.......#.#...#.#...#.#.....#.....
+ * ..####.#...#.#...#...#...####...###..#...#.#####.#####.
+ * .......................................................
+ * 55 x 7 pixel, 8 bpp
+ */
+ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110,110,110,110,110,
+ 120,120, 20, 20, 20, 20,120,222,222,222,222,120,120,120, 24, 24,
+ 24,120,120,226,120,120,120,226,120,120, 28, 28, 28, 28,120,120,
+ 230,230,230,120,120,120, 32, 32, 32,120,120,234,120,120,120,120,
+ 120, 36, 36, 36, 36, 36,120,
+ 130, 20,130,130,130,130,130,222,130,130,130,222,130, 24,130,130,
+ 130, 24,130,226,130,130,130,226,130, 28,130,130,130,130,130,230,
+ 130,130,130,230,130, 32,130,130,130, 32,130,234,130,130,130,130,
+ 130, 36,130,130,130,130,130,
+ 140, 20,140,140, 20, 20,140,222,222,222,222,140,140, 24, 24, 24,
+ 24, 24,140,140,226,140,226,140,140,140, 28, 28, 28,140,140,230,
+ 140,140,140,140,140, 32, 32, 32, 32, 32,140,234,140,140,140,140,
+ 140, 36, 36, 36, 36,140,140,
+ 130, 20,130,130,130, 20,130,222,130,130,222,130,130, 24,130,130,
+ 130, 24,130,130,130,226,130,130,130,130,130,130,130, 28,130,230,
+ 130,130,130,230,130, 32,130,130,130, 32,130,234,130,130,130,130,
+ 130, 36,130,130,130,130,130,
+ 120,120, 20, 20, 20, 20,120,222,120,120,120,222,120, 24,120,120,
+ 120, 24,120,120,120,226,120,120,120, 28, 28, 28, 28,120,120,120,
+ 230,230,230,120,120, 32,120,120,120, 32,120,234,234,234,234,234,
+ 120, 36, 36, 36, 36, 36,120,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
+ 110,110,110,110,110,110,110
+ };
+
+ if (rb->global_settings->backlight_timeout > 0)
+ rb->backlight_set_timeout(1); /* keep the light on */
+
+ rb->lcd_setfont(FONT_SYSFIXED); /* select default font */
+
+ /* get the remainder of the plugin buffer */
+ gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size);
+
+ /* initialize the grayscale buffer:
+ * 112 pixels wide, 7 rows (56 pixels) high, (try to) reserve
+ * 32 bitplanes for 33 shades of gray. (uses 25268 bytes)*/
+ shades = gray_init_buffer(gbuf, gbuf_size, 112, 7, 32) + 1;
+
+ /* place grayscale overlay 1 row down */
+ gray_position_display(0, 1);
+
+ rb->snprintf(pbuf, sizeof(pbuf), "Shades: %d", shades);
+ rb->lcd_puts(0, 0, pbuf);
+ rb->lcd_update();
+
+ gray_show_display(true); /* switch on grayscale overlay */
+
+ time = *rb->current_tick; /* start time measurement */
+
+ gray_fillrect(0, 0, 111, 55, 150); /* fill everything with gray 150 */
+
+ /* draw a dark gray line star background */
+ for (y = 0; y < 56; y += 8) /* horizontal part */
+ {
+ gray_drawline(0, y, 111, 55 - y, 80); /* gray lines */
+ }
+ for (x = 10; x < 112; x += 10) /* vertical part */
+ {
+ gray_drawline(x, 0, 111 - x, 55, 80); /* gray lines */
+ }
+
+ gray_drawrect(0, 0, 111, 55, 0); /* black border */
+
+ /* draw gray tones */
+ for (i = 0; i < 86; i++)
+ {
+ x = 13 + i;
+ gray_fillrect(x, 6, x, 49, 3 * i); /* gray rectangles */
+ }
+
+ gray_invertrect(13, 29, 98, 49); /* invert rectangle (lower half) */
+ gray_invertline(13, 27, 98, 27); /* invert a line */
+
+ /* show bitmaps (1 bit and 8 bit) */
+ gray_drawbitmap(rockbox, 14, 13, 43, 7, 43, true, 255, 100); /* opaque */
+ gray_drawbitmap(showing, 58, 13, 39, 7, 39, false, 0, 0); /* transparent */
+ gray_drawgraymap(grayscale_gray, 28, 35, 55, 7, 55);
+
+ time = *rb->current_tick - time; /* end time measurement */
+
+ rb->snprintf(pbuf, sizeof(pbuf), "Shades: %d, %d.%02ds", shades,
+ time / 100, time % 100);
+ rb->lcd_puts(0, 0, pbuf);
+ gray_deferred_update(); /* schedule an lcd_update() */
+
+ /* drawing is now finished, play around with scrolling
+ * until you press OFF or connect USB
+ */
+ while (true)
+ {
+ scroll_amount = 1;
+ black_border = false;
+
+ button = rb->button_get(true);
+
+ if (button == SYS_USB_CONNECTED)
+ {
+ gray_release_buffer(); /* switch off overlay and deinitialize */
+ /* restore normal backlight setting */
+ rb->backlight_set_timeout(rb->global_settings->backlight_timeout);
+ return PLUGIN_USB_CONNECTED;
+ }
+
+ if (button & BUTTON_ON)
+ black_border = true;
+
+ if (button & BUTTON_REPEAT)
+ scroll_amount = 4;
+
+ switch(button & ~(BUTTON_ON | BUTTON_REPEAT))
+ {
+ case BUTTON_LEFT:
+
+ gray_scroll_left(scroll_amount, black_border); /* scroll left */
+ break;
+
+ case BUTTON_RIGHT:
+
+ gray_scroll_right(scroll_amount, black_border); /* scroll right */
+ break;
+
+ case BUTTON_UP:
+
+ gray_scroll_up(scroll_amount, black_border); /* scroll up */
+ break;
+
+ case BUTTON_DOWN:
+
+ gray_scroll_down(scroll_amount, black_border); /* scroll down */
+ break;
+
+ case BUTTON_OFF:
+
+ gray_release_buffer(); /* switch off overlay and deinitialize */
+ /* restore normal backlight setting */
+ rb->backlight_set_timeout(rb->global_settings->backlight_timeout);
+ return PLUGIN_OK;
+ }
+ }
+}
+
+/*************************** Plugin entry point ****************************/
+
+enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
+{
+ int ret;
+ /* this macro should be called as the first thing you do in the plugin.
+ it test that the api version and model the plugin was compiled for
+ matches the machine it is running on */
+ TEST_PLUGIN_API(api);
+
+ rb = api; // copy to global api pointer
+ (void)parameter;
+
+ /* This plugin uses the grayscale framework, so initialize */
+ gray_init(api);
+
+ ret = main();
+
+ if (ret == PLUGIN_USB_CONNECTED)
+ rb->usb_screen();
+ return ret;
+}
+
+#endif // #ifdef HAVE_LCD_BITMAP
+#endif // #ifndef SIMULATOR
+