next: GPOS & GSUB tables
parent
3fd8cefdde
commit
7b5a04ba10
@ -0,0 +1,11 @@
|
||||
#lang fontkit/racket
|
||||
(require "ot-processor.rkt")
|
||||
(provide (all-defined-out))
|
||||
|
||||
#|
|
||||
https://github.com/mbutterick/fontkit/blob/master/src/opentype/GPOSProcessor.js
|
||||
|#
|
||||
|
||||
(define-subclass OTProcessor (GPOSProcessor)
|
||||
|
||||
)
|
@ -0,0 +1,11 @@
|
||||
#lang fontkit/racket
|
||||
(require "ot-processor.rkt")
|
||||
(provide (all-defined-out))
|
||||
|
||||
#|
|
||||
https://github.com/mbutterick/fontkit/blob/master/src/opentype/GSUBProcessor.js
|
||||
|#
|
||||
|
||||
(define-subclass OTProcessor (GSUBProcessor)
|
||||
|
||||
)
|
@ -0,0 +1,24 @@
|
||||
#lang fontkit/racket
|
||||
(require "gsub-processor.rkt" "gpos-processor.rkt")
|
||||
(provide (all-defined-out))
|
||||
|
||||
#|
|
||||
https://github.com/mbutterick/fontkit/blob/master/src/opentype/OTLayoutEngine.js
|
||||
|#
|
||||
|
||||
(define-subclass object% (OTLayoutEngine font)
|
||||
(field [glyphInfos #f]
|
||||
[plan #f]
|
||||
[GSUBProcessor #f]
|
||||
[GPOSProcessor #f])
|
||||
|
||||
(report 'dingdong)
|
||||
(when (· font has-gsub-table?)
|
||||
(set-field! GSUBProcessor this (+GSUBProcessor font (· font GSUB))))
|
||||
|
||||
(when (· font has-gpos-table?)
|
||||
(set-field! GPOSProcessor this (+GPOSProcessor font (· font GPOS))))
|
||||
|
||||
|
||||
|
||||
)
|
@ -0,0 +1,79 @@
|
||||
#lang fontkit/racket
|
||||
(require (prefix-in Script- "script.rkt"))
|
||||
(provide (all-defined-out))
|
||||
|
||||
#|
|
||||
https://github.com/mbutterick/fontkit/blob/master/src/opentype/OTProcessor.js
|
||||
|#
|
||||
|
||||
|
||||
(define DEFAULT_SCRIPTS '(DFLT dflt latn))
|
||||
|
||||
(define-subclass object% (OTProcessor font table)
|
||||
(field [script #f]
|
||||
[scriptTag #f]
|
||||
[language #f]
|
||||
[languageTag #f]
|
||||
[features (mhash)]
|
||||
[lookups (mhash)])
|
||||
|
||||
;; initialize to default script + language
|
||||
(selectScript)
|
||||
|
||||
;; current context (set by applyFeatures)
|
||||
(field [glyphs empty]
|
||||
[positions empty] ; only used by GPOS
|
||||
[ligatureID 1])
|
||||
|
||||
(define/public (findScript script)
|
||||
(unless (script? script)
|
||||
(raise-argument-error 'findScript "script" script))
|
||||
(and (· this table scriptList)
|
||||
(let ([script (if (not (list? script)) (list script) script)])
|
||||
(for*/first ([entry (in-list (· this table scriptList))]
|
||||
[s (in-list script)]
|
||||
#:when (equal? (· entry tag) s))
|
||||
entry))))
|
||||
|
||||
|
||||
(define/public (selectScript script language)
|
||||
(let/ec return!
|
||||
(define changed #f)
|
||||
(define entry #f)
|
||||
(when (or (not (· this script)) (not (equal? script (· this scriptTag))))
|
||||
(set! entry (findScript script))
|
||||
(when script
|
||||
(set! entry (findScript script))) ; ? why double dip
|
||||
(when (not entry)
|
||||
(set! entry (findScript DEFAULT_SCRIPTS)))
|
||||
(when (not entry)
|
||||
(return! (void)))
|
||||
(set-field! scriptTag this (· entry tag))
|
||||
(set-field! script this (· entry script))
|
||||
(set-field! direction this (Script-direction script))
|
||||
(set-field! language this #f)
|
||||
(set! changed #t))
|
||||
|
||||
(when (and (not language) (not (equal? language (· this languageTag))))
|
||||
(for/first ([lang (in-list (· this script langSysRecords))]
|
||||
#:when (equal? (· lang tag) language))
|
||||
(set-field! language this (· lang langSys))
|
||||
(set-field! languageTag this (· lang tag))
|
||||
(set! changed #t)))
|
||||
|
||||
(when (not (· this language))
|
||||
(set-field! language this (· this script defaultLangSys)))
|
||||
|
||||
;; Build a feature lookup table
|
||||
(when changed
|
||||
(set-field! features this (mhash))
|
||||
(when (· this language)
|
||||
(for ([featureIndex (in-list (· this language featureIndexes))])
|
||||
(define record (hash-ref (· this table featureList) featureIndex))
|
||||
(hash-set! (· this features) (· record tag)) (· record feature))))))
|
||||
|
||||
|
||||
)
|
||||
|
||||
|
||||
|
@ -1,23 +1,182 @@
|
||||
#lang fontkit/racket
|
||||
(provide (all-defined-out))
|
||||
|
||||
;; approximates
|
||||
;; https://github.com/devongovett/fontkit/blob/master/src/layout/Script.js
|
||||
#|
|
||||
https://github.com/mbutterick/fontkit/blob/master/src/layout/Script.js
|
||||
|#
|
||||
|
||||
(define/contract (script-for-string str)
|
||||
(string? . -> . symbol?)
|
||||
;; infers unicode script from string.
|
||||
;; todo: everything
|
||||
'latn)
|
||||
;; This maps the Unicode Script property to an OpenType script tag
|
||||
;; Data from http://www.microsoft.com/typography/otspec/scripttags.htm
|
||||
;; and http://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt.
|
||||
|
||||
(define UNICODE_SCRIPTS
|
||||
(apply mhash
|
||||
'(Caucasian_Albanian aghb
|
||||
Arabic arab
|
||||
Imperial_Aramaic armi
|
||||
Armenian armn
|
||||
Avestan avst
|
||||
Balinese bali
|
||||
Bamum bamu
|
||||
Bassa_Vah bass
|
||||
Batak batk
|
||||
Bengali '(bng2 beng)
|
||||
Bopomofo bopo
|
||||
Brahmi brah
|
||||
Braille brai
|
||||
Buginese bugi
|
||||
Buhid buhd
|
||||
Chakma cakm
|
||||
Canadian_Aboriginal cans
|
||||
Carian cari
|
||||
Cham cham
|
||||
Cherokee cher
|
||||
Coptic copt
|
||||
Cypriot cprt
|
||||
Cyrillic cyrl
|
||||
Devanagari '(dev2 deva)
|
||||
Deseret dsrt
|
||||
Duployan dupl
|
||||
Egyptian_Hieroglyphs egyp
|
||||
Elbasan elba
|
||||
Ethiopic ethi
|
||||
Georgian geor
|
||||
Glagolitic glag
|
||||
Gothic goth
|
||||
Grantha gran
|
||||
Greek grek
|
||||
Gujarati '(gjr2 gujr)
|
||||
Gurmukhi '(gur2 guru)
|
||||
Hangul hang
|
||||
Han hani
|
||||
Hanunoo hano
|
||||
Hebrew hebr
|
||||
Hiragana hira
|
||||
Pahawh_Hmong hmng
|
||||
Katakana_Or_Hiragana hrkt
|
||||
Old_Italic ital
|
||||
Javanese java
|
||||
Kayah_Li kali
|
||||
Katakana kana
|
||||
Kharoshthi khar
|
||||
Khmer khmr
|
||||
Khojki khoj
|
||||
Kannada '(knd2 knda)
|
||||
Kaithi kthi
|
||||
Tai_Tham lana
|
||||
Lao lao
|
||||
Latin latn
|
||||
Lepcha lepc
|
||||
Limbu limb
|
||||
Linear_A lina
|
||||
Linear_B linb
|
||||
Lisu lisu
|
||||
Lycian lyci
|
||||
Lydian lydi
|
||||
Mahajani mahj
|
||||
Mandaic mand
|
||||
Manichaean mani
|
||||
Mende_Kikakui mend
|
||||
Meroitic_Cursive merc
|
||||
Meroitic_Hieroglyphs mero
|
||||
Malayalam '(mlm2 mlym)
|
||||
Modi modi
|
||||
Mongolian mong
|
||||
Mro mroo
|
||||
Meetei_Mayek mtei
|
||||
Myanmar '(mym2 mymr)
|
||||
Old_North_Arabian narb
|
||||
Nabataean nbat
|
||||
Nko nko
|
||||
Ogham ogam
|
||||
Ol_Chiki olck
|
||||
Old_Turkic orkh
|
||||
Oriya orya
|
||||
Osmanya osma
|
||||
Palmyrene palm
|
||||
Pau_Cin_Hau pauc
|
||||
Old_Permic perm
|
||||
Phags_Pa phag
|
||||
Inscriptional_Pahlavi phli
|
||||
Psalter_Pahlavi phlp
|
||||
Phoenician phnx
|
||||
Miao plrd
|
||||
Inscriptional_Parthian prti
|
||||
Rejang rjng
|
||||
Runic runr
|
||||
Samaritan samr
|
||||
Old_South_Arabian sarb
|
||||
Saurashtra saur
|
||||
Shavian shaw
|
||||
Sharada shrd
|
||||
Siddham sidd
|
||||
Khudawadi sind
|
||||
Sinhala sinh
|
||||
Sora_Sompeng sora
|
||||
Sundanese sund
|
||||
Syloti_Nagri sylo
|
||||
Syriac syrc
|
||||
Tagbanwa tagb
|
||||
Takri takr
|
||||
Tai_Le tale
|
||||
New_Tai_Lue talu
|
||||
Tamil taml
|
||||
Tai_Viet tavt
|
||||
Telugu '(tel2 telu)
|
||||
Tifinagh tfng
|
||||
Tagalog tglg
|
||||
Thaana thaa
|
||||
Thai thai
|
||||
Tibetan tibt
|
||||
Tirhuta tirh
|
||||
Ugaritic ugar
|
||||
Vai vai
|
||||
Warang_Citi wara
|
||||
Old_Persian xpeo
|
||||
Cuneiform xsux
|
||||
Yi yi
|
||||
Inherited zinh
|
||||
Common zyyy
|
||||
Unknown zzzz)))
|
||||
|
||||
(define/contract (script-for-codepoints codepoints)
|
||||
((listof integer?) . -> . symbol?)
|
||||
;; infers unicode script from string.
|
||||
;; todo: everything
|
||||
(error 'script-for-codepoints-unimplemented))
|
||||
|
||||
(define/contract (fromUnicode script)
|
||||
((option/c script?) . -> . script?)
|
||||
(hash-ref UNICODE_SCRIPTS script #f))
|
||||
|
||||
(define/contract (script-direction script)
|
||||
((or/c symbol? #f) . -> . symbol?)
|
||||
'ltr) ; todo everything
|
||||
(define-stub-stop forString)
|
||||
|
||||
(define-stub-stop forCodePoints)
|
||||
|
||||
(define RTL '( arab ;; Arabic
|
||||
hebr ;; Hebrew
|
||||
syrc ;; Syriac
|
||||
thaa ;; Thaana
|
||||
cprt ;; Cypriot Syllabary
|
||||
khar ;; Kharosthi
|
||||
phnx ;; Phoenician
|
||||
|nko | ;; N'Ko
|
||||
lydi ;; Lydian
|
||||
avst ;; Avestan
|
||||
armi ;; Imperial Aramaic
|
||||
phli ;; Inscriptional Pahlavi
|
||||
prti ;; Inscriptional Parthian
|
||||
sarb ;; Old South Arabian
|
||||
orkh ;; Old Turkic, Orkhon Runic
|
||||
samr ;; Samaritan
|
||||
mand ;; Mandaic, Mandaean
|
||||
merc ;; Meroitic Cursive
|
||||
mero ;; Meroitic Hieroglyphs
|
||||
|
||||
;; Unicode 7.0 (not listed on http://www.microsoft.com/typography/otspec/scripttags.htm)
|
||||
mani ;; Manichaean
|
||||
mend ;; Mende Kikakui
|
||||
nbat ;; Nabataean
|
||||
narb ;; Old North Arabian
|
||||
palm ;; Palmyrene
|
||||
phlp ;; Psalter Pahlavi
|
||||
))
|
||||
|
||||
(define/contract (direction script)
|
||||
((option/c script?) . -> . (or/c 'rtl 'ltr))
|
||||
(if (memq script RTL) 'rtl 'ltr))
|
Binary file not shown.
Loading…
Reference in New Issue