From eb07e7e5640551d5c55b35c911da9f4d677191b5 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 22 Apr 2026 13:45:06 +0200 Subject: [PATCH] feat(fonts): deinterlace GIF i font ari-w9500 per placeholders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix: gif.cpp no desfeia l'interlace, trinxava qualsevol GIF entrellaçat (tota la sortida de Pillow). Afegeix Defaults::UI::Font per centralitzar noms/rutes i mou data/font → data/fonts. Co-Authored-By: Claude Opus 4.7 (1M context) --- data/{font => fonts}/8bithud.fnt | 0 data/{font => fonts}/8bithud.gif | Bin data/fonts/ari-w9500-bold.fnt | 132 +++++++++++++++++++++ data/fonts/ari-w9500-bold.gif | Bin 0 -> 2303 bytes data/fonts/ari-w9500-condensed-bold.fnt | 132 +++++++++++++++++++++ data/fonts/ari-w9500-condensed-bold.gif | Bin 0 -> 2232 bytes data/fonts/ari-w9500-condensed-display.fnt | 132 +++++++++++++++++++++ data/fonts/ari-w9500-condensed-display.gif | Bin 0 -> 2320 bytes data/fonts/ari-w9500-condensed.fnt | 132 +++++++++++++++++++++ data/fonts/ari-w9500-condensed.gif | Bin 0 -> 2019 bytes data/fonts/ari-w9500-display.fnt | 132 +++++++++++++++++++++ data/fonts/ari-w9500-display.gif | Bin 0 -> 2366 bytes data/fonts/ari-w9500.fnt | 132 +++++++++++++++++++++ data/fonts/ari-w9500.gif | Bin 0 -> 2197 bytes source/core/rendering/gif.cpp | 27 ++++- source/core/system/director.cpp | 34 ++++-- source/utils/defaults.hpp | 18 +++ source/utils/defines.hpp | 2 +- 18 files changed, 859 insertions(+), 14 deletions(-) rename data/{font => fonts}/8bithud.fnt (100%) rename data/{font => fonts}/8bithud.gif (100%) create mode 100644 data/fonts/ari-w9500-bold.fnt create mode 100644 data/fonts/ari-w9500-bold.gif create mode 100644 data/fonts/ari-w9500-condensed-bold.fnt create mode 100644 data/fonts/ari-w9500-condensed-bold.gif create mode 100644 data/fonts/ari-w9500-condensed-display.fnt create mode 100644 data/fonts/ari-w9500-condensed-display.gif create mode 100644 data/fonts/ari-w9500-condensed.fnt create mode 100644 data/fonts/ari-w9500-condensed.gif create mode 100644 data/fonts/ari-w9500-display.fnt create mode 100644 data/fonts/ari-w9500-display.gif create mode 100644 data/fonts/ari-w9500.fnt create mode 100644 data/fonts/ari-w9500.gif diff --git a/data/font/8bithud.fnt b/data/fonts/8bithud.fnt similarity index 100% rename from data/font/8bithud.fnt rename to data/fonts/8bithud.fnt diff --git a/data/font/8bithud.gif b/data/fonts/8bithud.gif similarity index 100% rename from data/font/8bithud.gif rename to data/fonts/8bithud.gif diff --git a/data/fonts/ari-w9500-bold.fnt b/data/fonts/ari-w9500-bold.fnt new file mode 100644 index 0000000..066e489 --- /dev/null +++ b/data/fonts/ari-w9500-bold.fnt @@ -0,0 +1,132 @@ +# Font: ari-w9500-bold — generado desde ari-w9500-bold.ttf size 11 +# Generado con tools/font_gen/font_gen.py + +box_width 13 +box_height 11 +columns 15 + +# codepoint_decimal ancho_visual +32 3 # U+0020 +33 3 # ! +34 6 # " +35 9 # # +36 7 # $ +37 12 # % +38 8 # & +39 3 # ' +40 5 # ( +41 5 # ) +42 5 # * +43 7 # + +44 3 # , +45 5 # - +46 3 # . +47 6 # / +48 7 # 0 +49 6 # 1 +50 7 # 2 +51 7 # 3 +52 7 # 4 +53 7 # 5 +54 7 # 6 +55 7 # 7 +56 7 # 8 +57 7 # 9 +58 3 # : +59 3 # ; +60 7 # < +61 7 # = +62 7 # > +63 7 # ? +64 13 # @ +65 9 # A +66 8 # B +67 8 # C +68 8 # D +69 7 # E +70 7 # F +71 8 # G +72 8 # H +73 3 # I +74 6 # J +75 8 # K +76 7 # L +77 10 # M +78 9 # N +79 9 # O +80 8 # P +81 9 # Q +82 8 # R +83 8 # S +84 7 # T +85 8 # U +86 8 # V +87 11 # W +88 9 # X +89 9 # Y +90 9 # Z +91 5 # [ +92 6 # \ +93 5 # ] +94 6 # ^ +95 7 # _ +96 4 # ` +97 7 # a +98 7 # b +99 7 # c +100 7 # d +101 7 # e +102 5 # f +103 7 # g +104 7 # h +105 3 # i +106 3 # j +107 7 # k +108 3 # l +109 9 # m +110 7 # n +111 7 # o +112 7 # p +113 7 # q +114 5 # r +115 6 # s +116 5 # t +117 7 # u +118 7 # v +119 9 # w +120 7 # x +121 7 # y +122 7 # z +123 6 # { +124 3 # | +125 6 # } +126 8 # ~ +192 9 # À +193 9 # Á +200 7 # È +201 7 # É +204 3 # Ì +205 3 # Í +210 9 # Ò +211 9 # Ó +217 8 # Ù +218 8 # Ú +209 9 # Ñ +199 8 # Ç +224 7 # à +225 7 # á +232 7 # è +233 7 # é +236 3 # ì +237 4 # í +242 7 # ò +243 7 # ó +249 7 # ù +250 7 # ú +241 7 # ñ +231 7 # ç +161 3 # ¡ +191 6 # ¿ +171 9 # « +187 9 # » +183 3 # · diff --git a/data/fonts/ari-w9500-bold.gif b/data/fonts/ari-w9500-bold.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ca1fc68964ffb36cfd9026dbac6b9505b24b44a GIT binary patch literal 2303 zcmeH{{XY|k1IOLPhHjJcyzRD$ ziDg3;IWWuXd6g{1OTN~Q9D z`LF#;;Qx*Q_-o^@TX0cRs(hnn=y5wLQ)QQq@y=$ucTaOPHH-@xcHg^Y=@=b5&lo%i zCF#3fTkzo4iztUpis8Zdy1rXB=GXce+Lt}bPB?SNnB1m-0fDx<>r<-roF}KEr;$zk}(n$AGF3! zNZ#VtKTZnoE1L#RwZ0Lu1$ACs{Htkw=(p~Rh7)FMBdb-GjgpAR|GkN!HCp;<*ZPXf zJGE6u(5s@{$eZ2rVIXSBG>~$!PqrGGT^*k`MglDE2IlPssTn1;L^m4eyNKK(@|t^B zr*3F>KMyUM6tsnhWkZCZF|=$v51`~uDGf_z+~e8G;Qkw1<(U;HW4|G$8l&2 z>QID5rPth)TjI}JpfFh}0a1WyRi|~%ch#cV_VKgMA`E>x>v2SjZ9W*qo03&>*qh`6 z76q>tCJ)Di;FkL!8K-H_>{O{1kHCw0NRE8h+a$Ird4yHhf!tUULw6KBWPRsZV8b~2 z9T6v54-T>tPab=5Ogan-59kWr6i3vqtpVQAoLHlFLbH8^Ywd}V{hve{-zxRjicyqK z_Q)`z@W3tm7iZQPQRfUBr(Eu(+q_-k+c-{=oF1*b;k#>ggp;SiPW;%3Gm6;+_gTw1 z_D4hFd^3U2JZ?6s&?l2^uOSzbE}aUMyIF1yJ@2{szH>U8R=l~?3T3eAUa#Zg(#4f} zs4LQdM!DbJKH!$W^twJ|rl=&wxBN=EI-=tvw;$;X;kZhVA_`a(KwnAfc^@xZ0_;b(`Q)*zr>a^?=Do_aOa! z6?S;7^x~f7hO>K;7U7B9h7z_B4+AbA%Cm0nNJgM%n0WH5QI0P`0*`9xz+M=2KAC`w!<%Te87yT#4 z^jeUJ@ib?Ia|?Cmd(~5Zy#~0$_|0=+w>SKFa6t=vSAFg7tMxtmAsig~P zzG4!%WQYrNhAM3ANQOw2&T>=E-l8~tJ_;nwZBrj-VI5!817ny~2i<)j8ix!%r-)$E zrT(;M8dTX7-F5G;pOEOD$n~1*QR;8@6jwJ(L(RD+3UA@=F| zRC5r;nY~CEkPjACIW%kOGJ|{q-}E{;IwTFuqk2zv#U6>{)=iIC*uzGkNo%b;)zwr^ F{{xsq266xZ literal 0 HcmV?d00001 diff --git a/data/fonts/ari-w9500-condensed-bold.fnt b/data/fonts/ari-w9500-condensed-bold.fnt new file mode 100644 index 0000000..178b56b --- /dev/null +++ b/data/fonts/ari-w9500-condensed-bold.fnt @@ -0,0 +1,132 @@ +# Font: ari-w9500-condensed-bold — generado desde ari-w9500-condensed-bold.ttf size 11 +# Generado con tools/font_gen/font_gen.py + +box_width 12 +box_height 11 +columns 15 + +# codepoint_decimal ancho_visual +32 2 # U+0020 +33 3 # ! +34 6 # " +35 9 # # +36 6 # $ +37 10 # % +38 7 # & +39 3 # ' +40 5 # ( +41 5 # ) +42 5 # * +43 7 # + +44 3 # , +45 5 # - +46 3 # . +47 5 # / +48 6 # 0 +49 5 # 1 +50 6 # 2 +51 6 # 3 +52 6 # 4 +53 6 # 5 +54 6 # 6 +55 6 # 7 +56 6 # 8 +57 6 # 9 +58 3 # : +59 3 # ; +60 7 # < +61 7 # = +62 7 # > +63 6 # ? +64 12 # @ +65 8 # A +66 7 # B +67 7 # C +68 7 # D +69 6 # E +70 6 # F +71 7 # G +72 7 # H +73 3 # I +74 6 # J +75 7 # K +76 7 # L +77 8 # M +78 8 # N +79 8 # O +80 7 # P +81 8 # Q +82 7 # R +83 7 # S +84 7 # T +85 7 # U +86 7 # V +87 9 # W +88 7 # X +89 7 # Y +90 7 # Z +91 5 # [ +92 5 # \ +93 5 # ] +94 6 # ^ +95 6 # _ +96 4 # ` +97 6 # a +98 6 # b +99 6 # c +100 6 # d +101 6 # e +102 5 # f +103 6 # g +104 6 # h +105 3 # i +106 3 # j +107 6 # k +108 3 # l +109 8 # m +110 6 # n +111 6 # o +112 6 # p +113 6 # q +114 5 # r +115 6 # s +116 5 # t +117 6 # u +118 6 # v +119 8 # w +120 6 # x +121 6 # y +122 6 # z +123 6 # { +124 3 # | +125 6 # } +126 8 # ~ +192 8 # À +193 8 # Á +200 6 # È +201 6 # É +204 3 # Ì +205 3 # Í +210 8 # Ò +211 8 # Ó +217 7 # Ù +218 7 # Ú +209 8 # Ñ +199 7 # Ç +224 6 # à +225 6 # á +232 6 # è +233 6 # é +236 3 # ì +237 4 # í +242 6 # ò +243 6 # ó +249 6 # ù +250 6 # ú +241 6 # ñ +231 6 # ç +161 3 # ¡ +191 6 # ¿ +171 9 # « +187 9 # » +183 3 # · diff --git a/data/fonts/ari-w9500-condensed-bold.gif b/data/fonts/ari-w9500-condensed-bold.gif new file mode 100644 index 0000000000000000000000000000000000000000..63c81c57ebe75ae9452a76cbb7ed2e91e8621955 GIT binary patch literal 2232 zcmeH``8yK~0LRxuq8!m%G9n2xS5ca?_i-efRPK9nk4UdkJ5UPEM$4JGhqag^_PEKB z+R(IVb00Zk5~bH1FYSGL|Bbir58v<4pU?ArZSAf=F5RL70stw1Ul9t0|LyPkZQy@r zK<5|nuP^*5E(9D9SGpSI_W*G4h_YzixzesADG6okWumGLUP2Ar?k-zqm8N1Gt7KPS z&U|+II@J0(hs?+pv$4b?>VxdFAu1ea#E;;YN;;dD5H8nfbB>jA&Q#nBf>U)<1iuo-Bqo@k27-~HS8Cc?4aaUH#yIuhxUZ{E@` zsofOzsSGvWcyU0k%9lV;fhDg(4CZ>1kB3j&Z|E!yl^ieLRBAQt z>9vqF@Q>)JYcu#d@sa<9*m+yS9VZe|bux8#z%W`Y>NWYM>-bI47ftIl^P@~C7VK2xmdF6xx+ ztssc>$wI=>dbd0j+T*^O*D_-1Q|i^C=J|{>a-*|}iTrzKodrptnQU^B`Yoc-E_I#= zHR7uij5Br?ubp@0`(^q2^MkSQv=N}Kr6WV#%1pp0FT!-%EfjQ}Iw(tWY8+caBzW>Q zu|4b&?`JmgCn+!{A{2xQtUys6TDb}#<(a`yGBsqwt}?IG0;EwgWz$z_-BBuZ(~2T+ zQCzqe5EouqU_wz2dcj)Oj+GlHspR#cS8i47rH`(9H;wgcRlkzX4}9DX9iY^;Om70= zfSet8P1;&&buKUhHbN~%PmE@+QFtX)7fAp3dlp)l=8^FNOi)1~o1y&zGVsPu#&&7-5$m z#~JLMrWnC68L#|~o2fv#oG{&5v1II8^H3t`?<$=#Fzth`h?0KRg?TQbL)VD_;+p&K z(R&;uv^Rdm-K}9k?hP-kfs}=Hsx9u`rGEOGBbNevIQ* z+Wl9&)Mzg3%Q8Tn*$5#5@l|2iVw-|X*Wi!F7OeY!nU3+=o{qmX_@XMd-wz^-|)8`8S_;=I} z9M$Lz*hL_o(ol&QGB^Mo_(^lk72N?R+L{*ceGGanD2#|@m`cY>GP?7PZ-fav<=GoX zjS>zz(3w_7rXR1VCx+lXmFgiOGTJ6BO^lWxT^kdU4t4rQyo-cnIpR1mJsO;+x3}=6 zM~@>lYh2h#rnkw1MlY;|*uI!YiEea`;afGm_m7NwW|LVU>Prc&Cp>(9VphuKLync6 zOpe<)g<%Vpt+ovP7_hNz)hF{;c+zG2z#K^h%TM3&DXHl4Z@wc|?s;p5fljQ+Jy7>G zmiU9=s&eFHQx{xU|FMq!BL4;iDiX=Y)J;wu@$u-V9ngG3nTy8jbY%(j>L%ZW>cLRqw<}6_pqT}=3&mzyE1a% +63 7 # ? +64 12 # @ +65 8 # A +66 7 # B +67 8 # C +68 8 # D +69 7 # E +70 7 # F +71 8 # G +72 7 # H +73 3 # I +74 6 # J +75 8 # K +76 7 # L +77 9 # M +78 8 # N +79 9 # O +80 7 # P +81 9 # Q +82 7 # R +83 7 # S +84 7 # T +85 7 # U +86 7 # V +87 10 # W +88 8 # X +89 7 # Y +90 8 # Z +91 5 # [ +92 6 # \ +93 5 # ] +94 6 # ^ +95 7 # _ +96 5 # ` +97 7 # a +98 7 # b +99 7 # c +100 7 # d +101 7 # e +102 6 # f +103 7 # g +104 7 # h +105 3 # i +106 3 # j +107 7 # k +108 3 # l +109 9 # m +110 7 # n +111 7 # o +112 7 # p +113 7 # q +114 6 # r +115 6 # s +116 6 # t +117 7 # u +118 7 # v +119 8 # w +120 7 # x +121 7 # y +122 7 # z +123 6 # { +124 3 # | +125 6 # } +126 8 # ~ +192 8 # À +193 8 # Á +200 7 # È +201 7 # É +204 3 # Ì +205 3 # Í +210 9 # Ò +211 9 # Ó +217 7 # Ù +218 7 # Ú +209 8 # Ñ +199 8 # Ç +224 7 # à +225 7 # á +232 7 # è +233 7 # é +236 4 # ì +237 3 # í +242 7 # ò +243 7 # ó +249 7 # ù +250 7 # ú +241 7 # ñ +231 7 # ç +161 3 # ¡ +191 7 # ¿ +171 10 # « +187 10 # » +183 3 # · diff --git a/data/fonts/ari-w9500-condensed-display.gif b/data/fonts/ari-w9500-condensed-display.gif new file mode 100644 index 0000000000000000000000000000000000000000..b293b0d78ca36c9b1d183942deb1a78e02405984 GIT binary patch literal 2320 zcmeH{{XY{30LGol$6Jo2V&uH;Fe*9;D|O!OtlYfR@-or9Y@)c!u}aHmNlx2nZ{~e7 z7FiUc7nuynTizGOm>sdaoR_n^?%%k3et4drpYP}MJRV-|C+x$XDugR!D14P%F8??G zxBm(J=LlGRZTxi$r1wH)^7^wGfUE`0E|Hq>U7C+k0=cpLFC|yhy<4@B{VGql=YFWBSp) zO>V6XO=!5uBrj%J@p$KPn{d36spegUEq_6mOu6tMV zY|r2We^D*{`jbn~kO@xw?Yx9ej$Px=JL4Bv^Ub&FN17RRS4A_iyT0Ueut#MAE)V@l zh&ZwSd7`CJo-So1Ox0&vXo9(Tn2Fo4uFoZC7?`7IX`9z) zvCE9#kO?k;`pdcd4p@fcuD=eTy9ZCru~UzFQxPooatSJHoH00=hlEi+aVl{RtTcqX z9AV11`SS*qyFKiQX3~UtU`|ubx+N;f#%Pe9vI=Y5p=WRx)eYjOx?{X!HQziTet!i37UNPr#|BTe|E(s+rrep?y zj?_L1b3j!^!NBYqX~Pzmr5%Vd@IObPN-~u_^mU5LFA3(z)O$|m=q+1^Bfl(A>2amj zO!ZIvfL_esRm&ri>Z$ zURpDzy6zSSRd=4h2Ci-JsiI#S-<;-zbLq+i=fMUG z$W&^Q;TnJXl^@nZK(8wXTFnb4kAuZ^W^o}Ky%XK~I|WfY<5)&#qfgnNU%K6}TUISP zBSqZJ~+|~0H!9n6P zpcXW!on~75C zz?;=+Iq=aPPjiY!jOHC};>Ej$$~MCBw#=Jq1)9YEs>*HfE%C!cuYdOgHCTJPUGfXf z1=-g?H$bqpt->W(gr0T!hipK^qiJf?cdC!iVZJdbs#~*nfxOWms7!~(eN=9n$G>;S zxK2)_CwXXiS-8!rQeLhV>5ft~Gubcb zA~b#a*z8vFyMi;o$0YA|Q$3khc>jF6ASXXwUWPiV-i9)i)5%ZE|M4h$pKMs z1|EAw&`ydt;DZOQvQ+J)n%Uv+=#Bx@%X=)`S-=9Z?^+G-j}d>@j0@`d+0pn>jE9q& UBi}ZQS7IHk4DT38RZwvH8_A&`SO5S3 literal 0 HcmV?d00001 diff --git a/data/fonts/ari-w9500-condensed.fnt b/data/fonts/ari-w9500-condensed.fnt new file mode 100644 index 0000000..4264e73 --- /dev/null +++ b/data/fonts/ari-w9500-condensed.fnt @@ -0,0 +1,132 @@ +# Font: ari-w9500-condensed — generado desde ari-w9500-condensed.ttf size 11 +# Generado con tools/font_gen/font_gen.py + +box_width 9 +box_height 11 +columns 15 + +# codepoint_decimal ancho_visual +32 2 # U+0020 +33 2 # ! +34 4 # " +35 8 # # +36 5 # $ +37 8 # % +38 6 # & +39 2 # ' +40 4 # ( +41 4 # ) +42 4 # * +43 6 # + +44 2 # , +45 4 # - +46 2 # . +47 4 # / +48 5 # 0 +49 4 # 1 +50 5 # 2 +51 5 # 3 +52 5 # 4 +53 5 # 5 +54 5 # 6 +55 5 # 7 +56 5 # 8 +57 5 # 9 +58 2 # : +59 2 # ; +60 4 # < +61 6 # = +62 4 # > +63 5 # ? +64 9 # @ +65 6 # A +66 6 # B +67 6 # C +68 6 # D +69 6 # E +70 6 # F +71 6 # G +72 6 # H +73 2 # I +74 4 # J +75 6 # K +76 6 # L +77 6 # M +78 6 # N +79 7 # O +80 6 # P +81 7 # Q +82 6 # R +83 6 # S +84 6 # T +85 6 # U +86 6 # V +87 8 # W +88 6 # X +89 6 # Y +90 6 # Z +91 4 # [ +92 4 # \ +93 4 # ] +94 6 # ^ +95 5 # _ +96 3 # ` +97 5 # a +98 5 # b +99 5 # c +100 5 # d +101 5 # e +102 4 # f +103 5 # g +104 5 # h +105 2 # i +106 2 # j +107 5 # k +108 2 # l +109 6 # m +110 5 # n +111 5 # o +112 5 # p +113 5 # q +114 4 # r +115 5 # s +116 4 # t +117 5 # u +118 5 # v +119 6 # w +120 5 # x +121 5 # y +122 5 # z +123 5 # { +124 2 # | +125 5 # } +126 6 # ~ +192 6 # À +193 6 # Á +200 6 # È +201 6 # É +204 2 # Ì +205 2 # Í +210 7 # Ò +211 7 # Ó +217 6 # Ù +218 6 # Ú +209 6 # Ñ +199 6 # Ç +224 5 # à +225 5 # á +232 5 # è +233 5 # é +236 2 # ì +237 3 # í +242 5 # ò +243 5 # ó +249 5 # ù +250 5 # ú +241 5 # ñ +231 5 # ç +161 2 # ¡ +191 5 # ¿ +171 7 # « +187 7 # » +183 2 # · diff --git a/data/fonts/ari-w9500-condensed.gif b/data/fonts/ari-w9500-condensed.gif new file mode 100644 index 0000000000000000000000000000000000000000..19b085c44da48ad16d0b0b0d008331edd6953e7c GIT binary patch literal 2019 zcmeH`{W}u~0LRAWmaoizzVq3#UVmms#a4%-XzdhIuJ(o0lxvdE0Q! zm`xfbX2j*C%#gYVCwZN-dGF$p_jXVBZ(QFWzTclepXd3aoRQX6fiyrcfCl&)g+lS) zeyeW={&xn9z7l`^g1w3Ypriu1Y69p?1E@lO3yJe zIU))B4%P!Wl1ZRIq=Ai0W7gbQe=|aH324`MKZ1gSKRJ#{gRUizH6UMoin^H(0Q83;b+KG%!+#*c1 z+*A5q?U$AY6gyqbkh?5I1b193Tt5K%7N`a`WmVkYYtnNTL$9`B3lrY3`v zVkFgNs8Gd}Ei`6&X~c}`6Um5|Z~ZW7r@aKRUE85+f2g->stp@4OC`SxGXiFT$d#8t zlfD#-tQ#r28u5Qoj(T8cQe)sMv&q;#TEMM^KwY$Z!%gu-c89YbgnFFaTp8OVYC+>J z*kUU(Ec|FvdWJ`+pO<-I$ZQ5=tvC1~O$j*VQg$kCEaKo4JcLl?wo}6R+^H3Cj}x9X zUtH(~=H_)<=&;if-ay@lCzvRI*DtYJVc2RVs~S>Vfq7-h{Y-0FqMJ1Hdc|6~lRi6s z6n@(MWz$Yo$-+EeevfSIQg{>B2?kde>^%#W4r!Aw}m2aLk~aKJBHA97P< z;>x1OC-jV2B^|yKarp&pA$R9xnuI!ggVxEs5u9#NosjNANK~ldW(3kE+{c&k^S9%0nMX07E35UlOUrWS2zbWhG$|Pl^;-F7%`^}TthR^(JOd7C|9)J-;ony zJYeqVx-s~w)_{;X7AoO#>;wbTeDF!t`I5%Z<9^8j(lOJncIA`juUa;)Eb>;8ZR-Bq z?r7skwne2d!g4LTz6``g@Uy)zgHPyf+=DPrT{AhUHNI;YI^^%qK3 z$U9=<;Npulb)n@;yl_8iDs2wGGf4CQj>lJ0ykIjbDe#8=xn0ohF2SxUiEOp*8viV9 z_em7{?6j*%-NdY$_K=V$ptPaWY$;Xh<MjG%oPugjvg zo(LS6)7a4IUM56SV~r&1$X@I189H?a6DVD>6q_$`@7t@MKB +63 8 # ? +64 12 # @ +65 9 # A +66 8 # B +67 9 # C +68 9 # D +69 8 # E +70 8 # F +71 9 # G +72 8 # H +73 3 # I +74 7 # J +75 9 # K +76 8 # L +77 10 # M +78 9 # N +79 10 # O +80 8 # P +81 10 # Q +82 8 # R +83 8 # S +84 9 # T +85 8 # U +86 9 # V +87 12 # W +88 9 # X +89 9 # Y +90 9 # Z +91 5 # [ +92 6 # \ +93 5 # ] +94 7 # ^ +95 7 # _ +96 5 # ` +97 8 # a +98 8 # b +99 8 # c +100 8 # d +101 8 # e +102 6 # f +103 8 # g +104 8 # h +105 3 # i +106 4 # j +107 8 # k +108 3 # l +109 11 # m +110 8 # n +111 8 # o +112 8 # p +113 8 # q +114 6 # r +115 7 # s +116 6 # t +117 8 # u +118 8 # v +119 9 # w +120 8 # x +121 8 # y +122 8 # z +123 6 # { +124 3 # | +125 6 # } +126 9 # ~ +192 9 # À +193 9 # Á +200 8 # È +201 8 # É +204 3 # Ì +205 3 # Í +210 10 # Ò +211 10 # Ó +217 8 # Ù +218 8 # Ú +209 9 # Ñ +199 9 # Ç +224 8 # à +225 8 # á +232 8 # è +233 8 # é +236 4 # ì +237 3 # í +242 8 # ò +243 8 # ó +249 8 # ù +250 8 # ú +241 8 # ñ +231 8 # ç +161 3 # ¡ +191 8 # ¿ +171 10 # « +187 10 # » +183 3 # · diff --git a/data/fonts/ari-w9500-display.gif b/data/fonts/ari-w9500-display.gif new file mode 100644 index 0000000000000000000000000000000000000000..11c0d38184512045d3b7c4a126da49d84b8f7fc4 GIT binary patch literal 2366 zcmeH`{XY{30LGCS6*h%#p0a+tg%MW}g;miJ?9h_M&%FEj5p z^R^R=jZSD^Lb!4)`n1@Rxy-VirCkPM52H9|N7s+ zf6jpJSK_Z#x37c3Ly!Tu4|r%=7AXU!j+ zwP`MYoullCO%z-%dxez*I#_9q`3+}+!Ye0KTiy?oWIPsVyWxUi-a;Vyj{rWzV{?X4@+DyLenTT0*$ zQz6po&pZ|G{V@^+k^Xs=Ne{%A1D7>e^tIb_*lk}{_ilq7hnR&_0+1f@dCwwuu!ri5 zoeh3Zj0kXp)fJV;aD2*eK*!8)u{1X$J~IA_<-JvJdrq9I5FB>8u_B+Pb<%%6fjr3LOtgz)I$}_^NEQZ%^l5~N2$nC_}?>2=kMVCpylMoC!jH$*rY*0;?+phK7%zoARerT8;y(8as05}f&*(}yrr z%E3=j^KNjX*Sw4`6={|Ely1Qi9tCn;!k(B6DtrKAIrGUr09Cc*KZ9V!l-NQkZ+ve% zA&;EOT@gGg*EG67)HS!MEX?<(u9SsE1})~x&0ec2C@M7oRYj28)toYCkE_?BdPQ`V z@F2)kKtYz`U;*tqm&ZY5tW@*}O)*lxY~q%G_=D`+H!lyv{(prCF~HYTJ8 z;lgyjkv`7}N$_u0SY>AT?*!+1A1PYQz%T6ZyUf1~=ut1^)8?|YOshcdj8`5F`QGQ< z-m$Cr`0ljRQVCKW@1mHpC3-46a_rNLNkT z!nCO+j>wqBZVlK6Bo;hkyJ2(Z(Scs)IlH>=yP}lZCvs_%(VLtdNm2L3JOKc-Rp_x1 z+t$JxTi0&^AXN;<)5HDS26L1jLB^~DSlltiDM2kyd^9tBwA}7>%gS#Jy3I>86IVz} z9h=POYF5^DtTm&s`yZFD8FTwS!0UZF(!SWMY?LRPY`K%L>50P&;y5Dw`PwI?pjQB4W1Z?n{cNbb@DgDI(~{s_BbaFY-4>6+jwj^ zPT5-U@1dM%Opvr9%OLbk_tvw}pdxR8DbunUC%CiK;<_sOJEdVqhV7nhne*K0I20uj z283)94?u_-zbAjdGWFFRs7{6h1&wLTn+t3Or7n$UpE1Cv1tSJR=ru(!;&d-x=3E8N z`0ys0*HkRLH{D*0!)eNNzWel0tE4M#EfxELj~8<>6!XG`o8DEyX&p1YBrk6w)l$I! zD74^q*Sn6^-l{oo{qxNua=NO`?}nI$)~CDz6IMIOshEp3Dzmo}oz*#nD>-(6($HMQ z;DXK@L$)s~ITzlC&wigu^An~L7#9?m;V2qg)A8=ECGm=KmDx8qcA6QlST$~Ppo!E- zfLwQ9CbFG{f!yi_o@ zXt8q4P}p=A|6RKm0J?|s46lCSZLRmiV{oEug%z5z(HDJ zQqwX8PKzEdJ0p8(c6!BPYRJY56I*z(sZh6>y6rYr1~3i#ZYV!23wb%hZ+DtH+QZ)@ zfJ1Vc-2;(Vqv^^I< zrsW&0QEi=0a${w4%NqNGe9DYR+kwKZCyZfmaDrl^%j(1AsBkyo^j{vvUk2M=g7r3L Mt9eV3$HYwj0rs^vsQ>@~ literal 0 HcmV?d00001 diff --git a/data/fonts/ari-w9500.fnt b/data/fonts/ari-w9500.fnt new file mode 100644 index 0000000..449e8a2 --- /dev/null +++ b/data/fonts/ari-w9500.fnt @@ -0,0 +1,132 @@ +# Font: ari-w9500 — generado desde ari-w9500.ttf size 11 +# Generado con tools/font_gen/font_gen.py + +box_width 12 +box_height 11 +columns 15 + +# codepoint_decimal ancho_visual +32 3 # U+0020 +33 2 # ! +34 4 # " +35 9 # # +36 6 # $ +37 10 # % +38 7 # & +39 2 # ' +40 4 # ( +41 4 # ) +42 4 # * +43 6 # + +44 2 # , +45 4 # - +46 2 # . +47 5 # / +48 6 # 0 +49 5 # 1 +50 6 # 2 +51 6 # 3 +52 6 # 4 +53 6 # 5 +54 6 # 6 +55 6 # 7 +56 6 # 8 +57 6 # 9 +58 2 # : +59 2 # ; +60 6 # < +61 6 # = +62 6 # > +63 6 # ? +64 12 # @ +65 8 # A +66 7 # B +67 8 # C +68 8 # D +69 7 # E +70 7 # F +71 8 # G +72 7 # H +73 2 # I +74 5 # J +75 7 # K +76 7 # L +77 8 # M +78 7 # N +79 8 # O +80 7 # P +81 8 # Q +82 7 # R +83 7 # S +84 6 # T +85 7 # U +86 7 # V +87 10 # W +88 8 # X +89 8 # Y +90 8 # Z +91 4 # [ +92 5 # \ +93 4 # ] +94 6 # ^ +95 6 # _ +96 3 # ` +97 6 # a +98 6 # b +99 6 # c +100 6 # d +101 6 # e +102 4 # f +103 6 # g +104 6 # h +105 2 # i +106 2 # j +107 6 # k +108 2 # l +109 8 # m +110 6 # n +111 6 # o +112 6 # p +113 6 # q +114 4 # r +115 5 # s +116 4 # t +117 6 # u +118 6 # v +119 8 # w +120 6 # x +121 6 # y +122 6 # z +123 5 # { +124 2 # | +125 5 # } +126 6 # ~ +192 8 # À +193 8 # Á +200 7 # È +201 7 # É +204 2 # Ì +205 2 # Í +210 8 # Ò +211 8 # Ó +217 7 # Ù +218 7 # Ú +209 7 # Ñ +199 8 # Ç +224 6 # à +225 6 # á +232 6 # è +233 6 # é +236 2 # ì +237 3 # í +242 6 # ò +243 6 # ó +249 6 # ù +250 6 # ú +241 6 # ñ +231 6 # ç +161 2 # ¡ +191 6 # ¿ +171 7 # « +187 7 # » +183 2 # · diff --git a/data/fonts/ari-w9500.gif b/data/fonts/ari-w9500.gif new file mode 100644 index 0000000000000000000000000000000000000000..994cb1be6b24e481c0c24c3030dd7cc24b0df07e GIT binary patch literal 2197 zcmeH``8yK~0LO_pNtFA@q*ji(-aIx79hOMsoWUO|*I0$~AMFW9F>M z{YDWvvdDcWgqPa;^!^)f-ygo;pFf}H`I?v-Lv`J1c|3UHd47e<<^H$7>$idbodNY< z#J|39?HHGb_n7?6`>v0pkDXL7vcEqKi{?G2EuoTjuAL~T4EeB^n%|kCc%3LO_yX9I zbV1ozhrlT4$yBvO9(LO(b!RJMU3vDfa-j0 z^32kZEv7rFLpf@0kpQ#$vauSKI7CMS1o)ARo@D3h4bv?Ow3Y(PZ|$tv)oSPW*MaQS zrd#cW+cgrQ7>`$}z^zPkR?ut{PQzbhb$8Qq;C%a0VKwP(&S0|e!dxH2V}(?CkAa4s zc1OoBC4Gv@ZOcBft%IB1G_x8uXSxVLm;Pqf&AIEL2S3e3ai}3+`JL}2O*oe+dDbKD z27ZsZwY503prhHWAFy%q#`ENeQ1DLAcS#S#3gWP154*{{6S*xsFNZ1u*h?dhAV2)| zFy=A-`C!pTr6?{0XULnzb@Q*c2CaBq4J^2Mh)Dt;sgrAaRKl1n z&WjvO?54S3VW61^Xtsb~QA($*D*9P2$sHX=KmzDzlgG312~zei5|Az260!InX;?Zs zZxH2L(hz3)vV91Aieb!(hQY=kwEwARdKy_YC*62*)3HF1v*Wzu%imz2N3>cO%+M|pjN7zo~qx7so z|H@*Uhryi+!3P>Gqr5C&__%gLO`&c^>1=eqdsju<9-y@5J#~KK&w+ApgX~^4q2{WO zmN8Ds@DtoO)j9pB$z@+wG9dW1Yiq7{+3iaK%qM%uh+R%MhP!AthTlS?red#>y+e4v z71QAN8O2Id*2ePFW8jHD>LxaENky{+&f={3v#ZK_88Jg2D7Xy~^mmG#z@*;%iR%^Q z)r>)OaM0y5dJmQeFnk?D35CbuVwPoc*L4KOupevrvZ~f}<%G1q)^Bhi+tPeg{3i^o z>-*C2ht8o}4VjCj0s8umpjCETS-^U-v?lk^Q`BHTkn=MKT_py@X747;N%K4cO37a| zMwk-MY=7Hr>}Oeqm+}Etw&Nj%ZWf*gwv^3iNOK`v{jQk@@~H3#`4pnc(`mwjv&hsH z`swR1a^Ot&gkGRx-p27YidV30uS^_jMO{rqp5nUg${ywPI!>Qi`v?a8}FZFpgxl@$p5Ojf{d(nwaXWsXA7z*}kWIQvPpi#Q| z5)(1XgF^Frcx<07eT@u0LS1scWU9TaVKrh{*xu`HY(-%_7cy{uPqa7s96IFZh4-4V zkg?Eox4Oy}b5uct`y7iZ(|r#Ge*gdg literal 0 HcmV?d00001 diff --git a/source/core/rendering/gif.cpp b/source/core/rendering/gif.cpp index c3182f1..49d819d 100644 --- a/source/core/rendering/gif.cpp +++ b/source/core/rendering/gif.cpp @@ -198,10 +198,33 @@ namespace GIF { readBytes(buffer, &lzw_code_size, sizeof(uint8_t)); std::vector compressed_data = readSubBlocks(buffer); - int uncompressed_data_length = image_descriptor.image_width * image_descriptor.image_height; - std::vector uncompressed_data(uncompressed_data_length); + const int IMG_W = image_descriptor.image_width; + const int IMG_H = image_descriptor.image_height; + std::vector uncompressed_data(static_cast(IMG_W) * IMG_H); decompress(lzw_code_size, compressed_data.data(), static_cast(compressed_data.size()), uncompressed_data.data()); + + // Interlaced GIF (flag 0x40 al byte de fields): les files no arriben + // en ordre lineal, sinó en 4 passades (8:0, 8:4, 4:2, 2:1). Reordena + // al buffer lineal que espera Surface. Sense aquest pas, les fuentes + // i qualsevol GIF entrellaçat es veien completament trinxats. + constexpr uint8_t INTERLACE_FLAG = 0x40; + if ((image_descriptor.fields & INTERLACE_FLAG) != 0) { + constexpr int PASS_START[4] = {0, 4, 2, 1}; + constexpr int PASS_STEP[4] = {8, 8, 4, 2}; + std::vector deinterlaced(static_cast(IMG_W) * IMG_H); + int src_row = 0; + for (int pass = 0; pass < 4; ++pass) { + for (int dst_row = PASS_START[pass]; dst_row < IMG_H; dst_row += PASS_STEP[pass]) { + std::memcpy(deinterlaced.data() + (static_cast(dst_row) * IMG_W), + uncompressed_data.data() + (static_cast(src_row) * IMG_W), + IMG_W); + ++src_row; + } + } + return deinterlaced; + } + return uncompressed_data; } diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 03cdc18..0226f82 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "core/audio/audio.hpp" @@ -80,11 +81,16 @@ Director::Director() { // Hotkeys globals. GlobalInputs::update() les consumirà a cada frame. KeyConfig::get().load("data/input/keys.yaml"); - // Recursos compartits d'UI (paleta + font). Es carreguen abans que els - // overlays perquè tots els reaprofiten sense duplicar la lògica. + // Recursos compartits d'UI (paleta + fonts). Es carreguen abans que els + // overlays perquè tots els reaprofiten sense duplicar la lògica. Els + // noms de font viuen a Defaults::UI::Font (un únic lloc per canviar-los). Resource::Cache::get().loadPalette("ui", "data/palettes/sega-cube.pal"); - Resource::Cache::get().loadSurface("8bithud.gif", "data/font/8bithud.gif"); - Resource::Cache::get().getSurface("8bithud.gif")->setPalette(Resource::Cache::get().getPalette("ui")); + const std::string HUD_FONT_GIF_KEY = std::string(Defaults::UI::Font::HUD_NAME) + ".gif"; + Resource::Cache::get().loadSurface(HUD_FONT_GIF_KEY, Defaults::UI::Font::HUD_GIF); + Resource::Cache::get().getSurface(HUD_FONT_GIF_KEY)->setPalette(Resource::Cache::get().getPalette("ui")); + const std::string PLACEHOLDER_FONT_GIF_KEY = std::string(Defaults::UI::Font::PLACEHOLDER_NAME) + ".gif"; + Resource::Cache::get().loadSurface(PLACEHOLDER_FONT_GIF_KEY, Defaults::UI::Font::PLACEHOLDER_GIF); + Resource::Cache::get().getSurface(PLACEHOLDER_FONT_GIF_KEY)->setPalette(Resource::Cache::get().getPalette("ui")); // Música de la piràmide 1 (primer i únic track de moment). Carreguem ací // perquè forma part del preload d'assets, com la font i la paleta. @@ -98,13 +104,19 @@ Director::Director() { // Font compartida pels overlays: construïm una sola instància de Text // i la injectem als consumidors (Notifier, RenderInfo) per a que cap // d'ells hagi de conèixer els noms dels recursos concrets. - auto hud_font_surface = Resource::Cache::get().getSurface("8bithud.gif"); - auto hud_text = std::make_shared(hud_font_surface, "data/font/8bithud.fnt"); + auto hud_font_surface = Resource::Cache::get().getSurface(HUD_FONT_GIF_KEY); + auto hud_text = std::make_shared(hud_font_surface, Defaults::UI::Font::HUD_FNT); const auto& ui_palette = Resource::Cache::get().getPalette("ui"); RenderInfo::get().init(Options::buildRenderInfoFrame(UiColor::RENDER_INFO_TEXT, UiColor::RENDER_INFO_SHADOW), hud_text); Notifier::get().init(hud_text, ui_palette); + // Font dels placeholders (LOGO / TITLE / INTRO). És una font distinta a + // la de HUD perquè els placeholders desapareixeran amb les seues escenes + // finals; mentrestant tenen estètica pròpia. + auto placeholder_font_surface = Resource::Cache::get().getSurface(PLACEHOLDER_FONT_GIF_KEY); + auto placeholder_text = std::make_shared(placeholder_font_surface, Defaults::UI::Font::PLACEHOLDER_FNT); + // Flux d'escenes LOGO → TITLE → INTRO → GAME. Cada placeholder rep una // factory que construeix la següent, construïda bottom-up des de GAME. // @@ -123,16 +135,16 @@ Director::Director() { std::cout << "Director: start_scene=" << DebugConfig::toString(START) << '\n'; auto make_game = []() -> std::unique_ptr { return std::make_unique(); }; - auto make_intro = [hud_text, make_game]() -> std::unique_ptr { - return std::make_unique(hud_text, make_game); + auto make_intro = [placeholder_text, make_game]() -> std::unique_ptr { + return std::make_unique(placeholder_text, make_game); }; - auto make_title = [hud_text, make_intro]() -> std::unique_ptr { - return std::make_unique(hud_text, make_intro); + auto make_title = [placeholder_text, make_intro]() -> std::unique_ptr { + return std::make_unique(placeholder_text, make_intro); }; switch (START) { case DebugConfig::StartScene::LOGO: - current_scene_ = std::make_unique(hud_text, make_title); + current_scene_ = std::make_unique(placeholder_text, make_title); break; case DebugConfig::StartScene::TITLE: current_scene_ = make_title(); diff --git a/source/utils/defaults.hpp b/source/utils/defaults.hpp index 8ec1916..4e8b767 100644 --- a/source/utils/defaults.hpp +++ b/source/utils/defaults.hpp @@ -90,6 +90,24 @@ namespace Defaults { // pel codi. Si algun dia es volen temes múltiples, es pot moure a YAML // sense més impacte que dos accessors extra. namespace UI { + // Fonts d'UI centralitzades: un únic lloc per conèixer la carpeta + // (data/fonts/), el nom-clau al Resource::Cache i els fitxers .gif / + // .fnt de cada font. Afegir-ne una nova és una constant ací i ja. + namespace Font { + constexpr const char* DIR = "data/fonts/"; + + // HUD/Notifier/RenderInfo: font principal de UI del joc. + constexpr const char* HUD_NAME = "8bithud"; + constexpr const char* HUD_GIF = "data/fonts/8bithud.gif"; + constexpr const char* HUD_FNT = "data/fonts/8bithud.fnt"; + + // Placeholders (LOGO / TITLE / INTRO): font temporal fins que els + // placeholders es substitueixin per les seues escenes finals. + constexpr const char* PLACEHOLDER_NAME = "ari-w9500"; + constexpr const char* PLACEHOLDER_GIF = "data/fonts/ari-w9500.gif"; + constexpr const char* PLACEHOLDER_FNT = "data/fonts/ari-w9500.fnt"; + } // namespace Font + // Overlay de RenderInfo (F12). constexpr Uint8 RENDER_INFO_TEXT = 47; constexpr Uint8 RENDER_INFO_SHADOW = 34; diff --git a/source/utils/defines.hpp b/source/utils/defines.hpp index 62e2fcf..2a572a2 100644 --- a/source/utils/defines.hpp +++ b/source/utils/defines.hpp @@ -3,7 +3,7 @@ namespace Texts { constexpr const char* WINDOW_TITLE = "© 2026 Aventures en Egipte — JailDesigner"; constexpr const char* COPYRIGHT = "© 2026 JailDesigner"; - constexpr const char* VERSION = "0.18.0"; // Single source of truth — Makefile el grep + constexpr const char* VERSION = "0.19.0"; // Single source of truth — Makefile el grep } // namespace Texts namespace GameCanvas {