We use a lot of different fonts throughout the different apps on our platform, and often it can be a little bit of a chore to figure out the correct string to feed to UIFont.FromName()
in order to properly instantiate a font from the files. One approached I've used in the past is to throw some lines in my app's startup code like this:
foreach (var family in UIFont.FamilyNames)
foreach (var fontName in UIFont.FontNamesForFamilyName(family))
Console.WriteLine(fontName);
Then I could quickly skim the output, pick out the name I was looking for, and move on with my life. This works, but it's a bit tedious and requires manual work every time. Neither of those really sits well with me.
I recently came across LCDF Typetools which is a nice little set of tools, including otfinfo. You can get these tools in a variety of ways. I went with Homebrew, which is nice and simple:
brew install lcdf-typetools
Here's what the output of otainfo
looks like:
+ otfinfo -i SourceSansPro-Light.ttf
Family: Source Sans Pro Light
Subfamily: Regular
Full name: Source Sans Pro Light
PostScript name: SourceSansPro-Light
Preferred family: Source Sans Pro
Preferred subfamily: Light
Version: Version 2.010;PS Version 2.0;hotconv 1.0.78;makeotf.lib2.5.61930
Unique ID: 2.010;ADBE;SourceSansPro-Light;ADOBE
Designer: Paul D. Hunt
Manufacturer: Adobe Systems Incorporated
Vendor URL: http://www.adobe.com/type
Trademark: Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
Copyright: Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'.
License URL: http://scripts.sil.org/OFL
License Description: This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is available with a FAQ at: http://scripts.sil.org/OFL. This Font Software is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
Vendor ID: ADBE
In this case we're looking specifically for PostScript name
. It wouldn't be difficult to parse this output to get it, but thankfully they have us covered and have a flag for just returning that name:
+ otfinfo -p SourceSansPro-Light.ttf
SourceSansPro-Light
Perfect! No extra parsing needed. As I've documented before, I use F#/FAKE for all of my build scripting, so naturally I needed to try hooking this up into that as well:
Target "font-test" (fun () ->
ExecProcessAndReturnMessages (fun p ->
p.FileName <- "otfinfo"
p.Arguments <- "-p SourceSansPro-Light.ttf"
) (TimeSpan.FromSeconds 30.)
|> fun response ->
match response.ExitCode with
| 0 ->
let postscriptName = response.Messages.[0]
printfn "PostScript Name: %s" postscriptName
| 1 -> failwith "Error processing font file"
)