;; BENG-OTF.flt -- Font Layout Table for Bengali OpenType fonts ;; Copyright (C) 2004, 2007, 2010 AIST (H15PRO112) ;; See the end for copying conditions. (font layouter beng-otf nil (version "1.6.0") (font (nil nil unicode-bmp :otf=beng))) ;;;
  • BENG-OTF.flt ;;; ;;; For Bengali OpenType fonts to draw the Bengali script. ;; 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 ;; 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) ;; N: ZWNJ ;; J: ZWJ (0x0980 0x09FF ?X) ; generic (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 (0x09AF ?Y) ; LETTER YA (0x09B0 ?R) ; LETTER RA (0x09BC ?n) ; SIGN NUKTA (0x09BE ?p) ; VOWEL SIGN AA (0x09BF ?m) ; VOWEL SIGN I (0x09C0 ?p) ; VOWEL SIGN II (0x09C1 0x09C4 ?b) ; VOWEL SIGN U .. RR (0x09C7 0x09C8 ?m) ; VOWEL SIGN E .. AI (0x09CD ?H) ; SIGN VIRAMA (0x09CE ?T) ; LETTER KHANDA TA (0x09D7 ?p) ; AU LENGTH MARK (0x09DC 0x09DF ?C) ; LETTER RRA .. YYA (0x09E0 0x09E1 ?V) ; LETTER VOCALIC RR, LL (0x09E2 0x09E3 ?b) ; VOWEL SIGN L .. LL (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 (cond ;; Decompose two-part vowel signs. ((0x09CB) 0x09C7 0x09BE) ((0x09CC) 0x09C7 0x09D7) ;; Many fonts still do not have KHANDA-TA. ((0x09CE) (cond ((font-facility 0x09CE) =) (".+" 0x09A4 0x09CD 0x200D))) ;; consonant + NUKTA ((0x09A1 0x09BC) 0x09DC) ((0x09A2 0x09BC) 0x09DD) ((0x09AF 0x09BC) 0x09DF) ("." =)) *)) ;; Stage 1 ;; Syllable identification (generator (0 (cond ;; 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+) >) ;; 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 =) | >) ("." =)) *)) ;; Stage 2 ;; Reorder halant for blwf and pstf (generator (0 (cond ;; 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 ("J?(H)([BR])" (2 =) (1 =)) ("." =))) (reorder-Y ("J?(H)(Y)" (2 =) (1 =))) ) ;; Stage 3 ;; Language forms and matra reordering (generator (0 (cond ;; 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 = *) |) ("." =)) *)) ;; Stage 5 ;; Final reordering #2 (Move reph after the first halant) (generator (0 (cond ;; 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 = *) |) ("." =)) *)) ;; Stage 6 ;; Nukta for matra and Presentation forms (generator (0 (cond (" (mn?)?([^ ]+) " | (1 :otf=beng=nukt,init+) (2 :otf=beng=nukt,pres,abvs,blws,psts,haln+) |) ("." =)) *)) ;; Stage 7 ;; Remove ZWNJ/ZWJ (generator (0 (cond ("[NJ]") ("." =)) *)) ;; Stage 8 ;; GPOS processing (generator (0 (cond (" ([^ ]+) " (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: