;; MLYM-OTF.flt -- Font Layout Table for Malayalam OpenType font ;; Copyright (C) 2003, 2004, 2005 ;; 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., 59 Temple Place, Suite 330, Boston, MA ;; 02111-1307, USA. ;;;
  • MLYM-OTF.flt ;;; ;;; For Malayalam OpenType fonts to draw the reformed Malayalam script. ;; The first stage is to extract a syllable and re-order characters. (category ;; C: consonant (except for BPR) ;; B: consonant that is the subject of "blws" feature ;; P: consonant that is the subject of "pstf" feature ;; R: consonant RA ;; H: HALANT (VIRAMA) ;; m: MATRA (Mpre) ;; p: MATRA (Mpost) ;; t: MATRA (two-part: Mpre+Mpost) ;; A: vowel modifier (post) (ANUSVARA and VISARGA) ;; V: independent vowel ;; N: ZWNJ (ZERO WIDTH NON-JOINER) ;; J: ZWJ (ZERO WIDTH JOINER) ;; E: else (all other independnt characters) (0x0D00 0x0D7F ?E) ; else (0x0D02 0x0D03 ?A) ; ANUSVARA & VISARGA (0x0D05 0x0D14 ?V) ; independent vowel (0x0D15 0x0D39 ?C) ; consonant ;; Accorind to www.microsoft.com/typography/otfntdev/indicot/appen.htm, ;; these must be classified into 'B' category, but at least, it ;; doesn't work with this font ;; http://www.supersoftweb.com/THOOLIUC.TTF ;;(0x0D1F ?B) ; TTA ;;(0x0D23 ?B) ; NNA ;;(0x0D26 ?B) ; DA (0x0D2F ?P) ; YA (0x0D30 ?R) ; RA (0x0D32 ?B) ; LA (0x0D35 ?P) ; VA (0x0D3E 0x0D43 ?p) ; dependent vowel (Mpost) (0x0D46 0x0D48 ?m) ; dependent vowel (Mpre) (0x0D4A 0x0D4C ?t) ; dependent vowel (two-part) (0x0D4D ?H) ; VIRAMA (HALANT) (0x0D57 ?p) ; dependent vowel (Mpost) (0x0D60 ?V) ; VOCALIC RR (0x0D61 ?V) ; VOCALIC LL (0x200C ?N) ; ZWNJ (0x200D ?J) ; ZWJ (0x0D7D ?x) ; marker inserted before base-C (0x0D7E ?y) ; marker inserted after base-C (0x0D7F ?z) ; marker inserted before last Ra ) ;; The 1st stage is to extract a syllable while moving a Halant ;; following Cbase to the tail and partitioning two-part matras into ;; parts. (generator (0 (cond ;; If [CR]H is followed by ZWNJ/ZWJ, move ZWNJ/ZWJ) to the head so ;; that the later stages find it quickly. ("([CBPR]H)([NJ])" < | (2 =) (1 = =) | >) ;; A syllable starting with a consonant and ending with a vowel ;; and/or a vowel modifier. ("(([CBPR]H)*[CBPR])([pmt]A?|A)" < | (1 move-halant) (3 partition = =) | >) ;; A syllable starting with a consonant and ending without a vowel ;; nor a vowel modifier. ("(([CBPR]H)*[CBPR])(H)?" < | (1 move-halant) (3 =) | >) ;; A syllable starting with an independent vowel. ("(VA?)" < | (1 = *) | >) ;; Other independent character. ("." =)) *) ;; Move Halant to the tail if necessary. Insert 0x0D7D before Cbase, ;; 0x0D7E after Cbase, 0x0D7F before the tailing RH (if any). They ;; work as markers in the following stages. (move-halant (cond ;; In the first two cases, we don't have to move Halant. ("[BPR]$" ; Single consonant. 0x0D7D 0x0D7E =) ("(([CBPR]H)*)(C)$" ; Cbase is at tail. (1 = *) 0x0D7D (3 =) 0x0D7E) ;; In the following cases, we must move Halant to the tail. ("(([CBPR]H)*)([C])H(([BR]H)*)(R)$" ; Cbase is at head or middle. (1 = *) 0x0D7D (3 =) 0x0D7E (4 = *) 0x0D7F 0x0D30 0x0D4D) ("(([CBPR]H)*)([C])H(([BR]H)*[BP])$" ; Cbase is at head or middle. (1 = *) 0x0D7D (3 =) 0x0D7E (4 = *) 0x0D4D) ("(RH)?(.)H(.*)$" ; No Cbase, move the first ; Halant to the tail. (1 = *) 0x0D7D (2 = ) 0x0D7E (3 = *) 0x0D4D))) ;; Partition two-part matras into parts. (partition (cond ((0x0D4A) 0x0D46 0x0D3E) ((0x0D4B) 0x0D47 0x0D3E) ;; Unicode suggests this partitioning: ((0x0D4C) 0x0D46 0x0D57) ;; but it is questionable. Perhaps, this substitution is better. ;; ((0x0D4C) 0x0D57) ))) ;; The 2nd stage is to apply GSUB for prebase part. (generator (0 (cond ;; Originally [CBPR]H is followed by ZWNJ. Apply no feature (just ;; cmap). (" N([^ ]*) " (1 otf:mlym=+)) ;; Originally [CBPR]H is followed by ZWJ. Apply only GSUB haln ;; feature. (" J([^ ]*) " (1 otf:mlym=haln+)) ;; Syllable starting with a consonant should match this pattern. (" ([^ y]*)y([^ z]*)(z..)?([^ ]*) " | (1 otf:mlym=~blwf,~pstf,~blws,~psts,*+) ; Prebase part. 0x0D7E ; Preserve this marker. (2 = *) ; Postbase part. (3 = *) ; Optional tailing RH. (4 = *) ; Optional Mpost. |) ;; A syllable starting with an independent vowel. (" ([^ ]*) " (1 otf:mlym+)) ;; Any other independent character. Apply no feature (just cmap). ("." [ otf:mlym=+ ] )) *)) ;; The 3rd stage is to move Mpre (if any) and tailing RH (if any) ;; forward to just before the base consonant. (generator (0 (cond (" ([^x]*)(.)xy([^ zm]*)(z(..))?(m)?([^ ]*) " | (1 = *) (4 (5 otf:mlym=pstf+)) (6 =) 0x0D7D (2 =) (3 = *) (7 = *) |) (" ([^x]*)x(.)y([^ zm]*)(z(..))?(m)?([^ ]*) " | (1 = *) (4 (5 otf:mlym=pstf+)) (6 =) 0x0D7D (2 =) (3 = *) (7 = *) |) (" xy([^ m]*)(m)?([^ ]*) " | (2 =) 0x0D7D (1 = *) (3 = *) |) ("[NJ]") ("." = )) *)) ;; The 4th stage is to apply GSUB to postbase part. (generator (0 (cond (" ([^x]*)x(.H) " | (1 = *) (2 otf:mlym=haln) |) (" ([^x]*)x([^ ]*) " | (1 = *) (2 otf:mlym=~akhn,~haln,blwf,pstf,vatu,*+) |) ("." =)) *)) ;; The 5th (last) stage is to apply GPOS features. (generator (0 (cond (" ([^ ]*) " (1 otf:mlym=)) ("." =)) *)) ;; Local Variables: ;; mode: emacs-lisp ;; End: