Skip to content

Commit

Permalink
Merge pull request #103 from SWTI2014/rendering/font-family
Browse files Browse the repository at this point in the history
Fix #54: Rendering/font family
  • Loading branch information
MrSerth committed Jun 15, 2014
2 parents 522ec13 + e409ef8 commit 60e31a4
Show file tree
Hide file tree
Showing 95 changed files with 227 additions and 42 deletions.
5 changes: 3 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ install:
- source build_env_vars
- ln -s $PROJECT_HOME $GIT_PATH
- ./build_image.sh
- chmod -R 777 $PROJECT_HOME/build-support/*.sh
- $PROJECT_HOME/build-support/copyfonts.sh

# use a different script if you want to customize how travis tests are run
# use verbose flag to dump transcript unconditionally
script: $BUILDER_CI_HOME/testTravisCI.sh # -verbose
script: $PROJECT_HOME/build-support/testTravisCI.sh # -verbose
after_success:
- chmod -R 777 $PROJECT_HOME/build-support/*.sh
- $PROJECT_HOME/build-support/screenshots.sh
3 changes: 3 additions & 0 deletions build-support/copyfonts.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
mkdir -p -v ${BUILD_PATH}/travisCI/Scamper/fonts
cp -R -v $PROJECT_HOME/build-support/fonts ${BUILD_PATH}/travisCI/Scamper/
chmod -R 777 ${BUILD_PATH}/travisCI/Scamper/fonts/*
Binary file added build-support/fonts/Andale Mono U.ttf
Binary file not shown.
Binary file added build-support/fonts/Comic Sans Bold U.ttf
Binary file not shown.
Binary file added build-support/fonts/Comic Sans U.ttf
Binary file not shown.
Binary file added build-support/fonts/Georgia Bold Italic U.ttf
Binary file not shown.
Binary file added build-support/fonts/Georgia Bold U.ttf
Binary file not shown.
Binary file added build-support/fonts/Georgia Italic U.ttf
Binary file not shown.
Binary file added build-support/fonts/Georgia U.ttf
Binary file not shown.
Binary file not shown.
Binary file added build-support/fonts/Nimbus Mono L Bold U.ttf
Binary file not shown.
Binary file not shown.
Binary file added build-support/fonts/Nimbus Mono L Regular U.ttf
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added build-support/fonts/Nimbus Sans L Bold U.ttf
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added build-support/fonts/Nimbus Sans L Regular U.ttf
Binary file not shown.
Binary file added build-support/fonts/Trebuchet Bold Italic U.ttf
Binary file not shown.
Binary file added build-support/fonts/Trebuchet Bold U.ttf
Binary file not shown.
Binary file added build-support/fonts/Trebuchet Italic U.ttf
Binary file not shown.
Binary file added build-support/fonts/Trebuchet U.ttf
Binary file not shown.
Binary file not shown.
Binary file added build-support/fonts/Unifont.ttf
Binary file not shown.
Binary file added build-support/fonts/Verdana Bold Italic U.ttf
Binary file not shown.
Binary file added build-support/fonts/Verdana Bold U.ttf
Binary file not shown.
Binary file added build-support/fonts/Verdana Italic U.ttf
Binary file not shown.
Binary file added build-support/fonts/Verdana U.ttf
Binary file not shown.
Binary file added build-support/fonts/Webdings U.ttf
Binary file not shown.
23 changes: 23 additions & 0 deletions build-support/testTravisCI.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/bash
#
# Generic test driver script for builderCI
#
# -verbose flag causes unconditional transcript display
#
# Copyright (c) 2012-2013 VMware, Inc. All Rights Reserved <dhenrich@vmware.com>.
# Copyright (C) 2014 GemTalk Systems LLC <dale.henrichs@gemtalksystems.com>
#
$BUILDER_CI_HOME/build.sh -d -i $ST -m -f "$PROJECT_HOME/tests/travisCI.st" -o travisCI
if [[ $? != 0 ]] ; then
echo "ERROR: $(basename $0)"
cd "${BUILD_PATH}/travisCI/"
$BUILDER_CI_HOME/buildImageErrorCheck.sh # dump Transcript on error and exit
if [[ $? != 0 ]] ; then exit 1; fi
$BUILDER_CI_HOME/dumpTranscript.sh
exit 1
fi
cd "${BUILD_PATH}/travisCI/"
$BUILDER_CI_HOME/buildImageErrorCheck.sh # dump Transcript on error and exit
if [[ $? != 0 ]] ; then exit 1; fi
$BUILDER_CI_HOME/buildTravisStatusCheck.sh "$@" # dump Transcript on failed tests and exit
if [[ $? != 0 ]] ; then exit 1; fi
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class initialization
initialize
super initialize.
self installFontsIfNecessary.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class initialization
installFonts
((FileDirectory uri: 'Scamper' , FileDirectory slash , 'fonts') fileNamesMatching: '*.ttf')
do: [:fontfile |
TTCFont newTextStyleFromTTFile:
(FileDirectory uri: 'Scamper' , FileDirectory slash , 'fonts') fullName , FileDirectory slash , fontfile].
fontsInstalled := true.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class initialization
installFontsIfNecessary
fontsInstalled ifNil: [self installFonts].
fontsInstalled ifFalse: [self installFonts].
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class initialization
uninstallFonts
{'NimbusMonoL' . 'TrebuchetMS' . 'Webdings' . 'Georgia' . 'Verdana' . 'AndaleMono' . 'NimbusRomanNo9L' . 'NimbusSansL' . 'ComicSansMS' . 'URWChanceryL'}
do: [:font | TTCFont removeStyleName: font].
fontsInstalled := false.
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ attributeMap
'font' -> [ :prop :fontAttribs | self readFontAttribute: prop propertyString to: fontAttribs ].
'font-style' -> [ :prop :fontAttribs | self readFontStyleAttribute: prop propertyString to: fontAttribs ].
'font-weight' -> [ :prop :fontAttribs | self readFontWeightAttribute: prop propertyString to: fontAttribs ].
'font-size' -> [ :prop :fontAttribs | self readFontSizeAttribute: prop propertyString to: fontAttribs ]
'font-size' -> [ :prop :fontAttribs | self readFontSizeAttribute: prop propertyString to: fontAttribs ].
'font-family' -> [ :prop :fontAttribs | self readFontFamilyAttribute: prop propertyString to: fontAttribs ]
}]
23 changes: 23 additions & 0 deletions packages/HTML.package/CSSFontFormatter.class/instance/fontMap.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
accessing
fontMap
"I replace some fonts with licence issues by free alternatives and set a mapping for generic font families such as serif or monospace."
^ fontMap ifNil:
[ Dictionary newFrom: {
'serif' -> 'NimbusRomanNo9L'.
'Times' -> 'NimbusRomanNo9L'.
'Times New Roman' -> 'NimbusRomanNo9L'.
'Nimbus Roman No9 L' -> 'NimbusRomanNo9L'.
'sans-serif' -> 'NimbusSansL'.
'Arial' -> 'NimbusSansL'.
'Helvetica' -> 'NimbusSansL'.
'Nimbus Sans L' -> 'NimbusSansL'.
'fantasy' -> 'ComicSansMS'.
'Comic Sans MS' -> 'ComicSansMS'.
'cursive' -> 'URWChanceryL'.
'URW Chancery L' -> 'URWChanceryL'.
'monospace' -> 'NimbusMonoL'.
'Courier New' -> 'NimubsMonoL'.
'Nimbus Mono L' -> 'NimbusMonoL'.
'Trebuchet MS' -> 'TrebuchetMS'.
'Andale Mono' -> 'AndaleMono'.
}]
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
parsing
parseTextAttributesFrom: aCSSProperty into: aContext

self class installFontsIfNecessary.
(self attributeMap at: aCSSProperty propertyName ifAbsent: [nil])
ifNotNilDo: [ :process | process value: aCSSProperty value: aContext ]
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ readFontAttribute: aString to: aContext
shorthandContext := Dictionary newFrom: {
#italic -> false.
#bold -> false.
#size -> TextStyle default defaultFontIndex
#size -> TextStyle default defaultFontIndex.
#family -> ((TextStyle named: 'Verdana') ifNil: [TextStyle default]).
}.

values := aString splitOn: ' '.
Expand All @@ -18,5 +19,5 @@ readFontAttribute: aString to: aContext
ifFalse: [
(self isValidWeightValue: values first)
ifTrue: [self readFontWeightAttribute: values first to: shorthandContext ]]].

values last ifNotNilDo: [:val | self readFontFamilyAttribute: val to: shorthandContext].
aContext addAll: shorthandContext
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
parsing
readFontFamilyAttribute: aString to: aContext
| style |
style := ((TextStyle named: 'Verdana') ifNil: [TextStyle default]).
aString splitBy: ',' reversed do: [:family | (self styleForFamily: family) ifNotNilDo: [:s | style := s]].
aContext at: #family put: style.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ parsing
readFontSizeAttribute: aString to: aContext
"Lots of value types possible: http://www.w3schools.com/cssref/pr_font_font-size.asp"
| defaultSize sizeFactors |
defaultSize := TextStyle default defaultFontIndex.
defaultSize := TextStyle default defaultFont pointSize.
((aString endsWith: '%') or: (aString endsWith: 'em')) ifTrue: [
| parentFontSize |
parentFontSize := (parentResolver value: #size) ifNil: [ defaultSize ].
Expand All @@ -13,7 +13,7 @@ readFontSizeAttribute: aString to: aContext
^ self ].

(aString endsWith: 'cm') ifTrue:
[ aString asNumber ifNotNil: [:value | aContext at: #size put: (value * 4) asInteger].
[ aString asNumber ifNotNil: [:value | aContext at: #size put: (value * defaultSize) asInteger].
^ self].

sizeFactors := Dictionary newFrom: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ readFontStyleAttribute: aString to: aContext
| map |
map := Dictionary newFrom: {
'italic' -> true.
'oblique' -> true.
'normal' -> false
}.

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
parsing
styleForFamily: aString
| family |
family := aString trimBoth: [:char | char isSeparator or: [char = $"] or: [char = $']].
(TextStyle named: family) ifNotNilDo: [:style | ^style].
self fontMap at: family ifPresent: [:replacement | ^TextStyle named: replacement].
^nil.
20 changes: 13 additions & 7 deletions packages/HTML.package/CSSFontFormatter.class/methodProperties.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
{
"class" : {
},
"initialize" : "SN 6/15/2014 11:47",
"installFonts" : "SN 6/15/2014 14:19",
"installFontsIfNecessary" : "SN 6/12/2014 22:16",
"uninstallFonts" : "SN 6/12/2014 22:13" },
"instance" : {
"attributeMap" : "rs 5/21/2014 12:46:49.11",
"attributeMap" : "SN 6/11/2014 22:54",
"fontMap" : "SN 6/12/2014 14:31",
"isValidStyleValue:" : "rs 5/21/2014 15:44:29.914",
"isValidWeightValue:" : "rs 5/21/2014 15:43:47.846",
"parseTextAttributesFrom:into:" : "rs 6/7/2014 13:29:31.21",
"readFontAttribute:to:" : "rs 5/21/2014 16:06:04.462",
"readFontSizeAttribute:to:" : "rs 6/7/2014 13:32:04.925",
"readFontStyleAttribute:to:" : "rs 5/21/2014 11:48:15.832",
"readFontWeightAttribute:to:" : "rs 5/21/2014 11:48:27.886" } }
"parseTextAttributesFrom:into:" : "SN 6/12/2014 22:14",
"readFontAttribute:to:" : "SN 6/12/2014 14:26",
"readFontFamilyAttribute:to:" : "SN 6/15/2014 13:06",
"readFontSizeAttribute:to:" : "SN 6/12/2014 12:11",
"readFontStyleAttribute:to:" : "SN 6/12/2014 14:20",
"readFontWeightAttribute:to:" : "rs 5/21/2014 11:48:27.886",
"styleForFamily:" : "SN 6/12/2014 10:07" } }
5 changes: 3 additions & 2 deletions packages/HTML.package/CSSFontFormatter.class/properties.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
{
"category" : "HTML-Formatter",
"classinstvars" : [
],
"fontsInstalled" ],
"classvars" : [
],
"commentStamp" : "",
"instvars" : [
"attributeMap" ],
"attributeMap",
"fontMap" ],
"name" : "CSSFontFormatter",
"pools" : [
],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
running
setUp
self timeout: 300.
self fontFormatter: CSSFontFormatter new
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ test04ComplexFontValueShouldBeParsedCorrectly
self fontFormatter parseTextAttributesFrom: prop into: result.
self assert: false equals: (result at: #italic).
self assert: true equals: (result at: #bold).
self assert: 3*2 equals: (result at: #size)
self assert: ((TextStyle defaultFont pointSize * 3) asInteger) equals: (result at: #size).
self assert: (TextStyle named: 'Verdana') equals: (result at: #family).
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
testing
test05FontFamilyShouldBeParsedCorrectly
| prop result |
result := Dictionary new.
prop := CSSProperty new
propertyName: 'font-family';
propertyString: 'serif';
yourself.
self fontFormatter parseTextAttributesFrom: prop into: result.
self assert: (TextStyle named: 'NimbusRomanNo9L') equals: (result at: #family).
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
"instance" : {
"fontFormatter" : "rs 5/19/2014 19:50:21.108",
"fontFormatter:" : "rs 5/19/2014 19:50:21.12",
"setUp" : "rs 5/19/2014 19:50:35.284",
"test01FontItalicBoldShouldBeParsedCorrectly" : "rs 5/21/2014 16:21:36.626",
"test02FontStyleItalicShouldBeParsedCorrectly" : "rs 5/21/2014 16:21:29.714",
"test03FontWeightBoldShouldBeParsedCorrectly" : "rs 5/21/2014 16:21:22.976",
"test04ComplexFontValueShouldBeParsedCorrectly" : "rs 5/21/2014 16:21:15.452" } }
"setUp" : "SN 6/13/2014 17:41",
"test01FontItalicBoldShouldBeParsedCorrectly" : "SN 6/13/2014 01:08",
"test02FontStyleItalicShouldBeParsedCorrectly" : "SN 6/13/2014 01:08",
"test03FontWeightBoldShouldBeParsedCorrectly" : "SN 6/13/2014 01:08",
"test04ComplexFontValueShouldBeParsedCorrectly" : "SN 6/13/2014 01:08",
"test05FontFamilyShouldBeParsedCorrectly" : "SN 6/13/2014 01:08" } }
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ parseTextAttributesFor: aDomNode
attributes := OrderedCollection new.
resolver := StyleResolver for: aDomNode.

self parseTextStyleAttributesFor: resolver in: attributes.

resolver
ifStyleNotNil: #italic do: [:italic | italic ifTrue: [ attributes add: TextEmphasis italic ]];
ifStyleNotNil: #bold do: [:bold | bold ifTrue: [ attributes add: TextEmphasis bold ]];
ifStyleNotNil: #size do: [:size | attributes add: (TextFontChange fontNumber: size)];
ifStyleNotNil: #color do: [:color | attributes add: (TextColor color: color)].
^ attributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
formatting commands
parseTextStyleAttributesFor: aStyleResolver in: anOrderedCollection

| family size |

size := aStyleResolver ifStyleNotNil: #size do: [:s | s] ifNil: [12].
family := aStyleResolver ifStyleNotNil: #family do: [:f | f] ifNil: [TextStyle default].

((aStyleResolver getStyle: #family) notNil or: [(aStyleResolver getStyle: #size) notNil])
ifTrue: [anOrderedCollection add: (TextFontReference toFont: (family fontOfPointSize: size))].
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"endStyles" : "rs 5/18/2014 14:00:49.41",
"increaseFontBy:" : "bolot 5/18/2000 11:50",
"lastFontSize" : "LaurentLaffont 2/26/2010 23:13",
"parseTextAttributesFor:" : "rs 6/7/2014 11:34:20.811",
"parseTextAttributesFor:" : "SN 6/15/2014 13:38",
"parseTextStyleAttributesFor:in:" : "SN 6/15/2014 13:39",
"resetFont" : "bolot 5/18/2000 11:57",
"setAttributes" : "LaurentLaffont 2/26/2010 23:13",
"startFont:" : "rs 5/18/2014 13:53:54.124",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
running
setUp
self timeout: 300.
self htmlFormatter: DHtmlFormatter new
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"instance" : {
"htmlFormatter" : "rs 5/19/2014 20:11:21.806",
"htmlFormatter:" : "rs 5/19/2014 20:11:21.816",
"setUp" : "rs 5/19/2014 20:11:34.988",
"setUp" : "SN 6/13/2014 01:08",
"test03HtmlEntitiesShouldBeParsedCorrectly" : "SS 5/27/2014 22:08",
"test04DecimalHtmlEntitiesShouldBeParsedCorrectly" : "SS 5/27/2014 21:24",
"test05HexadecimalHtmlEntitiesShouldBeParsedCorrectly" : "SS 5/27/2014 22:09",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ constants
inheritableAttributes
"The following CSS Attributes are inheritable:"
"'azimuth', 'border-collapse', 'border-spacing', 'caption-side', 'color', 'cursor', 'direction', 'elevation', 'empty-cells', 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight', 'font', 'letter-spacing', 'line-height', 'list-style-image', 'list-style-position', 'list-style-type', 'list-style', 'orphans', 'pitch-range', 'pitch', 'quotes', 'richness', 'speak-header', 'speak-numeral', 'speak-punctuation', 'speak', 'speak-rate', 'stress', 'text-align', 'text-indent', 'text-transform', 'visibility', 'voice-family', 'volume', 'white-space', 'widows', 'word-spacing'"
^ #( #italic. #bold. #size. #color)
^ #( #italic. #bold. #size. #color. #family)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
resolution
ifStyleNotNil: attributeKey do: aBlock

(self getStyle: attributeKey) ifNotNilDo: [ :attribValue | aBlock value: attribValue ]
(self getStyle: attributeKey) ifNotNilDo: [ :attribValue | ^aBlock value: attribValue ]
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
resolution
ifStyleNotNil: attributeKey do: aBlock ifNil: anotherBlock

(self getStyle: attributeKey) ifNil: [^anotherBlock value] ifNotNilDo: [ :attribValue | ^aBlock value: attribValue ]
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"class" : {
"for:" : "rs 6/7/2014 11:24:06.679",
"inheritableAttributes" : "rs 6/7/2014 11:18:08.712" },
"inheritableAttributes" : "SN 6/15/2014 13:13" },
"instance" : {
"cssPrefixMap" : "rs 6/7/2014 13:48:15.408",
"domNode:" : "rs 6/7/2014 11:23:34.652",
Expand All @@ -10,7 +10,8 @@
"getPrefixOf:" : "rs 6/7/2014 11:04:08.312",
"getStyle:" : "rs 6/7/2014 11:23:00.614",
"getStyle:for:" : "rs 6/7/2014 11:05:56.916",
"ifStyleNotNil:do:" : "rs 6/7/2014 11:27:59.686",
"ifStyleNotNil:do:" : "SN 6/15/2014 13:39",
"ifStyleNotNil:do:ifNil:" : "SN 6/15/2014 13:40",
"parseCSSProperty:of:into:" : "rs 6/8/2014 14:05:55.608",
"resolveParentAttribute:of:" : "rs 6/8/2014 14:06:08.032",
"resolveStyle:for:" : "rs 6/7/2014 11:18:40.612" } }
49 changes: 49 additions & 0 deletions packages/HTML.package/TTFontReader.extension/instance/readFrom..st
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
*html
readFrom: aStream

| fontData headerEntry maxProfileEntry nameEntry indexLocEntry charMapEntry glyphEntry horzHeaderEntry horzMetricsEntry kerningEntry glyphOffset cmap numHMetrics indexToLocFormat |

"Read the raw font byte data"
aStream binary.
fontData := aStream contents asByteArray.
fontDescription := TTFontDescription new.

"Search the tables required to build the font"
(headerEntry := self getTableDirEntry: 'head' from: fontData) == nil ifTrue:[
^self error:'This font does not have a header table'].
(maxProfileEntry := self getTableDirEntry: 'maxp' from: fontData) == nil ifTrue:[
^self error:'This font does not have a maximum profile table'].
(nameEntry := self getTableDirEntry: 'name' from: fontData) == nil ifTrue:[
^self error:'This font does not have a name table'].
(indexLocEntry := self getTableDirEntry: 'loca' from: fontData) == nil ifTrue:[
^self error:'This font does not have a relocation table'].
(charMapEntry := self getTableDirEntry: 'cmap' from: fontData) == nil ifTrue:[
^self error:'This font does not have a character map table'].
(glyphEntry := self getTableDirEntry: 'glyf' from: fontData) == nil ifTrue:[
^self error:'This font does not have a glyph table'].
(horzHeaderEntry := self getTableDirEntry: 'hhea' from: fontData) == nil ifTrue:[
^self error:'This font does not have a horizontal header table'].
(horzMetricsEntry := self getTableDirEntry: 'hmtx' from: fontData) == nil ifTrue:[
^self error:'This font does not have a horizontal metrics table'].
(kerningEntry := self getTableDirEntry: 'kern' from: fontData) == nil ifTrue:[
Transcript cr; show:'This font does not have a kerning table'].


"Process the data"
indexToLocFormat := self processFontHeaderTable: headerEntry.
self processMaximumProfileTable: maxProfileEntry.
self processNamingTable: nameEntry.
glyphOffset := self processIndexToLocationTable: indexLocEntry format: indexToLocFormat.
cmap := self processCharacterMappingTable: charMapEntry.
(cmap == nil or:[cmap value == nil])
ifTrue:[^self error:'This font has no suitable character mappings'].
self processGlyphDataTable: glyphEntry offsets: glyphOffset.
numHMetrics := self processHorizontalHeaderTable: horzHeaderEntry.
self processHorizontalMetricsTable: horzMetricsEntry length: numHMetrics.
kerningEntry isNil
ifTrue:[kernPairs := #()]
ifFalse:[self processKerningTable: kerningEntry].
charMap := self processCharMap: cmap.
fontDescription setGlyphs: glyphs mapping: charMap.
fontDescription setKernPairs: kernPairs.
^fontDescription
Loading

0 comments on commit 60e31a4

Please sign in to comment.