From 6b07b2af74b25f75e6006c13da4826568d0ea3c1 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 7 Feb 2016 21:57:03 +0100 Subject: [PATCH 1/6] GTRANS module skeleton --- demos/modules/gtrans/basic/demo.mk | 3 ++ demos/modules/gtrans/basic/gfxconf.h | 66 ++++++++++++++++++++++++++++ demos/modules/gtrans/basic/main.c | 42 ++++++++++++++++++ gfx.mk | 1 + gfxconf.example.h | 6 +++ src/gfx.c | 10 +++++ src/gfx_mk.c | 1 + src/gtrans/gtrans.c | 20 +++++++++ src/gtrans/gtrans.h | 39 ++++++++++++++++ src/gtrans/gtrans.mk | 6 +++ src/gtrans/gtrans_mk.c | 8 ++++ src/gtrans/gtrans_options.h | 21 +++++++++ src/gtrans/gtrans_rules.h | 22 ++++++++++ 13 files changed, 245 insertions(+) create mode 100644 demos/modules/gtrans/basic/demo.mk create mode 100644 demos/modules/gtrans/basic/gfxconf.h create mode 100644 demos/modules/gtrans/basic/main.c create mode 100644 src/gtrans/gtrans.c create mode 100644 src/gtrans/gtrans.h create mode 100644 src/gtrans/gtrans.mk create mode 100644 src/gtrans/gtrans_mk.c create mode 100644 src/gtrans/gtrans_options.h create mode 100644 src/gtrans/gtrans_rules.h diff --git a/demos/modules/gtrans/basic/demo.mk b/demos/modules/gtrans/basic/demo.mk new file mode 100644 index 00000000..aeda098b --- /dev/null +++ b/demos/modules/gtrans/basic/demo.mk @@ -0,0 +1,3 @@ +DEMODIR = $(GFXLIB)/demos/modules/gtrans/basic +GFXINC += $(DEMODIR) +GFXSRC += $(DEMODIR)/main.c diff --git a/demos/modules/gtrans/basic/gfxconf.h b/demos/modules/gtrans/basic/gfxconf.h new file mode 100644 index 00000000..a5a0fbef --- /dev/null +++ b/demos/modules/gtrans/basic/gfxconf.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu + * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket + * + * 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. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 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 _GFXCONF_H +#define _GFXCONF_H + +/* The operating system to use. One of these must be defined - preferably in your Makefile */ +//#define GFX_USE_OS_CHIBIOS FALSE +//#define GFX_USE_OS_WIN32 FALSE +//#define GFX_USE_OS_LINUX FALSE +//#define GFX_USE_OS_OSX FALSE + +#define GFX_USE_GTRANS TRUE +#define GFX_USE_GDISP TRUE + +#define GDISP_NEED_VALIDATION TRUE +#define GDISP_NEED_CLIP TRUE +#define GDISP_NEED_TEXT TRUE +#define GDISP_NEED_ANTIALIAS TRUE + +#define GDISP_INCLUDE_USER_FONTS FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 FALSE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS10 FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS12 FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS16 TRUE +#define GDISP_INCLUDE_FONT_DEJAVUSANS24 FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS32 FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12 FALSE +#define GDISP_INCLUDE_FONT_FIXED_10x20 FALSE +#define GDISP_INCLUDE_FONT_FIXED_7x14 FALSE +#define GDISP_INCLUDE_FONT_FIXED_5x8 FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA FALSE +#define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA FALSE + +#endif /* _GFXCONF_H */ diff --git a/demos/modules/gtrans/basic/main.c b/demos/modules/gtrans/basic/main.c new file mode 100644 index 00000000..38d163cd --- /dev/null +++ b/demos/modules/gtrans/basic/main.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu + * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket + * + * 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. + * * Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * 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 "gfx.h" + +int main(void) +{ + gfxInit(); + + while (TRUE) { + gfxSleepMilliseconds(500); + } + + return 0; +} + diff --git a/gfx.mk b/gfx.mk index 1644176d..3201c313 100644 --- a/gfx.mk +++ b/gfx.mk @@ -21,6 +21,7 @@ else include $(GFXLIB)/src/gaudio/gaudio.mk include $(GFXLIB)/src/gmisc/gmisc.mk include $(GFXLIB)/src/gfile/gfile.mk + include $(GFXLIB)/src/gtrans/gtrans.mk endif # Include the boards and drivers diff --git a/gfxconf.example.h b/gfxconf.example.h index 03f1f264..df22e86f 100644 --- a/gfxconf.example.h +++ b/gfxconf.example.h @@ -208,6 +208,12 @@ // #define GWIN_TABSET_TABHEIGHT 18 +/////////////////////////////////////////////////////////////////////////// +// GTRANS // +/////////////////////////////////////////////////////////////////////////// +//#define GFX_USE_GTRANS FALSE + + /////////////////////////////////////////////////////////////////////////// // GEVENT // /////////////////////////////////////////////////////////////////////////// diff --git a/src/gfx.c b/src/gfx.c index 34526e6b..ba7a581e 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -73,6 +73,10 @@ extern void _gosDeinit(void); extern void _gmiscInit(void); extern void _gmiscDeinit(void); #endif +#if GFX_USE_GTRANS + extern void _gtransInit(void); + extern void _gtransDeinit(void); +#endif void gfxInit(void) { @@ -96,6 +100,9 @@ void gfxInit(void) #if GFX_USE_GMISC _gmiscInit(); #endif + #if GFX_USE_GTRANS + _gtransInit(); + #endif #if GFX_USE_GEVENT _geventInit(); #endif @@ -159,6 +166,9 @@ void gfxDeinit(void) #if GFX_USE_GEVENT _geventDeinit(); #endif + #if GFX_USE_GTRANS + _gtransDeinit(); + #endif #if GFX_USE_GMISC _gmiscDeinit(); #endif diff --git a/src/gfx_mk.c b/src/gfx_mk.c index 34e6afd8..625ba680 100644 --- a/src/gfx_mk.c +++ b/src/gfx_mk.c @@ -18,3 +18,4 @@ #include "gaudio/gaudio_mk.c" #include "gmisc/gmisc_mk.c" #include "gfile/gfile_mk.c" +#include "gtrans/gtrans_mk.c" diff --git a/src/gtrans/gtrans.c b/src/gtrans/gtrans.c new file mode 100644 index 00000000..7e1105d6 --- /dev/null +++ b/src/gtrans/gtrans.c @@ -0,0 +1,20 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +#include "../../gfx.h" + +#if GFX_USE_GTRANS + +void _gtransInit(void) +{ +} + +void _gtransDeinit(void) +{ +} + +#endif /* GFX_USE_GTRANS */ diff --git a/src/gtrans/gtrans.h b/src/gtrans/gtrans.h new file mode 100644 index 00000000..c46b5b28 --- /dev/null +++ b/src/gtrans/gtrans.h @@ -0,0 +1,39 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +/** + * @file src/gtrans/gtrans.h + * + * @addtogroup GTRANS + * + * @brief Module to allow changing the language of an application dynamically during run-time. + * + * @{ + */ + +#ifndef _TRANS_H +#define _TRANS_H + +#include "../../gfx.h" + +#if GFX_USE_GTRANS || defined(__DOXYGEN__) + +#ifdef __cplusplus +extern "C" { +#endif + + + +#ifdef __cplusplus +} +#endif + +#endif /* GFX_USE_GTRANS */ + +#endif /* _TRANS_H */ +/** @} */ + diff --git a/src/gtrans/gtrans.mk b/src/gtrans/gtrans.mk new file mode 100644 index 00000000..e2f474f3 --- /dev/null +++ b/src/gtrans/gtrans.mk @@ -0,0 +1,6 @@ +# This file is subject to the terms of the GFX License. If a copy of +# the license was not distributed with this file, you can obtain one at: +# +# http://ugfx.org/license.html + +GFXSRC += $(GFXLIB)/src/gtrans/gtrans.c diff --git a/src/gtrans/gtrans_mk.c b/src/gtrans/gtrans_mk.c new file mode 100644 index 00000000..57557509 --- /dev/null +++ b/src/gtrans/gtrans_mk.c @@ -0,0 +1,8 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +#include "gtrans.c" diff --git a/src/gtrans/gtrans_options.h b/src/gtrans/gtrans_options.h new file mode 100644 index 00000000..04193f85 --- /dev/null +++ b/src/gtrans/gtrans_options.h @@ -0,0 +1,21 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +/** + * @file src/gtrans/gtrans_options.h + * + * @addtogroup GTRANS + * @{ + */ + +#ifndef _GTRANS_OPTIONS_H +#define _GTRANS_OPTIONS_H + + + +#endif /* _GTRANS_OPTIONS_H */ +/** @} */ diff --git a/src/gtrans/gtrans_rules.h b/src/gtrans/gtrans_rules.h new file mode 100644 index 00000000..e5d383ce --- /dev/null +++ b/src/gtrans/gtrans_rules.h @@ -0,0 +1,22 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +/** + * @file src/gtrans/gtrans_rules.h + * + * @addtogroup GTRANS + * @{ + */ + +#ifndef _GTRANS_RULES_H +#define _GTRANS_RULES_H + +#if GFX_USE_GTRANS +#endif + +#endif /* _GTRANS_RULES_H */ +/** @} */ From 7b6000346133a34600058931c7dbe2cfbbe1559d Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sun, 7 Feb 2016 22:59:35 +0100 Subject: [PATCH 2/6] Preliminary version of GTRANS --- demos/modules/gtrans/basic/gfxconf.h | 2 +- demos/modules/gtrans/basic/main.c | 39 ++++++++++++++++++++- gfx.h | 10 ++++++ src/gtrans/gtrans.c | 51 ++++++++++++++++++++++++++++ src/gtrans/gtrans.h | 10 +++++- 5 files changed, 109 insertions(+), 3 deletions(-) diff --git a/demos/modules/gtrans/basic/gfxconf.h b/demos/modules/gtrans/basic/gfxconf.h index a5a0fbef..09e6bbea 100644 --- a/demos/modules/gtrans/basic/gfxconf.h +++ b/demos/modules/gtrans/basic/gfxconf.h @@ -42,7 +42,7 @@ #define GDISP_NEED_VALIDATION TRUE #define GDISP_NEED_CLIP TRUE #define GDISP_NEED_TEXT TRUE -#define GDISP_NEED_ANTIALIAS TRUE +#define GDISP_NEED_ANTIALIAS FALSE #define GDISP_INCLUDE_USER_FONTS FALSE #define GDISP_INCLUDE_FONT_UI1 FALSE diff --git a/demos/modules/gtrans/basic/main.c b/demos/modules/gtrans/basic/main.c index 38d163cd..63310be7 100644 --- a/demos/modules/gtrans/basic/main.c +++ b/demos/modules/gtrans/basic/main.c @@ -28,10 +28,47 @@ */ #include "gfx.h" - + +static const char* EnglishStrings[] = { + "Welcome", + "The number %s has the value %d", + "Goodbye" +}; +static const transTable EnglishTranslation = { sizeof(EnglishStrings)/sizeof(EnglishStrings[0]), EnglishStrings }; + +static const char* GermanStrings[] = { + "Herzlich Willkommen", + "Die Zahl %s hat den Wert %d", + "Auf Wiedersehen" +}; +static const transTable GermanTranslation = { sizeof(GermanStrings)/sizeof(GermanStrings[0]), GermanStrings }; + int main(void) { + size_t i, j; + font_t font; + gfxInit(); + gdispClear(Silver); + + font = gdispOpenFont("*"); + + gtransSetBaseLanguage(&EnglishTranslation); + gtransSetLanguage(&GermanTranslation); + + gtransSetLanguage(&EnglishTranslation); + i = 0; + for (j = 0; j < EnglishTranslation.numEntries; j++) { + gdispFillStringBox(20+300*i, 35*j, 300, 35, gtransIndex(j), font, Black, Silver, justifyLeft); + } + + gtransSetLanguage(&GermanTranslation); + i = 1; + for (j = 0; j < EnglishTranslation.numEntries; j++) { + gdispFillStringBox(20+300*i, 35*j, 300, 35, gtransIndex(j), font, Black, Silver, justifyLeft); + } + + gdispFillStringBox(20, 300, 300, 25, gtransString("Welcome"), font, Black, Silver, justifyLeft); while (TRUE) { gfxSleepMilliseconds(500); diff --git a/gfx.h b/gfx.h index 1c217b32..afaf7b87 100644 --- a/gfx.h +++ b/gfx.h @@ -145,6 +145,13 @@ #ifndef GFX_USE_GFILE #define GFX_USE_GFILE FALSE #endif + /** + * @brief GFX Translation Support API + * @details Defaults to FALSE + */ + #ifndef GFX_USE_GTRANS + #define GFX_USE_GTRANS FALSE + #endif /** @} */ /** @@ -155,6 +162,7 @@ #include "src/gdriver/gdriver_options.h" #include "src/gfile/gfile_options.h" #include "src/gmisc/gmisc_options.h" +#include "src/gtrans/gtrans_options.h" #include "src/gqueue/gqueue_options.h" #include "src/gevent/gevent_options.h" #include "src/gtimer/gtimer_options.h" @@ -181,6 +189,7 @@ #include "src/gtimer/gtimer_rules.h" #include "src/gqueue/gqueue_rules.h" #include "src/gmisc/gmisc_rules.h" +#include "src/gtrans/gtrans_rules.h" #include "src/gfile/gfile_rules.h" #include "src/gdriver/gdriver_rules.h" #include "src/gos/gos_rules.h" @@ -192,6 +201,7 @@ //#include "src/gdriver/gdriver.h" // This module is only included by source that needs it. #include "src/gfile/gfile.h" #include "src/gmisc/gmisc.h" +#include "src/gtrans/gtrans.h" #include "src/gqueue/gqueue.h" #include "src/gevent/gevent.h" #include "src/gtimer/gtimer.h" diff --git a/src/gtrans/gtrans.c b/src/gtrans/gtrans.c index 7e1105d6..4961cdcb 100644 --- a/src/gtrans/gtrans.c +++ b/src/gtrans/gtrans.c @@ -5,16 +5,67 @@ * http://ugfx.org/license.html */ +#include #include "../../gfx.h" #if GFX_USE_GTRANS +static const transTable* _languageBase; +static const transTable* _languageCurrent; + void _gtransInit(void) { + _languageBase = 0; + _languageCurrent = 0; } void _gtransDeinit(void) { } +const char* gtransString(const char* string) +{ + size_t i = 0; + while (1) { + if (i >= _languageBase->numEntries-1) { + return 0; + } + + if (strcmp(string, _languageBase->strings[i]) == 0) { + break; + } + + i++; + } + + if (i >= _languageCurrent->numEntries-1) { + return 0; + } + + return _languageCurrent->strings[i]; +} + +const char* gtransIndex(unsigned index) +{ + if (!_languageCurrent) { + return 0; + } + + if (index >= _languageCurrent->numEntries) { + return 0; + } + + return _languageCurrent->strings[index]; +} + +void gtransSetBaseLanguage(const transTable* const translation) +{ + _languageBase = translation; +} + +void gtransSetLanguage(const transTable* const translation) +{ + _languageCurrent = translation; +} + #endif /* GFX_USE_GTRANS */ diff --git a/src/gtrans/gtrans.h b/src/gtrans/gtrans.h index c46b5b28..f09d90e1 100644 --- a/src/gtrans/gtrans.h +++ b/src/gtrans/gtrans.h @@ -22,11 +22,19 @@ #if GFX_USE_GTRANS || defined(__DOXYGEN__) +typedef struct transTable { + unsigned numEntries; + const char** strings; +} transTable; + #ifdef __cplusplus extern "C" { #endif - +const char* gtransString(const char* string); +const char* gtransIndex(unsigned index); +void gtransSetBaseLanguage(const transTable* const translation); +void gtransSetLanguage(const transTable* const translation); #ifdef __cplusplus } From 39c13d16455d31040956952bce8e5fe3f81d161e Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Mon, 8 Feb 2016 00:03:30 +0100 Subject: [PATCH 3/6] Adding documentation to GTRANS --- demos/modules/gtrans/basic/main.c | 2 +- src/gtrans/gtrans.c | 10 ++++-- src/gtrans/gtrans.h | 55 ++++++++++++++++++++++++++++--- 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/demos/modules/gtrans/basic/main.c b/demos/modules/gtrans/basic/main.c index 63310be7..165d3946 100644 --- a/demos/modules/gtrans/basic/main.c +++ b/demos/modules/gtrans/basic/main.c @@ -68,7 +68,7 @@ int main(void) gdispFillStringBox(20+300*i, 35*j, 300, 35, gtransIndex(j), font, Black, Silver, justifyLeft); } - gdispFillStringBox(20, 300, 300, 25, gtransString("Welcome"), font, Black, Silver, justifyLeft); + gdispFillStringBox(20, 300, 300, 25, gt("Welcome"), font, Black, Silver, justifyLeft); while (TRUE) { gfxSleepMilliseconds(500); diff --git a/src/gtrans/gtrans.c b/src/gtrans/gtrans.c index 4961cdcb..21508567 100644 --- a/src/gtrans/gtrans.c +++ b/src/gtrans/gtrans.c @@ -25,23 +25,29 @@ void _gtransDeinit(void) const char* gtransString(const char* string) { + // Find the index of the specified string in the base language table size_t i = 0; while (1) { + // Prevent overflow if (i >= _languageBase->numEntries-1) { - return 0; + return string; } + // Check if we found the string if (strcmp(string, _languageBase->strings[i]) == 0) { break; } + // Otherwise keep going i++; } + // Make sure that the index exists in the current language table if (i >= _languageCurrent->numEntries-1) { - return 0; + return string; } + // Return the translated string return _languageCurrent->strings[i]; } diff --git a/src/gtrans/gtrans.h b/src/gtrans/gtrans.h index f09d90e1..da3cae5e 100644 --- a/src/gtrans/gtrans.h +++ b/src/gtrans/gtrans.h @@ -10,7 +10,7 @@ * * @addtogroup GTRANS * - * @brief Module to allow changing the language of an application dynamically during run-time. + * @brief Module that allows changing the language of an application dynamically during run-time. * * @{ */ @@ -22,18 +22,66 @@ #if GFX_USE_GTRANS || defined(__DOXYGEN__) +/** + * @struct transTable + * @brief A table containing translated strings. + */ typedef struct transTable { - unsigned numEntries; - const char** strings; + unsigned numEntries; /**< The number of strings that this table contains */ + const char** strings; /**< The translated strings */ } transTable; #ifdef __cplusplus extern "C" { #endif +/** + * @brief A wrapper macro to make writing and reading translatable applications easier. + */ +#define gt(str) gtransString(str) + +/** + * @brief Get the string of the current language specified by the string of the base language. + * + * @details This function will return the string of the current language that corresponds to + * the specified string in the base language. + * @details This function uses strcmp() internally to compare strings. + * + * @param[in] string The string to translate. + * + * @return The corresponding string of the current language or the string passed as a parameter if it doesn't exist. + */ const char* gtransString(const char* string); + +/** + * @brief Get the string at the specified index position of the current language. + * + * @details Getting translation strings is a lot faster using the index as an accessor rather + * than the string in the base language. + * + * @param[in] index The index of the string in the current language translation table. + * + * @return The string at the given index of the current language or 0 if it doesn't exist. + */ const char* gtransIndex(unsigned index); + +/** + * @brief Set the base language. + * + * @details A translatable application needs to have a base language. All translations will + * be relative to this base language. + * + * @param[in] translation The translation table + */ void gtransSetBaseLanguage(const transTable* const translation); + +/** + * @brief Set the current language. + * + * @details All translations will refer to the current language set by calling this function. + * + * @param[in] translation The translation table + */ void gtransSetLanguage(const transTable* const translation); #ifdef __cplusplus @@ -44,4 +92,3 @@ void gtransSetLanguage(const transTable* const translation); #endif /* _TRANS_H */ /** @} */ - From 249ffe781f826b2d39d634023ea5334dc900df26 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Tue, 9 Feb 2016 12:53:38 +0100 Subject: [PATCH 4/6] Fixing bug in GTRANS --- src/gtrans/gtrans.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gtrans/gtrans.c b/src/gtrans/gtrans.c index 21508567..07409838 100644 --- a/src/gtrans/gtrans.c +++ b/src/gtrans/gtrans.c @@ -29,7 +29,7 @@ const char* gtransString(const char* string) size_t i = 0; while (1) { // Prevent overflow - if (i >= _languageBase->numEntries-1) { + if (i >= _languageBase->numEntries) { return string; } @@ -43,7 +43,7 @@ const char* gtransString(const char* string) } // Make sure that the index exists in the current language table - if (i >= _languageCurrent->numEntries-1) { + if (i >= _languageCurrent->numEntries) { return string; } From 205d3cf97bf1a523aca3218b469f0ebc136a1144 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Tue, 9 Feb 2016 12:54:10 +0100 Subject: [PATCH 5/6] Improving GTRANS basic demo --- demos/modules/gtrans/basic/gfxconf.h | 33 +- demos/modules/gtrans/basic/main.c | 99 ++-- demos/modules/gtrans/basic/userfonts.h | 734 +++++++++++++++++++++++++ 3 files changed, 809 insertions(+), 57 deletions(-) create mode 100644 demos/modules/gtrans/basic/userfonts.h diff --git a/demos/modules/gtrans/basic/gfxconf.h b/demos/modules/gtrans/basic/gfxconf.h index 09e6bbea..c4f75e22 100644 --- a/demos/modules/gtrans/basic/gfxconf.h +++ b/demos/modules/gtrans/basic/gfxconf.h @@ -36,31 +36,16 @@ //#define GFX_USE_OS_LINUX FALSE //#define GFX_USE_OS_OSX FALSE -#define GFX_USE_GTRANS TRUE -#define GFX_USE_GDISP TRUE +#define GFX_USE_GTRANS TRUE +#define GFX_USE_GDISP TRUE -#define GDISP_NEED_VALIDATION TRUE -#define GDISP_NEED_CLIP TRUE -#define GDISP_NEED_TEXT TRUE -#define GDISP_NEED_ANTIALIAS FALSE +#define GDISP_NEED_VALIDATION TRUE +#define GDISP_NEED_CLIP TRUE +#define GDISP_NEED_TEXT TRUE +#define GDISP_NEED_ANTIALIAS TRUE +#define GDISP_NEED_UTF8 TRUE +#define GDISP_NEED_TEXT_KERNING TRUE -#define GDISP_INCLUDE_USER_FONTS FALSE -#define GDISP_INCLUDE_FONT_UI1 FALSE -#define GDISP_INCLUDE_FONT_UI2 FALSE -#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS10 FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS12 FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS16 TRUE -#define GDISP_INCLUDE_FONT_DEJAVUSANS24 FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS32 FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12 FALSE -#define GDISP_INCLUDE_FONT_FIXED_10x20 FALSE -#define GDISP_INCLUDE_FONT_FIXED_7x14 FALSE -#define GDISP_INCLUDE_FONT_FIXED_5x8 FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA FALSE -#define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA FALSE +#define GDISP_INCLUDE_USER_FONTS TRUE #endif /* _GFXCONF_H */ diff --git a/demos/modules/gtrans/basic/main.c b/demos/modules/gtrans/basic/main.c index 165d3946..e15b3f6a 100644 --- a/demos/modules/gtrans/basic/main.c +++ b/demos/modules/gtrans/basic/main.c @@ -27,53 +27,86 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include "gfx.h" +#define COLOR_BACKGROUND Silver +#define COLOR_TEXT Black + +font_t font; + +// English Translation static const char* EnglishStrings[] = { "Welcome", - "The number %s has the value %d", - "Goodbye" + "The temperature is %d degrees", + "Goodbye", + "This is a translated uGFX application" }; static const transTable EnglishTranslation = { sizeof(EnglishStrings)/sizeof(EnglishStrings[0]), EnglishStrings }; +// German translation static const char* GermanStrings[] = { "Herzlich Willkommen", - "Die Zahl %s hat den Wert %d", - "Auf Wiedersehen" + "Die Temperatur beträgt %d Grad", + "Auf Wiedersehen", + "Das ist eine übersetzte uGFX Anwendung" }; static const transTable GermanTranslation = { sizeof(GermanStrings)/sizeof(GermanStrings[0]), GermanStrings }; -int main(void) +// French translation +static const char* FrenchStrings[] = { + "Bienvenue", + "La température est de %d degrés", + "Au revoir", + "Ceci est une application traduit uGFX" +}; +static const transTable FrenchTranslation = { sizeof(FrenchStrings)/sizeof(FrenchStrings[0]), FrenchStrings }; + +void updateText() { - size_t i, j; - font_t font; + coord_t width = 400; + coord_t height = 30; - gfxInit(); - gdispClear(Silver); + // Translate some basic strings + gdispFillStringBox(20, 20, width, height, gt("Welcome"), font, COLOR_TEXT, COLOR_BACKGROUND, justifyLeft); + gdispFillStringBox(20, 60, width, height, gt("This is a translated uGFX application"), font, COLOR_TEXT, COLOR_BACKGROUND, justifyLeft); + gdispFillStringBox(20, 100, width, height, gt("Goodbye"), font, COLOR_TEXT, COLOR_BACKGROUND, justifyLeft); - font = gdispOpenFont("*"); - - gtransSetBaseLanguage(&EnglishTranslation); - gtransSetLanguage(&GermanTranslation); - - gtransSetLanguage(&EnglishTranslation); - i = 0; - for (j = 0; j < EnglishTranslation.numEntries; j++) { - gdispFillStringBox(20+300*i, 35*j, 300, 35, gtransIndex(j), font, Black, Silver, justifyLeft); - } - - gtransSetLanguage(&GermanTranslation); - i = 1; - for (j = 0; j < EnglishTranslation.numEntries; j++) { - gdispFillStringBox(20+300*i, 35*j, 300, 35, gtransIndex(j), font, Black, Silver, justifyLeft); - } - - gdispFillStringBox(20, 300, 300, 25, gt("Welcome"), font, Black, Silver, justifyLeft); - - while (TRUE) { - gfxSleepMilliseconds(500); - } - - return 0; + // A more complex example using string formatting + char buffer[128]; + sprintf(buffer, gt("The temperature is %d degrees"), 18); + gdispFillStringBox(20, 140, width, height, buffer, font, COLOR_TEXT, COLOR_BACKGROUND, justifyLeft); } +int main(void) +{ + // Initialize the uGFX library + gfxInit(); + gdispClear(COLOR_BACKGROUND); + + // Take the first font we find + font = gdispOpenFont("*"); + + // Set the base language of the application + gtransSetBaseLanguage(&EnglishTranslation); + + // Loop through the languages + while (TRUE) { + // English + gtransSetLanguage(&EnglishTranslation); + updateText(); + gfxSleepMilliseconds(1000); + + // German + gtransSetLanguage(&GermanTranslation); + updateText(); + gfxSleepMilliseconds(1000); + + // French + gtransSetLanguage(&FrenchTranslation); + updateText(); + gfxSleepMilliseconds(1000); + } + + return 0; +} diff --git a/demos/modules/gtrans/basic/userfonts.h b/demos/modules/gtrans/basic/userfonts.h new file mode 100644 index 00000000..b00d1889 --- /dev/null +++ b/demos/modules/gtrans/basic/userfonts.h @@ -0,0 +1,734 @@ + + +/* Start of automatically generated font definition for phpRVS9jE. */ + +#ifndef MF_RLEFONT_INTERNALS +#define MF_RLEFONT_INTERNALS +#endif +#include "mf_rlefont.h" + +#ifndef MF_RLEFONT_VERSION_4_SUPPORTED +#error The font file is not compatible with this version of mcufont. +#endif + +static const uint8_t mf_rlefont_phpRVS9jE_dictionary_data[1423] = { + 0x05, 0xc2, 0xce, 0x29, 0x0a, 0x15, 0x0d, 0x07, 0x86, 0x13, 0x85, 0x80, 0x16, 0x80, 0x16, 0x80, + 0x08, 0x33, 0xcd, 0xde, 0x80, 0x06, 0x80, 0x0f, 0x80, 0x06, 0x80, 0x01, 0x0f, 0xc3, 0xcb, 0x0e, + 0x01, 0x80, 0x01, 0x80, 0x13, 0x82, 0x0c, 0x03, 0xc1, 0x40, 0x0b, 0xcd, 0xc2, 0x04, 0x89, 0x16, + 0x14, 0x13, 0x06, 0x04, 0x35, 0x02, 0xce, 0xc2, 0x15, 0xca, 0xcc, 0x16, 0xcb, 0xc9, 0x25, 0x09, + 0x03, 0xcc, 0xca, 0x14, 0xc9, 0xcb, 0x80, 0x06, 0x12, 0xce, 0xc9, 0xce, 0xc1, 0x01, 0x11, 0x80, + 0x16, 0x80, 0x16, 0x80, 0x16, 0x80, 0x16, 0x80, 0x16, 0x80, 0x05, 0x28, 0x80, 0x0d, 0x80, 0x08, + 0x80, 0x0d, 0x80, 0x08, 0x80, 0x08, 0xce, 0xcc, 0x80, 0xc1, 0xc3, 0xcc, 0x10, 0xcb, 0xc5, 0xc4, + 0xcc, 0x80, 0xce, 0xc5, 0xcc, 0xc7, 0xc8, 0x02, 0x80, 0x02, 0x40, 0x09, 0xcb, 0x80, 0x80, 0x16, + 0x80, 0x0e, 0xcb, 0xc3, 0xcd, 0xc4, 0xc6, 0xcc, 0x40, 0x0a, 0xc6, 0x01, 0xca, 0xc3, 0xc4, 0xc1, + 0x16, 0xc6, 0x80, 0xc5, 0xcd, 0x41, 0x0e, 0xc7, 0xc9, 0xcb, 0xc2, 0x01, 0x41, 0x0f, 0xc7, 0xca, + 0xc6, 0xc9, 0xc8, 0xc7, 0xce, 0xc2, 0xc7, 0xcb, 0xcd, 0xc8, 0x01, 0xc4, 0xcd, 0xc5, 0xce, 0xc3, + 0x0e, 0x80, 0x16, 0x87, 0xc1, 0x80, 0xcd, 0xc2, 0x40, 0x0c, 0xcd, 0xc3, 0xc1, 0xcd, 0xca, 0xcd, + 0xcb, 0xc7, 0xca, 0xc4, 0xcc, 0xc3, 0x01, 0x83, 0x01, 0xc3, 0xca, 0xce, 0x80, 0xce, 0x03, 0x80, + 0x08, 0x80, 0x02, 0xc3, 0x80, 0x41, 0x21, 0xcd, 0xc1, 0x84, 0x44, 0x18, 0x1c, 0xc9, 0xcd, 0x01, + 0xc1, 0xc9, 0xce, 0xce, 0xc1, 0x15, 0xc1, 0xc4, 0xc2, 0x01, 0xc2, 0xc6, 0xce, 0xc5, 0x0d, 0xc2, + 0xce, 0xc3, 0x05, 0xc3, 0xce, 0xc2, 0x0c, 0xc9, 0xc7, 0x07, 0xc7, 0xc9, 0x0c, 0xc6, 0xd1, 0x40, + 0x0d, 0xc1, 0xc5, 0xc6, 0x15, 0xc8, 0xca, 0x01, 0x80, 0x01, 0xce, 0xc7, 0xc5, 0xc1, 0xcd, 0xc6, + 0x0b, 0xc8, 0xc5, 0xc3, 0xce, 0xce, 0xc8, 0x01, 0xc9, 0x80, 0xc2, 0x80, 0xc1, 0xc3, 0xc4, 0xca, + 0xc2, 0xc8, 0x80, 0x08, 0x40, 0x38, 0x80, 0x05, 0x1f, 0x08, 0x81, 0xc7, 0x80, 0xc6, 0xc2, 0xc7, + 0xcc, 0x01, 0xc2, 0xcd, 0xc7, 0x01, 0x0e, 0x80, 0x02, 0xc4, 0xcd, 0xcc, 0xc7, 0x01, 0xcb, 0xc6, + 0x04, 0xc6, 0xcd, 0xce, 0x80, 0xca, 0x80, 0xc9, 0xc8, 0xc5, 0xcb, 0xc4, 0xcb, 0xce, 0xc4, 0xc5, + 0xce, 0xca, 0xc8, 0xca, 0xc2, 0xca, 0xcc, 0xcb, 0xce, 0x0c, 0x1c, 0x07, 0x0e, 0x05, 0x30, 0x0d, + 0x47, 0x31, 0x05, 0x0a, 0x00, 0x4f, 0x3b, 0x0b, 0x04, 0x00, 0x05, 0x0a, 0x3e, 0x44, 0x38, 0x68, + 0x45, 0x09, 0x06, 0x38, 0x4a, 0x25, 0x6b, 0x00, 0x2c, 0x3d, 0x1d, 0x98, 0x20, 0x07, 0x27, 0x2e, + 0x9b, 0x0d, 0x1d, 0x05, 0x0a, 0x1e, 0x0b, 0x01, 0x0e, 0x25, 0x09, 0x18, 0x03, 0x0d, 0x25, 0x0f, + 0x0c, 0x87, 0x7e, 0x9f, 0x27, 0x03, 0x0f, 0x0c, 0x05, 0x25, 0x9b, 0x0d, 0x07, 0x02, 0x00, 0x03, + 0x0a, 0x45, 0xa4, 0x1c, 0x60, 0x1c, 0x43, 0x1c, 0x60, 0x1c, 0xa4, 0x30, 0x9b, 0x0d, 0x07, 0x02, + 0x00, 0x03, 0x0a, 0x45, 0x9b, 0x0a, 0xa2, 0x0c, 0x05, 0x45, 0x49, 0x0e, 0x42, 0x04, 0x45, 0x8b, + 0x87, 0x82, 0x65, 0x25, 0x0a, 0x06, 0x33, 0x06, 0x0a, 0x25, 0x2e, 0x02, 0x0d, 0x25, 0x3a, 0x0f, + 0x25, 0x2e, 0x02, 0x0d, 0x25, 0x0a, 0x06, 0x33, 0x06, 0x0a, 0x25, 0x8b, 0x87, 0x82, 0x0b, 0x04, + 0x45, 0xa9, 0x02, 0x7b, 0xa6, 0x45, 0x7d, 0x0c, 0x09, 0x02, 0x31, 0x9b, 0x0a, 0x0e, 0x0d, 0x09, + 0x05, 0x30, 0x03, 0x51, 0x09, 0x3b, 0x2c, 0x0e, 0x45, 0x01, 0x0c, 0x08, 0x30, 0x09, 0x0a, 0x22, + 0x08, 0x36, 0x33, 0x7c, 0x62, 0x3b, 0x88, 0x01, 0x02, 0xa9, 0x1c, 0x6b, 0x3e, 0x07, 0x0d, 0x0e, + 0x2a, 0x45, 0x08, 0x4f, 0x01, 0x4b, 0x27, 0x68, 0x38, 0x8e, 0x45, 0x3d, 0x35, 0x08, 0x0f, 0x45, + 0x0a, 0x0a, 0x01, 0x01, 0x07, 0xa3, 0x1d, 0x2c, 0x0a, 0x0e, 0x0e, 0x3f, 0x3e, 0x21, 0x71, 0x6e, + 0x25, 0xa1, 0x87, 0x8f, 0xa3, 0x27, 0x03, 0x76, 0x18, 0x07, 0x27, 0x09, 0x83, 0x68, 0x1c, 0x4e, + 0x96, 0x68, 0x1c, 0x09, 0x83, 0x03, 0x76, 0x18, 0x07, 0x25, 0xa1, 0x87, 0x8f, 0xa3, 0x45, 0x71, + 0x6e, 0x92, 0x41, 0x35, 0x72, 0x41, 0x35, 0x72, 0x0f, 0x1b, 0x72, 0x0f, 0x1d, 0x60, 0x32, 0x19, + 0x1d, 0x0a, 0x07, 0x32, 0x5d, 0x2b, 0x9b, 0x62, 0x02, 0x35, 0x91, 0x68, 0x1d, 0x9b, 0x7a, 0x97, + 0x0d, 0x09, 0x02, 0x3b, 0x34, 0x03, 0x0d, 0x27, 0xa5, 0x18, 0x09, 0x07, 0x25, 0x6a, 0x2c, 0x3d, + 0x27, 0x5a, 0x38, 0x5d, 0x1d, 0x2c, 0x3d, 0x00, 0x6a, 0x3e, 0x09, 0x07, 0x00, 0x49, 0x3b, 0x03, + 0x0d, 0x00, 0x46, 0x31, 0x0b, 0x08, 0x0e, 0x30, 0x05, 0x0f, 0x08, 0x30, 0x67, 0x02, 0x45, 0x2c, + 0x08, 0x09, 0x31, 0x0f, 0x1d, 0x0f, 0x38, 0x0c, 0x04, 0x72, 0x18, 0x0f, 0x38, 0x03, 0x76, 0x4b, + 0x89, 0x0f, 0x33, 0x08, 0x08, 0x4b, 0x89, 0x94, 0x6f, 0x0f, 0x1d, 0x94, 0x44, 0x28, 0x2b, 0x3a, + 0x08, 0x54, 0x25, 0x05, 0x86, 0x7f, 0x6a, 0x1e, 0x03, 0x0d, 0x2b, 0x94, 0x2c, 0x0e, 0x2b, 0x94, + 0x2c, 0x0e, 0x2b, 0x6a, 0x1e, 0x03, 0x0d, 0x2b, 0x09, 0x07, 0x1e, 0x5a, 0x89, 0x9b, 0x65, 0x18, + 0x03, 0x60, 0x1d, 0xa8, 0x99, 0x9b, 0x06, 0x0e, 0x05, 0x25, 0x71, 0x54, 0x0e, 0x6e, 0x45, 0x9a, + 0x03, 0x8f, 0xa3, 0x45, 0x2e, 0x08, 0x45, 0x7d, 0x6d, 0x30, 0x9b, 0x0d, 0x0c, 0x8a, 0x02, 0x3b, + 0x63, 0x08, 0x0a, 0x0e, 0x0b, 0x70, 0x30, 0x06, 0x0b, 0x30, 0x49, 0x01, 0x31, 0x47, 0x01, 0x3b, + 0x63, 0x68, 0x31, 0x03, 0x68, 0x3b, 0x9b, 0x6a, 0x3b, 0x9b, 0x50, 0x45, 0x2c, 0x64, 0x45, 0x2c, + 0x0c, 0x06, 0x30, 0x6d, 0x1c, 0x77, 0x77, 0x80, 0x06, 0xa3, 0x25, 0x0a, 0x07, 0x33, 0x98, 0x25, + 0x60, 0x33, 0x8e, 0x25, 0x94, 0x67, 0x25, 0x60, 0x33, 0x8e, 0x25, 0x0a, 0x07, 0x33, 0x07, 0x92, + 0x3a, 0x0f, 0x25, 0x3d, 0x38, 0x8e, 0x25, 0x0c, 0x04, 0x33, 0x08, 0x0f, 0x25, 0x58, 0x55, 0x91, + 0x8d, 0x45, 0xa1, 0x0f, 0x9c, 0x85, 0x22, 0x0e, 0x3c, 0x67, 0x27, 0x9b, 0x86, 0x01, 0x01, 0x07, + 0xa3, 0x25, 0x0a, 0x07, 0x33, 0x08, 0x0f, 0x25, 0x60, 0x33, 0x8e, 0x25, 0x94, 0x67, 0x25, 0x60, + 0x33, 0x8e, 0x25, 0x0a, 0x07, 0x33, 0x98, 0x25, 0x19, 0x80, 0x06, 0xa3, 0x45, 0x03, 0x0f, 0x88, + 0x3e, 0x19, 0x05, 0x8f, 0x50, 0x45, 0x0a, 0x07, 0x38, 0xa5, 0x45, 0x68, 0x38, 0x6b, 0x45, 0x0f, + 0x20, 0x45, 0x7d, 0x0a, 0x83, 0x8b, 0x80, 0xa6, 0x3e, 0x03, 0xac, 0x0e, 0x0b, 0x04, 0x95, 0x0e, + 0x4f, 0x45, 0x0f, 0x0a, 0x07, 0x01, 0x01, 0x07, 0x60, 0x25, 0x0f, 0x07, 0x33, 0x5d, 0x25, 0x0f, + 0x02, 0x33, 0x19, 0x00, 0x0c, 0x0f, 0x2b, 0x9b, 0x68, 0x32, 0x08, 0x1d, 0x09, 0x83, 0x68, 0x1c, + 0x0f, 0x56, 0x94, 0x70, 0x2b, 0x2e, 0x72, 0x18, 0x09, 0x07, 0x1e, 0x0f, 0x2b, 0x9b, 0x60, 0x38, + 0x72, 0x33, 0x5d, 0x25, 0x0f, 0x0a, 0x80, 0x06, 0x60, 0x25, 0x43, 0x7c, 0x94, 0x67, 0x25, 0x94, + 0x9e, 0x25, 0x0f, 0x38, 0x82, 0x88, 0x85, 0x07, 0x0d, 0x0f, 0x88, 0x45, 0x0f, 0xa4, 0x02, 0x7e, + 0x64, 0x25, 0x0f, 0x08, 0x33, 0x47, 0x25, 0x0f, 0x02, 0x00, 0x2c, 0x0e, 0x25, 0x24, 0x27, 0x3a, + 0x0f, 0x25, 0x24, 0x96, 0x94, 0x73, 0x9d, 0x97, 0x20, 0x25, 0x21, 0x66, 0x25, 0x0f, 0x56, 0x21, + 0x5f, 0x1c, 0x19, 0x30, 0xa2, 0x46, 0x02, 0x7b, 0x08, 0x0b, 0x45, 0x90, 0xa2, 0x62, 0x01, 0x00, + 0x08, 0x0c, 0x01, 0x1c, 0x0a, 0x06, 0x45, 0x2c, 0x0e, 0x06, 0x3d, 0x3e, 0x0a, 0x07, 0x00, 0x64, + 0x00, 0x58, 0x3b, 0x9e, 0x0f, 0x0d, 0x73, 0x94, 0x9d, 0x92, 0x95, 0x38, 0x67, 0x25, 0x0f, 0x02, + 0x33, 0x19, 0x25, 0x0f, 0x07, 0x5b, 0x38, 0x6d, 0x2b, 0xa9, 0x01, 0x84, 0x35, 0x49, 0x1d, 0x3d, + 0x01, 0x0e, 0x00, 0x7b, 0x50, 0x1d, 0x3d, 0x01, 0x0e, 0x35, 0x08, 0x09, 0x27, 0xa9, 0x01, 0x84, + 0x8b, 0x01, 0x1d, 0x9b, 0xac, 0x5b, 0x0c, 0x06, 0x30, 0x31, 0x34, 0x1f, 0x35, 0x9a, 0x30, 0x05, + 0x68, 0x3b, 0x63, 0x60, 0x31, 0x03, 0x65, 0x3b, 0x9b, 0xa7, 0x3b, 0x9b, 0x6c, 0x0a, 0x31, 0x09, + 0x0a, 0x00, 0xa9, 0x1e, 0x95, 0x65, 0x45, 0x49, 0x0e, 0x42, 0x05, 0x0f, 0x2a, 0x42, 0x06, 0x45, + 0x0f, 0x3d, 0x32, 0x37, 0x4b, 0x0f, 0x40, 0x0a, 0x07, 0x18, 0x06, 0x0a, 0x4c, 0x97, 0x3a, 0x84, + 0x1d, 0x94, 0x8b, 0x01, 0x27, 0x94, 0x0c, 0x0f, 0x06, 0x0b, 0x32, 0x0f, 0x2b, 0x28, 0xa0, 0x4c, + 0x4b, 0x92, 0x34, 0x9b, 0x8c, 0x31, 0x39, 0x3b, 0x57, 0x06, 0x1a, 0x35, 0x9b, 0x68, 0x25, 0x06, + 0x0b, 0x38, 0xa0, 0x1d, 0x0c, 0x53, 0x06, 0x0b, 0x3e, 0x9b, 0x65, 0x60, 0x31, 0x98, 0x07, 0x1c, + 0x3f, 0x37, 0x81, 0x24, 0x27, 0x04, 0xac, 0x0e, 0x0b, 0x99, 0x01, 0x47, 0x1d, 0x0d, 0x87, 0x02, + 0x06, 0xac, 0x0e, 0x0f, 0x9b, 0x76, 0x33, 0x0f, 0x89, 0x4b, 0x5d, 0x27, 0x9b, 0x60, 0x35, 0x09, + 0x74, 0x25, 0x6d, 0x35, 0x03, 0x09, 0x28, 0x1d, 0x51, 0x38, 0x0b, 0x01, 0x28, 0x86, 0x02, 0x7b, + 0x02, 0x98, 0x25, 0x03, 0x6c, 0x09, 0x09, 0x00, 0xa9, 0x31, 0x6c, 0x0a, 0x04, 0x27, 0x58, 0x99, + 0x00, 0x3f, 0x3e, 0x3f, 0x37, 0x97, 0x1c, 0x97, 0x03, 0x0d, 0x31, 0x02, 0xac, 0x9d, 0x35, 0x61, + 0x35, 0x9d, 0x9b, 0x60, 0x45, 0x0f, 0x38, 0xab, 0x02, 0x25, 0x9a, 0x0e, 0x42, 0x07, 0x0a, 0x07, + 0x00, 0x5d, 0x3b, 0x19, 0x06, 0x3d, 0x07, 0x0e, 0x08, 0x19, 0x3b, 0x60, 0x7c, 0x0e, 0x7b, 0x0e, + 0x3b, 0x5e, 0x00, 0x5e, 0x00, 0x47, 0x77, 0x77, 0x1b, 0x72, 0x41, 0x35, 0x72, 0x41, 0x07, 0x0e, + 0x08, 0x19, 0x3b, 0x0e, 0x91, 0x86, 0x40, 0x05, 0x2b, 0x0c, 0x04, 0x1e, 0x47, 0x95, 0x02, 0x0c, + 0x19, 0x80, 0x06, 0xa3, 0x45, 0x03, 0xac, 0x3c, 0x67, 0x1c, 0x47, 0x45, 0x6e, 0x09, 0x67, 0x68, + 0x38, 0x64, 0x30, 0x9f, 0x30, 0x1f, 0x21, 0x9d, 0x35, 0x04, 0x18, 0x00, 0x81, 0x3b, 0x2c, 0x0e, + 0x3e, 0x00, 0x5a, 0x1d, 0x0b, 0x04, 0x1b, 0x2c, 0x96, 0x28, 0x29, 0x21, 0x27, 0x5d, 0x89, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_dictionary_offsets[233] = { + 0x0000, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x000a, 0x000b, 0x0011, 0x0012, 0x0014, 0x001c, 0x001d, 0x001f, + 0x0020, 0x0023, 0x0025, 0x0026, 0x0027, 0x0029, 0x002b, 0x002e, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x003f, + 0x0040, 0x0041, 0x0046, 0x0048, 0x0049, 0x004b, 0x004e, 0x004f, + 0x005b, 0x005c, 0x0066, 0x0068, 0x006a, 0x006c, 0x006d, 0x006f, + 0x0071, 0x0073, 0x0075, 0x0077, 0x007a, 0x007c, 0x007e, 0x0082, + 0x0084, 0x0086, 0x0088, 0x008a, 0x008c, 0x008e, 0x0090, 0x0091, + 0x0093, 0x0095, 0x0097, 0x0099, 0x009c, 0x009e, 0x00a0, 0x00a2, + 0x00a4, 0x00a6, 0x00a8, 0x00aa, 0x00ac, 0x00ae, 0x00b0, 0x00b4, + 0x00b6, 0x00b8, 0x00ba, 0x00bc, 0x00be, 0x00c0, 0x00c2, 0x00c4, + 0x00c7, 0x00c9, 0x00ce, 0x00d1, 0x00d3, 0x00d5, 0x00d7, 0x00d9, + 0x00da, 0x00dc, 0x00dd, 0x00df, 0x00e1, 0x00e3, 0x00e6, 0x00e8, + 0x00fd, 0x00ff, 0x0101, 0x0103, 0x0105, 0x0108, 0x010a, 0x010c, + 0x010e, 0x0110, 0x0111, 0x0113, 0x0115, 0x0118, 0x011a, 0x011c, + 0x011e, 0x0120, 0x0122, 0x0124, 0x0126, 0x0128, 0x0129, 0x012a, + 0x012b, 0x012d, 0x012f, 0x0131, 0x0133, 0x0136, 0x0139, 0x013b, + 0x013e, 0x0141, 0x0143, 0x0145, 0x0147, 0x0149, 0x014b, 0x014d, + 0x014f, 0x0151, 0x0153, 0x0155, 0x0157, 0x0159, 0x0187, 0x0196, + 0x01ba, 0x01de, 0x01f9, 0x01ff, 0x0203, 0x022b, 0x022e, 0x0251, + 0x0275, 0x02a3, 0x02c1, 0x02ec, 0x0305, 0x0327, 0x0340, 0x0357, + 0x037e, 0x039f, 0x03b4, 0x03d1, 0x03dc, 0x03e6, 0x0403, 0x0407, + 0x0410, 0x0415, 0x0420, 0x0425, 0x042f, 0x0436, 0x043b, 0x0445, + 0x0469, 0x046b, 0x047c, 0x0485, 0x048b, 0x0491, 0x0493, 0x0497, + 0x049c, 0x04a7, 0x04af, 0x04b2, 0x04b7, 0x04bb, 0x04d3, 0x04d5, + 0x04e3, 0x04eb, 0x04fd, 0x0505, 0x050c, 0x0511, 0x0515, 0x0518, + 0x051b, 0x051d, 0x0527, 0x052e, 0x0536, 0x053d, 0x0544, 0x0546, + 0x054e, 0x0557, 0x055e, 0x0560, 0x056d, 0x056f, 0x0571, 0x0576, + 0x0579, 0x057b, 0x057d, 0x0581, 0x0584, 0x0589, 0x058b, 0x058d, + 0x058f, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_0[2382] = { + 0x05, 0x00, 0x10, 0x06, 0x52, 0xfe, 0xfe, 0x0e, 0x56, 0x0d, 0x25, 0x34, 0x4e, 0x10, 0x06, 0x4c, + 0x73, 0x94, 0x9d, 0x29, 0xcd, 0x10, 0x0d, 0x56, 0xf9, 0x09, 0x0a, 0x00, 0x67, 0x03, 0x3e, 0x0d, + 0x53, 0xa8, 0x3e, 0x8e, 0x02, 0x00, 0x09, 0x0a, 0x27, 0x8e, 0x2a, 0x20, 0x25, 0x0a, 0x09, 0x00, + 0x8e, 0x02, 0x3e, 0x0e, 0x05, 0x00, 0xa8, 0x3e, 0x8e, 0x02, 0x00, 0x08, 0x0b, 0x25, 0x2a, 0x20, + 0x43, 0x27, 0x0a, 0x09, 0x00, 0x8e, 0x02, 0x3e, 0x0e, 0x05, 0x00, 0xa1, 0x3e, 0x03, 0x43, 0x00, + 0x0a, 0x09, 0x10, 0x0a, 0x81, 0x4e, 0x35, 0x2c, 0x7a, 0x48, 0x6e, 0x45, 0x0a, 0xaa, 0x43, 0xa5, + 0x45, 0x3d, 0x29, 0x6a, 0x00, 0x29, 0xa8, 0x08, 0x0f, 0x02, 0x3b, 0x9b, 0x98, 0x0d, 0x6f, 0x3e, + 0x28, 0x51, 0x31, 0x0f, 0x7b, 0x0e, 0x45, 0x0b, 0x04, 0x67, 0x02, 0x09, 0x0a, 0x45, 0x90, 0xa2, + 0x0d, 0x09, 0x01, 0x31, 0x4e, 0x10, 0x0f, 0x4c, 0xe8, 0xcf, 0x51, 0x00, 0xe8, 0x5b, 0x1b, 0x2c, + 0x65, 0x00, 0xa9, 0x01, 0x84, 0x1d, 0xa4, 0x35, 0x3d, 0x01, 0x0e, 0x1d, 0x03, 0x76, 0x35, 0x3d, + 0x01, 0x0e, 0x1d, 0x0c, 0x05, 0x38, 0xa9, 0x01, 0x84, 0x89, 0x61, 0x33, 0xe8, 0x5b, 0x10, 0x0c, + 0x2d, 0x08, 0x0d, 0x0f, 0x0c, 0x05, 0x3e, 0x09, 0xaa, 0x01, 0xa6, 0x3e, 0x7d, 0x6a, 0x1c, 0x9a, + 0x01, 0x30, 0xa9, 0x0b, 0x01, 0x3b, 0x08, 0x08, 0x00, 0x44, 0x02, 0x00, 0x7b, 0x0e, 0x1d, 0x68, + 0x35, 0x03, 0x50, 0x9b, 0x0d, 0x1d, 0x43, 0x38, 0x8b, 0x05, 0x5d, 0x1d, 0x0c, 0x05, 0x33, 0x8b, + 0x60, 0x2b, 0x63, 0x0e, 0x06, 0x01, 0x35, 0x49, 0x0f, 0x07, 0x27, 0x03, 0xac, 0x0e, 0x0d, 0x0a, + 0x05, 0x02, 0x9c, 0x10, 0x03, 0x4c, 0xf7, 0x10, 0x06, 0x52, 0x8e, 0x09, 0x30, 0x09, 0x76, 0x31, + 0x67, 0x04, 0x30, 0x61, 0x1c, 0x0a, 0x83, 0x68, 0x1c, 0x7d, 0x7d, 0x68, 0x1c, 0x0a, 0x83, 0x06, + 0x0b, 0x1c, 0x67, 0x04, 0x1c, 0x09, 0x0c, 0x01, 0x30, 0x8e, 0x09, 0x10, 0x06, 0x4c, 0x8d, 0x02, + 0x30, 0x6b, 0x09, 0x30, 0x63, 0x43, 0x1c, 0x0c, 0x83, 0x06, 0x0a, 0x30, 0x9b, 0x0d, 0xfa, 0x00, + 0x2c, 0x0e, 0x30, 0x9b, 0x0d, 0x1c, 0x06, 0x0a, 0x1c, 0x0c, 0x06, 0x31, 0x63, 0x43, 0x31, 0x6b, + 0x09, 0x30, 0x8d, 0x02, 0x10, 0x08, 0x69, 0x4e, 0x18, 0x0a, 0x06, 0x28, 0x06, 0x0a, 0x3e, 0x06, + 0x4d, 0xa0, 0x27, 0x06, 0x4d, 0xa0, 0x1d, 0x0a, 0x06, 0x28, 0x06, 0x0a, 0x31, 0x4e, 0x10, 0x0d, + 0x33, 0x5c, 0xf7, 0x27, 0x2a, 0x20, 0x3b, 0xf7, 0x10, 0x05, 0x5c, 0x75, 0x0f, 0xfa, 0x33, 0x5e, + 0x1c, 0x6f, 0x10, 0x06, 0x4c, 0x75, 0x70, 0x10, 0x05, 0x5c, 0x75, 0x4e, 0x10, 0x05, 0x2d, 0xe7, + 0x35, 0x4a, 0x1c, 0x0c, 0x04, 0x30, 0x19, 0x1c, 0x5e, 0x1c, 0x46, 0x3e, 0x2c, 0x3d, 0x31, 0xa5, + 0x1c, 0x09, 0x83, 0x60, 0x31, 0xee, 0x1c, 0x08, 0x08, 0x1c, 0x6a, 0x10, 0x0a, 0x4c, 0x9b, 0x0a, + 0x0e, 0x0e, 0xaa, 0x45, 0x6b, 0x07, 0x01, 0x01, 0x07, 0x76, 0x25, 0x5d, 0x33, 0x0a, 0x06, 0x25, + 0x0b, 0x04, 0x33, 0xa6, 0x25, 0x3d, 0x2c, 0x0e, 0x25, 0xde, 0x3d, 0x2c, 0x0e, 0x25, 0x0b, 0x04, + 0x33, 0xa6, 0x25, 0x5d, 0x33, 0x0a, 0x07, 0x25, 0x6b, 0x07, 0x01, 0x01, 0x07, 0x76, 0x25, 0x9b, + 0x0a, 0x0e, 0x0e, 0xaa, 0x10, 0x0a, 0x52, 0x03, 0x7c, 0x29, 0x62, 0x02, 0xb5, 0x27, 0x29, 0x1f, + 0x10, 0x0a, 0x4c, 0x90, 0x0e, 0x42, 0x05, 0x3e, 0x0f, 0x4f, 0x01, 0x44, 0x06, 0x45, 0x08, 0x33, + 0xe7, 0x35, 0x67, 0x1c, 0x49, 0x3e, 0x2c, 0x50, 0x45, 0x2c, 0x0b, 0x04, 0x31, 0xf2, 0x04, 0x31, + 0xf2, 0x04, 0x45, 0x2c, 0x0c, 0x04, 0x30, 0x0c, 0x05, 0x1c, 0x20, 0x43, 0x10, 0x0a, 0x4c, 0x03, + 0x7a, 0x48, 0x46, 0x45, 0x0c, 0x99, 0x7b, 0x47, 0x08, 0x1c, 0x19, 0x1c, 0x19, 0x45, 0x2c, 0x47, + 0x08, 0x3e, 0x0f, 0x2a, 0x0b, 0x30, 0x82, 0x9c, 0x30, 0x9e, 0x1c, 0x67, 0x30, 0xee, 0x25, 0x0b, + 0x87, 0x9b, 0x06, 0x50, 0x25, 0x90, 0x0e, 0x48, 0x54, 0x10, 0x0a, 0x81, 0x6b, 0x0f, 0x30, 0x46, + 0x29, 0x5d, 0x28, 0x3e, 0x03, 0x76, 0x28, 0x1d, 0x2c, 0x6f, 0x28, 0x45, 0x09, 0x07, 0x72, 0x96, + 0xa5, 0x33, 0x0f, 0x45, 0x2e, 0x0f, 0x45, 0x2a, 0x20, 0x30, 0x21, 0x10, 0x0a, 0x52, 0x20, 0x3e, + 0xfe, 0x48, 0x48, 0xaa, 0x3e, 0x6e, 0x9b, 0x07, 0x65, 0x1c, 0x06, 0x0b, 0xfa, 0x00, 0x2c, 0x0e, + 0x1c, 0x06, 0x0b, 0x25, 0x0b, 0x87, 0x9b, 0x07, 0x65, 0x25, 0x90, 0xa2, 0x0d, 0xaa, 0x10, 0x0a, + 0x2d, 0xa1, 0x0f, 0x0c, 0x05, 0x3e, 0x09, 0x09, 0x02, 0x00, 0x26, 0x45, 0xa6, 0x1c, 0x6e, 0x1c, + 0x64, 0xac, 0x0e, 0x4f, 0x45, 0x48, 0x80, 0x06, 0xa7, 0x25, 0x0f, 0x06, 0x33, 0x06, 0x0b, 0x25, + 0x3d, 0x2c, 0x0e, 0x25, 0x0b, 0x01, 0x00, 0x2c, 0x0e, 0x25, 0x06, 0x06, 0x33, 0x06, 0x0b, 0x45, + 0x0c, 0x80, 0x06, 0xa7, 0x1d, 0x2c, 0x0a, 0xa2, 0x0c, 0x04, 0x10, 0x0a, 0x4c, 0x97, 0x20, 0x1c, + 0x5d, 0x1c, 0x6a, 0x30, 0x49, 0x1c, 0x46, 0x30, 0xe7, 0x35, 0x09, 0x07, 0x3e, 0x2c, 0x3d, 0x31, + 0x5a, 0x1c, 0x6a, 0x30, 0xa5, 0x1c, 0x0c, 0x04, 0x10, 0x0a, 0x52, 0x51, 0x0e, 0x42, 0x06, 0x45, + 0x09, 0x0c, 0x55, 0x01, 0x47, 0x09, 0x25, 0x60, 0x33, 0x19, 0x25, 0x60, 0x33, 0x19, 0x25, 0x9a, + 0x55, 0x7e, 0x9f, 0x25, 0xa3, 0x2a, 0x0a, 0x45, 0x07, 0x0d, 0x87, 0x82, 0x9c, 0x27, 0x50, 0x33, + 0x9e, 0x25, 0x43, 0x33, 0x67, 0x25, 0x50, 0x33, 0x9e, 0x25, 0xa1, 0x87, 0x82, 0x88, 0x45, 0x49, + 0x0e, 0x42, 0x05, 0x10, 0x0a, 0x4c, 0xee, 0x48, 0x0a, 0x01, 0x25, 0x63, 0x0e, 0x80, 0x51, 0x45, + 0xa0, 0x06, 0x06, 0x25, 0x3d, 0x2c, 0x0b, 0x25, 0x3d, 0x2c, 0x0e, 0x25, 0xa0, 0x57, 0x27, 0x63, + 0x0e, 0x80, 0x06, 0xa2, 0x25, 0x63, 0xac, 0x42, 0x58, 0x1c, 0x90, 0x1c, 0x6e, 0x45, 0x4f, 0x9b, + 0x09, 0x09, 0x3e, 0x58, 0x0f, 0x9c, 0x10, 0x05, 0x18, 0x75, 0x4e, 0x56, 0xf9, 0x4e, 0x10, 0x05, + 0x18, 0x75, 0x4e, 0x56, 0xf9, 0x0f, 0xfa, 0x33, 0x5e, 0x1c, 0x6f, 0x10, 0x0d, 0x33, 0x5c, 0x2c, + 0x51, 0x3b, 0x90, 0x0e, 0x6e, 0x25, 0x91, 0x0d, 0x0c, 0x06, 0x01, 0x25, 0x06, 0xac, 0x08, 0x02, + 0x3b, 0x0f, 0x09, 0x01, 0x30, 0x06, 0xac, 0x08, 0x02, 0x30, 0x91, 0x0d, 0x0c, 0x06, 0x01, 0x30, + 0x90, 0x0e, 0x6e, 0x3e, 0x2c, 0x51, 0x10, 0x0d, 0x79, 0x75, 0x2a, 0x1f, 0x40, 0x2f, 0x10, 0x0d, + 0x5c, 0x0c, 0x06, 0x01, 0x30, 0x90, 0x0e, 0x6e, 0x3e, 0x2c, 0x51, 0x62, 0x02, 0x30, 0x91, 0x0e, + 0xa0, 0x1d, 0x2c, 0x8d, 0x3b, 0x91, 0x0e, 0xa0, 0x96, 0x2c, 0x51, 0x62, 0x02, 0x25, 0x90, 0x0e, + 0x6e, 0x3b, 0x0c, 0x06, 0x01, 0x10, 0x09, 0x4c, 0x05, 0xac, 0x3c, 0x01, 0x3e, 0x0c, 0x87, 0x01, + 0x09, 0x0a, 0xfa, 0x33, 0x07, 0x0d, 0x30, 0x98, 0x07, 0x31, 0x57, 0x09, 0x30, 0x62, 0x1c, 0x4e, + 0x95, 0x4e, 0x10, 0x10, 0x4c, 0x2c, 0x9a, 0xa2, 0x0d, 0x09, 0x03, 0x1d, 0x63, 0x3c, 0x55, 0x9b, + 0x07, 0x62, 0x2b, 0x05, 0x65, 0x38, 0x2c, 0x0b, 0x09, 0x1e, 0x2c, 0x65, 0xee, 0x48, 0x0b, 0x04, + 0x43, 0x50, 0x37, 0x08, 0x09, 0x63, 0x0e, 0x80, 0x06, 0x0e, 0x85, 0x06, 0x0a, 0x37, 0x6f, 0xa0, + 0x57, 0x7b, 0x0e, 0x37, 0x3d, 0x3d, 0x2c, 0x73, 0x0f, 0x37, 0x3d, 0x3d, 0x38, 0x67, 0x9b, 0x0d, + 0x37, 0x6f, 0xa0, 0x06, 0x85, 0x5e, 0x37, 0x08, 0x09, 0x63, 0x0e, 0x80, 0x06, 0xa2, 0x03, 0x68, + 0x32, 0x2c, 0x65, 0xee, 0x48, 0x0b, 0x04, 0x0e, 0xaa, 0x89, 0x05, 0x65, 0x30, 0x63, 0x3c, 0x55, + 0x00, 0x7e, 0x09, 0x0a, 0x89, 0x2c, 0x9a, 0xa2, 0x42, 0x08, 0x03, 0x10, 0x0b, 0x4c, 0x2c, 0xad, + 0xf1, 0x10, 0x0b, 0x4c, 0x77, 0x42, 0x06, 0x27, 0x28, 0x2c, 0x47, 0x09, 0x27, 0x3a, 0x19, 0x27, + 0x3a, 0x19, 0x1d, 0x28, 0x2c, 0x47, 0x09, 0x27, 0x0f, 0x20, 0x0c, 0x01, 0x9d, 0x35, 0x7e, 0x62, + 0x27, 0x3a, 0x03, 0x0d, 0x27, 0x3a, 0x67, 0x27, 0x3a, 0x03, 0x0d, 0x9d, 0x35, 0x7e, 0x9c, 0x1d, + 0x77, 0x42, 0x05, 0x10, 0x0b, 0x2d, 0xb6, 0x10, 0x0c, 0x4c, 0x2a, 0x48, 0x6d, 0x02, 0x25, 0x0f, + 0x38, 0x8f, 0x08, 0x0e, 0x05, 0x27, 0x3a, 0x03, 0x65, 0x1d, 0x3a, 0xfb, 0x3a, 0x9b, 0x0d, 0x1d, + 0x3a, 0x7b, 0x0e, 0x1d, 0x3a, 0x7b, 0x0e, 0x1d, 0x3a, 0x9b, 0x0d, 0x1d, 0x3a, 0xfb, 0x3a, 0x03, + 0x60, 0x1d, 0x0f, 0x38, 0x8f, 0x08, 0x0e, 0x05, 0x27, 0x2a, 0x48, 0x6d, 0x02, 0x10, 0x0a, 0x4c, + 0xc7, 0x66, 0x10, 0x09, 0x4c, 0x20, 0x73, 0x9d, 0x30, 0xfe, 0x20, 0x3e, 0x3f, 0x10, 0x0c, 0x52, + 0x9b, 0x7a, 0x97, 0x0d, 0x09, 0xe4, 0x82, 0xc2, 0x32, 0x06, 0xe2, 0x48, 0x62, 0x03, 0x10, 0x0c, + 0x4c, 0x92, 0x41, 0x35, 0x72, 0x0f, 0x1b, 0x72, 0x0f, 0x1d, 0xef, 0x10, 0x05, 0x52, 0xe5, 0x10, + 0x05, 0x52, 0xe5, 0x1e, 0x19, 0x3e, 0x2c, 0x84, 0x31, 0x0f, 0x5b, 0x10, 0x0a, 0x4c, 0x94, 0x03, + 0x9c, 0x1d, 0x0f, 0x33, 0x8b, 0x05, 0x00, 0x9d, 0x63, 0x6a, 0x35, 0x9d, 0x05, 0x68, 0x45, 0x28, + 0x9a, 0x01, 0x3b, 0x0f, 0x49, 0x01, 0x31, 0x43, 0x0c, 0x05, 0x31, 0x0f, 0x7b, 0x0c, 0x05, 0x3e, + 0x28, 0x7b, 0x0c, 0x06, 0x3e, 0x0f, 0x2c, 0x0c, 0x06, 0x25, 0x28, 0x2c, 0x9f, 0x9d, 0x2c, 0x9f, + 0x10, 0x09, 0x4c, 0x4e, 0x96, 0xb5, 0x27, 0x1f, 0x10, 0x0d, 0x4c, 0x0f, 0x0a, 0x1e, 0xa3, 0x2b, + 0x0f, 0x68, 0x18, 0xf2, 0x0f, 0x2b, 0x0f, 0x4a, 0x18, 0x09, 0x57, 0x2b, 0x43, 0x3d, 0x35, 0x6b, + 0x28, 0x1b, 0x28, 0x09, 0x07, 0x38, 0x4a, 0x28, 0x89, 0x0f, 0x9b, 0x0d, 0x38, 0x68, 0x28, 0x37, + 0x4b, 0x46, 0x00, 0x06, 0x0a, 0x4b, 0x37, 0x28, 0xee, 0x00, 0x0c, 0x04, 0x4b, 0x1b, 0x0f, 0x38, + 0x62, 0x0c, 0x72, 0x33, 0x0f, 0x38, 0x57, 0x53, 0x4b, 0x1e, 0x72, 0x28, 0x96, 0x72, 0x28, 0x10, + 0x0c, 0x4c, 0x0f, 0x60, 0x32, 0x0f, 0x1d, 0xd9, 0x28, 0x2b, 0xe0, 0x33, 0xb9, 0x57, 0x1d, 0x94, + 0x7b, 0x0c, 0x0f, 0x10, 0x0d, 0x2d, 0x71, 0xba, 0x10, 0x0a, 0x4c, 0xd4, 0x38, 0x82, 0x88, 0x25, + 0x94, 0x9e, 0x25, 0x94, 0x67, 0x25, 0x94, 0x9e, 0x25, 0x0f, 0x2c, 0x58, 0x07, 0x25, 0xd4, 0x56, + 0xf7, 0x10, 0x0d, 0x2d, 0x71, 0x54, 0x25, 0x05, 0x86, 0x7f, 0x6a, 0x1e, 0x03, 0x0d, 0x2b, 0x94, + 0x2c, 0x0e, 0x2b, 0x94, 0x2c, 0x0e, 0x2b, 0x6a, 0x1e, 0x03, 0x0d, 0x2b, 0x09, 0x07, 0x1e, 0x5a, + 0x89, 0x9b, 0x65, 0x18, 0x03, 0xa7, 0x1d, 0xa8, 0x99, 0x9b, 0x06, 0x8c, 0x27, 0x03, 0x6c, 0x2a, + 0x08, 0x1c, 0x06, 0x76, 0x1c, 0x9a, 0x01, 0x10, 0x0b, 0x4c, 0xd4, 0x2c, 0x58, 0x07, 0x25, 0x94, + 0x03, 0x0d, 0x25, 0xc4, 0x25, 0x20, 0x0c, 0x45, 0x0f, 0x2c, 0xa8, 0x05, 0x25, 0x94, 0x58, 0x25, + 0x3a, 0x0c, 0x05, 0x27, 0x3a, 0x58, 0x9d, 0x18, 0x0c, 0x06, 0x10, 0x0a, 0x52, 0x51, 0x0e, 0xbb, + 0x01, 0x1c, 0x09, 0x0a, 0x1c, 0xae, 0x7a, 0x0f, 0x42, 0x06, 0x10, 0x09, 0xd0, 0x2a, 0x20, 0x3b, + 0x4e, 0x96, 0xb5, 0x10, 0x0c, 0x4c, 0xb7, 0x10, 0x0b, 0x25, 0x34, 0x2c, 0xd5, 0x01, 0x3d, 0x1b, + 0x09, 0x07, 0x1e, 0x5a, 0x2b, 0x03, 0x0d, 0x1e, 0x6a, 0x1d, 0x46, 0x18, 0xa5, 0x27, 0xa5, 0x18, + 0x0b, 0x04, 0x25, 0x6a, 0x38, 0x03, 0x0d, 0x45, 0x5a, 0x38, 0x09, 0x06, 0x1d, 0x2c, 0x3d, 0x01, + 0x3d, 0x45, 0x09, 0x07, 0x00, 0x4a, 0x3e, 0x9b, 0x76, 0x68, 0x31, 0x0b, 0x0a, 0x0a, 0x31, 0x63, + 0x0f, 0x04, 0x10, 0x11, 0x4c, 0x0d, 0x18, 0x8e, 0x02, 0x18, 0xd5, 0x09, 0x05, 0x33, 0x06, 0x0e, + 0x06, 0x33, 0xa5, 0x96, 0x90, 0x33, 0xa4, 0x0a, 0x33, 0x0a, 0x05, 0x37, 0x76, 0x38, 0x68, 0x0d, + 0x2c, 0x3d, 0x96, 0x08, 0x53, 0x7b, 0x0c, 0x00, 0x0c, 0x02, 0x35, 0x5e, 0x1b, 0x26, 0x35, 0x05, + 0x08, 0x00, 0x8a, 0x35, 0x0c, 0x04, 0x89, 0x0c, 0x02, 0x00, 0x09, 0x05, 0x00, 0x05, 0x09, 0x9b, + 0x0d, 0x2b, 0x07, 0x07, 0x00, 0x0c, 0x01, 0x00, 0x6b, 0x00, 0x4a, 0x2b, 0xf2, 0x01, 0x0c, 0x38, + 0x0c, 0x01, 0x6a, 0x1d, 0x0c, 0x5a, 0x38, 0xa4, 0x0c, 0x27, 0x07, 0x0e, 0x05, 0x38, 0x05, 0x0f, + 0x07, 0x27, 0x67, 0x02, 0x35, 0x9b, 0x43, 0x10, 0x0b, 0x4c, 0xd7, 0x89, 0x2c, 0x60, 0x2c, 0x68, + 0x25, 0x06, 0x0b, 0x38, 0x0a, 0x06, 0x3e, 0x46, 0x00, 0xa5, 0x3e, 0x9b, 0x68, 0x68, 0x31, 0x08, + 0x8c, 0x31, 0x0c, 0x08, 0x0c, 0x31, 0x06, 0x0a, 0x00, 0x0a, 0x06, 0x27, 0x2c, 0x68, 0x7b, 0x68, + 0x45, 0x5f, 0x38, 0x06, 0x0a, 0x25, 0xf2, 0x18, 0x0c, 0x05, 0x27, 0x0b, 0xf8, 0x03, 0x76, 0x10, + 0x09, 0xd0, 0xd7, 0x1d, 0x9b, 0x60, 0xdd, 0x10, 0x0c, 0x4c, 0x20, 0xbc, 0x10, 0x06, 0x4c, 0x2a, + 0x30, 0xe5, 0x96, 0x2a, 0x10, 0x05, 0xd0, 0x6a, 0x1c, 0x08, 0x08, 0x30, 0xee, 0x56, 0x60, 0x1c, + 0x09, 0x83, 0xa5, 0x3b, 0x2c, 0x7d, 0x46, 0x1c, 0x5e, 0x1c, 0x19, 0x56, 0x0c, 0x04, 0x1c, 0x4a, + 0x1c, 0xe7, 0x10, 0x06, 0x52, 0x2a, 0x56, 0xe5, 0x32, 0x2a, 0x10, 0x0d, 0x81, 0x05, 0x97, 0x05, + 0x3b, 0x57, 0x09, 0x8d, 0x05, 0x45, 0x57, 0x06, 0x35, 0x57, 0x06, 0x27, 0x07, 0xa7, 0x38, 0x63, + 0x86, 0x10, 0x08, 0x4c, 0x78, 0x97, 0x20, 0x10, 0x08, 0x37, 0x1a, 0x08, 0x36, 0x10, 0x09, 0x59, + 0x9b, 0xb4, 0xf4, 0x10, 0x0a, 0x4c, 0xfe, 0x43, 0x7c, 0xc1, 0x9d, 0xce, 0xc3, 0x0e, 0x4f, 0x10, + 0x09, 0x59, 0x9b, 0x7c, 0xaf, 0x10, 0x0a, 0x35, 0xf9, 0x21, 0x96, 0x26, 0xbf, 0xac, 0x0e, 0xf4, + 0x10, 0x09, 0x59, 0xee, 0xc0, 0x10, 0x06, 0x52, 0x58, 0x0f, 0x29, 0x6a, 0x1c, 0x0f, 0x1c, 0x70, + 0x31, 0xf7, 0x3b, 0xf7, 0x10, 0x0a, 0x5c, 0x03, 0xac, 0x0e, 0xf4, 0x25, 0x19, 0xbd, 0x1e, 0xf3, + 0x01, 0x82, 0x88, 0x45, 0x49, 0x0e, 0x42, 0x05, 0x10, 0x0a, 0x4c, 0xfe, 0xc5, 0x10, 0x03, 0x4c, + 0x4e, 0x95, 0xb5, 0x10, 0x03, 0x4c, 0x4e, 0x95, 0xb5, 0x27, 0x0e, 0x30, 0xee, 0x30, 0x0f, 0x6a, + 0x10, 0x09, 0x4c, 0xf7, 0x8b, 0x53, 0x9d, 0x63, 0x50, 0x35, 0x9d, 0x51, 0x02, 0x45, 0x28, 0x5d, + 0x01, 0x3e, 0x28, 0x3d, 0x3e, 0x28, 0x06, 0x2e, 0x9d, 0x04, 0x50, 0x3e, 0x0f, 0x38, 0x03, 0x64, + 0x45, 0x0f, 0x38, 0x9b, 0x9c, 0x10, 0x03, 0x4c, 0xe5, 0x10, 0x0f, 0x59, 0x43, 0x7c, 0x8c, 0x01, + 0x7c, 0x3c, 0x89, 0x0f, 0x09, 0x06, 0x01, 0xf2, 0x5a, 0x06, 0x01, 0xf2, 0x06, 0x1b, 0x0f, 0x06, + 0x38, 0x8b, 0x06, 0x38, 0x44, 0x1b, 0x0f, 0x02, 0x38, 0x67, 0x02, 0x2c, 0x0e, 0x1b, 0x94, 0x94, + 0x0f, 0x1b, 0x94, 0x94, 0x0f, 0x1b, 0x94, 0x94, 0x0f, 0x1b, 0x94, 0x94, 0x0f, 0x1b, 0x94, 0x94, + 0x0f, 0x10, 0x0a, 0x59, 0xc5, 0x10, 0x0a, 0x5c, 0xb0, 0xd3, 0x10, 0x0a, 0x59, 0x43, 0x7c, 0xc1, + 0x9d, 0xce, 0xc3, 0x0e, 0x4f, 0x45, 0x21, 0x10, 0x0a, 0x5c, 0x26, 0xbf, 0xac, 0x3c, 0x01, 0xf7, + 0x10, 0x07, 0x59, 0x43, 0x09, 0xa2, 0x3b, 0x0f, 0x09, 0x87, 0x31, 0x0f, 0x07, 0x1c, 0x0f, 0x02, + 0x1c, 0xfe, 0x4e, 0x10, 0x09, 0x59, 0x01, 0x08, 0x23, 0xb1, 0xc9, 0x10, 0x06, 0x3b, 0xf9, 0x4e, + 0x1e, 0x77, 0x31, 0xfe, 0xfe, 0x0c, 0x05, 0x1c, 0x9e, 0x97, 0x10, 0x0a, 0x59, 0xde, 0xde, 0xbe, + 0x10, 0x09, 0x30, 0x93, 0xf2, 0x1e, 0x50, 0x1d, 0x0a, 0x06, 0x18, 0x51, 0x27, 0x03, 0x0d, 0x18, + 0x50, 0x25, 0x6d, 0x38, 0x9a, 0x25, 0x63, 0x3d, 0x01, 0x0e, 0x05, 0x3e, 0x9f, 0x08, 0x0d, 0x3b, + 0xa8, 0x19, 0x05, 0x31, 0x0d, 0x0e, 0x0d, 0x35, 0xdc, 0x10, 0x0d, 0x30, 0x93, 0x03, 0x0d, 0x33, + 0x6b, 0x18, 0x6a, 0x37, 0x0c, 0x04, 0x38, 0x06, 0x0e, 0x05, 0x35, 0xee, 0x1b, 0x06, 0x0a, 0x38, + 0x0c, 0x06, 0x0b, 0x38, 0x0a, 0x06, 0x1e, 0x2c, 0x3d, 0x44, 0x00, 0x0c, 0x02, 0x7b, 0x3d, 0x1b, + 0x0a, 0x07, 0x00, 0x5f, 0x00, 0x07, 0x07, 0x00, 0x5a, 0x89, 0xee, 0x00, 0x60, 0x9b, 0x0d, 0x00, + 0x6f, 0x2b, 0x62, 0x0b, 0x38, 0x0b, 0x08, 0x0c, 0x27, 0x98, 0x06, 0x38, 0x57, 0x06, 0x27, 0x19, + 0x01, 0x2c, 0x3d, 0x10, 0x0a, 0x59, 0xa9, 0x33, 0x84, 0x89, 0x2c, 0x6a, 0x35, 0x8b, 0x01, 0x45, + 0x49, 0x35, 0x0c, 0x05, 0x3b, 0x09, 0x07, 0x61, 0x45, 0x2c, 0x0c, 0x68, 0x31, 0x09, 0x05, 0x5e, + 0x3b, 0xa6, 0x35, 0x0b, 0x04, 0x1d, 0x2c, 0x68, 0x00, 0x9b, 0x76, 0x25, 0xa9, 0x33, 0x84, 0x10, + 0x09, 0x1c, 0x93, 0x0c, 0xf8, 0xb8, 0x48, 0x0a, 0x01, 0x10, 0x09, 0x59, 0xd1, 0xf6, 0x10, 0x0a, + 0x69, 0x58, 0x0f, 0x30, 0x64, 0x1c, 0x21, 0x1d, 0x67, 0x1c, 0x9a, 0x30, 0x97, 0x04, 0x1c, 0x51, + 0xfa, 0x18, 0xfe, 0x64, 0x1c, 0x58, 0x0f, 0x10, 0x05, 0x52, 0xe5, 0x96, 0xf7, 0x10, 0x0a, 0x52, + 0x0f, 0x64, 0x1c, 0x58, 0x56, 0xfe, 0x43, 0x1c, 0x9f, 0x31, 0x63, 0x97, 0x30, 0x0c, 0x83, 0x43, + 0x1c, 0x21, 0x1d, 0x58, 0x30, 0x0f, 0x64, 0x10, 0x0d, 0x22, 0x75, 0xdf, 0xfc, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_0[95] = { + 0x0000, 0x0003, 0x000e, 0x0016, 0x0053, 0x0086, 0x00af, 0x00f4, + 0x00f8, 0x011c, 0x0145, 0x015f, 0x0169, 0x0173, 0x0178, 0x017d, + 0x019c, 0x01d5, 0x01e1, 0x020d, 0x023a, 0x025c, 0x027f, 0x02bb, + 0x02d9, 0x0314, 0x0347, 0x034f, 0x035c, 0x0387, 0x038f, 0x03b6, + 0x03d3, 0x043c, 0x0442, 0x0474, 0x0478, 0x04ae, 0x04b3, 0x04be, + 0x04cf, 0x04dc, 0x04e0, 0x04ec, 0x0521, 0x0529, 0x0570, 0x0584, + 0x0589, 0x05a2, 0x05d8, 0x05fb, 0x060b, 0x0614, 0x0618, 0x0653, + 0x06b8, 0x06f0, 0x06f8, 0x06fd, 0x0705, 0x0723, 0x072b, 0x0742, + 0x0748, 0x074e, 0x0754, 0x0760, 0x0766, 0x0771, 0x0776, 0x0785, + 0x0799, 0x079e, 0x07a4, 0x07b1, 0x07d6, 0x07da, 0x0812, 0x0816, + 0x081b, 0x0828, 0x0831, 0x0844, 0x084c, 0x085b, 0x0861, 0x088a, + 0x08d4, 0x0900, 0x090a, 0x090f, 0x0928, 0x092e, 0x0948, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_1[1970] = { + 0x0a, 0x00, 0x10, 0x06, 0x2d, 0x4e, 0x00, 0x34, 0x0d, 0x56, 0x0e, 0x56, 0x3f, 0x10, 0x0a, 0x56, + 0xf9, 0x4e, 0x35, 0x2c, 0x7a, 0x0f, 0x64, 0x25, 0x9b, 0x3c, 0x74, 0x02, 0x09, 0x45, 0xa9, 0x4b, + 0x45, 0x60, 0x4b, 0x45, 0x43, 0x4b, 0x45, 0x60, 0x4b, 0x45, 0xa9, 0x4b, 0x25, 0x9b, 0x3c, 0x74, + 0x02, 0x0a, 0x45, 0x9b, 0x0a, 0xa2, 0x64, 0x30, 0x4e, 0x10, 0x0a, 0xd0, 0x2c, 0x7c, 0x64, 0x3b, + 0x08, 0x0a, 0x01, 0x02, 0x09, 0x3b, 0x68, 0x1c, 0x21, 0x2b, 0x77, 0x29, 0xf7, 0x45, 0x1f, 0x10, + 0x0a, 0x59, 0x09, 0x06, 0x18, 0x5e, 0x27, 0x05, 0x0f, 0x6c, 0x0f, 0x0d, 0xa3, 0x05, 0x25, 0x6c, + 0x55, 0x9e, 0x0a, 0x45, 0x50, 0x38, 0x9e, 0x45, 0x43, 0x38, 0x67, 0x45, 0x50, 0x38, 0x9e, 0x45, + 0x6c, 0x55, 0x9e, 0x0a, 0x25, 0x05, 0x0f, 0x6c, 0x0f, 0x0d, 0x8d, 0x05, 0x27, 0x09, 0x05, 0x18, + 0x05, 0x09, 0x10, 0x0a, 0xd0, 0xa0, 0x00, 0x06, 0x0b, 0x1d, 0x9b, 0x76, 0x2c, 0x68, 0x25, 0x5f, + 0x38, 0x4a, 0x1d, 0x2c, 0x76, 0x7b, 0x76, 0x3e, 0x06, 0x08, 0x00, 0x08, 0x06, 0x3e, 0x0f, 0x48, + 0x8b, 0x97, 0x3b, 0x06, 0x0e, 0x06, 0x3e, 0x2c, 0x43, 0x3b, 0x1f, 0x21, 0x10, 0x05, 0x31, 0xf9, + 0x3f, 0x1b, 0x34, 0x3f, 0x10, 0x08, 0x52, 0x44, 0x0e, 0x97, 0x3b, 0x64, 0x1c, 0x0f, 0x03, 0x1c, + 0x0d, 0x86, 0x01, 0x3b, 0x06, 0x0e, 0x7c, 0x50, 0x3e, 0x6a, 0x9b, 0x4d, 0x04, 0x45, 0x43, 0x38, + 0x08, 0x0c, 0x45, 0x0c, 0x0a, 0x01, 0x35, 0x67, 0x45, 0x8b, 0x50, 0x00, 0x49, 0x45, 0x9b, 0x4d, + 0x0c, 0xa7, 0x31, 0x58, 0x0d, 0x1c, 0x8e, 0x1c, 0x51, 0x3b, 0x2a, 0x4f, 0x10, 0x08, 0x52, 0xcd, + 0x10, 0x10, 0x81, 0x51, 0x0e, 0x42, 0x06, 0x25, 0xf2, 0x0b, 0x55, 0x7e, 0xab, 0x02, 0x1d, 0x9f, + 0x07, 0xa2, 0x85, 0x9a, 0x2b, 0x61, 0x00, 0x51, 0x03, 0x33, 0x0a, 0x07, 0x89, 0x0c, 0x04, 0x00, + 0x0c, 0xf8, 0x47, 0x89, 0x3d, 0x3d, 0x00, 0x2c, 0x0e, 0x89, 0x3d, 0x3d, 0x00, 0x2c, 0x0e, 0x89, + 0x0c, 0x04, 0x00, 0x0c, 0xf8, 0x47, 0x89, 0x61, 0x00, 0x49, 0x03, 0x33, 0x0a, 0x07, 0x2b, 0x0c, + 0x08, 0x00, 0x07, 0xa2, 0x85, 0x9a, 0x1d, 0xf2, 0x0b, 0x55, 0x7e, 0xea, 0x10, 0x08, 0x52, 0x97, + 0x42, 0x03, 0x1c, 0x49, 0x3e, 0x03, 0xac, 0x2a, 0x3e, 0x88, 0x01, 0x00, 0x67, 0x3e, 0x0e, 0x05, + 0x9b, 0xa3, 0x3e, 0x9e, 0x0f, 0x64, 0x0f, 0x40, 0x09, 0x77, 0x10, 0x0a, 0x1e, 0x75, 0x09, 0x38, + 0x09, 0x45, 0xf2, 0x0a, 0x00, 0xf2, 0x0a, 0x25, 0x03, 0x9c, 0x03, 0x9c, 0x25, 0x8c, 0x00, 0x8c, + 0x25, 0x63, 0x9c, 0x9e, 0x07, 0x3e, 0xf2, 0x0a, 0x00, 0xf2, 0x0a, 0x3b, 0x09, 0x38, 0x09, 0x10, + 0x0d, 0x79, 0x75, 0x2f, 0xf7, 0x10, 0x06, 0x4c, 0x75, 0x70, 0x10, 0x10, 0x81, 0x51, 0x0e, 0x42, + 0x06, 0x25, 0xf2, 0x0b, 0x55, 0x7e, 0xab, 0x02, 0x1d, 0x9f, 0x2a, 0x0c, 0x04, 0x9a, 0x2b, 0x61, + 0x4b, 0x04, 0x0e, 0x00, 0x0a, 0x07, 0x89, 0x0c, 0x04, 0x4b, 0x04, 0x0e, 0xee, 0x89, 0x3d, 0x00, + 0x2a, 0xa7, 0x7b, 0x0e, 0x89, 0x3d, 0x28, 0x57, 0x02, 0x7b, 0x0e, 0x89, 0x0c, 0x04, 0x4b, 0x0b, + 0x09, 0xee, 0x89, 0x61, 0x4b, 0x04, 0x0f, 0x03, 0x0a, 0x07, 0x2b, 0x0c, 0x08, 0x28, 0x35, 0x4d, + 0x0c, 0x1d, 0xf2, 0x0b, 0x55, 0x7e, 0xea, 0x10, 0x08, 0x52, 0x77, 0x10, 0x08, 0x52, 0xe8, 0x5b, + 0x3e, 0x6d, 0x01, 0x61, 0x3b, 0x3d, 0x01, 0x0e, 0x3b, 0x6d, 0x01, 0x61, 0x3b, 0xe8, 0x5b, 0x10, + 0x0d, 0x33, 0x93, 0x21, 0x1b, 0x2a, 0x20, 0x3b, 0x21, 0x38, 0x34, 0x2a, 0x20, 0x10, 0x06, 0x4c, + 0x2a, 0x6f, 0x30, 0xa1, 0x1c, 0x44, 0x31, 0x9b, 0x50, 0x31, 0x03, 0x64, 0x31, 0xa8, 0x05, 0x30, + 0x77, 0x10, 0x06, 0x4c, 0x2a, 0x0c, 0x04, 0x1c, 0xa8, 0x3e, 0x2c, 0x58, 0x31, 0x2a, 0x04, 0x3e, + 0x2c, 0x58, 0x3e, 0x2c, 0x58, 0x3b, 0x97, 0x42, 0x04, 0x10, 0x08, 0x34, 0x19, 0x08, 0x30, 0x39, + 0x10, 0x0a, 0x59, 0xde, 0xde, 0xde, 0x0f, 0x02, 0x33, 0x74, 0x25, 0x0f, 0x0c, 0x03, 0x01, 0x01, + 0x9e, 0x43, 0x27, 0x0f, 0xa1, 0x97, 0x0c, 0x06, 0x0a, 0x0e, 0x27, 0x21, 0x10, 0x0a, 0x52, 0x03, + 0xac, 0x2a, 0x45, 0x05, 0x70, 0x0f, 0x45, 0x0d, 0x70, 0x0f, 0x45, 0x77, 0x28, 0x25, 0x0d, 0x70, + 0x0f, 0x45, 0x05, 0x70, 0x0f, 0x3e, 0x03, 0x6c, 0x85, 0x29, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, + 0xfd, 0x10, 0x05, 0x79, 0x75, 0x4e, 0x10, 0x08, 0x1e, 0x78, 0xc8, 0x09, 0x10, 0x06, 0x4c, 0x97, + 0x3f, 0x25, 0x77, 0x10, 0x08, 0xd0, 0x7b, 0x7c, 0x3c, 0x01, 0x3e, 0x09, 0x0a, 0x01, 0x01, 0x0a, + 0x09, 0x3e, 0x3d, 0x7b, 0x0e, 0x3e, 0x3d, 0x7b, 0x0e, 0x3e, 0x09, 0x0a, 0x01, 0x01, 0x0a, 0x09, + 0x27, 0x2c, 0x7c, 0x3c, 0x01, 0x40, 0x4d, 0x2a, 0x0b, 0x10, 0x0a, 0x18, 0x75, 0x09, 0x38, 0x09, + 0x3b, 0xab, 0x02, 0x00, 0xab, 0x02, 0x3e, 0x07, 0x6a, 0x00, 0x07, 0x6a, 0x3e, 0x08, 0x0e, 0x35, + 0x08, 0x0e, 0x45, 0x07, 0x6a, 0x00, 0x07, 0x6a, 0x25, 0xab, 0x02, 0x00, 0xab, 0x02, 0x45, 0x09, + 0x38, 0x09, 0x10, 0x10, 0xd8, 0x53, 0xe9, 0x0c, 0x06, 0x35, 0x98, 0x89, 0x77, 0x06, 0x0b, 0x00, + 0x7b, 0x4d, 0xe1, 0x37, 0x2c, 0x65, 0x38, 0x77, 0x2b, 0xa9, 0x1e, 0x0f, 0x10, 0x10, 0xd8, 0x53, + 0xe9, 0x0c, 0x53, 0x2a, 0x6f, 0x96, 0x77, 0x06, 0x0b, 0x18, 0xa1, 0x2b, 0x9b, 0x60, 0x18, 0x44, + 0x1d, 0x6d, 0x33, 0x9b, 0x50, 0x2b, 0x51, 0x18, 0x03, 0x64, 0x37, 0x2c, 0x65, 0x33, 0xa8, 0x05, + 0x1d, 0xa9, 0x18, 0x77, 0x10, 0x10, 0x4c, 0x2a, 0x0c, 0x04, 0x33, 0x84, 0x27, 0xa8, 0x38, 0x8b, + 0x01, 0x89, 0x2c, 0x58, 0x38, 0x0c, 0x06, 0x27, 0x2a, 0x04, 0x35, 0x61, 0x1d, 0x2c, 0x58, 0x9b, + 0x60, 0x1d, 0x2c, 0x58, 0x00, 0x0c, 0x06, 0x35, 0x98, 0x89, 0x97, 0x42, 0x04, 0x06, 0x0b, 0x00, + 0x7b, 0x4d, 0xe1, 0x37, 0x2c, 0x65, 0x38, 0x77, 0x2b, 0xa9, 0x1e, 0x0f, 0x10, 0x09, 0x81, 0x4e, + 0x95, 0x0f, 0x1c, 0x67, 0x1c, 0x61, 0x30, 0x09, 0x60, 0x31, 0x07, 0xa7, 0x30, 0x6a, 0x1c, 0x7d, + 0x0a, 0x09, 0x01, 0x01, 0xa5, 0x27, 0x2c, 0x7c, 0x0e, 0x0b, 0x04, 0x10, 0x0b, 0x32, 0xca, 0x0b, + 0x1a, 0x2c, 0xad, 0xf1, 0x10, 0x0b, 0x1e, 0xb2, 0x1a, 0x2c, 0xad, 0xf1, 0x10, 0x0b, 0x1e, 0xd2, + 0x00, 0x2c, 0xad, 0xf1, 0x10, 0x0b, 0x18, 0xec, 0x07, 0x40, 0x2c, 0xad, 0xf1, 0x10, 0x0b, 0x32, + 0xcd, 0x00, 0x2c, 0xad, 0xf1, 0x10, 0x0b, 0x32, 0x44, 0x42, 0x03, 0x3b, 0x64, 0x00, 0x58, 0x3b, + 0x0e, 0x05, 0x00, 0x58, 0x3e, 0x63, 0x0f, 0x8d, 0x04, 0x3b, 0x58, 0x00, 0x64, 0x3b, 0x0a, 0x07, + 0x00, 0x06, 0x0a, 0x27, 0x2c, 0x3d, 0x01, 0x3d, 0x25, 0x5a, 0x38, 0x5f, 0x45, 0x6f, 0x35, 0xf2, + 0x25, 0x26, 0x18, 0x54, 0x27, 0x8a, 0x18, 0x03, 0x08, 0x27, 0x0e, 0x20, 0x48, 0x1d, 0x58, 0x1e, + 0x64, 0x2b, 0x0a, 0x07, 0x1e, 0xff, 0x01, 0xd5, 0x01, 0x3d, 0x10, 0x10, 0x69, 0x05, 0x77, 0x77, + 0x2b, 0x0b, 0x04, 0x28, 0x3e, 0xf2, 0x4b, 0x45, 0x08, 0x53, 0x28, 0x3e, 0x76, 0x4b, 0x25, 0x05, + 0x09, 0x38, 0x97, 0x20, 0x1b, 0x4f, 0x72, 0x96, 0xf2, 0x33, 0x0f, 0x45, 0x09, 0x20, 0x2b, 0x2c, + 0x60, 0x33, 0x0f, 0x25, 0x06, 0x0a, 0x18, 0x0f, 0x25, 0x0c, 0xf8, 0x97, 0x20, 0x10, 0x0b, 0x2d, + 0xb6, 0x3b, 0xc8, 0x09, 0x10, 0x0a, 0x32, 0xca, 0x0b, 0x1a, 0xc7, 0x66, 0x10, 0x0a, 0x1e, 0xb2, + 0x1a, 0xc7, 0x66, 0x10, 0x0a, 0x1e, 0xd2, 0x00, 0xc7, 0x66, 0x10, 0x0a, 0x32, 0xcd, 0x00, 0xc7, + 0x66, 0x10, 0x05, 0x38, 0xca, 0x0b, 0x33, 0x1a, 0xe5, 0x10, 0x05, 0x33, 0xb2, 0x33, 0x1a, 0xe5, + 0x10, 0x05, 0x33, 0xd2, 0x18, 0xe5, 0x10, 0x05, 0x38, 0xcd, 0x18, 0xe5, 0x10, 0x0d, 0x52, 0x2a, + 0x48, 0x6d, 0x01, 0x25, 0x0f, 0x38, 0x7e, 0x7c, 0x05, 0x27, 0x3a, 0x03, 0x60, 0x1d, 0x3a, 0xfb, + 0x3a, 0x9b, 0x0d, 0x89, 0x97, 0x70, 0x2c, 0x0e, 0x1d, 0x3a, 0x7b, 0x0e, 0x1d, 0x0f, 0x1e, 0x03, + 0x0d, 0x1d, 0x3a, 0xfb, 0x3a, 0x03, 0x60, 0x1d, 0x0f, 0x38, 0x7e, 0x7c, 0x05, 0x27, 0x2a, 0x48, + 0x6d, 0x01, 0x10, 0x0c, 0x32, 0xec, 0x07, 0x96, 0x95, 0x0f, 0x60, 0x32, 0x0f, 0x1d, 0xd9, 0x28, + 0x2b, 0xe0, 0x33, 0xb9, 0x57, 0x1d, 0x94, 0x7b, 0x0c, 0x0f, 0x10, 0x0d, 0x1e, 0xca, 0x0b, 0x00, + 0x1a, 0x71, 0xba, 0x10, 0x0d, 0x96, 0xb2, 0x00, 0x1a, 0x71, 0xba, 0x10, 0x0d, 0x96, 0xd2, 0x35, + 0x71, 0xba, 0x10, 0x0d, 0x32, 0xec, 0x07, 0x1a, 0x71, 0xba, 0x10, 0x0d, 0x1e, 0xcd, 0x35, 0x71, + 0xba, 0x10, 0x0d, 0x93, 0xaa, 0x33, 0x9b, 0x0a, 0x27, 0x07, 0xf5, 0x02, 0x9c, 0x27, 0x07, 0x68, + 0x9b, 0x9c, 0x45, 0x07, 0x6a, 0x9c, 0x3b, 0x4d, 0x0a, 0x31, 0x07, 0x6a, 0x9c, 0x45, 0x07, 0x68, + 0x9b, 0x9c, 0x27, 0x07, 0xf5, 0x02, 0x9c, 0x1d, 0xaa, 0x33, 0x9b, 0x0a, 0x10, 0x0d, 0x33, 0x34, + 0x2c, 0x27, 0x91, 0x23, 0x0b, 0x06, 0x44, 0x1d, 0x03, 0x0d, 0x07, 0x02, 0x9b, 0x07, 0xa2, 0x06, + 0x37, 0x2c, 0x6a, 0x00, 0x2c, 0x0c, 0x0c, 0x05, 0x2b, 0x5f, 0x18, 0x0b, 0x04, 0x5e, 0x2b, 0x6f, + 0x38, 0x0a, 0x53, 0x03, 0x0d, 0x2b, 0x0e, 0x33, 0x5f, 0x35, 0x67, 0x2b, 0x43, 0x35, 0x5a, 0x2c, + 0x0e, 0x2b, 0x6a, 0x00, 0x05, 0x0a, 0x33, 0x44, 0x2b, 0x08, 0x06, 0xa6, 0x18, 0x4a, 0x89, 0xee, + 0x0c, 0x01, 0x33, 0x03, 0x76, 0x2b, 0x57, 0x86, 0x02, 0x9b, 0x06, 0x50, 0x1d, 0x0c, 0x03, 0x06, + 0x0b, 0xa2, 0x62, 0x02, 0x89, 0x2c, 0x10, 0x0c, 0x1e, 0xca, 0x0b, 0x40, 0xb7, 0x10, 0x0c, 0x96, + 0xb2, 0x40, 0xb7, 0x10, 0x0c, 0x96, 0xd2, 0xb7, 0x10, 0x0c, 0x1e, 0xcd, 0xb7, 0x10, 0x09, 0x1e, + 0xb2, 0x40, 0xd7, 0x1d, 0x9b, 0x60, 0xdd, 0x10, 0x0a, 0x4c, 0x4e, 0x96, 0xd4, 0x38, 0x82, 0x88, + 0x25, 0x94, 0x9e, 0x25, 0xc4, 0x25, 0xd4, 0x56, 0x4e, 0x10, 0x0a, 0x52, 0x07, 0x0d, 0x0e, 0x9c, + 0x45, 0x08, 0x4f, 0x9b, 0x6d, 0x45, 0xf5, 0x03, 0x0d, 0x25, 0x28, 0x9b, 0x0b, 0x0b, 0x08, 0x35, + 0x9d, 0x46, 0x33, 0x9d, 0x60, 0x33, 0x9d, 0x0c, 0x86, 0x01, 0x25, 0x28, 0x63, 0xa2, 0x68, 0x25, + 0x0f, 0x33, 0x49, 0x0c, 0x00, 0x9d, 0x2c, 0x0e, 0x27, 0x28, 0x2c, 0x61, 0x27, 0x28, 0x2a, 0x0d, + 0x09, 0x01, 0x10, 0x09, 0xb3, 0x9b, 0xb4, 0xf4, 0x10, 0x09, 0xdb, 0x1a, 0x9b, 0xb4, 0xf4, 0x10, + 0x09, 0x34, 0x57, 0xcb, 0xff, 0x79, 0x9b, 0xb4, 0xf4, 0x10, 0x09, 0x52, 0xf0, 0x9b, 0xb4, 0xf4, + 0x10, 0x09, 0xda, 0xd6, 0x9b, 0xb4, 0xf4, 0x10, 0x09, 0x00, 0x79, 0x9e, 0x50, 0x31, 0x6a, 0xe7, + 0x6a, 0xe7, 0x9e, 0x50, 0x40, 0x9b, 0xb4, 0xf4, 0x10, 0x10, 0x5c, 0x91, 0x0e, 0x0e, 0x4f, 0x9a, + 0x0e, 0x0e, 0x0b, 0x04, 0x89, 0x88, 0x01, 0x02, 0x0a, 0x97, 0x08, 0x02, 0x82, 0xa7, 0x27, 0x67, + 0x08, 0x33, 0xa5, 0x1b, 0x07, 0x0d, 0x0e, 0x2a, 0x02, 0x00, 0x2c, 0x0e, 0x37, 0x08, 0x4f, 0x01, + 0x35, 0x97, 0x20, 0x37, 0xf5, 0x67, 0x02, 0x25, 0x3d, 0x35, 0x57, 0x07, 0x25, 0x0a, 0x0a, 0x01, + 0x01, 0x06, 0x64, 0x86, 0x02, 0x7b, 0xa5, 0x32, 0x2c, 0x7c, 0x0e, 0x5b, 0x02, 0x6c, 0x48, 0x54, + 0x10, 0x09, 0x59, 0x9b, 0x7c, 0xaf, 0x38, 0xc8, 0x09, 0x10, 0x09, 0xb3, 0xee, 0xc0, 0x10, 0x09, + 0xdb, 0x1a, 0xee, 0xc0, 0x10, 0x09, 0x34, 0x57, 0xcb, 0xff, 0x79, 0xee, 0xc0, 0x10, 0x09, 0xda, + 0xd6, 0xee, 0xc0, 0x10, 0x03, 0x1e, 0x1a, 0x08, 0x36, 0x1e, 0xb5, 0x10, 0x03, 0x22, 0x19, 0x08, + 0x30, 0x39, 0x38, 0x1a, 0xb5, 0x10, 0x03, 0x37, 0x1a, 0x57, 0xcb, 0xff, 0x95, 0xb5, 0x10, 0x03, + 0xd0, 0xcd, 0x33, 0xb5, 0x10, 0x0a, 0x52, 0x08, 0x64, 0x09, 0x64, 0x45, 0x82, 0xa2, 0xaa, 0x3e, + 0xa4, 0x02, 0x02, 0x0a, 0xaa, 0x45, 0xee, 0x2a, 0x76, 0x25, 0x8b, 0x99, 0x9b, 0x9f, 0x27, 0x0a, + 0x07, 0x33, 0x49, 0x25, 0x2e, 0x19, 0x25, 0x3a, 0x0f, 0x25, 0xf5, 0x9b, 0x0d, 0x25, 0x0a, 0x06, + 0x33, 0x06, 0x0a, 0x25, 0x8b, 0x87, 0x82, 0x65, 0x25, 0xee, 0x0e, 0x42, 0x04, 0x10, 0x0a, 0x52, + 0xf0, 0xc5, 0x10, 0x0a, 0xb3, 0x00, 0xb0, 0xd3, 0x10, 0x0a, 0xdb, 0x00, 0x1a, 0xb0, 0xd3, 0x10, + 0x0a, 0x34, 0x57, 0xcb, 0x5d, 0x40, 0xb0, 0xd3, 0x10, 0x0a, 0x52, 0xf0, 0x00, 0xb0, 0xd3, 0x10, + 0x0a, 0x2d, 0xcd, 0x35, 0xb0, 0xd3, 0x10, 0x0d, 0x37, 0x75, 0xe6, 0x40, 0x2f, 0x3b, 0xe6, 0x10, + 0x0a, 0x32, 0x93, 0x03, 0x45, 0xa6, 0xa2, 0x62, 0x0c, 0x01, 0x27, 0x19, 0x87, 0x63, 0x0f, 0x07, + 0x25, 0x0a, 0x06, 0x38, 0x09, 0xa4, 0x25, 0x68, 0x35, 0x5f, 0x6b, 0x00, 0x9d, 0x4a, 0x4b, 0x1d, + 0x76, 0x5e, 0x00, 0x9b, 0x0d, 0x25, 0xa4, 0x09, 0x38, 0x06, 0x0a, 0x25, 0x98, 0x04, 0x00, 0x82, + 0x60, 0x89, 0x2c, 0x0c, 0x9a, 0x48, 0x0b, 0x04, 0x25, 0x8f, 0x10, 0x0a, 0xb3, 0xde, 0xde, 0xbe, + 0x10, 0x0a, 0xdb, 0x1a, 0xde, 0xde, 0xbe, 0x10, 0x0a, 0x34, 0x57, 0xcb, 0xff, 0x79, 0xde, 0xde, + 0xbe, 0x10, 0x0a, 0xda, 0xd6, 0xde, 0xde, 0xbe, 0x10, 0x09, 0xdb, 0x40, 0x0c, 0xf8, 0xb8, 0x48, + 0x0a, 0x01, 0x10, 0x0a, 0x4c, 0xfe, 0x43, 0x7c, 0xc1, 0x9d, 0xce, 0xc3, 0x0e, 0x4f, 0x45, 0x21, + 0x10, 0x09, 0x2d, 0xcd, 0x0c, 0xf8, 0xb8, 0x48, 0x0a, 0x01, 0x10, 0x00, 0x0b, 0x96, 0xb2, 0x00, + 0x1a, 0xb6, 0x10, 0x09, 0xdb, 0x1a, 0x9b, 0x7c, 0xaf, 0x10, 0x0b, 0x1e, 0xe3, 0x1a, 0xb6, 0x10, + 0x09, 0x00, 0x22, 0xeb, 0xdc, 0x02, 0x7c, 0xaf, 0x10, 0x0a, 0x35, 0xf9, 0x29, 0x77, 0x1c, 0x0f, + 0x45, 0x26, 0xbf, 0xac, 0x0e, 0xf4, 0x10, 0x0c, 0x1e, 0xcc, 0x04, 0x40, 0x02, 0x7a, 0x97, 0x0d, + 0x09, 0xe4, 0x82, 0xc2, 0x32, 0x06, 0xe2, 0x48, 0x62, 0x03, 0x10, 0x0a, 0x2d, 0xcc, 0x04, 0x40, + 0x03, 0xac, 0x0e, 0xf4, 0x25, 0x19, 0xbd, 0x1e, 0xf3, 0x01, 0x82, 0x88, 0x45, 0x49, 0x0e, 0x42, + 0x05, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_1[128] = { + 0x0000, 0x0003, 0x000e, 0x003a, 0x0050, 0x0083, 0x00ad, 0x00b5, + 0x00ed, 0x00f1, 0x013d, 0x015b, 0x0180, 0x0186, 0x018b, 0x01d8, + 0x01dc, 0x01f0, 0x01fe, 0x0212, 0x022a, 0x0231, 0x024d, 0x0272, + 0x0277, 0x027d, 0x0284, 0x02aa, 0x02d3, 0x02ed, 0x0315, 0x034d, + 0x036c, 0x0375, 0x037d, 0x0385, 0x038e, 0x0396, 0x03db, 0x040e, + 0x0415, 0x041d, 0x0424, 0x042b, 0x0432, 0x043a, 0x0441, 0x0447, + 0x044d, 0x0483, 0x049b, 0x04a4, 0x04ac, 0x04b3, 0x04bb, 0x04c2, + 0x04ed, 0x0547, 0x054e, 0x0554, 0x0559, 0x055e, 0x0568, 0x057a, + 0x05b3, 0x05b9, 0x05c0, 0x05ca, 0x05d1, 0x05d8, 0x05e9, 0x0631, + 0x063a, 0x063f, 0x0645, 0x064e, 0x0654, 0x065c, 0x0666, 0x066f, + 0x0675, 0x06ae, 0x06b3, 0x06b9, 0x06c0, 0x06c9, 0x06d0, 0x06d7, + 0x06e0, 0x071b, 0x0721, 0x0728, 0x0732, 0x0739, 0x0743, 0x0751, + 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075c, 0x0763, + 0x075b, 0x075b, 0x075b, 0x075b, 0x076a, 0x0770, 0x075b, 0x075b, + 0x075b, 0x0779, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, + 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x0787, 0x079b, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_2[11] = { + 0x05, 0x33, 0xe6, 0x33, 0x1a, 0xe5, 0x10, 0x03, 0x59, 0xb5, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_2[2] = { + 0x0000, 0x0007, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_3[43] = { + 0x09, 0x52, 0xfe, 0x0f, 0x9b, 0x06, 0x31, 0x0f, 0x04, 0x3c, 0x31, 0x48, 0x05, 0x31, 0x05, 0x0f, + 0x02, 0x31, 0x0a, 0xa2, 0x30, 0x55, 0xfe, 0x1f, 0x10, 0x04, 0x4c, 0xf7, 0x3b, 0x0f, 0x6e, 0x31, + 0x8e, 0x07, 0x3b, 0x63, 0xa2, 0x30, 0x03, 0x8e, 0x56, 0xf7, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_3[2] = { + 0x0000, 0x0019, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_4[183] = { + 0x11, 0x52, 0x9b, 0x7a, 0x0e, 0x2a, 0x20, 0x37, 0x05, 0x86, 0x02, 0x4b, 0x1d, 0x03, 0x60, 0x33, + 0x0f, 0x25, 0x09, 0x07, 0x18, 0x0f, 0x25, 0x2e, 0x28, 0x27, 0x3a, 0x0f, 0x20, 0x92, 0x3a, 0x0f, + 0x25, 0x2e, 0x28, 0x27, 0x09, 0x07, 0x18, 0x0f, 0x25, 0x03, 0x60, 0x33, 0x0f, 0x45, 0x06, 0x86, + 0x02, 0x4b, 0x27, 0x9b, 0x7a, 0x0e, 0x2a, 0x20, 0x10, 0x0f, 0x5c, 0x49, 0x0f, 0x0c, 0x04, 0x00, + 0x44, 0x0f, 0x64, 0x89, 0x8b, 0x55, 0xa8, 0x06, 0x0e, 0x05, 0x8f, 0x50, 0x1b, 0x0a, 0x06, 0x38, + 0x57, 0x07, 0x38, 0xa5, 0x1b, 0xf5, 0x8e, 0x02, 0x38, 0x6b, 0x1b, 0x94, 0x0f, 0x20, 0x1b, 0xf5, + 0x02, 0x43, 0x25, 0x0a, 0x06, 0x38, 0x57, 0x06, 0x25, 0x03, 0xa7, 0x7e, 0x0e, 0x58, 0x87, 0x01, + 0xa6, 0x89, 0x49, 0x0f, 0x50, 0x00, 0x03, 0xac, 0x0e, 0x0b, 0x04, 0x10, 0x00, 0x0a, 0x52, 0x51, + 0x0e, 0xbb, 0x01, 0x1c, 0x09, 0x0a, 0x1c, 0xae, 0x7a, 0x0f, 0x42, 0x06, 0x31, 0xc8, 0x09, 0x10, + 0x09, 0x59, 0x01, 0x08, 0x23, 0xb1, 0xc9, 0x3e, 0xc8, 0x09, 0x10, 0x0a, 0x32, 0xe3, 0x1a, 0x51, + 0x0e, 0xbb, 0x01, 0x1c, 0x09, 0x0a, 0x1c, 0xae, 0x7a, 0x0f, 0x42, 0x06, 0x10, 0x09, 0x22, 0xeb, + 0xdc, 0x01, 0x08, 0x23, 0xb1, 0xc9, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_4[16] = { + 0x0000, 0x0039, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, + 0x007c, 0x007c, 0x007c, 0x007c, 0x007d, 0x0090, 0x009b, 0x00ad, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_5[24] = { + 0x09, 0x32, 0xcd, 0xd7, 0x1d, 0x9b, 0x60, 0xdd, 0x10, 0x00, 0x0c, 0x32, 0xe3, 0x40, 0x20, 0xbc, + 0x10, 0x09, 0x22, 0xeb, 0xdc, 0xd1, 0xf6, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_5[7] = { + 0x0000, 0x0009, 0x0009, 0x0009, 0x0009, 0x000a, 0x0011, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_6[40] = { + 0x0a, 0xf9, 0xa1, 0x97, 0x3e, 0x63, 0x0f, 0x06, 0x30, 0x0a, 0x83, 0x76, 0x3e, 0x2c, 0x0c, 0x31, + 0x06, 0x2a, 0x48, 0x31, 0x8a, 0x1c, 0x4f, 0x1c, 0x76, 0x30, 0x6b, 0x1c, 0xa6, 0x1c, 0x5a, 0x1c, + 0x46, 0x30, 0xa8, 0x01, 0x3b, 0x97, 0x50, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_6[1] = { + 0x0000, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_7[12] = { + 0x08, 0x00, 0x22, 0x57, 0xcb, 0x5d, 0x10, 0x08, 0x22, 0xeb, 0xdc, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_7[2] = { + 0x0000, 0x0007, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_8[51] = { + 0x08, 0x52, 0xcc, 0x04, 0x10, 0x08, 0x2d, 0xe6, 0x10, 0x08, 0x79, 0x9e, 0x50, 0x31, 0x6a, 0xe7, + 0x6a, 0xe7, 0x9e, 0x50, 0x10, 0x08, 0x1e, 0x78, 0x4a, 0x1c, 0x65, 0x1c, 0x7c, 0x0e, 0x10, 0x08, + 0x4c, 0xf0, 0x10, 0x08, 0x00, 0x22, 0x84, 0x0c, 0x0a, 0x45, 0x9b, 0x60, 0x04, 0x3d, 0x45, 0x6d, + 0x00, 0xa0, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_8[6] = { + 0x0000, 0x0005, 0x0009, 0x0015, 0x001f, 0x0023, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_9[63] = { + 0x0c, 0x2d, 0x71, 0xaa, 0x25, 0x58, 0x99, 0x9b, 0x06, 0x64, 0x2b, 0x9b, 0x2e, 0x9b, 0x68, 0x2b, + 0x09, 0x06, 0x1e, 0x5e, 0x2b, 0x68, 0x32, 0x9b, 0x0d, 0x37, 0x72, 0x28, 0x89, 0xd5, 0x19, 0x2b, + 0x0c, 0x06, 0x1e, 0x51, 0x2b, 0x08, 0x76, 0x35, 0x2c, 0x62, 0x37, 0x2c, 0x0e, 0x0b, 0x01, 0x2c, + 0x4d, 0x02, 0x1d, 0x57, 0x50, 0x00, 0x9e, 0x0f, 0x06, 0x2b, 0x74, 0x70, 0x77, 0x02, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_9[1] = { + 0x0000, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_10[49] = { + 0x09, 0x38, 0x75, 0x44, 0x0e, 0x20, 0x0d, 0x1d, 0x0c, 0x06, 0x98, 0x02, 0x00, 0x05, 0x43, 0x45, + 0xac, 0x35, 0x9a, 0x3e, 0x0e, 0x0a, 0x35, 0xa4, 0x25, 0x63, 0x0f, 0x06, 0x35, 0x0c, 0x05, 0x45, + 0x98, 0x02, 0x35, 0x3d, 0x25, 0x0b, 0x0d, 0x38, 0x0f, 0x02, 0x45, 0x0e, 0x0a, 0x38, 0x8d, 0x09, + 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_10[1] = { + 0x0000, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_11[235] = { + 0x08, 0xd0, 0x75, 0x97, 0x20, 0x10, 0x10, 0xd0, 0x75, 0x20, 0x2f, 0x10, 0x00, 0x05, 0x4c, 0x44, + 0x1c, 0x09, 0x83, 0x7d, 0x0f, 0x10, 0x05, 0x52, 0x97, 0x30, 0x67, 0x0c, 0x30, 0x07, 0x60, 0x30, + 0x0c, 0x06, 0x10, 0x05, 0x5c, 0x75, 0x0f, 0xfa, 0x33, 0x5e, 0x1c, 0x6f, 0x10, 0x08, 0x4c, 0x44, + 0x00, 0x44, 0x3b, 0x09, 0x53, 0x09, 0x06, 0x3b, 0x3d, 0xd5, 0xd6, 0x10, 0x08, 0xd0, 0x4b, 0x0f, + 0x25, 0x2c, 0xed, 0x3b, 0x6f, 0x6f, 0x10, 0x08, 0x5c, 0x75, 0x73, 0x0f, 0x25, 0x2c, 0xed, 0x3b, + 0x6f, 0x6f, 0x10, 0x08, 0x2d, 0x21, 0x89, 0x1f, 0xb5, 0x9d, 0x10, 0x08, 0x2d, 0x21, 0x89, 0x1f, + 0x3f, 0x27, 0x1f, 0x21, 0x10, 0x09, 0x18, 0x75, 0xe8, 0x5b, 0x3e, 0x0b, 0x2a, 0x0b, 0x3b, 0x0e, + 0x97, 0x48, 0x3b, 0x0b, 0x2a, 0x0b, 0x3b, 0xe8, 0x5b, 0x10, 0x10, 0x5c, 0x75, 0x73, 0x4b, 0x4b, + 0x96, 0x4b, 0x4b, 0x4b, 0x10, 0x15, 0x4c, 0xe8, 0xcf, 0x51, 0x00, 0xe8, 0x5b, 0xe8, 0x5b, 0x33, + 0x2c, 0x65, 0x00, 0xa9, 0x01, 0x84, 0xa9, 0x01, 0x84, 0x1e, 0xa4, 0x35, 0x3d, 0x01, 0x0e, 0x00, + 0x3d, 0x01, 0x0e, 0x1e, 0x03, 0x76, 0x35, 0x3d, 0x01, 0x0e, 0x00, 0x3d, 0x01, 0x0e, 0x1e, 0x0c, + 0x05, 0x38, 0xa9, 0x01, 0x84, 0xa9, 0x01, 0x84, 0x18, 0x61, 0x33, 0xe8, 0x5b, 0xe8, 0x5b, 0x10, + 0x06, 0x1e, 0x75, 0x09, 0x30, 0xf2, 0x0a, 0x31, 0x03, 0x9c, 0x31, 0x8c, 0x30, 0x9e, 0x07, 0x1c, + 0xf2, 0x0a, 0x56, 0x09, 0x10, 0x06, 0x18, 0x75, 0x09, 0x56, 0xab, 0x02, 0x1c, 0x07, 0x6a, 0x1c, + 0x08, 0x0e, 0x30, 0x07, 0x6a, 0x31, 0xab, 0x02, 0x30, 0x09, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_11[40] = { + 0x0000, 0x0006, 0x000c, 0x000c, 0x000c, 0x000d, 0x0016, 0x0023, + 0x000c, 0x002d, 0x003c, 0x0047, 0x000c, 0x0053, 0x005b, 0x0065, + 0x000c, 0x000c, 0x000c, 0x007a, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0085, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x00c0, 0x00d5, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_12[46] = { + 0x0a, 0x69, 0x51, 0x48, 0x0b, 0x04, 0x45, 0x0a, 0x4f, 0x01, 0x02, 0x8d, 0x25, 0x51, 0x18, 0x07, + 0x25, 0x46, 0x31, 0x0b, 0x20, 0x0c, 0x3e, 0x4e, 0x32, 0x0b, 0x77, 0x0b, 0x3b, 0x46, 0x1c, 0x51, + 0x18, 0x07, 0x45, 0x0a, 0x4f, 0x01, 0x91, 0x0f, 0x3e, 0x9a, 0x48, 0x0b, 0x04, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_12[1] = { + 0x0000, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_13[26] = { + 0x10, 0x52, 0x20, 0x08, 0x00, 0x07, 0x85, 0x9d, 0x0f, 0x0b, 0x01, 0x0a, 0x85, 0x9d, 0x0f, 0x49, + 0x05, 0x85, 0x9d, 0x85, 0x0c, 0x28, 0x9d, 0x73, 0x28, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_13[1] = { + 0x0000, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_14[360] = { + 0x08, 0x40, 0xf9, 0xee, 0x0f, 0x64, 0x3b, 0x61, 0x55, 0x6f, 0x30, 0x61, 0x1c, 0xa1, 0x3e, 0x07, + 0x0d, 0x0e, 0x08, 0x98, 0x45, 0x07, 0x6a, 0x01, 0xa1, 0x0d, 0x45, 0x50, 0x35, 0x67, 0x0a, 0x45, + 0x3d, 0x63, 0x0f, 0x04, 0x45, 0x0a, 0x06, 0x8f, 0x0d, 0x0a, 0x27, 0x2c, 0x0a, 0x0e, 0x8c, 0x10, + 0x00, 0x0b, 0x69, 0x8d, 0x09, 0x45, 0x2c, 0x0e, 0x06, 0x3d, 0x3e, 0x06, 0x0b, 0x00, 0x0c, 0x06, + 0x3b, 0x0c, 0x05, 0x00, 0x49, 0x3e, 0x9e, 0x38, 0x6a, 0x45, 0x0a, 0x07, 0x38, 0x5a, 0x2b, 0x2c, + 0x0e, 0x01, 0x2c, 0x3d, 0x1d, 0x5a, 0x18, 0x09, 0x06, 0x27, 0x6a, 0x18, 0xf2, 0x1d, 0xa6, 0x1e, + 0x4f, 0x2b, 0x0a, 0x05, 0x1e, 0x90, 0x89, 0x67, 0x2a, 0x20, 0x43, 0x10, 0x0c, 0x4c, 0xef, 0x35, + 0x72, 0x41, 0x35, 0x72, 0x41, 0x35, 0x72, 0x0f, 0x1b, 0x72, 0x0f, 0x10, 0x0b, 0xd0, 0x0c, 0x97, + 0x20, 0x0c, 0x1d, 0xa0, 0x45, 0x63, 0x0e, 0x05, 0x30, 0x63, 0x0e, 0x05, 0x30, 0x63, 0x0e, 0x05, + 0x30, 0x63, 0x0e, 0x05, 0x30, 0x63, 0x0e, 0x05, 0x1c, 0x57, 0x02, 0x3b, 0x9b, 0x9c, 0x3e, 0x9b, + 0x9c, 0x3e, 0x9b, 0x9c, 0x3b, 0x03, 0x86, 0x31, 0x03, 0x86, 0x30, 0x86, 0x1c, 0x2f, 0x10, 0x0d, + 0x52, 0x75, 0x2f, 0x10, 0x03, 0x69, 0x84, 0x31, 0x8b, 0x01, 0x30, 0x0c, 0x06, 0x30, 0x61, 0x31, + 0x9b, 0x60, 0x30, 0x0c, 0x06, 0x30, 0x06, 0x0b, 0x31, 0x9b, 0x60, 0x30, 0x6d, 0x30, 0x51, 0x3e, + 0x2c, 0x65, 0x30, 0xa9, 0x10, 0x05, 0x79, 0x75, 0x4e, 0x10, 0x0a, 0x33, 0x34, 0x4d, 0x30, 0x6b, + 0x1c, 0x07, 0x07, 0x1c, 0x0c, 0x01, 0x30, 0x03, 0x0a, 0x45, 0x03, 0x02, 0x38, 0x09, 0x04, 0x25, + 0x7a, 0x0a, 0x00, 0x7b, 0x0c, 0x3e, 0x06, 0x3d, 0x05, 0x07, 0x27, 0x2c, 0x0e, 0x53, 0x5b, 0x3e, + 0x09, 0x0c, 0x02, 0x0a, 0x31, 0x74, 0x6e, 0x30, 0x0c, 0x0d, 0x1c, 0x07, 0x07, 0x10, 0x0d, 0x18, + 0x75, 0xe8, 0x0a, 0x01, 0xf2, 0x0e, 0x0b, 0x01, 0x1d, 0x0a, 0x09, 0x7e, 0x09, 0x0c, 0x07, 0xfb, + 0x3d, 0x00, 0x09, 0x0c, 0x00, 0x7b, 0x0e, 0x1d, 0x3d, 0x00, 0x0d, 0x09, 0x35, 0x19, 0x1d, 0xa4, + 0x01, 0x09, 0x0c, 0x09, 0x99, 0x0a, 0x0a, 0x1b, 0x2c, 0x0a, 0x0e, 0x0b, 0x01, 0x00, 0x7c, 0x5b, + 0x10, 0x08, 0x69, 0x07, 0x0e, 0x0b, 0x3b, 0x9b, 0x09, 0x1c, 0x07, 0x05, 0x1c, 0x54, 0x1c, 0x0c, + 0x02, 0x1c, 0x7d, 0x43, 0x1c, 0x4e, 0x33, 0x2c, 0x0e, 0x1c, 0x6b, 0x30, 0x9b, 0x0b, 0x30, 0x63, + 0x08, 0x1c, 0x08, 0x03, 0x31, 0x0b, 0x86, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_14[42] = { + 0x0000, 0x0030, 0x0030, 0x0030, 0x0031, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x006c, 0x0030, 0x007c, + 0x00af, 0x0030, 0x0030, 0x00b4, 0x0030, 0x0030, 0x0030, 0x00d5, + 0x00da, 0x0030, 0x0030, 0x0030, 0x010e, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0141, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_15[23] = { + 0x0d, 0x18, 0x75, 0xdf, 0xfc, 0x01, 0x2b, 0x63, 0xac, 0x0e, 0x0b, 0x99, 0x01, 0x58, 0x1d, 0x0d, + 0x55, 0x02, 0x06, 0xac, 0x0e, 0xfc, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_15[1] = { + 0x0000, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_16[106] = { + 0x0d, 0x1e, 0x5c, 0x5a, 0x30, 0x07, 0x65, 0x27, 0x77, 0x77, 0x3e, 0x98, 0x03, 0x31, 0x74, 0x06, + 0x3e, 0x77, 0x77, 0x27, 0x03, 0x86, 0x30, 0x0a, 0x07, 0x10, 0x00, 0x0d, 0x32, 0x5c, 0x7e, 0x7a, + 0x25, 0x9b, 0x07, 0xac, 0x6d, 0x03, 0x2b, 0x63, 0x7a, 0x0d, 0x09, 0x87, 0x45, 0x0f, 0x64, 0x31, + 0x63, 0x7a, 0x0d, 0x09, 0x87, 0x3b, 0x9b, 0x07, 0xac, 0x6d, 0x03, 0x31, 0x7e, 0x7a, 0x18, 0x95, + 0x2f, 0x10, 0x0d, 0x5c, 0x0d, 0x09, 0x55, 0x31, 0x03, 0x07, 0xac, 0x6d, 0x02, 0x31, 0x82, 0x7a, + 0x0d, 0x09, 0x04, 0x30, 0x58, 0x0f, 0x45, 0x82, 0x7a, 0x0d, 0x09, 0x05, 0x1d, 0x03, 0x07, 0xac, + 0x6d, 0x02, 0x45, 0x0d, 0x09, 0x55, 0x00, 0x1a, 0x2f, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_16[6] = { + 0x0000, 0x001a, 0x001a, 0x001a, 0x001b, 0x0042, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_17[72] = { + 0x08, 0x22, 0x63, 0x04, 0x1c, 0x0b, 0x0b, 0x30, 0x26, 0x4f, 0x31, 0x6e, 0x90, 0x3e, 0x9b, 0x0b, + 0x35, 0x5b, 0x45, 0x09, 0x04, 0x35, 0x05, 0x09, 0x1d, 0x2c, 0x0c, 0x33, 0x0c, 0x01, 0x25, 0x8a, + 0x33, 0x05, 0x08, 0x25, 0x76, 0x33, 0x6b, 0x25, 0x5f, 0x33, 0x4a, 0x25, 0x6b, 0x33, 0x76, 0x45, + 0x09, 0x06, 0x35, 0x5e, 0x3e, 0xf2, 0x35, 0x0c, 0x02, 0x3b, 0x0a, 0x05, 0x05, 0x0a, 0x31, 0x44, + 0x6f, 0x31, 0x0b, 0x0b, 0x30, 0x63, 0x04, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_17[1] = { + 0x0000, +}; + +static const uint8_t mf_rlefont_phpRVS9jE_glyph_data_18[47] = { + 0x0a, 0x52, 0x44, 0x97, 0x4b, 0x27, 0x0c, 0x05, 0x35, 0x4b, 0x9d, 0x31, 0x0f, 0x20, 0x92, 0xc6, + 0x72, 0xc6, 0x72, 0xc6, 0x72, 0xc6, 0x72, 0x10, 0x0a, 0x52, 0x58, 0x77, 0x45, 0x6a, 0x35, 0x4b, + 0x9d, 0x72, 0x1e, 0x0f, 0x2a, 0x72, 0xc6, 0x72, 0xc6, 0x72, 0xc6, 0x72, 0xc6, 0x72, 0x10, +}; + +static const uint16_t mf_rlefont_phpRVS9jE_glyph_offsets_18[2] = { + 0x0000, 0x0018, +}; + +static const struct mf_rlefont_char_range_s mf_rlefont_phpRVS9jE_char_ranges[] = { + {32, 95, mf_rlefont_phpRVS9jE_glyph_offsets_0, mf_rlefont_phpRVS9jE_glyph_data_0}, + {160, 128, mf_rlefont_phpRVS9jE_glyph_offsets_1, mf_rlefont_phpRVS9jE_glyph_data_1}, + {304, 2, mf_rlefont_phpRVS9jE_glyph_offsets_2, mf_rlefont_phpRVS9jE_glyph_data_2}, + {321, 2, mf_rlefont_phpRVS9jE_glyph_offsets_3, mf_rlefont_phpRVS9jE_glyph_data_3}, + {338, 16, mf_rlefont_phpRVS9jE_glyph_offsets_4, mf_rlefont_phpRVS9jE_glyph_data_4}, + {376, 7, mf_rlefont_phpRVS9jE_glyph_offsets_5, mf_rlefont_phpRVS9jE_glyph_data_5}, + {402, 1, mf_rlefont_phpRVS9jE_glyph_offsets_6, mf_rlefont_phpRVS9jE_glyph_data_6}, + {710, 2, mf_rlefont_phpRVS9jE_glyph_offsets_7, mf_rlefont_phpRVS9jE_glyph_data_7}, + {728, 6, mf_rlefont_phpRVS9jE_glyph_offsets_8, mf_rlefont_phpRVS9jE_glyph_data_8}, + {937, 1, mf_rlefont_phpRVS9jE_glyph_offsets_9, mf_rlefont_phpRVS9jE_glyph_data_9}, + {960, 1, mf_rlefont_phpRVS9jE_glyph_offsets_10, mf_rlefont_phpRVS9jE_glyph_data_10}, + {8211, 40, mf_rlefont_phpRVS9jE_glyph_offsets_11, mf_rlefont_phpRVS9jE_glyph_data_11}, + {8364, 1, mf_rlefont_phpRVS9jE_glyph_offsets_12, mf_rlefont_phpRVS9jE_glyph_data_12}, + {8482, 1, mf_rlefont_phpRVS9jE_glyph_offsets_13, mf_rlefont_phpRVS9jE_glyph_data_13}, + {8706, 42, mf_rlefont_phpRVS9jE_glyph_offsets_14, mf_rlefont_phpRVS9jE_glyph_data_14}, + {8776, 1, mf_rlefont_phpRVS9jE_glyph_offsets_15, mf_rlefont_phpRVS9jE_glyph_data_15}, + {8800, 6, mf_rlefont_phpRVS9jE_glyph_offsets_16, mf_rlefont_phpRVS9jE_glyph_data_16}, + {9674, 1, mf_rlefont_phpRVS9jE_glyph_offsets_17, mf_rlefont_phpRVS9jE_glyph_data_17}, + {64257, 2, mf_rlefont_phpRVS9jE_glyph_offsets_18, mf_rlefont_phpRVS9jE_glyph_data_18}, +}; + +const struct mf_rlefont_s mf_rlefont_phpRVS9jE = { + { + "Bitstream Vera Sans Roman 16", + "phpRVS9jE", + 23, /* width */ + 19, /* height */ + 3, /* min x advance */ + 21, /* max x advance */ + 3, /* baseline x */ + 15, /* baseline y */ + 19, /* line height */ + 0, /* flags */ + 63, /* fallback character */ + &mf_rlefont_character_width, + &mf_rlefont_render_character, + }, + 4, /* version */ + mf_rlefont_phpRVS9jE_dictionary_data, + mf_rlefont_phpRVS9jE_dictionary_offsets, + 149, /* rle dict count */ + 232, /* total dict count */ + 19, /* char range count */ + mf_rlefont_phpRVS9jE_char_ranges, +}; + +#ifdef MF_INCLUDED_FONTS +/* List entry for searching fonts by name. */ +static const struct mf_font_list_s mf_rlefont_phpRVS9jE_listentry = { + MF_INCLUDED_FONTS, + (struct mf_font_s*)&mf_rlefont_phpRVS9jE +}; +#undef MF_INCLUDED_FONTS +#define MF_INCLUDED_FONTS (&mf_rlefont_phpRVS9jE_listentry) +#endif + + +/* End of automatically generated font definition for phpRVS9jE. */ + From 87412e87d641e1d4e63eebbffc6434608a2149cb Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Wed, 10 Feb 2016 23:28:50 +0100 Subject: [PATCH 6/6] New sample board file (replacing some misleading existing ones) --- .../board_SSD1306_chibios_16.1.3_stm32f4.h | 93 ++++++++++++ boards/addons/gdisp/board_SSD1306_spi.h | 136 ------------------ boards/addons/gdisp/board_SSD1306_spi2.h | 115 --------------- 3 files changed, 93 insertions(+), 251 deletions(-) create mode 100644 boards/addons/gdisp/board_SSD1306_chibios_16.1.3_stm32f4.h delete mode 100644 boards/addons/gdisp/board_SSD1306_spi.h delete mode 100644 boards/addons/gdisp/board_SSD1306_spi2.h diff --git a/boards/addons/gdisp/board_SSD1306_chibios_16.1.3_stm32f4.h b/boards/addons/gdisp/board_SSD1306_chibios_16.1.3_stm32f4.h new file mode 100644 index 00000000..361562fa --- /dev/null +++ b/boards/addons/gdisp/board_SSD1306_chibios_16.1.3_stm32f4.h @@ -0,0 +1,93 @@ +#ifndef _GDISP_LLD_BOARD_H +#define _GDISP_LLD_BOARD_H + +// Pin & SPI setup +#define SPI_DRIVER (&SPID2) +#define SPI_PORT GPIOB +#define SCK_PAD 10 +#define MOSI_PAD 15 + +#define CS_PORT GPIOB +#define RESET_PORT GPIOB +#define DC_PORT GPIOB +#define CS_PAD 3 // 0 = chip selected +#define RESET_PAD 4 // 0 = reset +#define DC_PAD 5 // control = 0, data = 1 + +static SPIConfig spi_cfg = { + NULL, + CS_PORT, + CS_PAD, + SPI_CR1_BR_1 +}; + +static GFXINLINE void init_board(GDisplay* g) +{ + (void)g; + + g->board = 0; + + // Set pin modes + palSetPadMode(SPI_PORT, SCK_PAD, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(SPI_PORT, MOSI_PAD, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(RESET_PORT, RESET_PAD, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(CS_PORT, CS_PAD, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(DC_PORT, DC_PAD, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + + // Apply default states + palSetPad(CS_PORT, CS_PAD); + palSetPad(RESET_PORT, RESET_PAD); + palClearPad(DC_PORT, DC_PAD); + + // Start the SPI driver + spiStart(SPI_DRIVER, &spi_cfg); +} + +static GFXINLINE void post_init_board(GDisplay* g) +{ + (void)g; +} + + +static GFXINLINE void setpin_reset(GDisplay* g, bool_t state) +{ + (void)g; + + palWritePad(RESET_PORT, RESET_PAD, !state); +} + +static GFXINLINE void acquire_bus(GDisplay* g) +{ + (void)g; + + spiAcquireBus(SPI_DRIVER); + spiSelect(SPI_DRIVER); +} + +static GFXINLINE void release_bus(GDisplay* g) +{ + (void)g; + + spiUnselect(SPI_DRIVER); + spiReleaseBus(SPI_DRIVER); +} + +static GFXINLINE void write_cmd(GDisplay* g, uint8_t cmd) +{ + (void)g; + + static uint8_t buf; + palClearPad(DC_PORT, DC_PAD); + buf = cmd; + spiSend(SPI_DRIVER, 1, &buf); +} + +static GFXINLINE void write_data(GDisplay* g, uint8_t* data, uint16_t length) +{ + (void)g; + + palSetPad(DC_PORT, DC_PAD); + spiSend(SPI_DRIVER, length, data); +} + +#endif /* _GDISP_LLD_BOARD_H */ diff --git a/boards/addons/gdisp/board_SSD1306_spi.h b/boards/addons/gdisp/board_SSD1306_spi.h deleted file mode 100644 index f7b1ac6d..00000000 --- a/boards/addons/gdisp/board_SSD1306_spi.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This file is subject to the terms of the GFX License. If a copy of - * the license was not distributed with this file, you can obtain one at: - * - * http://ugfx.org/license.html - */ - -/** - * @file boards/addons/gdisp/board_SSD1306_spi.h - * @brief GDISP Graphic Driver subsystem board interface for the SSD1306 display. - * - * @note This file contains a mix of hardware specific and operating system specific - * code. You will need to change it for your CPU and/or operating system. - */ - -#ifndef _GDISP_LLD_BOARD_H -#define _GDISP_LLD_BOARD_H - -// The command byte to put on the front of each page line -#define SSD1306_PAGE_PREFIX 0x40 // Co = 0, D/C = 1 - -// For a multiple display configuration we would put all this in a structure and then -// set g->board to that structure. -#define SSD1306_RESET_PORT GPIOB -#define SSD1306_RESET_PIN 5 -#define SSD1306_MISO_PORT GPIOB -#define SSD1306_MISO_PIN 8 -#define SSD1306_MOSI_PORT GPIOB -#define SSD1306_MOSI_PIN 7 -#define SSD1306_SCK_PORT GPIOB -#define SSD1306_SCK_PIN 6 -#define SSD1306_CS_PORT GPIOB -#define SSD1306_CS_PIN 5 -#define SET_RST palSetPad(SSD1306_RESET_PORT, SSD1306_RESET_PIN); -#define CLR_RST palClearPad(SSD1306_RESET_PORT, SSD1306_RESET_PIN); - -/* - * SPI1 configuration structure. - * Speed 42MHz, CPHA=0, CPOL=0, 8bits frames, MSb transmitted first. - * The slave select line is the pin 4 on the port GPIOA. - */ -static const SPIConfig spi1config = { - 0, - /* HW dependent part.*/ - SSD1306_MISO_PORT, - SSD1306_MISO_PIN, - 0 - //SPI_CR1_BR_0 -}; - -#if GFX_USE_OS_CHIBIOS - static int32_t thdPriority = 0; -#endif - -static GFXINLINE void init_board(GDisplay *g) { - unsigned i; - - // As we are not using multiple displays we set g->board to NULL as we don't use it. - g->board = 0; - - - switch(g->controllerdisplay) { - case 0: // Set up for Display 0 - // RESET pin. - palSetPadMode(SSD1306_RESET_PORT, SSD1306_RESET_PIN, PAL_MODE_OUTPUT_PUSHPULL); - - palSetPadMode(SSD1306_MISO_PORT, SSD1306_MISO_PIN, PAL_MODE_ALTERNATE(1)| - PAL_STM32_OSPEED_HIGHEST); - palSetPadMode(SSD1306_MOSI_PORT, SSD1306_MOSI_PIN, PAL_MODE_ALTERNATE(1)| - PAL_STM32_OSPEED_HIGHEST); - palSetPadMode(SSD1306_SCK_PORT, SSD1306_SCK_PIN, PAL_MODE_ALTERNATE(1)| - PAL_STM32_OSPEED_HIGHEST); - palSetPad(SSD1306_CS_PORT, SSD1306_CS_PIN); - palSetPadMode(SSD1306_CS_PORT, SSD1306_CS_PIN, PAL_MODE_ALTERNATE(1)| - PAL_STM32_OSPEED_HIGHEST); - spiInit(); - break; - } -} - -static GFXINLINE void post_init_board(GDisplay *g) { - (void) g; -} - -static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) { - (void) g; - if(state) - CLR_RST - else - SET_RST -} - -static GFXINLINE void acquire_bus(GDisplay *g) { - (void) g; - #if GFX_USE_OS_CHIBIOS - thdPriority = (int32_t)chThdGetPriority(); - chThdSetPriority(HIGHPRIO); - #endif - spiAcquireBus(&SPID1); -} - -static GFXINLINE void release_bus(GDisplay *g) { - (void) g; - #if GFX_USE_OS_CHIBIOS - chThdSetPriority(thdPriority); - #endif - spiReleaseBus(&SPID1); -} - -static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) { - uint8_t command[2]; - (void) g; - - command[0] = 0x00; // Co = 0, D/C = 0 - command[1] = cmd; - - spiStart(&SPID1, &spi1config); - spiSelect(&SPID1); - spiStartSend(&SPID1, 2, command); - spiUnselect(&SPID1); - spiStop(&SPID1); -} - -static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) { - (void) g; - - spiStart(&SPID1, &spi1config); - spiSelect(&SPID1); - spiStartSend(&SPID1, length, data); - spiUnselect(&SPID1); - spiStop(&SPID1); -} - - -#endif /* _GDISP_LLD_BOARD_H */ - diff --git a/boards/addons/gdisp/board_SSD1306_spi2.h b/boards/addons/gdisp/board_SSD1306_spi2.h deleted file mode 100644 index 2bc0679f..00000000 --- a/boards/addons/gdisp/board_SSD1306_spi2.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is subject to the terms of the GFX License. If a copy of - * the license was not distributed with this file, you can obtain one at: - * - * http://ugfx.org/license.html - */ - -/** - * @file boards/addons/gdisp/board_SSD1306_spi.h - * @brief GDISP Graphic Driver subsystem board interface for the SSD1306 display. - * - * @note This file contains a mix of hardware specific and operating system specific - * code. You will need to change it for your CPU and/or operating system. - */ - -#ifndef _GDISP_LLD_BOARD_H -#define _GDISP_LLD_BOARD_H - -// Pin & SPI setup - -#define SPI_DRIVER (&SPID2) -#define SPI_PORT GPIOB -#define SCK_PAD 13 -#define MISO_PAD 14 -#define MOSI_PAD 15 - -#define CS_PORT GPIOC -#define RESET_PORT GPIOC -#define DNC_PORT GPIOC -#define CS_PAD 7 // 0 = chip selected -#define RESET_PAD 8 // 0 = reset -#define DNC_PAD 9 // control=0, data=1 - -static SPIConfig spi_cfg = { NULL, CS_PORT, CS_PAD, 0 }; - -static GFXINLINE void init_board(GDisplay *g) { - (void) g; - g->board = 0; - // Maximum speed of SSD1306 is 10Mhz, so set SPI speed less or = to that. - // - // STM32 specific setup - // STM32_PCLK1 is APB1 frequence in hertz. - // STM32_PCLK2 is APB2 frequence in hertz. - // See manual clock diagram to determine APB1 or APB2 for spi in use. - // SPI2 uses APB1 clock on stm32151 - // BR bits divide PCLK as follows - // 000 /2 = 16 MHz - // 001 /4 = 8 MHz - // 010 /8 = 4 MHz - // 011 /16 = 2 MHz - // 100 /32 = 1 MHz - // 101 /64 = 500 kHz - // 110 /128 = 250 kHz - // 111 /256 = 125 kHz - unsigned long spi_clk = STM32_PCLK1 / 2; - unsigned code = 0; - while (spi_clk > 10000000) { - code++; - spi_clk /= 2; - } - spi_cfg.cr1 |= (code << 3); - - if (g->controllerdisplay == 0) { - palSetPadMode(SPI_PORT, SCK_PAD, PAL_MODE_ALTERNATE(5)|PAL_STM32_OTYPE_PUSHPULL|PAL_STM32_OSPEED_MID2); - palSetPadMode(SPI_PORT, MOSI_PAD, PAL_MODE_ALTERNATE(5)|PAL_STM32_OTYPE_PUSHPULL|PAL_STM32_OSPEED_MID2); - palSetPadMode(SPI_PORT, MISO_PAD, PAL_MODE_ALTERNATE(5)); - palSetPadMode(RESET_PORT, RESET_PAD, PAL_MODE_OUTPUT_PUSHPULL); - palSetPadMode(CS_PORT, CS_PAD, PAL_MODE_OUTPUT_PUSHPULL); - palSetPadMode(DNC_PORT, DNC_PAD, PAL_MODE_OUTPUT_PUSHPULL); - palSetPad(CS_PORT, CS_PAD); - palSetPad(RESET_PORT, RESET_PAD); - palClearPad(DNC_PORT, DNC_PAD); - } -} - -static GFXINLINE void post_init_board(GDisplay *g) { - (void) g; -} - - -static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) { - (void) g; - palWritePad(RESET_PORT, RESET_PAD, !state); -} - -static GFXINLINE void acquire_bus(GDisplay *g) { - (void) g; - spiAcquireBus(SPI_DRIVER); - spiStart(SPI_DRIVER, &spi_cfg); - spiSelect(SPI_DRIVER); -} - -static GFXINLINE void release_bus(GDisplay *g) { - (void) g; - spiUnselect(SPI_DRIVER); - spiStop(SPI_DRIVER); - spiReleaseBus(SPI_DRIVER); -} - -static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) { - (void) g; - static uint8_t buf; - palClearPad(DNC_PORT, DNC_PAD); - buf = cmd; - spiSend(SPI_DRIVER, 1, &buf); -} - -static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) { - (void) g; - palSetPad(DNC_PORT, DNC_PAD); - spiSend(SPI_DRIVER, length, data); -} - - -#endif /* _GDISP_LLD_BOARD_H */