MC's journal

Sweetmorn, the 58 day of Discord in the YOLD 3176

Några ord om typsnitt i X och typsnitt för programmering

Inledning

Jag föredrar normalt bitmappade typsnitt. De flesta av dagens datorskärmar har väldig låg upplösning, så det blir svårt för vektoriserade typsnitt att komma till sin rätt. Jag tycker det är väldigt svårt för dem att tävla med handgjorda glyfer för en viss storlek. Det finns kanske undantag. Läs vidare!

Upplösningen på min bärbara dator, brain, är 106x105 DPI på den interna skärmen. När jag ibland använder en extern skärm är DPI:n ofta ännu sämre. I tryck så är DPI vanligen som allra minst 600 DPI även om fototypsättare och liknande har mycket högre upplösning, till exempel 2540 eller till och med 4800 DPI! När det gäller tryck så flyter dessutom bläcket ut lite grann i papperet och ger ännu mjukare kurvor. Så är det förstås inte på skärmar.

Det finns knep för att få ett skalbart typsnitt att se bättre ut även på lägre upplösningar. Ett sådant knep är kantutjämning, oftast känt med det engelska uttrycket anti-aliasing (nedan "AA"). På en LCD går det till och med att göra det på nivån av de subpixlar som bygger upp en vanlig färgpixel. Resultatet, tycker jag, är ganska dåligt, alldeles särskilt om det är fråga om vit text på svart botten, något jag ofta använder i till exempel terminaler och i min Emacs.

Subpixel-AA ger värst effekt. Jag ser de enskilda färgerna i subpixlarna, vilket alltså betyder att kanterna på glyferna blir röd, grön och blå. AA utan subpixelanpassning blir bara suddig, speciellt med vitt på svart. Skärpan är mycket bättre om jag slår av AA, men då ser jag i stället förstås hur dålig upplösning jag har om jag använder ett skalbart typsnitt. Det ser helt enkelt inte bra ut.

Kanske är det här framför allt fråga om problem som finns i en särskild implementation av AA, specifikt FreeType i kombination med RENDER-utökningen i X.org-servern. Kanske fungerar AA med vit text på svart botten jättebra i något annat system.

Typsnitt

Typsnitten jag för det mesta använder är som sagt bitmappade och ser ut så här:

xterm-9x15.png

Det här typsnittet heter "-misc-fixed-medium-r-normal–15-140-75-75-c-90-iso10646-1" i X Logical Font Description (XLFD), men är också känt som 9x15. Det har funnits länge i X, men har på senare tid fått en del Unicode-tecken tillagt. Jag använder den framför allt i Emacs.

Tidigare använde jag Gacha 8x16 i Emacs, här i en xterm:

xterm-gacha.png

Gacha var defaulttypsnitt i fönsterystemet MGR, fast då vanligen på mycket större skärmar än på min bärbaras lilla 13-tummare. Var typsnittet kommer ifrån ursprungligen vet jag inte. Jag har sett det på skärmdumpar från SunView också, så det var tydligen inte begränsat till MGR. Om någon vet varifrån det kommer och vem som gjort det får ni gärna berätta för mig.

Jag har gjort om MGR-typssnittet till PCF, som moderna X-servrar använder:

https://hack.org/mc/files/gacha-8x16.pcf

Jag har också gjort om det till ett VGA-typsnitt för konsollanvändning under FreeBSD och Linux. Det fungerar antagligen under MS-DOS och FreeDOS också.

https://hack.org/mc/files/gacha-8x16.vga

Gacha täcker tyvärr bara Latin 1. Jag använder därför inte den längre i min Emacs. Även om jag fortfarande kör en Latin 1-locale så kan Emacs hantera tecken utanför Latin 1 och får jag till exempel ett mail med tecken utanför Latin 1 använder Emacs plötsligt ett annat typsnitt för just det tecknet, även om det skulle råka vara till exempel en genitivapostrof. Jag fann det så irriterande att jag bytte till 9x15.

För sena nätter och/eller långa arbetsdagar brukar jag ibland köra Terminus 24, som också ger en skön retrokänsla tillbaka till tiden då jag satt framför en 80x24-terminal, fast nu med klart bättre upplösning:

emacs-terminus.png

Jag har definierat en fånig liten elispfunktion för att byta till den:

(defun night-font ()
  "Change default font to something huge."
  (interactive)
  (set-frame-font
  "-xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso10646-1" t))

Terminus är överhuvudtaget ett ganska begagligt typsnitt av Dimitar Zhekov:

http://www.is-vn.bg/hamster/

Jag har bara testat det ett kort tag och kan kanske övertygas om att 8x14- eller 8x16-varianten kan bli min nya default i Emacs.

I typiska xtermar är jag annars förtjust i Lucida Typewriter:

xterm-lucidatype.png

Dess fulla namn i XLFD är: "-b&h-lucidatypewriter-medium-r-normal-sans-12-120-75-75-m-70-iso8859-1".

Den finns också i en Unicode-variant, men jag kör som sagt fortfarande i en Latin 1-locale i mitt skal.

Det finns ett intressant projekt som heter GNU Unifont som försöker verkar täcka hela Unicode BMP:

http://unifoundry.com/unifont.html

Tyvärr verkar den inte fungera något vidare med Emacs, i alla fall inte i den version jag testade. Emacs blev rejält förvirrad och de redan lite störande "fringes" blev någon centimeter breda! Jag vet inte varför ännu.

