-;; BENG-OTF.flt -- Font Layout Table for Bengali OpenType font
-;; Copyright (C) 2004, 2007
-;; National Institute of Advanced Industrial Science and Technology (AIST)
-;; Registration Number H15PRO112
-
-;; This file is part of the m17n database; a sub-part of the m17n
-;; library.
-
-;; The m17n library is free software; you can redistribute it and/or
-;; modify it under the terms of the GNU Lesser General Public License
-;; as published by the Free Software Foundation; either version 2.1 of
-;; the License, or (at your option) any later version.
+;; BENG-OTF.flt -- Font Layout Table for Bengali OpenType fonts
+;; Copyright (C) 2004, 2007, 2010 AIST (H15PRO112)
+;; See the end for copying conditions.
-;; The m17n library is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; Lesser General Public License for more details.
-
-;; You should have received a copy of the GNU Lesser General Public
-;; License along with the m17n library; if not, write to the Free
-;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+(font layouter beng-otf nil
+ (version "1.6.0")
+ (font (nil nil unicode-bmp :otf=beng)))
;;; <li> BENG-OTF.flt
;;;
;;; For Bengali OpenType fonts to draw the Bengali script.
-(font layouter beng-otf nil
- (font (nil nil unicode-bmp :otf=beng=rphf)))
+;; After-base glyph order for rendering:
+;; 1. below form consonants
+;; 2. below matra
+;; 3. reph
+;; 4. candrabindu (0981)
+;; 5. post form consonants
+;; 6. post matra
+;; 7. anusvara (0982) and visarga (0983)
(category
;; X: generic
;; V: independent vowel
- ;; C: consonant (except for R, B and Y)
- ;; R: consonant RA
- ;; B: consonant BA
- ;; Y: consonant YA
+ ;; C: consonant
+ ;; B: BA
+ ;; Y: YA
+ ;; R: RA
;; T: KHANDA TA
;; n: NUKTA
;; H: HALANT
;; m: vowel sign (pre)
;; b: vowel sign (below)
;; p: vowel sign (post)
- ;; A: vowel modifier (above)
- ;; a: vowel modifier (post)
- ;; Z: internal use
- ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
- ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; a: vowel modifier (above)
+ ;; A: vowel modifier (post)
+ ;; N: ZWNJ
+ ;; J: ZWJ
(0x0980 0x09FF ?X) ; generic
- (0x0980 ?Z) ; internal use
- (0x0981 ?A) ; SIGN CANDRABINDU
- (0x0982 0x0983 ?a) ; SIGN ANUSVARA .. VISARGA
+ (0x0981 ?a) ; SIGN CANDRABINDU
+ (0x0982 0x0983 ?A) ; SIGN ANUSVARA .. VISARGA
(0x0985 0x0994 ?V) ; LETTER A .. AU
(0x0995 0x09B9 ?C) ; LETTER KA .. HA
(0x09AC ?B) ; LETTER BA
(0x09DC 0x09DF ?C) ; LETTER RRA .. YYA
(0x09E0 0x09E1 ?V) ; LETTER VOCALIC RR, LL
(0x09E2 0x09E3 ?b) ; VOWEL SIGN L .. LL
- (0x09F0 0x09F1 ?C) ; LETTER RR WITH MIDDLE/LOWER DIAGONAL
- (0x0964 0x0965 ?X) ; DANDA .. DOUBLE DANDA
+ (0x09F0 ?R) ; LETTER RA WITH MIDDLE DIAGONAL
+ (0x09F1 ?C) ; LETTER RA WITH LOWER DIAGONAL
+
(0x200C ?N) ; ZWNJ
(0x200D ?J) ; ZWJ
+ (0x25CC ?X) ; DOTTED CIRCLE
+
+ (rphf ?r)
+ (pstf ?P)
)
+;; Stage 0
;; Preprocessing
(generator
(0
0x09C7 0x09BE)
((0x09CC)
0x09C7 0x09D7)
- ;; TA + HALANT + ZWJ -> KHANDA-TA
- ((0x09A4 0x09CD 0x200D)
- 0x09CE)
+
+ ;; Many fonts still do not have KHANDA-TA.
+ ((0x09CE)
+ (cond
+ ((font-facility 0x09CE) =)
+ (".+" 0x09A4 0x09CD 0x200D)))
+
;; consonant + NUKTA
((0x09A1 0x09BC)
0x09DC)
0x09DD)
((0x09AF 0x09BC)
0x09DF)
+
("." =))
*))
-;; Syllable identification and reordering.
+;; Stage 1
+;; Syllable identification
(generator
(0
(cond
- ;; Khanda-Ta
+ ;; Syllables with an independent vowel
+ ("(RH)?(Vn?)((J?H[BYR])?m?b?p?n?a?A?)"
+ < | (1 = =) (2 :otf=beng=nukt+) (3 = *) | >)
+
+ ;; KHANDA-TA combines only with reph.
("(RH)?(T)"
- < | (2 =) (1 otf:beng=rphf+) | >)
-
- ;; Standalone Ya-phalaa
- ("JHY"
- < | post | >)
-
- ;; A syllable with a pre-base vowel sign.
- ;;1 2 3 4 5 6 7 8 9
- ("(RH)?([CRBY]n?(HCn?)*(H[RB])?(J?HY)?)(m)(p)?(A)?(a)?"
- < | (6 =) (2 pre-below) (1 otf:beng=rphf+) (8 =) (2 post) (7 =) (9 =) | >)
-
- ;; A syllable with a non-pre-base vowel sign.
- ;;1 2 3 4 5 6 78 9 10 11
- ("(RH)?([CRBY]n?(HCn?)*(H[RB])?(J?HY)?)(N)?J?((b)|(p))(A)?(a)?"
- < | (6 =) (2 pre-below) (8 =) (1 otf:beng=rphf+) (10 =)
- (2 post) (9 =) (11 =) | >)
-
- ;; A syllable with a vowel modifier and no vowel signs.
- ;;1 2 3 4 5 67 8
- ("(RH)?([CRBY]n?(HCn?)*(H[RB])?(J?HY)?)((A)|(a))"
- < | (2 pre-below) (1 otf:beng=rphf+) (7 =) (2 post) (8 =) | >)
-
- ;; A syllable ending with a halant.
- ;;1 2 3 4 5 6
- ("(RH)?([CRBY]n?(HCn?)*(H[RB])?(J?HY)?)(HN?)?"
- < | (2 pre-below) (6 =) (1 otf:beng=rphf+) (2 post) | >)
-
- ;; A syllable starting with an independent vowel.
- ;;1 2 3
- ("(V)(J?HY)?(A?a?)"
- < | (1 =) 0x0980 (2 post) (3 = *) | >)
+ < (2 =) (1 :otf=beng=rphf+) >)
+
+ ;; Consonant-based syllables
+ ;;1 23 4
+ ("([CBYR]n?((J?H|HJ?)[CBYR]n?)*)(H[NJ]?|m?([NJ]?b)?p?n?a?A?)"
+ < |
+ (cond
+ (".+HJ$" :otf=beng=nukt,akhn+)
+ ("(.+)(H)N?$" (1 :otf=beng=nukt,akhn+) (2 =) 0x200C)
+ (".+" :otf=beng=nukt,akhn+))
+ | >)
+
+ ;; Two-part vowel signs
+ ((0x09C7 0x09BE)
+ (cond
+ ((font-facility 0x25CC) < = 0x25CC = >)
+ (".+" [ 0x09CB ])))
+ ((0x09C7 0x09D7)
+ (cond
+ ((font-facility 0x25CC) < = 0x25CC = >)
+ (".+" [ 0x09CC ])))
+
+ ;; Combining marks are displayed with a DOTTED CIRCLE.
+ ("m"
+ (cond
+ ((font-facility 0x25CC) < = 0x25CC >)
+ ("." [ = ])))
+ ("[nHbpaA]"
+ (cond
+ ((font-facility 0x25CC) < 0x25CC = >)
+ ("." [ = ])))
+
+ ;; Isolated blwf and pstf are displayed with a DOTTED CIRCLE in the
+ ;; next stage.
+ ("(J)(H)([BYR])"
+ < | (1 =) (3 =) (2 =) | >)
("." =))
- *)
+ *))
- ;; Move a halant after the base consonant to the end.
- ;; Put a special mark after the final belew-base consonant.
- ;; Remove post-base parts.
- (pre-below
+;; Stage 2
+;; Reorder halant for blwf and pstf
+(generator
+ (0
(cond
- ("(.+)(H)([RB])(J?HY)?$"
- (1 = *) (3 =) (2 =) 0x0980)
- ("([^J]+)J?HY$"
- (1 = *) 0x0980)
- (".+"
- = * 0x0980)))
-
- ;; Extract post-base parts and add a halant at the end.
- ;; Produce nothing if there are no post-base parts.
- (post
+ ;; Isolated blwf and pstf
+ (" J([BYR]H) "
+ (cond
+ ((font-facility 0x25CC) < 0x25CC (1 :otf=beng=blwf,pstf+) >)
+ (" J([BYR]H) " [ (1 :otf=beng=blwf,pstf+) ])))
+
+ ;; Syllables with an overt halant
+ (" (RHJ?)?([^ ]+)(HN) "
+ | (1 = *) (2 reorder) (3 = =) |)
+
+ ;; Syllables with a below matra
+ (" (RHJ?)?([^mbpaA ]*[^mbpaANJ ])(m?[NJ]?bp?n?a?A?) "
+ | (1 = *) (2 reorder) (3 = *) |)
+
+ ;; Other syllables
+ (" (RHJ?)?([^mbpaA ]+)(m?p?n?a?A?) "
+ | (1 = *) (2 reorder) (3 = *) |)
+
+ ("." =))
+ *)
+
+ (reorder
+ ("(.|.+([^YJ]|JY|HJ))((J?HY)*)$"
+ (1 reorder-BR *) (3 reorder-Y *)))
+
+ ;; Unlike Devanagari and Gujarati, vattu in Bengali does not have a
+ ;; half form. Therefore the sequence CHRHC can be safely reordered
+ ;; to CRHHC. Same for CHBHC.
+ (reorder-BR
(cond
- (".*(H)(Y)$"
+ ("J?(H)([BR])"
(2 =) (1 =))
- (".+"
- ))))
+ ("." =)))
+
+ (reorder-Y
+ ("J?(H)(Y)"
+ (2 =) (1 =)))
+ )
-;; Apply 'nukt' and 'akhn'.
+;; Stage 3
+;; Language forms and matra reordering
(generator
(0
(cond
- (" ([^Z]+)(Z[^ ]*) "
- | (1 otf:beng=nukt,akhn+) (2 = *) |)
+ ;; Overt halant forms
+ (" (RHJ?)?([^ ]+)(HN) "
+ |
+ (1 (cond ("RHJ" :otf=beng=half+)
+ ("RH" :otf=beng=rphf+)))
+ (2 b4post) (2 post) (3 = =) |)
+
+ ;; Syllables with a below matra
+ ;; 1 2 3 4 5
+ (" (RHJ?)?([^mb]*[^mbNJ])(mn?)?([NJ]?bn?)(p?n?a?A?) "
+ | (3 = *)
+ (1 (cond ("RHJ" :otf=beng=half+)
+ ("RH" :otf=beng=rphf+)))
+ (2 b4post) (4 = *) (2 post) (5 = *) |)
+
+ ;; Other syllables
+ ;; 1 2 3 4
+ (" (RHJ?)?([^mpaA ]*)(mn?)?(p?n?a?A?) "
+ | (3 = *)
+ (1 (cond ("RHJ" :otf=beng=half+)
+ ("RH" :otf=beng=rphf+)))
+ (2 b4post) (2 post) (4 = *) |)
+
+ ("." =))
+ *)
+
+ (b4post
+ (cond
+ ("(.H)J?(.*)"
+ (1 :otf=beng=half+)
+ (2 ("(.|.+([^YH]|JY|[BR]H))((YH)*)$" (1 lang-forms *))))
+ ("(.|.+([^YH]|JY|[BR]H))((YH)*)"
+ (1 lang-forms *))))
+
+ (lang-forms
+ (cond
+ ("(.H)J" (1 :otf=beng=half+))
+ (".H" :otf=beng=blwf,half,vatu+)
+ ("." =)))
+
+ (post
+ ("(.|.+([^YH]|JY|[BR]H))((YH)+)$"
+ (3 :otf=beng=pstf+)))
+ )
+
+;; Stage 4
+;; Final reordering #1 (Move pre-base matra after the last halant)
+(generator
+ (0
+ (cond
+ ;; 1 2 3
+ (" (mn?)([^ ]+HJ?)([^H ]+) "
+ | (2 = *) (1 = *) (3 = *) |)
+
("." =))
*))
-;; Apply 'blwf' and 'pstf' to the concerning parts.
+;; Stage 5
+;; Final reordering #2 (Move reph after the first halant)
(generator
(0
(cond
- (" (N?m?.)([^Z]*)(Z)([^ ]*) "
- | (1 = *) (2 otf:beng=blwf+) (3 =) (4 otf:beng=pstf+) |)
- (" (YH) "
- | (1 otf:beng=pstf+) |)
+ ;; Syllables with a reph and an explicit halant
+ ;; 1 2 3 4
+ (" (mn?)?(r)([^HP ]+HJ?)([^ ]*) "
+ | (1 = *) (3 = *) (2 =) (4 = *) |)
+
+ ;; A reph without explicit halant
+ ;; 1 2 3 4
+ (" (mn?)?(r)([^PpaA ]+)(P*(HN)?p?n?a?A?) "
+ | (1 = *) (3 = *) (2 =) (4 = *) |)
+
("." =))
*))
-;; Get pre-base and below-base conjuncts.
+;; Stage 6
+;; Nukta for matra and Presentation forms
(generator
(0
(cond
- (" (N?m?)([^Z]+)(Z)([^ ]*) "
- | (1 = *) (2 otf:beng=half,vatu,pres,blws+) (3 =) (4 = *) |)
+ (" (mn?)?([^ ]+) "
+ | (1 :otf=beng=nukt,init+) (2 :otf=beng=nukt,pres,abvs,blws,psts,haln+) |)
+
("." =))
*))
-;; When the number of glyphs between a pre-base vowel sign and the
-;; post-below mark is more than one, move the pre-base vowel sign
-;; before the final glyph.
+;; Stage 7
+;; Remove ZWNJ/ZWJ
(generator
(0
(cond
- (" (N)?(m)([^Z]+)([^Z])Z([^ ]*) "
- | (1 =) (3 = *) (2 =) (4 =) (5 = *) |)
- (" ([^Z]+)Z([^ ]*) "
- | (1 = *) (2 = *) |)
+ ("[NJ]")
+
("." =))
*))
-;; Get matra conjuncts.
-;; Do not apply 'blws' to syllables that begins with ZWNJ.
+;; Stage 8
+;; GPOS processing
(generator
(0
(cond
- (" N([^ ]+) "
- (1 otf:beng=init,pres,abvs,psts,haln+abvm,blwm,dist))
(" ([^ ]+) "
- (1 otf:beng=init,pres,abvs,blws,psts,haln+abvm,blwm,dist))
- ("."
- [ = ]))
+ (1 :otf=beng=+abvm,blwm,dist))
+
+ ("." =))
*))
+;; Copyright (C) 2004, 2007, 2010
+;; National Institute of Advanced Industrial Science and Technology (AIST)
+;; Registration Number H15PRO112
+
+;; This file is part of the m17n database; a sub-part of the m17n
+;; library.
+
+;; The m17n library is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU Lesser General Public License
+;; as published by the Free Software Foundation; either version 2.1 of
+;; the License, or (at your option) any later version.
+
+;; The m17n library is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; Lesser General Public License for more details.
+
+;; You should have received a copy of the GNU Lesser General Public
+;; License along with the m17n library; if not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
;; Local Variables:
;; mode: emacs-lisp
;; End: