From 5df8c4b739fe66f943e739068f23a64cb97c3c0a Mon Sep 17 00:00:00 2001 From: d0k3 Date: Mon, 15 Jan 2018 01:49:04 +0100 Subject: [PATCH] New, easier to edit font format --- arm9/source/common/ui.c | 50 +++++++++++++++++++------- data/font.pbm | Bin 2591 -> 2006 bytes resources/fonts/font_6x10.pbm | Bin 2591 -> 2006 bytes resources/fonts/font_acorn_8x8.pbm | Bin 2079 -> 2140 bytes resources/fonts/font_gb_7x6.pbm | Bin 1567 -> 1398 bytes resources/fonts/font_original_8x8.pbm | Bin 2079 -> 2101 bytes resources/fonts/font_sheikah_8x8.pbm | Bin 2079 -> 0 bytes resources/fonts/font_zuish_8x8.pbm | Bin 2079 -> 0 bytes 8 files changed, 38 insertions(+), 12 deletions(-) delete mode 100644 resources/fonts/font_sheikah_8x8.pbm delete mode 100644 resources/fonts/font_zuish_8x8.pbm diff --git a/arm9/source/common/ui.c b/arm9/source/common/ui.c index f139d2b..e983b61 100644 --- a/arm9/source/common/ui.c +++ b/arm9/source/common/ui.c @@ -18,11 +18,10 @@ #define STRBUF_SIZE 512 // maximum size of the string buffer #define FONT_MAX_WIDTH 8 #define FONT_MAX_HEIGHT 10 -#define FONT_N_SYMBOLS 256 static u32 font_width = 0; static u32 font_height = 0; -static u8 font_bin[FONT_MAX_HEIGHT * FONT_N_SYMBOLS]; +static u8 font_bin[FONT_MAX_HEIGHT * 256]; u8* GetFontFromPbm(const void* pbm, const u32 pbm_size, u32* w, u32* h) { @@ -68,14 +67,22 @@ u8* GetFontFromPbm(const void* pbm, const u32 pbm_size, u32* w, u32* h) { return NULL; // check sizes - if ((pbm_w > FONT_MAX_WIDTH) || (pbm_h % FONT_N_SYMBOLS) || - ((pbm_h / FONT_N_SYMBOLS) > FONT_MAX_HEIGHT) || - (pbm_h != (pbm_size - p))) - return NULL; + if (pbm_w <= 8) { // 1x256 format + if ((pbm_w > FONT_MAX_WIDTH) || (pbm_h % 256) || + ((pbm_h / 256) > FONT_MAX_HEIGHT) || + (pbm_h != (pbm_size - p))) + return NULL; + } else { // 16x16 format + if ((pbm_w % 16) || (pbm_h % 16) || + ((pbm_w / 16) > FONT_MAX_WIDTH) || + ((pbm_h / 16) > FONT_MAX_HEIGHT) || + ((pbm_h * pbm_w / 8) != (pbm_size - p))) + return NULL; + } // all good if (w) *w = pbm_w; - if (h) *h = pbm_h / FONT_N_SYMBOLS; + if (h) *h = pbm_h; return (u8*) pbm + p; } @@ -94,12 +101,31 @@ bool SetFontFromPbm(const void* pbm, u32 pbm_size) { if (pbm) ptr = GetFontFromPbm(pbm, pbm_size, &w, &h); - if (ptr) { + if (!ptr) { + return false; + } else if (w > 8) { + font_width = w / 16; + font_height = h / 16; + memset(font_bin, 0x00, w * h / 8); + + for (u32 cy = 0; cy < 16; cy++) { + for (u32 row = 0; row < font_height; row++) { + for (u32 cx = 0; cx < 16; cx++) { + u32 bp0 = (cx * font_width) >> 3; + u32 bm0 = (cx * font_width) % 8; + u8 byte = ((ptr[bp0] << bm0) | (ptr[bp0+1] >> (8 - bm0))) & (0xFF << (8 - font_width)); + font_bin[(((cy << 4) + cx) * font_height) + row] = byte; + } + ptr += font_width << 1; + } + } + } else { font_width = w; - font_height = h; - memcpy(font_bin, ptr, h * FONT_N_SYMBOLS); - return true; - } else return false; + font_height = h / 256; + memcpy(font_bin, ptr, h); + } + + return true; } void ClearScreen(u8* screen, int color) diff --git a/data/font.pbm b/data/font.pbm index 88b2267138cc5ff04d0adb5663d43ac74cea7fd0..36c1c93dbf8d1335e4b6d18f3638f5116455a6c1 100644 GIT binary patch literal 2006 zcma)-T}%{L6vxlZPIVa-?%f@`HZk2nAzfnA#foIM(s=K3r$D1*M|LZwF`z=LiC+b5 zFo9&STS5t)3TkZ9q*l^CHhrr}A1vxt6QXO0`qmW4V(lXcgeKic&n$~t8yin1dw=&o zXa0BY$C-^)s2lYihmM};)GIqTm+K!KJKCX#^@AN9$J^fuhd(^jaqz_cHx3*-67D$G z_VK>ME$!jMZg#k%t+h3LWM6wnYa1&2!|sFaYNS%%Tv@I{F0w@<*h&v<{LL2KHV&lZ z;3%1d?9E@qu7qb>laU#?wW(G#q~+jv_od%^1791__dVO{BbRR8+GLSvz5H8>aLgZz zT)*e~WbABFn)as9Fy}dvYyZVn6M2nMUxFxvx!vY1Lvg#%;EGfnJbq$Vf~}3SKA8qP zXMAt#3aJ^do^?>yE}WyWzNp`6-ePM_4w+Q=Ybo^6!b$Y$T<%cI1qLubt!m#Mz`?Dgb0)!B{Ei8$*}d z^`Rcw!f;%d0SEy46SvKW{uHBRR67MT7mNu| zA%~(lE*Yf0uY^#%4A|XzGD$^E3VAtJC?ijH87HqV-@ukAxKAUDlX6@OWC<7$cUSH^ z6_aZ^uleYA4!msb^q&!2qwiTT7c*z5;OlAJl2DiYg8PtR-l>>bBPMAizBFG6&(3lb z!ir^dTbbByliU0Jk$%jL_r8c|30w!ll-5d|d!mf=!3NdT3Xv&Qh-tM}Nc7EfWj=g% zu<`DztH)HafcZg|a{=P|=Xt^%2p|dECNhxZ4&$O4+Q35i%Y6dxNVa=lcDUa$GI$M? zr!1~)QAsVpgOt2bJ&wOqM#to3GqAjkG8!MkF z9^dyV618F24qXIuw|LCY=>Dtr?C|A3e*n~{>o1cHr&di?VZQ%r|LpKje-$aY{C+ar zkCV&!<66B4 zhd{*zBy78T+QZk@Lz*eFZ!=6V!r30y}qqKD{Wuw8NqKXMEl8$bF;hp zOM4CHN4jvAGrizROB%zSjcB!?(XAy-WbT5gy<<$#x)QaZBx%moB^n0nG?kVlBU)V| zPLWGXlGOKEe2Q*uQM+zb8-HAnc*fkqRoo%+@igNH9AKXf5S3Rms0As;AdBU~y|p06 zKCz|gKEl?PGugUkyL!!4nAE_76O;+_0&_X*9?P}vx7TA!vkqbM660_botI;&nz8o} Db<5I9 literal 2591 zcmY*bEsyI)6dhn-triRjFbEi_1_lpURr+LLFkrxd00V=71$k{&t<*dzsusA?z<|Q{ zGx`JaGxjGG6fRisU_e06xp(YrZ+0ig=g$3@J9owzHV;3zU;cRh^74FeKmX~ze);|R z^y}A$&+f;cKDQ6%F4Ot-{Cb%{Ot;JJ@=9cylsYSOY&WB>J05LE5?oSb+NmXTyWQXg z7{ZhHD93g@NG)tTAVE&;LIJ-SRfTBFs)?yA zp-p}&l&hT2yOrRPtJ8hM)+y?XvIQ~*K^Yg)w)jIW5wsL1QQC(SB|6MDh^K!8MS}SY|gU=P!w(EP-qy!?t>(D$^E%2`q1Oi``sZNcA`LrvW}wIY{M442I)fb zocDfJw&-As6-$2BFf`Yp$l5)$aX3l+s8g*mzv1wWbZih;Y_(dn74EQ;3Tli( zI4=wiE($n-(NrF3z`Es3fuw%MFoYf}Dd0RW^vD^Vp#97qMcGgjCZ~fulNS>==6XrD zfkJ)QVNf@7TwDdYLbfq;O&0{`nXBq*)`}l`p+&Clf^ebSxfZD)W6aA4+Kj?-0@{dX zle1v&-Hu*drGfj_55qJJPvV7L$qF!)orWu&WQ)y|wR^ZpVbUU;<*yrtUc zPpAubCNwEuI;VJwPqO>kIeTMREA2X6hQ?51}!`JRpGo@m9fxCZ~OT82;y&Rwzs$LNwvcG5H&3^a1d zadTFD>X&&pLG*l2e<_C1Rq}U(ig*(E?;`6(M3IA;4SoWk!>T&O7{bn@Spp9=00i$} z*}qiV($-119u}=2fcPRa6Eef?gWn|RT)FiC;D~2SPD;byC6%l27OKRy!;M6(DS$c; z(0ku`xmm?RZ$cJQDyXk+W`Ii@_YH0F&HDrhC+h#Q2Wj!*lyV!~TXJ=^bLPME$!jMZg#k%t+h3LWM6wnYa1&2!|sFaYNS%%Tv@I{F0w@<*h&v<{LL2KHV&lZ z;3%1d?9E@qu7qb>laU#?wW(G#q~+jv_od%^1791__dVO{BbRR8+GLSvz5H8>aLgZz zT)*e~WbABFn)as9Fy}dvYyZVn6M2nMUxFxvx!vY1Lvg#%;EGfnJbq$Vf~}3SKA8qP zXMAt#3aJ^do^?>yE}WyWzNp`6-ePM_4w+Q=Ybo^6!b$Y$T<%cI1qLubt!m#Mz`?Dgb0)!B{Ei8$*}d z^`Rcw!f;%d0SEy46SvKW{uHBRR67MT7mNu| zA%~(lE*Yf0uY^#%4A|XzGD$^E3VAtJC?ijH87HqV-@ukAxKAUDlX6@OWC<7$cUSH^ z6_aZ^uleYA4!msb^q&!2qwiTT7c*z5;OlAJl2DiYg8PtR-l>>bBPMAizBFG6&(3lb z!ir^dTbbByliU0Jk$%jL_r8c|30w!ll-5d|d!mf=!3NdT3Xv&Qh-tM}Nc7EfWj=g% zu<`DztH)HafcZg|a{=P|=Xt^%2p|dECNhxZ4&$O4+Q35i%Y6dxNVa=lcDUa$GI$M? zr!1~)QAsVpgOt2bJ&wOqM#to3GqAjkG8!MkF z9^dyV618F24qXIuw|LCY=>Dtr?C|A3e*n~{>o1cHr&di?VZQ%r|LpKje-$aY{C+ar zkCV&!<66B4 zhd{*zBy78T+QZk@Lz*eFZ!=6V!r30y}qqKD{Wuw8NqKXMEl8$bF;hp zOM4CHN4jvAGrizROB%zSjcB!?(XAy-WbT5gy<<$#x)QaZBx%moB^n0nG?kVlBU)V| zPLWGXlGOKEe2Q*uQM+zb8-HAnc*fkqRoo%+@igNH9AKXf5S3Rms0As;AdBU~y|p06 zKCz|gKEl?PGugUkyL!!4nAE_76O;+_0&_X*9?P}vx7TA!vkqbM660_botI;&nz8o} Db<5I9 literal 2591 zcmY*bEsyI)6dhn-triRjFbEi_1_lpURr+LLFkrxd00V=71$k{&t<*dzsusA?z<|Q{ zGx`JaGxjGG6fRisU_e06xp(YrZ+0ig=g$3@J9owzHV;3zU;cRh^74FeKmX~ze);|R z^y}A$&+f;cKDQ6%F4Ot-{Cb%{Ot;JJ@=9cylsYSOY&WB>J05LE5?oSb+NmXTyWQXg z7{ZhHD93g@NG)tTAVE&;LIJ-SRfTBFs)?yA zp-p}&l&hT2yOrRPtJ8hM)+y?XvIQ~*K^Yg)w)jIW5wsL1QQC(SB|6MDh^K!8MS}SY|gU=P!w(EP-qy!?t>(D$^E%2`q1Oi``sZNcA`LrvW}wIY{M442I)fb zocDfJw&-As6-$2BFf`Yp$l5)$aX3l+s8g*mzv1wWbZih;Y_(dn74EQ;3Tli( zI4=wiE($n-(NrF3z`Es3fuw%MFoYf}Dd0RW^vD^Vp#97qMcGgjCZ~fulNS>==6XrD zfkJ)QVNf@7TwDdYLbfq;O&0{`nXBq*)`}l`p+&Clf^ebSxfZD)W6aA4+Kj?-0@{dX zle1v&-Hu*drGfj_55qJJPvV7L$qF!)orWu&WQ)y|wR^ZpVbUU;<*yrtUc zPpAubCNwEuI;VJwPqO>kIeTMREA2X6hQ?51}!`JRpGo@m9fxCZ~OT82;y&Rwzs$LNwvcG5H&3^a1d zadTFD>X&&pLG*l2e<_C1Rq}U(ig*(E?;`6(M3IA;4SoWk!>T&O7{bn@Spp9=00i$} z*}qiV($-119u}=2fcPRa6Eef?gWn|RT)FiC;D~2SPD;byC6%l27OKRy!;M6(DS$c; z(0ku`xmm?RZ$cJQDyXk+W`Ii@_YH0F&HDrhC+h#Q2Wj!*lyV!~TXJ=^bLP}L8}#v)-4Cb0SPYLUmH3}>#Y+du4{?qS={&+ z`Uh~~f2d?BlHp*9Ya|DWQ*uG5M~lNQ-#ojevRx@9NQT)a`W-N2BA@k9)m?2cyHs_deJ^dej>oos936-<^?%(e{ zx_dghe}bKRJu^Jry7gh+#czv3D7R^w8fse7pE7;l)H&zW$k{dB+h5X;&+1AlzS5^H z?N7zz^;IorpFaCe)BP)Yc2-quyb!}rukw7Yzu@Bo)8F1^@XOgEJilDR9}$6{nhF0t zV_b<8c9S_$(h0bY5*}~kxC}e(NL)0S5d6ed$>zV z|3r1D>eXX|lZl^>^B@h@JON4SV2$Xo9LhAAE+oKc~0iTy8KLIB2S(Ea1)R1N>Q|I`;5p^*H7m1nk8y8jnTL z_byeLN|8qFov+#jXX-E}& z79bv^ykP(C6kO(B4=esls(yU7%ODMNw*K2H@J;#G^Uyzleo;7)>w)Jli@r|(XG*ZL ztldVaw{OEMg66Vx896tb(cWUMx0^u(Ig-yY(V7|l@^fD771-19ZW}$jW7uk@Ln1`o z+QKt3w@@(IbiKuUi*@?(+IkDO_rCtk>IMTF9i|_Cdh#zEXUgeG5OB!rJ${tH{?s3jcZo&3Djyn!3iPKUJF$nn21Wu7*?>O_5<0P1v98{(#U z-hw+YARPqt|FG0lBg&BHH^}WGk~z(Z#ux&|OS>BDtoC8=Lgw=%1V6thXJvZ6$6C*e z!XC97qYZy#0y#|hoG)-IBdZ>P literal 2079 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 literal 2079 zcmYLKKWpSx5FcD@4kKg{!tscWy*MsXio@)^LY#v+LW&eAE{#c{bI!_<=wLaHjgq`5 z_EuNi2e2D=NfGiD90U$x3t?P|g*9eLv2M(=T;bb7Jmoj{r{% zpR~VydGPer!L#=MPwf{^e>muV_hMPLANbpHnHorsem^=pIZD%dRG;6}X{@zY(j!kQ zgM&cSHzF|f)RWK>U=h{z%{k<23ZmWJD4_cMt`S_5Q+(-J6y9BFyVh@I)7DW`%Z==!Zm(^8T+mw$V z%hz2#ZknbGxs>Gr#2?lp;b;el{7{EJOJ`Z8fwp$*-7R1ah-n)h78W=fSfO}}g^1!< zrm+F4y5k-FuJKq;1zm&;E@iX~e+sFw&3`1WKUV$~_f;xz><@=Ry{PWrfS4P2n zd|GNb5YI?mT;EM5iiAvHASIQz*1EZ79JF#pYe8ISXPtCbwU}0UR^`AthdvxA5KQBf z@;nnZCDM-!SMJ^PWSem>PD?B|oa>kDA$1B`tYT6=kU ztyEZi>B)y=L0knpvdDg+U9~rH<@$T z_=)ne)G_$TfC&lP%9#^Y$Nsa5TvVeFF876b$G(qx8B^~HDh!+mQ)hh5qFXffUC+j; z`qJd1pe8S##faVT`Ft7lRNu<;jdFg*jegYR19nVa#-7DS4)-r5k8%UJbo9>$)<=G=&zyTHm@EL3?}D%?sO&ce4>XiE&CRM5Pb z|5IESEq7I*UWQ$_iOX%y$MLfrx3M1`+xv=+P2rMsf^BXk8OM@vedwW(V{t%f8YZ%i}}p5{0+lrdk^{3 zdFbyLy&d1u?~FWay=(TF&otZVblw?0d$V+>!`SRE{29GYhwbtyHq5^D%gdc+zXs-0 zEzY}$i_cv*!1BDDHL%hE^LUTwRWZ2gVIB^PJiq!(@AKS1|1G7rar_159r^}y55x0v zFz5nv-OUd{4~6hZda5iH{#48yG;=hMKb=yrDbUafRrWn8UYmfHK3M Q7+~gSJX8Pyz^?fFAFvn1NB{r; diff --git a/resources/fonts/font_sheikah_8x8.pbm b/resources/fonts/font_sheikah_8x8.pbm deleted file mode 100644 index 9bbb62e6a935d6c3e4acce063835f9ea14584b01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2079 zcmds2L2Khy5FUJR7b6rA%JOKI#-urzo+9mJ-DrS#B458KPqgEnncXtiLLC3V|Z z)zN7WJ%pS#7ZVm*iYWO3h6F*1@Ii!}g27=iJv0!42tFhx1gYOV$^8)>`FY;Vd^7Xj z)6CQ7D~%7DU%l9P_HyIv=K2rK=g+>|Xn*s(VK+ZASL_B=6m0#rb+Ee?1jVR0Ixhl0 z&vR)TWY|)1#}UQ3aFm=GHoOE>L`89a1bjh`x3=avR2=Od9PAzybMMUkoTh2V@jTBF zfw-qN8uvO^B;I}R{)@l$2gVaSv!58$9Z&P=xJxztQT|A;A?j1{6oKL9dF0VAqtWQ6 zg#~)BWIujvziRVxgCLmU0>*=g|JaX&mTO>Sy18pII*#KUYAJ2d2t!~FoKrX+Os08f zs{A}Rn!Q>r?{+7YhavJzs8-hik7)uq412UQKR*G4AYgUi+uOZvH>b(`Jevs4J8bW5 zZ?lQ=T8&LWs*r4F6LN9B*)W=%#S|J8f%>t)>+BiEj$uqlhP~f=T}g*;qBnh{j#?Q4 z_9<&+AqMi?HZB^s)Ne(l9AXwJOvL(#(NRQM6t$vOA8{@k5$mHU#Gu2y{XL-ZWG!In z;zM|G9z=_xKJ`O>AVbUe47v<)GNsSh&e;go@Rs9*hkFXg-tYq!E6NZT+CTOwuU$m@ z-JCjjEw0<4m^WOnQHKjebnyE91cx!B!ffK*g8py&*HMi^=-d}-j7?LR=9o6ms;%=u zBss|>juR=`DWO}_P0|gStwIrq5!HfA-~W{Ib@a_TpImS<7_`B;?xtPHLm>>Z4S9Mh@lioDsrp3q z__&XpB_Z+o1K!)+pj(9C0zBbm-6_T|$S8TVJ8QfCwQ~)2~-s zLkXsM&=hCzAZQ2CDWkyRz~#_z7*B`5MhFk~Vh-U!7RKE5_rC9x=1F(I@4feX?|uL8 z>(#kWs^2}^eDZwr`|8Fo)u&H>+N}TZbk44RX06(DR7kM>*Y?5Qb`azz`Qb$#_*s@o z+a%ML3LQt}7s63`YTAerFcIbX#Uc1PIo|rZ=TLsQcW|(Gn9qMO|63f#4af65M+D-I zF*kRoF(&cR$9JEdRqmOO?9_f_($;92O-EZ)syxUZR7%MDSUg5zgn1r$^!v%l$*&6w zbZ^;y_|Se;=k5kUFyjTxhY-Iwj)ajJ0J7Z7wU`}-VFp-P&(~LgJRsKf@X*l0qd^w( zSC~ZP`x$;dnetfPy)}uve+IQ5W3s=p8%Oa=vdpUD3Cnd|OAsD`Hh50%cyL+Pt)=R7 zTaj;7fO=U}DjT4Olr>p0%37_K!e(>7Kv-aJHm?f5Mks~X9TXNCLOhyftV=KkONTat#uqx5Jv#I!_7G?`G6MA!kS4;e$BK>q0U*q=se3N)Dj z44DaB94-PUlQD-tFLMi+go(1Br{~Bs93sE6bEO12qTb`D$X@s(Q`w`WtZ-c9n;};m zs=A@_CuLnH8bYXnWpUjGg*@PLi5k2?L<7t3NB^$_FqvNutQ^|SZ+ zr3~2%e>YXUZs$hfZjo<>O;qIkXYHQycW!i@Zo3V81-ns*3ZD!0j4Vr7)`(u57Nh5h zh%%B<7)DamW5Q{TUr@!AQ5H(<3)_&;V`?ZInHnuiBasY4#L1@SN65r+qaxlT8>Jo2 zqi|$uRJNI{J6=^GV7NCheU}Rck63Ymf;ZE|e*p*(YVT&jj8=pOkra+0H1CWy--2 zomYq@w7EpCthm!zfh^%+6WdwW_9bQKeE0cPyKk+jxHU`b*NV?k*M*<$taF}P?ONHn zn$~MIM&+N?Q*pH#=jC23DZj4E&9%ax1G!hT{?5k5{mu(vJ~zjO%ooBo_7Odg`=>8( z9}eOuI{iG`;Co|CR0=MA|4Yg?aBenu=7QsXzYgSmH{F6h5W*zelu07-QNdwS`xCpz z|1>3MSx9{T!1wm{_