Ett annat intressant typsnitt är Liberation Mono, som finns med de andra Liberation-typsnitten här:

https://fedorahosted.org/liberation-fonts/

Red Hat har tydligen beställt dem från typsnittsmakaren Ascender för att få typsnitt som är storleksmässigt kompatibla med Microsofts Windows-typsnitt. De har dessutom haft den goda smaken att släppa dem som GPL med några tillägg.

Liberation Mono fungerar faktiskt förvånansvärt bra som programmeringstypsnitt, tycker jag, speciellt för att vara ett skalbart typsnitt. Här i en xterm med en emacsclient:

xterm-libmono.png

Här är några andra kul genomgångar av typsnitt för programmerare:

http://www.codeproject.com/KB/work/FontSurvey.aspx

http://hivelogic.com/articles/top-10-programming-fonts

http://www.lowing.org/fonts/

Typsnittssystem i X

X Window System har nu för tiden två sätt att hantera typsnitt. Det ena kallas ibland "core fonts" och ibland "server-side fonts" och det andra går vid lite olika namn beroende på vad man tänker på. Ibland kallas det Fontconfig-systemet och ibland Xft, men ett bättre namn är nog "client-side fonts", eftersom typsnitten inte alls behöver renderas av just Xft (X FreeType Library Interface), utan lika gärna kan renderas av något annat.

Fontconfig, i sin tur, är ett system för att hitta typssnittsfiler och används tillsammans med till exempel just FreeType för att tala om hur renderingen skall gå till.

Client-side är det nyare sättet att hantera typsnitt på. Tillämpningarna själva renderar typsnitten, vanligen med hjälp av ett bibliotek som Freetype eller Cairo, och skickar det färdigrenderade resultatet till X-servern, som alltså bara skall visa resultatet.

I klassiska core fonts så laddas i stället hela typsnittet över till X-servern som sedan renderar det. I bitmapfallet betyder detta troligen bara att blitta över en bitmap från en plats i minnet till en annan.

De flesta core fonts är alltså bitmapbaserade, men de behöver inte vara det. Moderna X-servrar har till exempel direkt stöd för att själva rendera typsnitt i TrueType-formatet.

På samma sätt är de flesta client-side-typsnitt vektorbaserade, men behöver inte vara det. Det går att stoppa in bitmaps i dem, till och med enbart för vissa storlekar medan man samtidigt har en generell vektorbeskrivning.

För att lista de installerade typsnitten använder man xlsfonts för server-side och fc-list för client-side.

Typiskt sätt att manuellt använda ett typsnitt i client-side är så här:

% xterm -fa "Bitstream Vera Sans Mono" -fs 10

xterm är dock notoriskt slö på uppdateringar när man använder sådana typsnitt. På förra hackjuntan fick jag se hur alternativet urxvt sprang cirklar runt xterm när det gäller hanteringen av just typsnitt i client-side och scrollning. Ingen flicker alls!

En intressant sak är att moderna X-servrar som jag skrev ovan kan rendera TrueType själva, så program som normalt inte använder Freetype-biblioteket kan ändå visa samma typsnitt, fast troligen renderade lite annorlunda, i alla fall om det är ett skalbart typsnitt. Om du vill använda detta, leta reda på typsnittskatalogen. Gör sedan:

% cd /path/till/katalogen
% ttmkfdir -o fonts.dir
% xset fp+ /path/till/katalogen
% xset fp rehash

Nu borde typsnitten synas med en vanlig xlsfonts. De anges vanligen med "0" i stället för storlekarna eftersom de är skalbara, exempelvis:

-redhat-liberation mono-medium-r-normal--0-0-0-0-p-0-iso10646-1

Du använder dem genom att helt enkelt stoppa in lagom storlek på rätt plats, exempelvis:

xterm -fn '-redhat-liberation mono-medium-r-normal--0-100-0-0-p-0-iso10646-1'

för att få en 10-punktersskalning.

För att permanent få med de här typsnitten i din X-server, stoppa in

FontPath "/path/till/katalogen"

i Files-sektionen i din xorg.conf. Finns vanligen i /etc/X11/xorg.conf

De program som använder client-side och FreeType använder oftast också kantutjämning (anti-aliasing, AA). Som jag skrev ovan ogillar jag det, men det går tack och lov att stänga av. För att stänga av AA, skapa en ~/.fonts.conf och stoppa in:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match target="font">
    <edit name="antialias" mode="assign">
      <bool>false</bool>
    </edit>
  </match>
</fontconfig>

TrueType-typsnitt kan innehålla hinting i form av bytekod som skall evalueras av renderaren. Detta är patenterat av Apple i USA, om jag förstår det rätt, så det är inte säkert att FreeType-biblioteket på din plattform stöder det. Du kan bli tvungen att kompilera om FreeType. Se då till att slå på BCI (ByteCode Interpreter), i alla fall om du 1) inte befinner dig i ett land där Apples patent är giltigt, 2) har köpt en licens av Apple, eller, 3) skiter i patent.

FreeType har som default en autohinter, men jag tycker den ger ganska hemskt resultat som du speciellt ser om du har slagit av AA.

För att slå på användning av bytekoderna och slå av den automatiska hintningen, ändra i ~/.fonts.conf eller local.conf för hela systemet:

<match target="font" >
  <edit mode="assign" name="hinting" >
    <bool>true</bool>
  </edit>

  <edit name="autohint" mode="assign">
    <bool>false</bool>
  </edit>
</match>

Ser du skillnaden?


Written by MC using Emacs and friends.