ub's #20

ub's Space at the End of the Universe

Desktopologia II.

2016-06-04, tagged as desktop, utilities
Priznam sa, ze keby ste sa ma spytali, este predtym ako som sa o to zacal zaujimat, ci su fonty v texte komprimovane, povedal by som, ze asi nie. Vsak ked sa na kazetu/disketu uklada ciste font (teda nie ako sucast textu), tak je nekomprimovany. A tiez by som na prvy pohlad nepredpokladal ze sa komprimaciou fontu da usetrit nejake vyznamnejsie miesto.

Cast druha: Format fontov

Ked som vsak pozrel na texty, ktore sa mi zachovali, tak som zistil ze v kazdom z nich sa komprimaciou fontov usetril minimalne jeden kilobajt media (v pamati desktopu su fonty nekomprimovane, co je celkom pochopitelne, ani si nechcem predstavit tu nadbytocnu reziu, ktora by bola potrebna na vyhladanie znaku v komprimovanom fonte pri zapisani noveho znaku do textu, kedze je desktop wysiwyg).

Ano, v dnesnej dobe harddiskov, CF ci SD kariet uz jeden kilobajt neznamena takmer nic. A pravdepodobne by ten jeden kilobajt aj tak zozral sposob ukladania dat na FAT, kde existuju clustre, ktore dnes uz bezne maju nie 1KB ale rovno 4KB (alebo este viac) a tak kazdy subor majuci od 4096-8192 bajtov zozerie celych 8KB. Takze dnes by som povedal, ze komprimacia fontov je skor na obtiaz ;].

No, ale spat k teme. Takze som zistil, ze fonty su komprimovane, otazka ale znela "akym sposobom?". Komprimacia rovnakym sposobom ako ma text moc nepripadala do uvahy, pretoze sposob komprimacie textu bol vybrany s ohladom na to, ze sa jednoducho niektore bajty v texte vyskytovat nemozu a tak boli vhodne na znackovanie opakovacich bajtov. Vo fonte sa ale mozu vyskytovat vsetky bajty, takze nech vyberieme akykolvek bajt, moze nastat situacia, ked by skomprimovany font mal vyslednu dlzku vacsiu ako nekomprimovany.

Chvilu som sa pozeral na hexdump fontov, ale akosi mi to nedochadzalo a tak pomohol debugger. Prva vec, kvoli ktorej to nebolo na prvy pohlad viditelne je, ze sa font dekomprimuje "odzadu". Druha zasa to, ze ako znackovy bajt bol vybrany bajt s hodnotou 1 (nepredpokladal by som ze by nim bol bajt 0, to je velmi casta hodnota vo fonte, ale 255 by celkom pripadal do uvahy). Vyznam komprimacie odzadu mi trosku unika, znackovaci bajt 1 vsak zmysel ma, nakolko su znaky v gride zarovnane dolava, tak je pravdepodobnost vyskytu bajtu 1 v bitmape znaku mala a minimalna sirka znaku je 2, takze v poli sirok sa 1 vyskytovat nemoze. No a format komprimovaneho fontu je potom jednoduchy:
  • Akykolvek byte iny ako 1 znamena nekomprimovany bajt a je jednoducho skopirovany do vysledku
  • bajt 1 je znackovaci bajt, po ktorom nasleduje pocet opakovani a nasledne bajt, ktory sa ma opakovat

Z bodu 2 jasne vyplyva vlastnost, ze pokial je vo fonte osamoteny bajt s hodnotou 1, v komprimovanom fonte zaberie o 2 bajty viac ako v nekomprimovanom, a tak font predlzi, takze na toto pozor.

A nakoniec este jedna vec, subor s fontmi obsahuje okrem samotnych fontov aj nastavenie sirky textu. Neviem preco je to sucast fontu a nie sucast textu, asi to bude len tym, ze proste je to tak ulozene aj v pamati. Nakoniec na tom ale nezalezi, podstatne je pre nas vediet, kde tuto informaciu hladat. Sirka textu je ulozena v prvych dvoch bajtoch suboru fontu a pozor, tato hodnota je v subore znizena o 2 pixle, cize ak je v desktope nastavena sirka textu na 480 pixlov, v subore budu ulozena hodnota 478, cize bajty 0xDE a 0x01.

Nuz a tak by nas dekomprimovaci program mohol vypadat nejako takto:


(vstupny subor stiahnete tu: dopis F.B a skript tu: uncompress_font.php)


[: to be continued :]


--