Version 8 of extrafont

Updated 2017-07-18 13:30:55 by ABU

ABU 16-Jul-2017

extrafont is a multi-platform binary package providing a way for loading "private fonts" in a Tk apps.

"Private fonts" are fonts usually delivered with an app.
They don't need to be installed in some 'standard' system-wide directories; once these fonts are loaded, they can be used in the same way of pre-installed fonts.
These loaded fonts are only visible by the process (app) who loaded'em, and then disappear when the app terminates.

Download

  • [L1 ] extrafont-1.0 Multi-platform package (Windows/Linux/MacOSX)
  • [L2 ] extrafont Development-Kit. For developers/maintainers.

Image Img-PrivateFonts

SYNOPSYS

The extrafont package provides one core command

 extrafont::load

and two convenience commands

 extrafont::isAvailable
 extrafont::availableFamilies
extrafont::load filename
After loading filename, a new font-family will be available to the current Tk app.
extrafont::isAvailable fontFamily
Return true is fontFamily is avaiable.
extrafont::availableFamilies fontFamilyPattern
Return the list of font-families matching the glob-style fontFamilyPattern.

e.g.

 extrafont::availableFamilies co*
 returns
  Courier {Comic Sans MS}  .....

One important distinction to keep in mind is among

  • font-filename
  • font-family
  • fontname

Font-filename is used just for loading an external font:

  extrafont::load "c:/tmp/Monoton-regular.ttf"

This font will be then available as "Monoton" font-family (note that the family-name may be very different from the font-filename).

 extrafont::isAvailable "Monoton"   ;# true

Finally, when you want to use this new font, you should create or configure a fontname (using the standard 'font' command)

 set myfontname "tk_monoton"  ;#  ... choose the name you want ..
 font create $myfontname -family "monoton" -size 20
  # or, let tk choose a fontname for you ...
 set myfontname [font create -family "monoton" -size 20]
  # then use $myfontname for a new widget ...
 label .mylabel -font $myfontname .......  

MG This is awesome! I have a couple of suggestions/observations, though:

  • It would be super handy if extrafont::load returned the font family, so you could do
    font create myNewFont -family [extrafont::load $file]
  • In your pkgIndex.tcl, I think you're better off using info sharedlibextension rather than trying to guess it by platform
  • On Windows, I think it's better to check if $tcl_platform(machine) == amd64 to determine if it's 64bit rather than 32. (IIRC, I stole that from the source for the platform::generic command when I needed to do something similar before)
  • In your availableFamilies command, I'd suggest replacing the foreach with an lsearch, which I think should be slightly faster/more efficient
    lsearch -all -inline -glob -nocase [font families] $familyPattern

This is a really neat functionality to add, thank you. :)

APN I second that.

ABU - Extracting the font-family from a font-file, or better, as suggested by MG, let extrafont::load return the loaded font-family, is a very difficult task.
Windows/Linux/Mac have three very different font-management APIs, and as far as I googled I never found any hint about how to solve it.
Expert help is welcomed !