From e52cb141b71e35d3bf65222afb98e12b1935789b Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 23 May 2013 23:38:57 +0700 Subject: [PATCH] New Notepad-2 Demo for ChibiOS/GFX See demos/3rdparty/notepad-2/readme.txt for more details. --- demos/3rdparty/notepad-2/gfxconf.h | 58 +++ demos/3rdparty/notepad-2/main.c | 108 +++++ demos/3rdparty/notepad-2/notepadApp.c | 471 ++++++++++++++++++++ demos/3rdparty/notepad-2/notepadApp.h | 48 ++ demos/3rdparty/notepad-2/notepadCore.c | 235 ++++++++++ demos/3rdparty/notepad-2/notepadCore.h | 66 +++ demos/3rdparty/notepad-2/notepadUIDefines.h | 114 +++++ demos/3rdparty/notepad-2/readme.txt | 17 + demos/3rdparty/notepad-2/toolbarIcons.gif | Bin 0 -> 3184 bytes demos/3rdparty/notepad-2/toolbarIcons.h | 237 ++++++++++ 10 files changed, 1354 insertions(+) create mode 100644 demos/3rdparty/notepad-2/gfxconf.h create mode 100644 demos/3rdparty/notepad-2/main.c create mode 100644 demos/3rdparty/notepad-2/notepadApp.c create mode 100644 demos/3rdparty/notepad-2/notepadApp.h create mode 100644 demos/3rdparty/notepad-2/notepadCore.c create mode 100644 demos/3rdparty/notepad-2/notepadCore.h create mode 100644 demos/3rdparty/notepad-2/notepadUIDefines.h create mode 100644 demos/3rdparty/notepad-2/readme.txt create mode 100644 demos/3rdparty/notepad-2/toolbarIcons.gif create mode 100644 demos/3rdparty/notepad-2/toolbarIcons.h diff --git a/demos/3rdparty/notepad-2/gfxconf.h b/demos/3rdparty/notepad-2/gfxconf.h new file mode 100644 index 00000000..0768ca22 --- /dev/null +++ b/demos/3rdparty/notepad-2/gfxconf.h @@ -0,0 +1,58 @@ +/* + * This file has a different license to the rest of the GFX system. + * You can copy, modify and distribute this file as you see fit. + * You do not need to publish your source modifications to this file. + * The only thing you are not permitted to do is to relicense it + * under a different license. + */ + +#ifndef _GFXCONF_H +#define _GFXCONF_H + +/* GFX sub-systems to turn on */ +#define GFX_USE_GDISP TRUE +#define GFX_USE_GWIN TRUE +#define GFX_USE_GEVENT TRUE +#define GFX_USE_GTIMER TRUE +#define GFX_USE_GINPUT TRUE + +/* Features for the GDISP sub-system. */ +#define GDISP_NEED_VALIDATION TRUE +#define GDISP_NEED_CLIP TRUE +#define GDISP_NEED_TEXT TRUE +#define GDISP_NEED_CIRCLE TRUE +#define GDISP_NEED_ELLIPSE FALSE +#define GDISP_NEED_ARC FALSE +#define GDISP_NEED_CONVEX_POLYGON FALSE +#define GDISP_NEED_SCROLL FALSE +#define GDISP_NEED_PIXELREAD FALSE +#define GDISP_NEED_CONTROL TRUE +#define GDISP_NEED_IMAGE TRUE +#define GDISP_NEED_MULTITHREAD TRUE +#define GDISP_NEED_ASYNC FALSE +#define GDISP_NEED_MSGAPI FALSE + +/* Builtin Fonts */ +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE + +/* GDISP image decoders */ +#define GDISP_NEED_IMAGE_NATIVE FALSE +#define GDISP_NEED_IMAGE_GIF TRUE +#define GDISP_NEED_IMAGE_BMP FALSE +#define GDISP_NEED_IMAGE_JPG FALSE +#define GDISP_NEED_IMAGE_PNG FALSE + +/* Features for the GWIN sub-system. */ +#define GWIN_NEED_BUTTON TRUE +#define GWIN_NEED_CONSOLE TRUE +#define GWIN_NEED_SLIDER TRUE + +/* Features for the GINPUT sub-system. */ +#define GINPUT_NEED_MOUSE TRUE +#define GINPUT_NEED_DIAL FALSE + +#endif /* _GFXCONF_H */ diff --git a/demos/3rdparty/notepad-2/main.c b/demos/3rdparty/notepad-2/main.c new file mode 100644 index 00000000..350cee80 --- /dev/null +++ b/demos/3rdparty/notepad-2/main.c @@ -0,0 +1,108 @@ +/* + * File: main.c + * + * This file is a part of the Notepad demo application for ChibiOS/GFX + * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The name of 'Kumar Abhishek' may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * DISCLAIMER OF WARRANTY: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#include "notepadApp.h" + +const NColorScheme schemeDefault = { + .titleBarColor = HTML2COLOR(0x3064D8), + .titleTextColor = White, + + .winBgColor = HTML2COLOR(0xFFECB0), + .drawingWinBorder = HTML2COLOR(0xCEBA77), + + .toolbarSeparator = HTML2COLOR(0xC09028), + .toolbarBgUnsel = HTML2COLOR(0xF0D484), + .toolbarBgActive = HTML2COLOR(0xC8B060), + .toolbarBgSel = HTML2COLOR(0xDCC06C), + + .statusBarText = HTML2COLOR(0x000000) +}; + +const NColorScheme schemeDefault2 = { + .titleBarColor = HTML2COLOR(0x3064D8), + .titleTextColor = White, + + .winBgColor = HTML2COLOR(0xC8D8F8), + .drawingWinBorder = HTML2COLOR(0x8098E0), + + .toolbarSeparator = HTML2COLOR(0x5078F0), + .toolbarBgUnsel = HTML2COLOR(0xA0B8F0), + .toolbarBgActive = HTML2COLOR(0x6084F0), + .toolbarBgSel = HTML2COLOR(0x88A8F8), + + .statusBarText = HTML2COLOR(0x000000) +}; + +const char *tsCalibRead(uint16_t instance) { + // This will perform a on-spot calibration + // Unless you read and add the co-efficients here + return NULL; +} + +int main(void) { + + font_t font = gdispOpenFont("UI2"); + + /* initialize the hardware and the OS */ + halInit(); + chSysInit(); + + /* initialize the LCD */ + gdispInit(); + gdispClear(Black); + + /* Calibrate the touchscreen */ + ginputSetMouseCalibrationRoutines(0, NULL, tsCalibRead, FALSE); + ginputGetMouse(0); + + // Set the color scheme + nSetColorScheme(schemeDefault); + + while (TRUE) { + + chThdWait(nLaunchNotepadApp()); + + gdispClear(Black); + gdispSetClip(0, 0, gdispGetWidth(), gdispGetHeight()); + gdispDrawString(3, 3, "Notepad Terminated.", font, White); + gdispDrawString(3, 20, "Relaunching Notepad App...", font, White); + + chThdSleepMilliseconds(1000); + + } + + return 0; +} diff --git a/demos/3rdparty/notepad-2/notepadApp.c b/demos/3rdparty/notepad-2/notepadApp.c new file mode 100644 index 00000000..a89b7bf0 --- /dev/null +++ b/demos/3rdparty/notepad-2/notepadApp.c @@ -0,0 +1,471 @@ +/* + * File: notepadApp.c + * + * This file is a part of the Notepad demo application for ChibiOS/GFX + * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The name of 'Kumar Abhishek' may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * DISCLAIMER OF WARRANTY: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#include "chprintf.h" + +#include "notepadApp.h" +#include "toolbarIcons.h" + +// Get the handle for a window object +#define H(obj) ((GHandle)&obj) + +// Static objects +static GListener gl; // Event listener object +static GHandle nDrawingArea; // GWindow Drawing Area +static BaseSequentialStream *gstatusConsole; // GConsole Handle to the Status Bar + +static GEventMouse curPtr; // Holder for current pointer location + +static font_t font; +static coord_t swidth, sheight; + +// The toolbar buttons - Self-Explanatory +static GButtonObject btnNew, btnOpen, btnSave; +static GButtonObject btnColorBar; +static GButtonObject btnColorBarSel; + +static GButtonObject btnPencil, btnFill, btnEraser; + +static GButtonObject btnClose; +/* static GButtonObject btnYes, btnNo; // Reserved for future use */ + +// Image object +static gdispImage toolbarImageFilmstrip; + +static color_t myColors[] = { Black, Red, Green, Blue, Cyan, Magenta, Yellow, White }; + +static color_t selColor = Black; +static int selColorIndex = 0, selPenWidth = 1, tbMode = 1; + +static NColorScheme nCurColorScheme; + +static msg_t notepadThread(void *param); + +// Custom drawing functions for the buttons +static void nbtnColorBarDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { + #define ccs nCurColorScheme + + int i, j, k; + + (void)txt; + (void)pstyle; + (void)param; + (void)enabled; + + ginputGetMouseStatus(0, &curPtr); + + // Draw the toolbars according to the mode + if (tbMode == 0) { + k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8); + + for (i = 0; i < 8; i++) { + j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i; + + if (isdown == TRUE) { + // Update selection - this is like lazy release. + if (k >= 0 && k <= 7) { + selPenWidth = k + 1; + ncoreSetPenWidth((uint8_t) selPenWidth); + } + + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selPenWidth - i == 1 ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); + } + else { + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selPenWidth - i == 1 ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); + + gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selPenWidth - i == 1 ? ccs.toolbarSeparator: ccs.toolbarBgUnsel); + } + + gdispFillCircle(j, gh->y + 10, i + 1, myColors[selColorIndex]); + } + + } else { + k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8); + + for (i = 0; i < 8; i++) { + j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i; + + if (isdown == TRUE) { + // Update selection - this is like lazy release. + if (k >= 0 && k <= 7) { + selColorIndex = k; + selColor = myColors[k]; + ncoreSetPenColor(selColor); + } + + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + k == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); + } + else { + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selColorIndex == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); + + gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, + selColorIndex == i ? ccs.toolbarSeparator: ccs.toolbarBgUnsel); + } + + gdispFillCircle(j, gh->y + (NPAD_TOOLBAR_BTN_HEIGHT / 2), 3, myColors[i] ); + } + } + + + #undef ccs +} + +static void nbtnColorBarSelDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { +#define ccs nCurColorScheme + + int i, j = 0, k; + color_t ca, cb; + GEventMouse ptr; + + (void)txt; + (void)pstyle; + (void)param; + (void)enabled; + + // Get a copy of the pointer location + ginputGetMouseStatus(0, &ptr); + + // Get which button the pointer is on right now + k = (ptr.x - gh->x) / NPAD_TOOLBAR_BTN_WIDTH; + + gdispDrawBox(gh->x, gh->y, gh->width, gh->height, ccs.toolbarBgUnsel); + gdispDrawBox(gh->x + 1, gh->y + 1, gh->width - 2, gh->height - 2, ccs.toolbarBgUnsel); + + for (i = 0; i < 2; i++) { + if (isdown == TRUE) { + // Update selection - this is like lazy release. + if (k == 0 || k == 1) { + tbMode = k; + j = 1; + } + + ca = (tbMode == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); + } + else { + ca = (tbMode == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); + } + + cb = (tbMode == i ? ccs.toolbarSeparator : ccs.toolbarBgUnsel); + + gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, + gh->y, + NPAD_TOOLBAR_BTN_WIDTH, + NPAD_TOOLBAR_BTN_HEIGHT, + ca); + + gdispImageSetBgColor(&toolbarImageFilmstrip, ca); + gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, + NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, cb); + + /* Draw both the icons */ + gwinImageDraw(gh, &toolbarImageFilmstrip, + 2 + NPAD_TOOLBAR_BTN_WIDTH * i, + 2, + NPAD_ICON_WIDTH, + NPAD_ICON_HEIGHT, + NPAD_ICON_START(3 + i), + 0); + } + + if (j) + gwinButtonDraw(H(btnColorBar)); + + #undef ccs +} + +static void nToolbarImageButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { + (void)txt; (void)pstyle; (void)isenabled; + + color_t cl = isdown ? nCurColorScheme.toolbarBgActive : nCurColorScheme.toolbarBgUnsel; + + gdispImageSetBgColor(&toolbarImageFilmstrip, cl); + gdispFillArea(gh->x, gh->y, gh->width, gh->height, cl); + gwinImageDraw(gh, &toolbarImageFilmstrip, 2, 2, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START((int) param), 0); + + if (isdown || ((int)param - 5) == ncoreGetMode()) + gdispDrawBox(gh->x, gh->y, gh->width, gh->height, nCurColorScheme.toolbarSeparator); +} + +static void nCloseButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { + gwinImageDraw(gh, &toolbarImageFilmstrip, 0, 0, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START(8), 0); +} + +static void initButtons(void) { + + /* Init all the button objects */ + gwinCreateButton(&btnNew, NPAD_TOOLBAR_1_X(0), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnOpen, NPAD_TOOLBAR_1_X(1), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnSave, NPAD_TOOLBAR_1_X(2), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + + gwinCreateButton(&btnColorBarSel, NPAD_COLORBAR_SEL_X, NPAD_COLORBAR_SEL_Y, NPAD_COLORBAR_SEL_WIDTH, NPAD_COLORBAR_SEL_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnColorBar, NPAD_COLORBAR_X, NPAD_TOOLBAR_1_Y, NPAD_COLORBAR_WIDTH, NPAD_COLORBAR_HEIGHT, font, GBTN_CUSTOM); + + gwinCreateButton(&btnPencil, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(0), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnEraser, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(1), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + gwinCreateButton(&btnFill, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(2), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); + + gwinCreateButton(&btnClose, swidth - 18, 0, 16, 16, font, GBTN_CUSTOM); + + /* Attach custom renders */ + gwinSetButtonCustom(H(btnNew), nToolbarImageButtonDraw, (void *)0); + gwinSetButtonCustom(H(btnOpen), nToolbarImageButtonDraw, (void *)1); + gwinSetButtonCustom(H(btnSave), nToolbarImageButtonDraw, (void *)2); + + gwinSetButtonCustom(H(btnColorBar), nbtnColorBarDraw, (void *)0); + gwinSetButtonCustom(H(btnColorBarSel), nbtnColorBarSelDraw, (void *)0); + + gwinSetButtonCustom(H(btnPencil), nToolbarImageButtonDraw, (void *)5); + gwinSetButtonCustom(H(btnEraser), nToolbarImageButtonDraw, (void *)6); + gwinSetButtonCustom(H(btnFill), nToolbarImageButtonDraw, (void *)7); + gwinSetButtonCustom(H(btnClose), nCloseButtonDraw, (void *)0); + + /* Attach listeners */ + geventAttachSource(&gl, gwinGetButtonSource(H(btnNew)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnOpen)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnSave)), 0); + + geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBar)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBarSel)), 0); + + geventAttachSource(&gl, gwinGetButtonSource(H(btnPencil)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnEraser)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnFill)), 0); + geventAttachSource(&gl, gwinGetButtonSource(H(btnClose)), 0); + + /* Give listeners access to touch events */ + gwinAttachButtonMouse(H(btnNew), 0); + gwinAttachButtonMouse(H(btnOpen), 0); + gwinAttachButtonMouse(H(btnSave), 0); + + gwinAttachButtonMouse(H(btnColorBar), 0); + gwinAttachButtonMouse(H(btnColorBarSel), 0); + + gwinAttachButtonMouse(H(btnPencil), 0); + gwinAttachButtonMouse(H(btnEraser), 0); + gwinAttachButtonMouse(H(btnFill), 0); + gwinAttachButtonMouse(H(btnClose), 0); + +} + +static void drawButtons(void) { + gwinButtonDraw(H(btnNew)); + gwinButtonDraw(H(btnOpen)); + gwinButtonDraw(H(btnSave)); + + gwinButtonDraw(H(btnColorBar)); + gwinButtonDraw(H(btnColorBarSel)); + + gwinButtonDraw(H(btnClose)); +} + +static void drawVButtons(void) { + gwinButtonDraw(H(btnPencil)); + gwinButtonDraw(H(btnEraser)); + gwinButtonDraw(H(btnFill)); +} + +static WORKING_AREA(waNotepadThread, NPAD_THD_WA_SIZE); +static msg_t notepadThread(void *param) { + + GEventMouse *pem; + GEventGWinButton *peb; + GHandle ghc; + + (void)param; + + /* Get the display dimensions */ + swidth = gdispGetWidth(); + sheight = gdispGetHeight(); + + font = gdispOpenFont("UI2"); + + /* Initialize the mouse */ + geventListenerInit(&gl); + ginputGetMouse(0); + + initButtons(); + + /* Configure the GIF decoder with the toolbar Icon images */ + gdispImageSetMemoryReader(&toolbarImageFilmstrip, toolbarIcons); + gdispImageOpen(&toolbarImageFilmstrip); + + /* Set clip to the entire screen */ + gdispSetClip(0, 0, swidth, sheight); + + /* Clear the screen with the window background + * Also, draw the title bars */ + gdispClear(nCurColorScheme.winBgColor); + gdispDrawBox(0, 0, swidth, sheight, nCurColorScheme.titleBarColor); + gdispFillArea(0, 0, swidth, NPAD_TITLEBAR_HEIGHT, nCurColorScheme.titleBarColor); + gdispDrawStringBox(NPAD_TITLETEXT_START_X, + NPAD_TITLETEXT_START_Y, + swidth, + NPAD_TITLEBAR_HEIGHT, + NPAD_TITLETEXT_STR, + font, + nCurColorScheme.titleTextColor, + justifyLeft); + + /* Create the drawing window, draw its border */ + gdispDrawBox(NPAD_DRAWING_AREA_START_X - 1, + NPAD_DRAWING_AREA_START_Y - 1, + NPAD_DRAWING_AREA_WIDTH + 2, + NPAD_DRAWING_AREA_HEIGHT + 2, + nCurColorScheme.drawingWinBorder); + + nDrawingArea = gwinCreateWindow(NULL, + NPAD_DRAWING_AREA_START_X, + NPAD_DRAWING_AREA_START_Y, + NPAD_DRAWING_AREA_WIDTH, + NPAD_DRAWING_AREA_HEIGHT); + + /* Create the bottom status bar console */ + ghc = gwinCreateConsole(NULL, + NPAD_STATUSBAR_START_X, + NPAD_STATUSBAR_START_Y, + NPAD_STATUSBAR_WIDTH, + NPAD_STATUSBAR_HEIGHT, + font); + + gdispImageDraw(&toolbarImageFilmstrip, + NPAD_STATUSBAR_ICON_START_X, + NPAD_STATUSBAR_ICON_START_Y, + NPAD_ICON_WIDTH, + NPAD_ICON_HEIGHT, + NPAD_ICON_START(12), + 0); + + gwinSetBgColor(ghc, nCurColorScheme.winBgColor); + gwinSetColor(ghc, Black); + + gstatusConsole = gwinGetConsoleStream(ghc); + + /* draw the buttons */ + gwinSetColor(nDrawingArea, Black); + gwinSetBgColor(nDrawingArea, White); + + gwinClear(nDrawingArea); + gwinClear(ghc); + + drawButtons(); + drawVButtons(); + + chprintf(gstatusConsole, "Welcome to ChibiOS/GFX Notepad demo."); + + ncoreSpawnDrawThread(nDrawingArea, gstatusConsole); + + while(TRUE) { + pem = (GEventMouse *) geventEventWait(&gl, TIME_INFINITE); + + /* button pressed... */ + if (pem->type == GEVENT_GWIN_BUTTON) { + peb = (GEventGWinButton *)pem; + + if (peb->button == H(btnNew)) { + // Reset all the settings + selColorIndex = 0; + selPenWidth = 0; + ncoreSetMode(NCORE_MODE_DRAW); + + gwinSetColor(nDrawingArea, Black); + gwinSetBgColor(nDrawingArea, White); + + // Refresh the buttons + drawButtons(); + drawVButtons(); + + gwinClear(nDrawingArea); + chprintf(gstatusConsole, "\nScreen Cleared."); + } + else if (peb->button == H(btnOpen)) { + chprintf(gstatusConsole, "\nFile Open not implemented."); + } + else if (peb->button == H(btnSave)) { + chprintf(gstatusConsole, "\nFile Save not implemented."); + } + else if (peb->button == H(btnPencil)) { + ncoreSetMode(NCORE_MODE_DRAW); + drawVButtons(); + chprintf(gstatusConsole, "\nPencil Tool Selected."); + } + else if (peb->button == H(btnEraser)) { + ncoreSetMode(NCORE_MODE_ERASE); + drawVButtons(); + chprintf(gstatusConsole, "\nEraser Tool Selected."); + } + else if (peb->button == H(btnFill)) { + ncoreSetMode(NCORE_MODE_FILL); + drawVButtons(); + chprintf(gstatusConsole, "\nFill Tool Selected."); + } + else if (peb->button == H(btnClose)) { + break; + } + } + } + + gwinDestroyWindow(ghc); + // No need to destroy the buttons as they are statically allocated + gdispCloseFont(font); + ncoreTerminateDrawThread(); + gdispImageClose(&toolbarImageFilmstrip); + + return 0; +} + +// Public methods +void nSetColorScheme(NColorScheme sch) { nCurColorScheme = sch; } +NColorScheme nGetColorScheme(void) { return nCurColorScheme; } + +Thread *nLaunchNotepadApp(void) { + + return chThdCreateStatic(waNotepadThread, + sizeof(waNotepadThread), + NPAD_THD_PRIO, + notepadThread, NULL); + +} diff --git a/demos/3rdparty/notepad-2/notepadApp.h b/demos/3rdparty/notepad-2/notepadApp.h new file mode 100644 index 00000000..bae5f59c --- /dev/null +++ b/demos/3rdparty/notepad-2/notepadApp.h @@ -0,0 +1,48 @@ +/* + * File: notepadApp.h + * + * This file is a part of the Notepad demo application for ChibiOS/GFX + * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The name of 'Kumar Abhishek' may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * DISCLAIMER OF WARRANTY: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NOTEPADAPP_H_ +#define NOTEPADAPP_H_ + +#include "notepadCore.h" +#include "notepadUIDefines.h" + +#define NPAD_THD_PRIO (NORMALPRIO + 2) +#define NPAD_THD_WA_SIZE 512 + +void nSetColorScheme(NColorScheme sch); +NColorScheme nGetColorScheme(void); + + +Thread *nLaunchNotepadApp(void); + +#endif /* NOTEPADAPP_H_ */ diff --git a/demos/3rdparty/notepad-2/notepadCore.c b/demos/3rdparty/notepad-2/notepadCore.c new file mode 100644 index 00000000..abb189bc --- /dev/null +++ b/demos/3rdparty/notepad-2/notepadCore.c @@ -0,0 +1,235 @@ +/* + * File: notepadCore.c + * + * This file is a part of the Notepad demo application for ChibiOS/GFX + * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The name of 'Kumar Abhishek' may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * DISCLAIMER OF WARRANTY: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#include "notepadCore.h" +#include "notepadUIDefines.h" + +#define PEN_IN_DRAWING_AREA(ev) ((ev.x >= ncoreDrawingArea->x) && (ev.x <= (ncoreDrawingArea->x + ncoreDrawingArea->width)) && \ + (ev.y >= ncoreDrawingArea->y) && (ev.y <= (ncoreDrawingArea->y + ncoreDrawingArea->height))) + +/* This is the drawing core */ +static WORKING_AREA(waDrawThread, NCORE_THD_STACK_SIZE); + +static uint8_t nPenWidth = 1; +static uint8_t nMode = NCORE_MODE_DRAW; + +static Thread *nThd; + +static GHandle ncoreDrawingArea = NULL; +static BaseSequentialStream *nStatusConsole = NULL; + +static void draw_point(coord_t x, coord_t y) { + color_t c = ncoreDrawingArea->color; + + if (nMode == NCORE_MODE_DRAW) + c = ncoreDrawingArea->color; + else if (nMode == NCORE_MODE_ERASE) + c = ncoreDrawingArea->bgcolor; + + if (nPenWidth == 1) + gdispDrawPixel(x, y, c); + else + gdispFillCircle(x, y, nPenWidth, c); +} + +/* Bresenham's Line Drawing Algorithm + Modified version to draw line of variable thickness */ +static void draw_line(coord_t x0, coord_t y0, coord_t x1, coord_t y1) { + int16_t dy, dx; + int16_t addx, addy; + int16_t P, diff, i; + + if (x1 >= x0) { + dx = x1 - x0; + addx = 1; + } else { + dx = x0 - x1; + addx = -1; + } + if (y1 >= y0) { + dy = y1 - y0; + addy = 1; + } else { + dy = y0 - y1; + addy = -1; + } + + if (dx >= dy) { + dy *= 2; + P = dy - dx; + diff = P - dx; + + for(i=0; i<=dx; ++i) { + draw_point(x0, y0); + if (P < 0) { + P += dy; + x0 += addx; + } else { + P += diff; + x0 += addx; + y0 += addy; + } + } + } else { + dx *= 2; + P = dx - dy; + diff = P - dy; + + for(i=0; i<=dy; ++i) { + draw_point(x0, y0); + if (P < 0) { + P += dx; + y0 += addy; + } else { + P += diff; + x0 += addx; + y0 += addy; + } + } + } +} + +/* Core thread */ +static msg_t ncoreDrawThread(void *msg) { + + GEventMouse ev, evPrev; + coord_t dx, dy; + + int state = 0, dist; + + (void)msg; + + ginputGetMouseStatus(0, &evPrev); + + while (1) { + + // Exit signal received? If yes, terminate. + if (chThdShouldTerminate()) + return 0; + + ginputGetMouseStatus(0, &ev); + switch(state) { + case 0: if (ev.meta == GMETA_MOUSE_DOWN) { + state = 1; + if (nMode == NCORE_MODE_FILL && PEN_IN_DRAWING_AREA(ev)) { + // Set bgcolor to current color, clear the display. + ncoreDrawingArea->bgcolor = ncoreDrawingArea->color; + gwinClear(ncoreDrawingArea); + } + } + else + chThdYield(); + break; + + + case 1: if (ev.meta == GMETA_MOUSE_UP) { + state = 0; + //chprintf(nStatusConsole, "\nPen Up: (%d, %d)", ev.x, ev.y); + break; + } + + dx = abs(ev.x - evPrev.x); + dy = abs(ev.y - evPrev.y); + + dist = dx * dx + dy * dy; + + if (dist > 0) + { + gdispSetClip(ncoreDrawingArea->x, + ncoreDrawingArea->y, + ncoreDrawingArea->width, + ncoreDrawingArea->height); + + if (PEN_IN_DRAWING_AREA(ev)){ + // Do Interpolation + if (dist <= 2) { + draw_point(ev.x, ev.y); + } + else if (dist <= 5) { + // Line drawing does not give good results for this case. + // So draw two pixels directly + draw_point(ev.x, ev.y); + draw_point((ev.x + evPrev.x) / 2, (ev.y + evPrev.y) / 2); + } + else if (dx * dx <= MAX_DX && dy * dy <= MAX_DY) { + draw_line(ev.x, ev.y, evPrev.x, evPrev.y); + } + } + + //chprintf(nStatusConsole, "\nPen Down: (%d, %d)", ev.x, ev.y); + } + break; + } + evPrev = ev; + } + + return 0; +} + +/* Spawn the core thread */ +void ncoreSpawnDrawThread(GHandle drawingArea, BaseSequentialStream *statusConsole) { + + ncoreDrawingArea = drawingArea; + nStatusConsole = statusConsole; + + nThd = chThdCreateStatic(waDrawThread, + sizeof(waDrawThread), + NCORE_THD_PRIO, + ncoreDrawThread, + NULL); + +} + +/* Terminate the core thread, wait for control release */ +void ncoreTerminateDrawThread(void) { + chThdTerminate(nThd); + chThdWait(nThd); +} + +/* Get and set the pen width + * Brush is cicular, width is pixel radius */ +void ncoreSetPenWidth(uint8_t penWidth) { nPenWidth = penWidth; } +uint8_t ncoreGetPenWidth(void) { return nPenWidth; } + +/* Get and set the drawing color */ +void ncoreSetPenColor(color_t penColor) { gwinSetColor(ncoreDrawingArea, penColor); } +color_t ncoreGetPenColor(void) { return ncoreDrawingArea->color; } + +/* Set mode */ +void ncoreSetMode(uint8_t mode) { nMode = mode; } +uint8_t ncoreGetMode(void) { return nMode; } diff --git a/demos/3rdparty/notepad-2/notepadCore.h b/demos/3rdparty/notepad-2/notepadCore.h new file mode 100644 index 00000000..b4f1b185 --- /dev/null +++ b/demos/3rdparty/notepad-2/notepadCore.h @@ -0,0 +1,66 @@ +/* + * File: notepadCore.h + * + * This file is a part of the Notepad demo application for ChibiOS/GFX + * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The name of 'Kumar Abhishek' may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * DISCLAIMER OF WARRANTY: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NOTEPADCORE_H_ +#define NOTEPADCORE_H_ + +/* Configuration */ +#define NCORE_THD_STACK_SIZE 256 +#define NCORE_THD_PRIO (NORMALPRIO + 1) + +#define NCORE_MODE_DRAW 0 +#define NCORE_MODE_ERASE 1 +#define NCORE_MODE_FILL 2 + +#define MAX_DX 500 +#define MAX_DY 500 + +/* Spawn the notepad core thread */ +void ncoreSpawnDrawThread(GHandle drawingArea, BaseSequentialStream *statusConsole); + +/* Terminate the core thread, wait for control release */ +void ncoreTerminateDrawThread(void); + +/* Get and set the pen width + * Brush is cicular, width is pixel radius */ +void ncoreSetPenWidth(uint8_t penWidth); +uint8_t ncoreGetPenWidth(void); + +/* Get and set the drawing color */ +void ncoreSetPenColor(color_t penColor); +color_t ncoreGetPenColor(void); + +/* Get and set the pen mode */ +void ncoreSetMode(uint8_t mode); +uint8_t ncoreGetMode(void); + +#endif /* NOTEPADCORE_H_ */ diff --git a/demos/3rdparty/notepad-2/notepadUIDefines.h b/demos/3rdparty/notepad-2/notepadUIDefines.h new file mode 100644 index 00000000..5ed08d00 --- /dev/null +++ b/demos/3rdparty/notepad-2/notepadUIDefines.h @@ -0,0 +1,114 @@ +/* + * File: notepadUIDefines.h + * + * This file is a part of the Notepad demo application for ChibiOS/GFX + * Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The name of 'Kumar Abhishek' may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * DISCLAIMER OF WARRANTY: + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NOTEPADUIDEFINES_H_ +#define NOTEPADUIDEFINES_H_ + +#define NPAD_TITLETEXT_STR "ChibiOS/GFX Notepad Demo" + +/* UI Element dimenstions */ +#define NPAD_TITLEBAR_HEIGHT 18 +#define NPAD_TITLETEXT_START_X 5 +#define NPAD_TITLETEXT_START_Y 0 + +#define NPAD_TOOLBAR_BTN_WIDTH 20 +#define NPAD_TOOLBAR_BTN_HEIGHT 20 + +#define NPAD_TOOLBAR_INTERBTN_PADDING_X 2 +#define NPAD_TOOLBAR_1_START_X 5 +#define NPAD_TOOLBAR_1_Y (NPAD_TITLEBAR_HEIGHT + 3) +#define NPAD_TOOLBAR_1_X(n) (NPAD_TOOLBAR_1_START_X + \ + (NPAD_TOOLBAR_BTN_WIDTH + \ + NPAD_TOOLBAR_INTERBTN_PADDING_X) * n) + +#define NPAD_TOOLBAR_INTERBTN_PADDING_Y 2 +#define NPAD_TOOLBAR_2_START_Y (NPAD_DRAWING_AREA_START_Y + 6) +#define NPAD_TOOLBAR_2_X 4 +#define NPAD_TOOLBAR_2_Y(n) (NPAD_TOOLBAR_2_START_Y + \ + (NPAD_TOOLBAR_BTN_HEIGHT + \ + NPAD_TOOLBAR_INTERBTN_PADDING_Y) * n) + +#define NPAD_DRAWING_AREA_START_X 28 +#define NPAD_DRAWING_AREA_START_Y 46 +#define NPAD_DRAWING_AREA_END_X 10 +#define NPAD_DRAWING_AREA_END_Y 24 +#define NPAD_DRAWING_AREA_WIDTH (swidth - \ + NPAD_DRAWING_AREA_START_X - \ + NPAD_DRAWING_AREA_END_X) +#define NPAD_DRAWING_AREA_HEIGHT (sheight - \ + NPAD_DRAWING_AREA_START_Y - \ + NPAD_DRAWING_AREA_END_Y) + +#define NPAD_COLORBAR_WIDTH 160 +#define NPAD_COLORBAR_HEIGHT 20 +#define NPAD_COLORBAR_X (swidth - NPAD_DRAWING_AREA_END_X - NPAD_COLORBAR_WIDTH) +#define NPAD_COLORBAR_Y NPAD_TOOLBAR_1_Y + +#define NPAD_COLORBAR_SEL_WIDTH (2 * NPAD_TOOLBAR_BTN_WIDTH) +#define NPAD_COLORBAR_SEL_HEIGHT (NPAD_TOOLBAR_BTN_HEIGHT) +#define NPAD_COLORBAR_SEL_X (NPAD_COLORBAR_X - NPAD_COLORBAR_SEL_WIDTH - 24) +#define NPAD_COLORBAR_SEL_Y NPAD_TOOLBAR_1_Y + +#define NPAD_ICON_WIDTH 16 +#define NPAD_ICON_HEIGHT 16 +#define NPAD_ICON_START(x) ((x) * NPAD_ICON_WIDTH) + + +#define NPAD_STATUSBAR_ICON_START_X 5 +#define NPAD_STATUSBAR_ICON_START_Y (sheight - 5 - NPAD_ICON_HEIGHT - 1) + + +#define NPAD_STATUSBAR_PADDING 5 +#define NPAD_STATUSBAR_START_X (NPAD_STATUSBAR_ICON_START_X + NPAD_ICON_WIDTH + NPAD_STATUSBAR_PADDING) +#define NPAD_STATUSBAR_START_Y (NPAD_STATUSBAR_ICON_START_Y + 3) +#define NPAD_STATUSBAR_WIDTH (swidth - NPAD_STATUSBAR_START_X - 2) +#define NPAD_STATUSBAR_HEIGHT 15 + +/* Color scheme definition */ +typedef struct colScheme { + color_t titleBarColor; + color_t titleTextColor; + + color_t winBgColor; + color_t drawingWinBorder; + + color_t toolbarSeparator; + color_t toolbarBgUnsel; + color_t toolbarBgActive; + color_t toolbarBgSel; + + color_t statusBarText; +} NColorScheme; + + + +#endif /* NOTEPADUIDEFINES_H_ */ diff --git a/demos/3rdparty/notepad-2/readme.txt b/demos/3rdparty/notepad-2/readme.txt new file mode 100644 index 00000000..660d1404 --- /dev/null +++ b/demos/3rdparty/notepad-2/readme.txt @@ -0,0 +1,17 @@ +# Notepad-2 Demo for ChibiOS/GFX + +This demo showcases an improved Notepad demo for the ChibiOS/GFX project. + +## Features: + +* 2 Different UI Skins available +* Draw in 8 different colors in 8 different thickness +* Pen, Erase and Fill Modes (Fill: Fills the entire canvas, this is not flood fill) + +This demo is planned to support Loading and Saving to SD Card the sketches made in the near future. + +## License: +Copyright © 2013 Kumar Abhishek [abhishek.kakkar@edaboard.com]. All Rights Reserved +This code is made available under the terms of the 3-clause BSD License. + +Some of the icons in the set have been taken from the fugue-icons-set by Yusuke Kamiyamane: http://p.yusukekamiyamane.com/ . These icons are covered by a Creative Commons Attribution 3.0 License. \ No newline at end of file diff --git a/demos/3rdparty/notepad-2/toolbarIcons.gif b/demos/3rdparty/notepad-2/toolbarIcons.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb9e7cc95a5d81d93e5269124180dec95cad7e60 GIT binary patch literal 3184 zcmV-$43G0iNk%w1VE_RT0QUd@1qB5d7#ILE01GNA7dSXE2?;7V9Vsa(DK#}RE+#rU zIs#1s09yhcT^<5(11f4NEKpEBWo29e0cZdKeE?v^Z;?H*vK*Uc@PQ#ajY~NmaZ;b*Owvl~8ilT72RFkq;A`Bmk!q5~d>&xgsuu zE-{8NG?+9fvpF=pMGwp$56B=A$s-ZfA|k^yJH$*#ok&!vRA;ScV6|X+w0cC$RZZ1i zQQKl$<7{rjZX2QEJBrpmoaZ>j|5b>(aGtq%r@2g#%~Fr{U%cpOo6ci}>vE*gW~TpL z(f@VG?uY;Yl>q^p5fPgLAg2HTrxX;k0RgxX5vKwpv;rlqCMLBgD7-W@iA4d5TL6us49OA_ z*Z~355fR2GC&xKCOe5cLPFI|P1sOS(R*6tSyt<5T=8sbfJmE( zR-%wysg`4}r*y#5eU6!h3#N(#tCRtxlN_*u3%G?Bvzi01jxM*RFp+~ui-cyHh;f^m zb%>%?m$PTFltj9pW4)thr^b28hXBxsJkGEb&$lkhmR85FOxCV#=aX^jzhC09dH&1< z=E^kQ%~s>mUhBkX>B@iR)nxkfSnJ?q_T_nlgM^BPm6es2oSdzIzkrsjtGKj}rKYH< zsko)Kw!N>QxVX86fXjre%YnAzx`)%Yxy7*2gs{r6l*jmz6@(PxPC=bo)sgVXmGRYy z^xBpE?1cE@oB#iW<>I{j>7@VhtjWpA+1c6H*y`Kr>f7u8^XSUw=jY+!^5*j9==1db z@bCEf`2YX_A^8LW3IP8AEC2ui0003H000R70RR0fL864gg9ZgE{MV|X!-owQN|aco z%EXHb4~@advEx5PhzNCD!-gbA4;jBMD98@Fc7MGyi5 za6Ch|u3fqdcj(>ASMS2RfX__)76~NCNZ&AG<1(f36fW2<(wnvfh-Dy4rqRSm@7Ar& z3mwE$BBiux(@Nqw*y+1G9D)i$gQKU$;y4jKi>r>c{AVB{3n-od#M3UpYd1K3Fq6ZHL0sy#p#?Yku`12bw zzvD=h{{R9AMG!j(R9}7wPO{%Zk{IS7B9lxchGP^?A%;ZsG;!I6Kr{iGMCf>i&O{C< zp@cLiridbnN~|Uj2|c|An?1(V2*FTG#WRa>JO(#II6V5ZoETvgDTZ?#K{v)2jtG>8 zAB))H$bE*)0t+y}ghCxhoM__DJoJoV-a_c9ryg5wEd*aaC;%{@L}!q9-JEomC(sU1 zJfY_kNFcH26HpZRPn>lYI_4yZFv5s~ibA;1gpL(Q;e`rm$l-<_PSlxapGo8Z6G@Qs zKs=+CN=_0?xcCo@J^AArZ2t7{GXjoFk+Q`WV1RMWHU9VrWUKsqp_~?0xX?n9N=o;S zAF-HY%OQuj0f{Z5h|LKG*&;7;Tq(A|4C?zrD%2vis&{rD3x<(4lR zi9n21=s6bxRd(q<{uE=`5*T{sre`0P_<#rWdsz&?5yuncH$L*)LEgC__f2oTIiK6F4q z9Rxvf{~&_^-@rjPpaBhKK%fEzVi?RpEOUkti03p$A%T1>WFxx_h*Spv5ru{o=}-U& zJm3$P`9lHz>0pJbA`m3x;mibt5QISf5WL}S;uTQzhcSHOBXHCsX-MNoJ-`9Ii9qKN zXsDh-<}eF$#3B#P%HH<6Kn-eKK_X%!n=UrNiS)%wg8qZ7z`+eN=!iGCp$uR;;0MvLz#KRs2zfLhJtUY99`FEzWN2jVBFV`QE|5``LtzU4 zu|j`%&V{2Z-G&yjsavd$bqaAn5+0xcWcXtk9tcK0kfDGFBw>g=LY@)rVS=(OQFy}h z1T0|j3V&qb8vF`^_U6f&_sul97yjDBuQ*Bts)Shz3pOW0Gp9Vm(xPFq(m|=^DyLFJs4!!$to{%z zK_)Vo&Qu_^v?-@L^$!LB;Q^!0YSW95S65(9P4iE8$v`$10fKW$Vs}|RDm}3w29GfnBVFx^1 zq_3RZBw*=rfR!jD0Qf^FGLm7)WHi${Ba;#NUiV?B7e{?QVv2_gS{vkRbkWOSALY+Wrx?7ax6cwvTKmdkJJ1(6-ZASkN_ zNvk0rl^#T9i@@n3^x(stF2ZOfP3lsUS~?D+oJv)_D2ri?LM&_y$2?}4kjZjGCHqHi zb-P=d_|^xiXuvFlO>9;8Ah}BB5tCC}E+i#}0>y)L|9)Ci!%6;dL6Bhr0&zeNGVbw>4 New + * 1 -> Open + * 2 -> Save + * 3 -> Brush + * 4 -> Color Palette + * 5 -> Pencil + * 6 -> Eraser + * 7 -> Fill Color + * 8 -> Cross + * 9 -> Plus + * 10 -> Minus + * 11 -> Cross (Round) + * 12 -> Info + * 13 -> Tick + * 14 -> Warning + * 15 -> 32-bit processor + * + */ + +static const unsigned char toolbarIcons[] = { + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x00, 0x01, 0x10, 0x00, 0xF7, 0x00, 0x00, 0x05, 0x05, 0x05, + 0x18, 0x18, 0x18, 0x00, 0x33, 0x00, 0x0B, 0x2A, 0x2A, 0x17, 0x38, 0x38, 0x31, 0x09, 0x09, 0x2A, + 0x38, 0x1D, 0x29, 0x29, 0x29, 0x29, 0x35, 0x35, 0x32, 0x2E, 0x26, 0x3A, 0x3A, 0x3A, 0x02, 0x4D, + 0x02, 0x00, 0x5B, 0x02, 0x1E, 0x5D, 0x1E, 0x02, 0x70, 0x03, 0x2A, 0x6A, 0x2A, 0x2C, 0x50, 0x50, + 0x3E, 0x65, 0x65, 0x5C, 0x01, 0x01, 0x68, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x7D, 0x3C, 0x06, 0x71, + 0x27, 0x27, 0x45, 0x00, 0x67, 0x51, 0x02, 0x79, 0x45, 0x36, 0x4E, 0x55, 0x47, 0x0A, 0x4F, 0x57, + 0x32, 0x6C, 0x52, 0x01, 0x7A, 0x64, 0x00, 0x46, 0x46, 0x46, 0x52, 0x4F, 0x47, 0x54, 0x54, 0x54, + 0x43, 0x51, 0x7C, 0x5E, 0x70, 0x5E, 0x45, 0x6D, 0x6D, 0x4B, 0x74, 0x74, 0x53, 0x7D, 0x7D, 0x6A, + 0x48, 0x48, 0x67, 0x67, 0x67, 0x78, 0x78, 0x78, 0x09, 0x2B, 0x91, 0x1B, 0x3D, 0xA3, 0x3B, 0x2B, + 0x97, 0x1E, 0x71, 0x8E, 0x19, 0x6C, 0xB7, 0x2A, 0x53, 0xB4, 0x38, 0x6B, 0x9E, 0x37, 0x71, 0xB5, + 0x3C, 0x5E, 0xC4, 0x29, 0x78, 0xC5, 0x5B, 0x02, 0x86, 0x49, 0x55, 0xBC, 0x42, 0x75, 0xA8, 0x7C, + 0x49, 0x95, 0x50, 0x72, 0xD6, 0x5A, 0x7C, 0xE2, 0x00, 0x91, 0x0F, 0x13, 0x9C, 0x24, 0x00, 0xA7, + 0x13, 0x12, 0xA6, 0x23, 0x11, 0xB9, 0x22, 0x2E, 0x83, 0x2E, 0x31, 0x86, 0x31, 0x34, 0x98, 0x34, + 0x28, 0xB3, 0x39, 0x34, 0xBC, 0x45, 0x0F, 0xCC, 0x1F, 0x0F, 0xC8, 0x20, 0x12, 0xC9, 0x23, 0x11, + 0xD5, 0x22, 0x22, 0xC3, 0x34, 0x3B, 0xC4, 0x4C, 0x48, 0x9D, 0x48, 0x54, 0xA9, 0x54, 0x67, 0xAD, + 0x67, 0x60, 0xB5, 0x60, 0x7A, 0xB4, 0x7A, 0x44, 0xCC, 0x55, 0x4D, 0xD5, 0x5E, 0x51, 0xDB, 0x62, + 0x5B, 0xE3, 0x6C, 0x6E, 0xC3, 0x6E, 0x1B, 0xA1, 0xE2, 0x3B, 0x8A, 0xD6, 0x3E, 0x9C, 0xE7, 0x38, + 0xC5, 0xFF, 0x55, 0x88, 0xBA, 0x70, 0x9E, 0xB9, 0x78, 0xA7, 0xB9, 0x4C, 0x91, 0xCD, 0x52, 0x8F, + 0xF6, 0x5F, 0xBC, 0xE8, 0x68, 0x9B, 0xCE, 0x63, 0x85, 0xEB, 0x72, 0xA4, 0xD1, 0x66, 0xA6, 0xFF, + 0x5D, 0xD1, 0xFF, 0x75, 0xC8, 0xEE, 0x88, 0x00, 0x00, 0x95, 0x01, 0x01, 0x9B, 0x11, 0x11, 0x9B, + 0x02, 0x20, 0xA7, 0x00, 0x00, 0xA7, 0x14, 0x14, 0xB3, 0x01, 0x01, 0xB8, 0x11, 0x11, 0xA7, 0x02, + 0x23, 0xB4, 0x02, 0x25, 0xAD, 0x26, 0x26, 0xB5, 0x28, 0x28, 0xBC, 0x34, 0x34, 0x89, 0x45, 0x01, + 0x8A, 0x5B, 0x00, 0x93, 0x49, 0x01, 0x9A, 0x50, 0x05, 0x98, 0x55, 0x11, 0x8E, 0x6B, 0x01, 0x89, + 0x75, 0x04, 0x98, 0x66, 0x00, 0x96, 0x77, 0x03, 0xB0, 0x5C, 0x06, 0xA7, 0x6F, 0x00, 0xAB, 0x65, + 0x13, 0xA6, 0x78, 0x02, 0xA9, 0x7A, 0x1C, 0xBC, 0x61, 0x04, 0xB7, 0x7A, 0x00, 0xB2, 0x78, 0x38, + 0x8A, 0x6A, 0x4B, 0xC9, 0x0C, 0x0C, 0xC9, 0x12, 0x12, 0xD8, 0x01, 0x01, 0xD4, 0x11, 0x11, 0xC6, + 0x27, 0x27, 0xC7, 0x39, 0x39, 0xE4, 0x13, 0x00, 0xD2, 0x5E, 0x28, 0xC0, 0x62, 0x04, 0xC9, 0x78, + 0x26, 0xEA, 0x40, 0x30, 0xCA, 0x42, 0x42, 0xD5, 0x4D, 0x4D, 0xD8, 0x50, 0x50, 0xD1, 0x7B, 0x5A, + 0xE4, 0x59, 0x56, 0xEB, 0x69, 0x5C, 0xF1, 0x6C, 0x6A, 0x80, 0x48, 0x9B, 0x89, 0x56, 0xA2, 0x90, + 0x5D, 0xA9, 0x96, 0x63, 0xAF, 0xA7, 0x74, 0xC0, 0xD2, 0x7D, 0x8E, 0x99, 0x85, 0x0B, 0xA6, 0x8A, + 0x03, 0xAB, 0x94, 0x01, 0xA4, 0x93, 0x1C, 0xB0, 0x82, 0x0B, 0xB8, 0x85, 0x17, 0xB3, 0x9A, 0x03, + 0xAF, 0x8E, 0x2E, 0xB7, 0xA6, 0x30, 0x91, 0x83, 0x48, 0x8B, 0x84, 0x66, 0x9A, 0x88, 0x71, 0x9B, + 0x9A, 0x75, 0x88, 0xA2, 0x56, 0x97, 0xB3, 0x67, 0xB1, 0x94, 0x44, 0xBA, 0x9F, 0x63, 0xBD, 0xA3, + 0x66, 0xA7, 0xC6, 0x79, 0xCA, 0x87, 0x00, 0xD0, 0x88, 0x3C, 0xCE, 0xB0, 0x14, 0xCF, 0xB7, 0x2E, + 0xCA, 0x96, 0x56, 0xC7, 0xAF, 0x4C, 0xD6, 0xAE, 0x6D, 0xE7, 0x93, 0x71, 0xEA, 0xBF, 0x5F, 0xE2, + 0xB1, 0x79, 0xFE, 0xCC, 0x04, 0xE6, 0xCA, 0x34, 0xDE, 0xCD, 0x56, 0xE3, 0xD2, 0x5E, 0xEB, 0xC4, + 0x67, 0xE9, 0xCA, 0x7F, 0xE6, 0xD5, 0x64, 0xFA, 0xF3, 0x58, 0xEB, 0xE0, 0x64, 0xF6, 0xE5, 0x79, + 0x83, 0x83, 0x84, 0x8A, 0x86, 0x95, 0x95, 0x95, 0x96, 0x9C, 0x9C, 0xAD, 0x80, 0xBF, 0x80, 0x96, + 0xAB, 0xAB, 0xB8, 0xB4, 0x8F, 0xA5, 0xA6, 0xA8, 0xA9, 0xA9, 0xB8, 0xA5, 0xB6, 0xB6, 0xBD, 0xAF, + 0xA0, 0xB8, 0xB8, 0xB9, 0x85, 0x80, 0xCB, 0x84, 0xAC, 0xCB, 0x81, 0xB6, 0xE3, 0xBA, 0x87, 0xD3, + 0xB6, 0xB9, 0xC5, 0xB0, 0xD1, 0x84, 0xB0, 0xCA, 0xB0, 0x94, 0xC7, 0xF8, 0x92, 0xE3, 0xFF, 0xAD, + 0xC3, 0xCD, 0xAA, 0xD3, 0xFD, 0xBF, 0xE1, 0xF1, 0xDA, 0x85, 0x96, 0xC7, 0xB6, 0x80, 0xF1, 0x89, + 0x91, 0xE9, 0x9B, 0xAC, 0xE6, 0xB8, 0x84, 0xEB, 0xA4, 0xB5, 0xF2, 0xBE, 0xB9, 0xC3, 0x90, 0xDC, + 0xCD, 0x9A, 0xE6, 0xD9, 0xA6, 0xF2, 0xFB, 0xB3, 0xC4, 0xD8, 0xC7, 0x8B, 0xDB, 0xD4, 0xB0, 0xEA, + 0xC4, 0x89, 0xEE, 0xC4, 0x91, 0xE9, 0xD3, 0x87, 0xEC, 0xD5, 0x91, 0xF0, 0xC8, 0x95, 0xF1, 0xD5, + 0x89, 0xF4, 0xDA, 0x95, 0xFD, 0xEC, 0x84, 0xF8, 0xE2, 0x9B, 0xFF, 0xFF, 0x84, 0xE5, 0xE2, 0xBC, + 0xFC, 0xE9, 0xA4, 0xFF, 0xF1, 0xAC, 0xC9, 0xC9, 0xC9, 0xD9, 0xD9, 0xD9, 0xD8, 0xD8, 0xEA, 0xDB, + 0xEA, 0xEA, 0xDB, 0xEB, 0xFF, 0xF3, 0xE8, 0xCA, 0xE7, 0xE7, 0xE7, 0xE1, 0xE1, 0xF2, 0xE6, 0xF2, + 0xE6, 0xE8, 0xF3, 0xF4, 0xFD, 0xF0, 0xEF, 0xF8, 0xF9, 0xF9, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04, + 0x01, 0x0A, 0x00, 0xFF, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x08, + 0xFE, 0x00, 0xFF, 0xFD, 0x2B, 0x41, 0xA2, 0x84, 0xC1, 0x83, 0x06, 0x05, 0x2A, 0xFC, 0xD7, 0xAA, + 0xA1, 0xC3, 0x87, 0x0D, 0x17, 0x4A, 0x94, 0x58, 0xA5, 0xCA, 0xC4, 0x8B, 0x0A, 0x0F, 0x8D, 0xC1, + 0xC8, 0xB1, 0xE3, 0x3F, 0x44, 0x88, 0x08, 0x75, 0x5C, 0xC3, 0x86, 0x24, 0x46, 0x0F, 0x20, 0x14, + 0x1C, 0xF0, 0xC8, 0xB2, 0xA5, 0xCB, 0x97, 0x30, 0x63, 0xB6, 0xA4, 0x77, 0xD1, 0x81, 0xCD, 0x9B, + 0x38, 0x73, 0x2A, 0x2C, 0xE1, 0x8F, 0x9F, 0xCF, 0x9F, 0xD6, 0x12, 0x2E, 0x6C, 0xB5, 0x6E, 0x57, + 0xAD, 0x75, 0xEE, 0xE2, 0x29, 0x55, 0xDA, 0x4A, 0xE1, 0x8C, 0x19, 0x08, 0xA3, 0x52, 0xA1, 0x42, + 0xA3, 0xA5, 0x23, 0x32, 0x63, 0x0E, 0x49, 0xF4, 0xA3, 0xA8, 0xAB, 0x57, 0x45, 0x7E, 0x5A, 0x82, + 0x50, 0xB3, 0x2D, 0x4D, 0x1A, 0x8C, 0x6C, 0xD8, 0x8C, 0x1B, 0xB7, 0x66, 0xCD, 0x45, 0x10, 0x02, + 0x03, 0x70, 0x3C, 0x43, 0xB7, 0xAE, 0x5D, 0xBA, 0x0B, 0x77, 0xE8, 0xDD, 0xCB, 0x57, 0xEF, 0xC2, + 0xBB, 0x80, 0xCF, 0x4C, 0xFC, 0x16, 0x09, 0x24, 0xC8, 0x48, 0xDF, 0x30, 0x62, 0xE3, 0x32, 0xA5, + 0xF1, 0x14, 0x2E, 0xD8, 0x2E, 0xD2, 0x9B, 0xB6, 0x04, 0x88, 0x65, 0x20, 0x4B, 0xA6, 0xD1, 0xC4, + 0x48, 0xEF, 0xD6, 0xAD, 0xCD, 0x0B, 0x1D, 0xC4, 0x53, 0x22, 0xA5, 0xB4, 0x69, 0xD3, 0x4A, 0xE2, + 0x39, 0xD8, 0xE9, 0xD3, 0x1E, 0x3F, 0x7B, 0xF6, 0xE8, 0x29, 0xF3, 0x47, 0x70, 0xA8, 0xBC, 0x78, + 0xEE, 0x76, 0xA5, 0x3A, 0xC6, 0x9B, 0xF7, 0x28, 0x52, 0xA4, 0xFE, 0xCD, 0x10, 0xE7, 0xAF, 0x78, + 0xF1, 0x67, 0x5A, 0x92, 0x6B, 0xA9, 0x26, 0x43, 0x86, 0x47, 0x32, 0x58, 0x37, 0x2A, 0xF4, 0xE3, + 0x27, 0x51, 0xA4, 0x48, 0xB4, 0xBA, 0xD9, 0x92, 0x05, 0xEB, 0x53, 0xD8, 0x8E, 0x20, 0x40, 0xFE, + 0xF8, 0x9B, 0x14, 0x49, 0xF0, 0x44, 0x92, 0xE3, 0xBC, 0x79, 0x63, 0xCB, 0x66, 0xA2, 0x07, 0x0F, + 0x07, 0x02, 0x00, 0xB8, 0x78, 0xC6, 0xD0, 0xA4, 0xFB, 0xF8, 0xF3, 0x1B, 0x32, 0xBF, 0xE3, 0x48, + 0x94, 0xFF, 0x00, 0x02, 0x08, 0x45, 0x10, 0x3B, 0x08, 0x54, 0x5F, 0x7E, 0x08, 0x4E, 0xB2, 0xDF, + 0x42, 0x92, 0x18, 0xE6, 0x20, 0x22, 0x93, 0x4C, 0x24, 0x86, 0x63, 0x14, 0x4E, 0x21, 0x86, 0x44, + 0xF4, 0x34, 0x71, 0xD9, 0x86, 0x40, 0x34, 0x01, 0x9A, 0x44, 0xE8, 0x78, 0x86, 0xCE, 0x44, 0x0E, + 0x28, 0xA1, 0x84, 0x34, 0x27, 0xA6, 0x88, 0x22, 0x8A, 0x4A, 0xAC, 0x26, 0x10, 0x09, 0x3D, 0xBD, + 0x06, 0x9B, 0x3D, 0xC6, 0xD4, 0x08, 0xC1, 0x50, 0x4B, 0xC5, 0x33, 0x8B, 0x71, 0x3C, 0x06, 0x37, + 0x43, 0x38, 0x3C, 0xFA, 0xB3, 0x9C, 0x18, 0x61, 0x14, 0x29, 0x86, 0x73, 0x1C, 0x41, 0x37, 0xC6, + 0x18, 0x8E, 0x08, 0x94, 0x87, 0x1F, 0x8B, 0xD8, 0xE2, 0xC8, 0x7D, 0x86, 0xCC, 0x02, 0x0B, 0x30, + 0xC0, 0x84, 0x42, 0x1D, 0x47, 0x9C, 0x68, 0xE2, 0xCF, 0x3C, 0xF4, 0x8C, 0x61, 0xDE, 0x42, 0xE8, + 0xA9, 0xA7, 0x1E, 0x5B, 0x6E, 0x2D, 0x04, 0x5F, 0x3E, 0x28, 0x00, 0x30, 0x9F, 0x44, 0x67, 0x90, + 0x77, 0xDD, 0x9C, 0x74, 0x96, 0x27, 0xD0, 0x0E, 0x50, 0x3C, 0xA1, 0xE7, 0x13, 0x48, 0x20, 0xB1, + 0xE7, 0x13, 0x50, 0x14, 0xF8, 0x4F, 0x9C, 0x75, 0x16, 0x3A, 0xE6, 0x24, 0x88, 0x30, 0xC2, 0x88, + 0x83, 0x8A, 0x42, 0xB8, 0xD0, 0x84, 0x8E, 0x15, 0x47, 0xE1, 0x85, 0x0A, 0x69, 0xC8, 0xE1, 0x86, + 0x1E, 0x4E, 0xD4, 0x99, 0x67, 0x9F, 0x49, 0xE4, 0x00, 0x13, 0x49, 0x90, 0xF3, 0x40, 0x3C, 0xA3, + 0x96, 0x4A, 0x4E, 0x12, 0x4C, 0xB8, 0xF8, 0x0F, 0x8C, 0x3D, 0xF9, 0xE3, 0x1A, 0x6C, 0xFE, 0xF4, + 0xF0, 0x33, 0x02, 0x8E, 0x4B, 0x91, 0xB2, 0xC5, 0x16, 0x60, 0x80, 0x71, 0xCD, 0x35, 0xFE, 0xF8, + 0x08, 0x64, 0xAB, 0xFC, 0x7C, 0xA1, 0x9C, 0x16, 0x56, 0xB8, 0xD0, 0x42, 0x92, 0x4A, 0x4A, 0xF7, + 0x8F, 0x1F, 0xB1, 0x98, 0x63, 0xCB, 0x21, 0x87, 0xB8, 0x01, 0x89, 0x2D, 0xA2, 0x88, 0xD2, 0xC9, + 0x2C, 0xAE, 0xE4, 0x81, 0x11, 0x28, 0x9B, 0xB4, 0x23, 0x0A, 0x3D, 0x01, 0x14, 0x30, 0x51, 0x30, + 0xC1, 0x8C, 0xC3, 0x0D, 0x37, 0xDE, 0xA0, 0x9B, 0x0D, 0x37, 0x69, 0x0A, 0xB4, 0x26, 0x3D, 0x28, + 0xE4, 0xE3, 0x26, 0x9C, 0x93, 0x38, 0xE2, 0x88, 0x3F, 0xF6, 0xDA, 0x8B, 0xAF, 0x23, 0x76, 0xFE, + 0x83, 0xA7, 0x13, 0x00, 0x23, 0x51, 0x1C, 0x12, 0x00, 0x3B, 0x11, 0xA8, 0x81, 0xF5, 0xE6, 0xAB, + 0xB0, 0xBD, 0xFD, 0x7E, 0x93, 0x68, 0x3F, 0xFD, 0x2C, 0xFA, 0x70, 0xC4, 0x88, 0x24, 0xF6, 0x0F, + 0x36, 0x15, 0x4A, 0x4A, 0x61, 0x64, 0xFF, 0x4C, 0x73, 0x29, 0x10, 0xC5, 0xF8, 0xB3, 0x8F, 0x65, + 0xD3, 0x4C, 0x14, 0x22, 0xA7, 0x23, 0x86, 0x26, 0x0D, 0x39, 0x1F, 0xBC, 0xE7, 0xF2, 0x7B, 0x1F, + 0x90, 0x23, 0x8D, 0xAA, 0x23, 0x00, 0x2B, 0x23, 0x6C, 0xFC, 0x90, 0xB0, 0xD0, 0x1F, 0xB8, 0x25, + 0x35, 0x8A, 0x33, 0x40, 0x7F, 0x61, 0xCD, 0x3D, 0xBD, 0x0A, 0x07, 0xA4, 0x6B, 0x3F, 0xBD, 0xC6, + 0x0F, 0x0C, 0x30, 0xAC, 0x80, 0x2C, 0x1A, 0x63, 0x50, 0xA0, 0x50, 0x1E, 0xB3, 0x68, 0x67, 0x0B, + 0x24, 0x68, 0x4C, 0xBB, 0x9D, 0x26, 0xB2, 0xD8, 0x62, 0x8B, 0xB6, 0x13, 0x71, 0xC2, 0x49, 0x3B, + 0xC0, 0xE4, 0x62, 0xC7, 0x9B, 0x0B, 0x91, 0x5B, 0xDC, 0xB9, 0xEA, 0xAE, 0xDB, 0xEE, 0xBB, 0xF3, + 0xA0, 0xC0, 0x0C, 0x3D, 0xF3, 0x2A, 0x44, 0x46, 0x24, 0x8D, 0x18, 0xD7, 0x48, 0xFE, 0xDE, 0xC5, + 0x35, 0x72, 0x95, 0x40, 0x39, 0x40, 0xD1, 0x27, 0x12, 0x42, 0x14, 0x27, 0xC4, 0xE0, 0x4E, 0xE4, + 0x20, 0xD0, 0xDD, 0x7B, 0x37, 0xEE, 0xB8, 0xDF, 0x64, 0x08, 0x54, 0x18, 0x23, 0xFD, 0xF8, 0x13, + 0x31, 0xE5, 0x96, 0x2F, 0x1A, 0x89, 0x40, 0x8C, 0x55, 0xE8, 0x39, 0x17, 0x02, 0x55, 0x76, 0xE9, + 0x3E, 0xFE, 0x14, 0x63, 0xD9, 0x12, 0x18, 0x7A, 0xE6, 0xA6, 0x67, 0x1F, 0x96, 0xF8, 0x80, 0x07, + 0xF4, 0x7C, 0x09, 0xC2, 0x3C, 0xFE, 0xD0, 0xE3, 0xC1, 0x03, 0x2D, 0x2A, 0x54, 0x33, 0xB0, 0xAE, + 0x2A, 0x1D, 0xC1, 0xCE, 0xEE, 0xB0, 0xC3, 0x8E, 0x3B, 0xB1, 0xF0, 0x18, 0x0D, 0x3F, 0x45, 0xFF, + 0x78, 0xF3, 0x8C, 0xB0, 0x5D, 0xD1, 0xCC, 0x0C, 0x18, 0x41, 0xF7, 0x46, 0x19, 0x52, 0x4F, 0xAD, + 0x4E, 0x37, 0xDD, 0x98, 0x83, 0xFD, 0xF6, 0xD8, 0x2F, 0xF3, 0xC5, 0x17, 0x81, 0x4C, 0x04, 0xCA, + 0xD8, 0xC0, 0xF4, 0xC2, 0x09, 0x28, 0x13, 0xA1, 0x80, 0x42, 0x71, 0xF9, 0xF8, 0x83, 0x6E, 0x26, + 0xD9, 0x6C, 0xB3, 0x86, 0x19, 0xEE, 0x1E, 0x90, 0x0F, 0x3D, 0xF3, 0x20, 0x83, 0xC2, 0x30, 0xC8, + 0x80, 0x7B, 0x83, 0x17, 0x8B, 0x7B, 0xC4, 0x1B, 0xDA, 0xC0, 0x3E, 0x7A, 0x18, 0xB0, 0x0C, 0x68, + 0x70, 0x43, 0xE4, 0xFE, 0x91, 0x83, 0x27, 0x08, 0x21, 0x08, 0x10, 0xCC, 0x47, 0x3E, 0x74, 0x40, + 0x41, 0x1D, 0x04, 0x41, 0x71, 0xFF, 0x20, 0x83, 0x00, 0xDF, 0xC0, 0x41, 0x37, 0xA0, 0x01, 0x0D, + 0x65, 0x40, 0xA0, 0x02, 0x05, 0x62, 0x18, 0xCC, 0x41, 0x2C, 0x73, 0x86, 0x11, 0x88, 0xE7, 0x34, + 0x46, 0x21, 0x81, 0x7C, 0x2C, 0x64, 0x23, 0xBB, 0x0C, 0x88, 0x54, 0x07, 0x00, 0x11, 0x85, 0x86, + 0x15, 0xE9, 0x50, 0x00, 0x08, 0x3C, 0xE0, 0x0F, 0x97, 0xF9, 0x43, 0x01, 0xFE, 0xE9, 0x60, 0x85, + 0xAA, 0x22, 0x10, 0x24, 0xE4, 0xE1, 0xCC, 0x04, 0x84, 0x10, 0x84, 0x40, 0xFE, 0x10, 0xBC, 0xE1, + 0x6D, 0xE2, 0x15, 0x50, 0xF4, 0x87, 0x31, 0x7C, 0xE2, 0x23, 0x70, 0xD4, 0x23, 0x69, 0x48, 0xE3, + 0x47, 0x3D, 0xC0, 0x01, 0xBD, 0x89, 0x40, 0xE7, 0x10, 0x68, 0xA8, 0x9E, 0x42, 0xE6, 0x30, 0x0B, + 0x73, 0xC4, 0x22, 0x0F, 0xCD, 0xCA, 0xDE, 0xF6, 0xBA, 0x40, 0x0D, 0x6A, 0x5C, 0x41, 0x22, 0x62, + 0x23, 0x9B, 0x2E, 0x36, 0xC1, 0x89, 0xF4, 0xC5, 0x4B, 0x82, 0xFE, 0x90, 0x60, 0x26, 0x32, 0xB1, + 0x0D, 0x33, 0xD0, 0xEF, 0x1F, 0x70, 0x63, 0xC6, 0x30, 0xE6, 0x11, 0x0C, 0x62, 0x24, 0xA3, 0x1E, + 0x21, 0xC0, 0xC1, 0x0D, 0x32, 0xE8, 0x88, 0x37, 0xB8, 0xA1, 0x0C, 0x60, 0x3A, 0xE0, 0x07, 0xD1, + 0xB0, 0xC0, 0x1C, 0x38, 0x21, 0x08, 0x79, 0x34, 0x20, 0x3D, 0x24, 0x98, 0x0F, 0x1E, 0xF0, 0x00, + 0x83, 0x64, 0x68, 0x64, 0xED, 0x22, 0xC9, 0xC9, 0x0F, 0x2E, 0x90, 0x51, 0x95, 0x43, 0x61, 0x0A, + 0xFF, 0xB1, 0x42, 0x7F, 0x78, 0xCE, 0x85, 0xA3, 0x2B, 0xDD, 0x86, 0x16, 0xB2, 0xA9, 0x5B, 0xAC, + 0x8E, 0x75, 0x0A, 0x71, 0x40, 0x12, 0x1E, 0xA0, 0x00, 0x64, 0xF8, 0x63, 0x18, 0x1E, 0x08, 0x46, + 0x3E, 0x90, 0xA1, 0x80, 0x07, 0x24, 0x61, 0x88, 0x3C, 0x42, 0x9E, 0x11, 0xED, 0x61, 0x82, 0xB2, + 0x2C, 0x51, 0x78, 0xC2, 0xF3, 0x04, 0x2C, 0x60, 0xF1, 0x0A, 0x7F, 0x64, 0xE1, 0x1A, 0xFC, 0x08, + 0x0E, 0x06, 0xC0, 0x01, 0x8D, 0x6E, 0x7A, 0xF3, 0x9B, 0xD0, 0xE8, 0xE2, 0x42, 0xA0, 0xE3, 0x88, + 0x36, 0x88, 0x71, 0x21, 0x70, 0x48, 0xE7, 0x3F, 0xE0, 0xA0, 0x8E, 0x58, 0xD0, 0x21, 0x15, 0xD8, + 0xBB, 0xC2, 0x15, 0x6A, 0x10, 0x3E, 0x85, 0x70, 0xAB, 0x1D, 0xBD, 0xFE, 0xE8, 0x85, 0x26, 0x36, + 0x31, 0x91, 0x13, 0xC4, 0x2B, 0x8F, 0x00, 0x05, 0x53, 0x36, 0xFC, 0x58, 0xBF, 0xFB, 0xCD, 0x23, + 0x19, 0x82, 0x04, 0x81, 0x30, 0x92, 0x91, 0x8C, 0x7C, 0x28, 0xE0, 0x06, 0x8B, 0x24, 0x43, 0x23, + 0x3C, 0x88, 0x06, 0x4D, 0xE6, 0x63, 0x92, 0x6A, 0xA8, 0xE4, 0x25, 0x35, 0xB9, 0x49, 0x4E, 0x7A, + 0x12, 0x94, 0x13, 0xC5, 0x9F, 0x01, 0x39, 0x79, 0xD1, 0x8C, 0x92, 0xB0, 0x84, 0xA9, 0xA4, 0xD8, + 0x2A, 0x5B, 0xF9, 0xCA, 0x7F, 0x5C, 0x86, 0x74, 0xC5, 0x80, 0x21, 0x87, 0x16, 0x72, 0x32, 0x5B, + 0xD6, 0xD0, 0x86, 0x02, 0x61, 0x00, 0x2A, 0xCC, 0xA1, 0x00, 0x0F, 0x28, 0xC0, 0xA1, 0xF9, 0x38, + 0x81, 0x4F, 0xCD, 0x81, 0x0A, 0x06, 0x28, 0x04, 0x02, 0x41, 0x2A, 0x0E, 0x3F, 0xE0, 0xE1, 0x4B, + 0x09, 0x2C, 0xF0, 0x0F, 0xEC, 0x58, 0xC7, 0x3A, 0xD8, 0xF1, 0x09, 0x5F, 0xE0, 0x02, 0x17, 0xFE, + 0xC0, 0x02, 0x35, 0xB2, 0x29, 0x1C, 0x68, 0x54, 0xE2, 0xAB, 0x60, 0x0D, 0x6B, 0x38, 0x30, 0x20, + 0x11, 0x0B, 0x84, 0xD2, 0x0D, 0xE7, 0xBC, 0x08, 0x1C, 0x00, 0xC1, 0x0E, 0x3A, 0xFC, 0x83, 0x0E, + 0xE7, 0xE8, 0xC6, 0x31, 0x5E, 0x50, 0x0A, 0xB0, 0xFD, 0x23, 0x8E, 0xF9, 0xB4, 0x83, 0x26, 0xFA, + 0x79, 0x02, 0x92, 0x4A, 0x70, 0x1E, 0x60, 0x52, 0xC0, 0x1F, 0xFF, 0x61, 0x3F, 0xFC, 0x31, 0x83, + 0x19, 0xC9, 0x40, 0x86, 0x21, 0xA3, 0xA1, 0x8F, 0x9E, 0xC6, 0x20, 0x06, 0xFF, 0xC8, 0x8A, 0x1A, + 0xD4, 0x60, 0x51, 0x09, 0x4E, 0x56, 0x0D, 0xD2, 0xC9, 0x01, 0x12, 0x7A, 0xE0, 0x49, 0x1E, 0x48, + 0xB0, 0xB3, 0x3D, 0xE8, 0x01, 0x06, 0x25, 0x3B, 0xC9, 0xD2, 0xA2, 0x61, 0xB2, 0xD2, 0x41, 0xA9, + 0xE5, 0x2A, 0xA7, 0x52, 0x44, 0xA8, 0x30, 0x63, 0xAE, 0xAC, 0xFE, 0x10, 0x2C, 0x41, 0x26, 0x32, + 0x98, 0xCE, 0x54, 0x20, 0xB5, 0xB4, 0x29, 0xA7, 0x3A, 0xF5, 0x0F, 0x06, 0x00, 0xE1, 0x01, 0x07, + 0x60, 0x46, 0x3E, 0x98, 0xF1, 0x53, 0x09, 0x1E, 0xE0, 0x01, 0x40, 0x30, 0xAA, 0x40, 0x90, 0x5A, + 0x44, 0x78, 0xC8, 0x02, 0x18, 0x08, 0x90, 0x8B, 0x40, 0xF8, 0xB0, 0x0E, 0x74, 0xA0, 0x63, 0x1D, + 0xA1, 0x78, 0xC7, 0x2F, 0x70, 0xC1, 0x8F, 0x29, 0x72, 0x75, 0x9B, 0x95, 0x00, 0xEC, 0x3C, 0xA2, + 0x01, 0x58, 0x4B, 0x60, 0xC2, 0x12, 0xE1, 0x5C, 0xC8, 0x0E, 0x0F, 0xF1, 0x86, 0xB4, 0x4E, 0x44, + 0x0E, 0x80, 0x50, 0x47, 0x5C, 0xAB, 0x16, 0xD7, 0x73, 0x98, 0x63, 0x0F, 0xF6, 0x1C, 0x9B, 0x2E, + 0x7A, 0x61, 0x07, 0x3C, 0x5C, 0xA4, 0xAF, 0x9C, 0xDC, 0x24, 0x60, 0xE9, 0x71, 0x80, 0x95, 0x28, + 0x24, 0x00, 0xF8, 0x43, 0x28, 0x32, 0x92, 0x61, 0xC8, 0x64, 0x34, 0xD6, 0x03, 0xFF, 0x70, 0x81, + 0x0B, 0x22, 0x6B, 0x08, 0xCA, 0x1A, 0xF0, 0x83, 0x9C, 0x44, 0x2D, 0xE0, 0x8E, 0x10, 0xDA, 0xD0, + 0x4A, 0xB0, 0xC3, 0xA1, 0x1D, 0x6D, 0x85, 0x2F, 0x4B, 0xE2, 0xCB, 0x4A, 0x67, 0x72, 0xAC, 0x55, + 0x54, 0x8A, 0x11, 0xB1, 0xB9, 0x7F, 0x74, 0x2E, 0x52, 0xB1, 0x75, 0x0C, 0xE8, 0xFE, 0x21, 0x3A, + 0x20, 0x90, 0x4E, 0x64, 0x1C, 0x42, 0x9D, 0x40, 0x6A, 0xBA, 0x5B, 0x94, 0xE5, 0x14, 0x15, 0xAB, + 0x48, 0x40, 0x00, 0x86, 0x4C, 0xE4, 0x00, 0x24, 0x60, 0x15, 0x45, 0x3D, 0x6A, 0x52, 0x9D, 0x0B, + 0x8C, 0x54, 0x6C, 0x60, 0x21, 0x7A, 0x58, 0x87, 0x39, 0xCC, 0xB1, 0x0E, 0x3E, 0xDC, 0xE2, 0x15, + 0xA0, 0xE0, 0x87, 0x08, 0x58, 0x00, 0x9C, 0x7F, 0x60, 0x00, 0x1A, 0x96, 0x88, 0x86, 0x0D, 0x6C, + 0x70, 0xD8, 0x68, 0x54, 0x02, 0x13, 0x97, 0x00, 0x07, 0xFE, 0x59, 0x05, 0xB2, 0x43, 0x7F, 0x20, + 0xC3, 0xBD, 0xEF, 0xB5, 0xAF, 0x39, 0xCE, 0x21, 0x5F, 0x75, 0xB4, 0xD3, 0xAE, 0x7C, 0xE8, 0x96, + 0x2E, 0x74, 0xD1, 0x01, 0x3B, 0x60, 0x04, 0x04, 0x01, 0xCE, 0x87, 0x78, 0x87, 0x2C, 0x11, 0x37, + 0xCD, 0x03, 0xB1, 0x8A, 0x4D, 0x46, 0x34, 0xEA, 0xD1, 0x53, 0x81, 0xA8, 0x40, 0x05, 0x91, 0x1D, + 0xC4, 0x20, 0x28, 0xAB, 0x06, 0x49, 0xAB, 0x21, 0x1F, 0x95, 0x1E, 0x44, 0x66, 0x8B, 0xC0, 0xE9, + 0x22, 0xF4, 0xE0, 0xC3, 0x9D, 0x2E, 0xC2, 0x68, 0x25, 0x4D, 0xEA, 0x52, 0x93, 0x5A, 0x3A, 0x0E, + 0xA3, 0x9C, 0x4A, 0x55, 0xBD, 0x28, 0x8B, 0x61, 0x8C, 0x42, 0x2C, 0x6C, 0x0C, 0xC7, 0x3C, 0x66, + 0x99, 0x90, 0xC9, 0x72, 0x43, 0x25, 0xFB, 0x47, 0x6E, 0x75, 0xBB, 0x5B, 0x9A, 0xF8, 0xD6, 0x07, + 0xAA, 0x68, 0xC0, 0x2C, 0x84, 0x4D, 0x6C, 0x55, 0xF8, 0x20, 0xB9, 0x4A, 0xE6, 0x11, 0x93, 0x53, + 0x51, 0x8E, 0x1B, 0x29, 0xE4, 0x0E, 0xE8, 0xE0, 0x05, 0x2F, 0xD0, 0x71, 0x87, 0x57, 0x6C, 0x02, + 0x0F, 0xFC, 0x30, 0x45, 0x53, 0x04, 0xF2, 0xE5, 0x4A, 0x30, 0xC3, 0x12, 0x97, 0x60, 0x68, 0x32, + 0x2E, 0x81, 0x09, 0x4C, 0x40, 0x63, 0xCD, 0x7B, 0xD8, 0x83, 0x9B, 0xA5, 0xEB, 0x11, 0x39, 0x34, + 0x4B, 0xBE, 0xDD, 0x98, 0x05, 0x20, 0xE6, 0xB0, 0x10, 0x3C, 0xD4, 0x01, 0x1F, 0xB2, 0xE0, 0x73, + 0x07, 0x38, 0xE2, 0xD3, 0xDA, 0x0D, 0x17, 0xB0, 0xF2, 0xB9, 0x88, 0x9B, 0xA2, 0x91, 0xE8, 0x45, + 0x1F, 0x40, 0x01, 0x0A, 0x49, 0x41, 0x0A, 0xFE, 0x41, 0x81, 0x41, 0x14, 0xA2, 0x10, 0x6A, 0x78, + 0xF8, 0xC3, 0x23, 0x5E, 0x08, 0x41, 0x54, 0xCF, 0x01, 0x45, 0x30, 0x82, 0xC6, 0x8D, 0x10, 0xDA, + 0x8D, 0x1B, 0x81, 0x08, 0x2E, 0x6A, 0xB8, 0xC4, 0xFE, 0x47, 0x2E, 0x71, 0x8B, 0x2B, 0xA4, 0x41, + 0x8D, 0x2A, 0xE1, 0xA2, 0x22, 0xA4, 0x10, 0x48, 0x35, 0x26, 0xD6, 0x94, 0x12, 0x88, 0xA5, 0x3E, + 0xD6, 0xA1, 0xCD, 0xF0, 0x98, 0xD7, 0x3E, 0x5E, 0xC0, 0x0F, 0x7E, 0x70, 0x0A, 0x9E, 0xFB, 0xBC, + 0xE7, 0x3D, 0xFF, 0xC1, 0x02, 0x92, 0x5D, 0x1C, 0x7C, 0x37, 0xB9, 0x1C, 0xFE, 0x70, 0xB6, 0x40, + 0xE2, 0x10, 0x8A, 0x32, 0x9A, 0x23, 0x14, 0x49, 0x7B, 0xB2, 0x42, 0x2E, 0x70, 0x01, 0x4A, 0x8C, + 0x3B, 0xDC, 0x0C, 0x25, 0xB7, 0xB9, 0x2F, 0x20, 0x90, 0x3D, 0xC4, 0x02, 0x10, 0xEC, 0x66, 0x49, + 0x3A, 0xC7, 0x0E, 0x87, 0x89, 0xD4, 0x61, 0x15, 0xF8, 0x28, 0x07, 0x07, 0xF6, 0xDD, 0x91, 0xF8, + 0x08, 0x1A, 0xB0, 0x75, 0x13, 0x38, 0x00, 0x18, 0xBA, 0x68, 0x42, 0x27, 0x5C, 0x20, 0x13, 0x20, + 0x83, 0xC3, 0x49, 0xFE, 0x70, 0x41, 0x90, 0x61, 0x02, 0x02, 0x71, 0x40, 0x0E, 0x32, 0xEE, 0xF1, + 0x8D, 0x0F, 0x21, 0x07, 0x2E, 0xCA, 0xFB, 0xDE, 0xF9, 0xEE, 0x77, 0xC0, 0x2B, 0x04, 0x51, 0x0F, + 0x02, 0x09, 0xCB, 0x1F, 0xE5, 0xB9, 0xC6, 0xC4, 0xBC, 0x52, 0x34, 0xCF, 0x94, 0x40, 0x7A, 0xCC, + 0x79, 0x4E, 0xFD, 0x43, 0x00, 0xB3, 0xF8, 0x01, 0xCD, 0x81, 0xF0, 0x83, 0x59, 0x08, 0x40, 0x21, + 0x04, 0xE0, 0x91, 0x36, 0xF0, 0x91, 0x0A, 0x78, 0x14, 0x87, 0x00, 0x12, 0xB9, 0xC3, 0x1D, 0xFA, + 0x20, 0x0B, 0x0E, 0x78, 0xE2, 0xF6, 0xB7, 0x97, 0x08, 0xD5, 0xDD, 0xC4, 0x7B, 0x00, 0x50, 0xFD, + 0xF7, 0xFF, 0xC0, 0x81, 0x30, 0x52, 0x51, 0x01, 0x99, 0x74, 0x84, 0x03, 0xAC, 0xE7, 0x00, 0x07, + 0x5A, 0x22, 0x9F, 0xDE, 0x7B, 0x64, 0xE0, 0xF5, 0x88, 0xFB, 0x44, 0x24, 0x40, 0xFD, 0xEA, 0x5B, + 0x9F, 0xFA, 0x0B, 0x61, 0x80, 0xF6, 0xB7, 0x56, 0xCF, 0x7D, 0xED, 0x2F, 0xE4, 0xFA, 0xE0, 0x97, + 0xC0, 0x60, 0x0A, 0x63, 0x18, 0xC4, 0x28, 0xE6, 0xC5, 0x8F, 0xE1, 0x18, 0x86, 0x28, 0xB3, 0xA1, + 0xCC, 0x7C, 0xE8, 0xE6, 0x9D, 0x1F, 0x91, 0x00, 0xE6, 0x4F, 0xFF, 0xFA, 0xDB, 0x5F, 0x21, 0x03, + 0xC8, 0x7F, 0xFE, 0x01, 0xA0, 0x01, 0x03, 0xE8, 0x7F, 0x00, 0x17, 0x11, 0x07, 0x71, 0xB0, 0x6D, + 0xC6, 0xA7, 0x10, 0x5B, 0xE0, 0x02, 0x19, 0x50, 0x80, 0x1C, 0x01, 0x00, 0xCA, 0xB7, 0x7C, 0x0A, + 0xD8, 0x11, 0xCE, 0xF7, 0x80, 0x12, 0x38, 0x81, 0x14, 0x58, 0x81, 0x2F, 0x11, 0x10, 0x00, 0x3B, +};