From f3f41f4fa8b9aeee7c44c7a04221cfa92a54d026 Mon Sep 17 00:00:00 2001 From: Florian Loeffler Date: Mon, 2 May 2022 20:18:52 +0200 Subject: [PATCH] adds fonts and basic rendering code --- .fblib.c.swp | Bin 20480 -> 0 bytes .fblib.h.swp | Bin 12288 -> 0 bytes .gitignore | 1 + fbdash | Bin 17268 -> 18728 bytes fbdash.c | 40 +++++++++++++ fbfonts.h | 30 ++++++++++ font8x8_basic.h | 152 ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 223 insertions(+) delete mode 100644 .fblib.c.swp delete mode 100644 .fblib.h.swp create mode 100644 fbfonts.h create mode 100644 font8x8_basic.h diff --git a/.fblib.c.swp b/.fblib.c.swp deleted file mode 100644 index a4e571778d273224d9f3ce62c99dd7471d1f6e98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI2ZHydc9l)m|@?NDzKf(hTZtrDZ?%HC*wI$cm_73`%yQ@t@=rOxHyF2aN%rY~3 zy9=orNQfVlM9T+17^9?75}T+Mjo=3p#KeF}i9+HBi5f{NXsH?{CIs>KpO>Az?cN(j zNRye|@1C8R=lRe7`9Ci+&;R)s3!j_Xr?%t@8pkIz?dR+2#UmR@uh+D?DHm5h%Em%= zHF-Z@H}jQZwyb+KQp+snN-GObbEFnXEpX`;X!w=vmK(HJoZmzhdP zEs$CuwLoft)B>pmQVXOONG*_B;IguSU%x_o7mYsxSy&hGQPO)L7oA^0IttC`oFqL` z3#1lEEs$CuwLoft)B>pmQVXOONG*_BAhkehfy=}KdRfyxb&aOI3bOw%K7e;Vu4(^- z3vdR$4_|>C48ytgn)Vue19UhFgK+K!^1^9&3cd?Zz)AQT9EDrpW_XSGg71L^n_(0D z`#Meg6+8-e!AOunE?~J2-Xz2CD05WwYa*3n!Fed4_tpb3rn?df9AvyIj|C)$leoriN5o4Xe?l zSd!nYs7!bMt*S8C5!N0a9#0-#cJ=0*W!gq2E8<#(5!E7XllGpwBdR*0ii61$^LbTt zeBYT@9qC>2M2^T4IU=w3ystdVX&SDYH_K(qSWal5ZMW3Ug}!1N_4=}6U10_S#H*2P4WLj$bHq{;sO>El!qL$mHMpag|LKDi(w%Vo&$!Uwzu;s?J1;;F_ zifLJMCDSb-S@MfPgK|+CW)82RqTHg9BqDT55C0os~#6*>bUGh!GR=%U8EtMXqV3gxhrmd>xf?=zYV>zy-od^sN{#P8yFFEV# zg;A%?w8a2)iP5f(Bw0VSAy9Alb9J+2Sg5vm1oUn5sK>izwdQN0xEzU$i-ys1LM)@w zPsW-@ids^ewToIor`31bjiuLf- zSZal@%2K<_a9Uid!fQWMlGj6FT#;^7O-YA`WtNvrVTSN^qDpNt)X2cgKF%Nt$}>vs z?pI4t!BS0k)li^`G z%`{fnL^{l+Dwj6NrHy03g<_B;e#mlCwr*9Uql<)aWpf`Ps@U*(ffh|)%{#8aD|5bX znI+w)uF_u9dvGOutJvD$)?n_K^Kh;{$tp=4| zTx)5vBpbO}Qfq45Ce0k4x_fp~E<`Wie7;lBWeZkJyW-?zLYT7*yXx0sJE662+!;Lt zHH`(sZHoeiCG{Ai&bDWi8b03)VQaZ;c1-P^nmwXu*4^uYr&yK+)ay2jzD z*~tTkX4S<0BkJ(P^fY3QjH@Q!WYYSWlFu-@fGNF(F4NRqSGWB(_7Mqpo1X8Q$l(^V zwB)Qgb+H%YA?Qd=J|0!kP<#Pa8rDdpai-?`^*i(Vl56PFEcD8G8Y$qk6E};nfLG#(V z?)r11n{qXO-V*UMPQxuR{!l{4mYA%}V6Hk$I(#5UI!u)Hx>S%#?B<);)NOUIWy~A) zL%}G=`f>YIigOZfuj;OIjEONS9|zy(hcsFLKhB!D!dhF_|FXyb3Tylq;g|3Wcn)O! z@4^h+0KZ|q{}P;qZ$cX~umRp+eg86uAK+UcK7dETgJW<6CV_BdEe|)rRq!@GfY;#_ zI1P_M9dy_O!*Cs(N7p~V^Kc3tgBI9OgP<10;vU33w)3k zIFTH|8Z_}#C%+WO;xoB|iwc*%_^CXcCvv6xU|qs(`9G}6k!wG`FFP^D7|xh-EB3?0 zw=RAR9x#^c!DD*FNSWj@Syk>)BYMnsl`Xe>pTpzB?IHvu%J<~cFDvlI_4=@ay%CkUMII7sC?1FCpH(VTwI=d(aR*|gS>6o|7l0nrD9S#*f9!Aw}R5Gex)UEE7(1v zbmE~5_U?M!AT)t!DLz?ATcgo=l=eDCmf9!^9KfsHCR*BCJa5e7#1pUHh(e>-2Q|5C zYR}{>i)@@xVy)3TcCfbIrnX4JRWW=%-&1%Ya74A(%_2*9(hg6Sk`kDT?K9n-^H{$d zcBW%3>4-cyyd3yl7WullmAG&_j?F++;QENlWrH0u)vP&qIWKWTOxFLOVgFk8xn=!- z56N4s@Ba>O!g-MW{|6ug7g*n)hGS5JDvZFD@Ke_CKY=IVBrHG!N^n0+!KYyzoMjz< z2EG8YzR$x3_#^B0=isaG5KKY=-o;1pU-$>S3@^YbI0=t{!~^VuJ+KSzhHK%^?EgOj zUxWu?79=iU0>)tk{z5FkOYmjzVGM4DSFy?O;Vhg1i3@lH9)!SNALPppm zQVU#G7T}Yjb9`t4C&_Mf@JV!0#7G>G5XU0%xwe+Tt59ff;79LyU!f~RUoDp0iQb4s zcP{jmy+R1qVpDYDIbvIMF7%cC!Ny^Az8|Bn>z=ReG$botM#)fnSc?aotjD_I!B|}_ z8I{MYkY6e6SW+Kn+5p>Z|>)V^62(M1`NFPCQmlw@smDN{H_h{-0f9WGG=-u71 zk}JzwjdrUakgHU04FZ?bFK*8j2lWbStzJ$?o3J~+&ykvaLbonqj*unkB?oP;F^Vgg zeFN7M;Xdyvlq-^uL}De<7$d#GV147cx+S&x>l&8Ajq?=o8tsLMtIf+$XCH Y^6Gd98YMuvD6vZ)d`f12ntxVHXE0op{JkfKX^@B!5XjztO0Al8n6be0c*e-um=8D223{N{DH)e zfbuhdnHmiCvIeXHYrqv^9%SHd?+N<WSM5}%sgUPd zJ6f!>*5m#0s)Bd{m>%Sz=3L%wcPch3%pem-JiU9XDtlB{|GVCuM#N*pr1pB}rFM^& zmzpP2d!6gOHZ84`f6O$54AUaw^a7eHj{JkjOI|!Rn@@6oG-C4XY_&GV3FXsk<4~IP z>{M>Fki&cDqT|EOr?=)N66)--LJG{5b0@(!RyRAVgEr#D67A9SG0tT#_yAvYbG^IP zZf*5itDVhGZ=aN=jZSZCeRr2Ow!74#omRKkS?h1My0p{p?riU_d*!~MFtpd{wYU2{ zYHjV)UaQ+hnf+@t7A8@+%MZCElW-EFEEPPWG1Hn!Ga(h16|N(%7N~<;qFR}#jAIKk z_$G2xN>d6r6*-TK^h%w0E-@y1-uLkqU`8DBP>n`P=AP0+KNTUDInVuI;xBtmKjJ*{ zxE%C%=gX(utZqkCz=u8#w^mo7wWmnJHantT)#wwzU`v$x<3CeL%s4 zZn!(tRk;x~$GiiNk*jm#5|a^K?y@`!xYm>MSu$n# F&Yx|JarCpNnny_NFu}< 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 M9Cwt2xW$G419fnj(EtDd diff --git a/fbdash.c b/fbdash.c index 1469ec2..03fba83 100644 --- a/fbdash.c +++ b/fbdash.c @@ -4,6 +4,9 @@ * Adapted by Florian Klemenz for use in the fb_dash project * * Source and all credit goes to + * http://raspberrycompote.blogspot.com/ + * -------------------------------------------------------------------------------------------- + * * http://raspberrycompote.blogspot.ie/2014/03/low-level-graphics-on-raspberry-pi-part_14.html * * Original work by J-P Rosti (a.k.a -rst- and 'Raspberry Compote') @@ -18,6 +21,7 @@ */ #include "fblib.h" +#include "fbfonts.h" // 'global' variables to store screen info char *fbp = 0; @@ -25,6 +29,9 @@ struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; +#define FONTW 8 +#define FONTH 8 + // helper function for drawing - no more need to go mess with // the main function when just want to change what to draw... void draw() { @@ -50,7 +57,40 @@ void draw() { + char *text = "HUHU!"; + int text_length = strlen(text); + int i, x, y; + // see https://www.geeksforgeeks.org/pointer-array-array-pointer/ + //char *fontImg = font8x8_basic; + + for (i = 0; i < text_length; i++) { // each character + int ix = text[i]; + //printf("%c --> %d\n", text[i], ix); + + char *img = font8x8_basic[ix]; + // loop through pixel rows (8 rows with 8 pixels/bits or 1 bytes each) + for (y = 0; y < FONTH; y++) { // each line + + // loop through pixel/bit columns + char row = img[y]; + + for (x = 0; x < FONTW; x++) { // each column + unsigned char mask = 1 << x; + if(row & mask) { + printf("x"); + // plot the pixel + put_pixel(fbp, i * FONTW + x, y, 255, 255, 255); + } + else { + printf(" "); + // leave empty (or maybe plot 'text backgr color') + } + } // end "for x" + printf("\n"); + + } // end "for y" + } // end "for i" } diff --git a/fbfonts.h b/fbfonts.h new file mode 100644 index 0000000..7c54be7 --- /dev/null +++ b/fbfonts.h @@ -0,0 +1,30 @@ +/** + * fbdash.c + * + * Adapted by Florian Klemenz for use in the fb_dash project + * + * Source and all credit goes to + * https://github.com/dhepper/font8x8 + * -------------------------------------------------------------------------------------------- + * + * 8x8 monochrome bitmap fonts for rendering + * Author: Daniel Hepper + * + * License: Public Domain + * + * Based on: + * // Summary: font8x8.h + * // 8x8 monochrome bitmap fonts for rendering + * // + * // Author: + * // Marcel Sondaar + * // International Business Machines (public domain VGA fonts) + * // + * // License: + * // Public Domain + * + * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm + **/ + + +#include "font8x8_basic.h" diff --git a/font8x8_basic.h b/font8x8_basic.h new file mode 100644 index 0000000..125cf16 --- /dev/null +++ b/font8x8_basic.h @@ -0,0 +1,152 @@ +/** + * 8x8 monochrome bitmap fonts for rendering + * Author: Daniel Hepper + * + * License: Public Domain + * + * Based on: + * // Summary: font8x8.h + * // 8x8 monochrome bitmap fonts for rendering + * // + * // Author: + * // Marcel Sondaar + * // International Business Machines (public domain VGA fonts) + * // + * // License: + * // Public Domain + * + * Fetched from: http://dimensionalrift.homelinux.net/combuster/mos3/?p=viewsource&file=/modules/gfx/font8_8.asm + **/ + +// Constant: font8x8_basic +// Contains an 8x8 font map for unicode points U+0000 - U+007F (basic latin) +char font8x8_basic[128][8] = { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019 + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space) + { 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!) + { 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (") + { 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#) + { 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($) + { 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%) + { 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&) + { 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (') + { 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (() + { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ()) + { 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*) + { 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,) + { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.) + { 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/) + { 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0) + { 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1) + { 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2) + { 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3) + { 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4) + { 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5) + { 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6) + { 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7) + { 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8) + { 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:) + { 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (;) + { 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<) + { 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=) + { 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>) + { 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?) + { 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@) + { 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A) + { 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B) + { 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C) + { 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E) + { 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F) + { 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G) + { 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H) + { 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I) + { 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J) + { 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K) + { 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L) + { 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M) + { 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N) + { 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O) + { 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P) + { 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q) + { 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R) + { 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S) + { 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U) + { 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V) + { 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W) + { 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X) + { 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y) + { 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z) + { 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([) + { 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\) + { 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (]) + { 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_) + { 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`) + { 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a) + { 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b) + { 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c) + { 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d) + { 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e) + { 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g) + { 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h) + { 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i) + { 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j) + { 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k) + { 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l) + { 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m) + { 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n) + { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o) + { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p) + { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q) + { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r) + { 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s) + { 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v) + { 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w) + { 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x) + { 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y) + { 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z) + { 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({) + { 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|) + { 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (}) + { 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~) + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F +};