2015-01-08
Improving Linux Font Support in Self
In the Linux version of the Self programming language implementation the fonts used are standard X11 fonts. On modern Linux systems these don't look great and a common question asked in the mailing list is how to improve it. Fonts on the Mac OS X build of Self use a different system and they look much better. It would be good to convert the Linux version to use freetype to gain more control over fonts.
I worked on adding Freetype support a couple of years ago and wrote about it on the mailing list. I haven't done much on it since then but the code is in my github repository under the linux_fonts branch. That work adds Self primitives to access Freetype but does not integrate it into the Self font system. I hope to be able to continue this work sometime but I'm unlikely to get to it in the near future. This post is to point to the code, show how to use the primitives, in case someone else would like to take it forward as a project.
To try the code out you'll need to build Self in the usual manner but using that branch. Once the desktop is launched I test it by creating an object with the following slots:
(| parent* = traits oddball.
window <- desktop w anyWindowCanvas.
draw <-- nil.
font <- nil.
xftcolor <- nil.
xrcolor <- nil.
|)
With an outliner for this object I create an evaulator for it and, one at a time, evaluate the following code snippets:
draw: window display xftDrawCreate: window platformWindow
Visual: window display screen defaultVisualOfScreen
Colormap: window display screen defaultColormapOfScreen
xftcolor: xlib xftColor new.
xrcolor: xlib xRenderColor new.
xrcolor alpha: 16rffff
window display xftColorAllocValue: window display screen defaultVisualOfScreen
Colormap: window display screen defaultColormapOfScreen
RenderColor: xrcolor
XftColor: xftcolor
font: window display xftFontOpenNameOnScreen: window display screen number
Name: 'verdana-18'
draw xftDrawString8: xftcolor
Font: font X: 100 Y: 100
String: 'Hello World!'
The results in the text 'Hello World!' appearing at position 100@100 on the desktop in the Verdana font. The video below demonstrates this to show how it's done in the Self user interface:
This is a common workflow I use to prototype things in Self. I create an empty object and populate it with slots to hold data. With an evaluator created for that object these slots are accessible without needing to have an object to call them on. This is known as 'implicit self calls'. The message for the slot implicitly is sent to the current object. I create and remove slots as needed. I can use the Self outliner to drill down on the slots to look at and manipulate those objects specifically if needed.
Hopefully this Freetype support can be used as a base for better looking fonts on Linux. If you are keen to take it further, or have ideas on how to integrate it, I can be contacted using the details at the bottom of my blog, or you can raise it in the Self mailing list or on github.