*** empty log message ***
[m17n/m17n-db.git] / FLT / MLYM-OTF.flt
index e60b1a1..67f9bf2 100644 (file)
@@ -1,44 +1,39 @@
-;; MLYM-OTF.flt -- Font Layout Table for Malayalam OpenType font
-;; Copyright (C) 2003, 2004, 2005, 2007, 2008  AIST (H15PRO112)
+;; MLYM-OTF.flt -- Font Layout Table for Malayalam OpenType fonts
+;; Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010 AIST (H15PRO112)
 ;; See the end for copying conditions.
 
 (font layouter mlym-otf nil
-      (font (nil nil unicode-bmp :otf=mlym=akhn)))
+      (version "1.6.0")
+      (font (nil nil unicode-bmp :otf=mlym)))
 
 ;;; <li> MLYM-OTF.flt
 ;;;
 ;;; For Malayalam OpenType fonts to draw the reformed Malayalam script.
 
-;; Tested with the following fonts.  All of these fonts require Halant
-;; movement for syllable-final YA, LA and VA, but not for RA.
+;; AnjaliOldLipi.ttf, Dyuthi3.ttf, Meera_04.ttf, Rachana_04.ttf, suruma2.ttf
+;; blwf: 0d32
+;; pstf: 0d2f 0d30 0d35
 
-;; AnjaliOldLipi.ttf
-;; Dyuthi3.ttf
-;; Kalyani121.ttf
-;; Meera_04.ttf
-;; Rachana_04.ttf
 ;; RaghuMalayalamSans2.ttf
-;; suruma2.ttf
+;; blwf: 0d32
+;; pstf: 0d2f 0d30 0d35 0d41
+
+;; lohit_ml.ttf
+;; blwf: 0d32
+;; pstf: 0d2f 0d30 0d31 0d35 0d41
+
+;; Kalyani121.ttf
+;; blwf: N/A
+;; pstf: 0d2f 0d30 0d32 0d35 0d41
 
 (category
- ;; C: ordinary consonants (except P)
- ;; P: consonants that have a post form
- ;; H: HALANT
- ;; m: vowel sign (pre)
- ;; b: vowel sign (below)
- ;; p: vowel sign (post)
- ;; A: vowel modifier (post)
- ;; V: independent vowel
- ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
- ;; J: ZWJ (ZERO WIDTH JOINER)
- ;; Z: internal use
- ;; X: generic
  (0x0D00 0x0D7F        ?X)                     ; generic
- (0x0D00        ?Z)                    ; internal use
  (0x0D02 0x0D03        ?A)                     ; SIGN ANUSVARA .. VISARGA
  (0x0D05 0x0D14        ?V)                     ; LETTER A .. AU
  (0x0D15 0x0D39 ?C)                    ; LETTER KA .. HA
  (0x0D2F       ?P)                     ; LETTER YA
+ (0x0D30       ?R)                     ; LETTER RA
+ (0x0D32       ?B)                     ; LETTER LA
  (0x0D35       ?P)                     ; LETTER VA
  (0x0D3E 0x0D44        ?p)                     ; VOWEL SIGN AA .. VOCALIC RR
  (0x0D46 0x0D48        ?m)                     ; VOWEL SIGN E .. AI
  (0x0D57       ?p)                     ; AU LENGTH MARK
  (0x0D60 0x0D61        ?V)                     ; LETTER VOCALIC RR .. VOCALIC LL
  (0x0D62 0x0D63 ?b)                    ; VOWEL SIGN VOCALIC L .. LL
- (0x0964 0x0965        ?X)                     ; DANDA .. DOUBLE DANDA
+
  (0x200C       ?N)                     ; ZWNJ
  (0x200D       ?J)                     ; ZWJ
+ (0x25CC       ?X)                     ; DOTTED CIRCLE
+
+ (pstf         ?r)
  )
 
 ;; Stage 0
-;; Decompose two-part vowels.
+;; Preprocessing
 (generator
  (0
   (cond
-   ((0x0D4A)
-    0x0D46 0x0D3E)
-   ((0x0D4B)
-    0x0D47 0x0D3E)
-   ((0x0D4C)
-    0x0D46 0x0D57)
+   ;; Decompose two-part vowel signs
+   ((0x0D4A) 0x0D46 0x0D3E)
+   ((0x0D4B) 0x0D47 0x0D3E)
+   ((0x0D4C) 0x0D46 0x0D57)
+
    ("." =))
   *))
 
 ;; Stage 1
-;; Syllable identification and reordering.  
-;; Put the mark Z after the base consonant.
+;; Syllable identification
+(generator
+ (0
+  (cond
+   ;; Consonant-based syllables
+   ;;1      23                 4
+   ("([CBPR]((J?H|HJ?)[CBPR])*)(H[NJ]?|m?p?A?)"
+    < |
+    (cond
+     (".+HJ$" :otf=mlym=nukt,akhn+)
+     ("(.+)(H)N?$" (1 :otf=mlym=nukt,akhn+) (2 =) 0x200C)
+     (".+" :otf=mlym=nukt,akhn+))
+    | >)
+
+   ;; Syllables with an independent vowel
+   ("V(J?H[BPR])?m?p?A?"
+    < | = * | >)
+
+   ;; Two-part vowel signs
+   ((0x0D46 0x0D3E)
+    (cond
+     ((font-facility 0x25CC) < = 0x25CC = >)
+     (".+" [ 0x0D4A ])))
+   ((0x0D47 0x0D3E)
+    (cond
+     ((font-facility 0x25CC) < = 0x25CC = >)
+     (".+" [ 0x0D4B ])))
+   ((0x0D46 0x0D57)
+    (cond
+     ((font-facility 0x25CC) < = 0x25CC = >)
+     (".+" [ 0x0D4C ])))
+
+   ;; Combining marks are displayed with a DOTTED CIRCLE.
+   ("m"
+    (cond
+     ((font-facility 0x25CC) < = 0x25CC >)
+     ("." [ = ])))
+   ("[HbpA]"
+    (cond
+     ((font-facility 0x25CC) < 0x25CC = >)
+     ("." [ = ])))
+
+   ;; Isolated blwf and pstf are displayed with a DOTTED CIRCLE in the
+   ;; next stage.
+   ("(J)(H)([BPR])"
+    < | (1 =) (3 =) (2 =) | >)
+
+   ("." =))
+  *))
+
+;; Stage 2
+;; Reorder halant for blwf and pstf
 (generator
  (0
   (cond
-   ;; A syllable with a left vowel sign.
-   ;;1    2        3  4
-   ("([CP](H[CP])*)(m)(p?A?)"
-    < | (3 =) (1 move-h) (4 = *) | >)
-
-   ;; A syllable with a right vowel sign, a below vowel sign
-   ;; and/or a vowel modifier.
-   ;;1    2        3
-   ("([CP](H[CP])*)(bA?|pA?|A)"
-    < | (1 move-h) (3 = *) | >)
-
-   ;; Explicit Halant / forced chillu form is separated from the
-   ;; preceding characters.
-   ;;12        3
-   ("(([CP]H)*)([CP]H[NJ])"
-    (1 < | cut-off | >) (3 < | = * | >))
-
-   ;; A syllable with no vowel signs/modifiers.
-   ;;1    2        3
-   ("([CP](H[CP])*)(H)?"
-    < | (1 move-h) (3 =) | >)
-
-   ;; Starting with an independent vowel.
-   ("VA?"
-    < | (0 = *) | >)
+   ;; Isolated blwf and pstf
+   (" J([BP]H) "
+    (cond
+     ((font-facility 0x25CC) < 0x25CC (1 :otf=mlym=blwf,pstf+) >)
+     (" J([BP]H) " [ (1 :otf=mlym=blwf,pstf+) ])))
+
+   ;; Isolated pref
+   (" J(RH) "
+    (cond
+     ((font-facility 0x25CC) < (1 :otf=mlym=pstf+) 0x25CC >)
+     (" J(RH) " [ (1 :otf=mlym=pstf+) ])))
+
+   ;; Overt halnt forms
+   (" ([^ ]+)(HN) "
+    | (1 reorder) (2 = =) |)
+
+   ;; Ordinary syllables
+   (" ([^mbpA ]+)(m?p?A?) "
+    | (1 reorder) (2 = *) |)
 
    ("." =))
   *)
 
+ (reorder
+  (cond
+   ;; pref after pstf
+   ("(.|.+([^PJ]|JP))((J?HP)*J?HR)$"
+    (1 reorder-B *) (3 reorder-any *))
+   ;; pref between blwf and pstf
+   ("(.*[^J])(J?HR(J?HP)+)$"
+    (1 reorder-B *) (2 reorder-any *))
+   ;; pref before blwf
+   ("(.*[^J])(J?HR(J?HB)+(J?HP)*)$"
+    (1 reorder-B *) (2 reorder-any *))
+   ;; no pref
+   ("(.|.+([^PJ]|JP|HJ))((J?HP)*)$"
+    (1 reorder-B *) (3 reorder-any *))))
+
+ (reorder-B
+  (cond
+   ("J?(H)(B)"
+    (2 =) (1 =))
+   ("." =)))
+
+ (reorder-any
+  ("J?(H)(.)"
+   (2 =) (1 =)))
+ )
 
- ;; Move the halant that follows the base consonant to the end.
- (move-h
+;; Stage 3
+;; Language forms and matra reordering
+(generator
+ (0
   (cond
-   ;; All consonants are P's.
-   ("(P)(H)([PH]*)$"
-    (1 =) 0x0D00 (3 = *) (2 =))
+   ;; Overt halant forms
+   (" ([^ ]+)(HN) "
+    | (1 blwf-pstf) (2 = =) |)
 
-   ;; One or more Non-P consonants.
-   ("([CPH]*C)(H)([PH]+)$"
-    (1 = *) 0x0D00 (3 = *) (2 =))
+   ;; Other syllables
+   ;; 1          2   3
+   (" ([^mpA ]+)(m)?(p?A?) "
+    | (2 =) (1 blwf-pstf) (3 = *) |)
 
-   ;; Otherwise, final consonant is not P.  No need to move H.
-   (".+"
-    = * 0x0D00)))
+   ("." =))
+  *)
 
- ;; If there are some letters, make them a separate syllable.
- (cut-off
+ (blwf-pstf
   (cond
-   ("([CP](H[CP])*)(H)?"
-    (1 move-h) (3 =))))
+   ;;1              23     4
+   ("(.|.+BH|.+[^H])((PH)*)(RH)$"
+    (4 :otf=mlym=pstf) (1 :otf=mlym=blwf+) (2 :otf=mlym=pstf+))
+   ;;1   2   3
+   ("(.*)(RH)((PH)+)$"
+    (2 :otf=mlym=pstf+) (1 :otf=mlym=blwf+) (3 :otf=mlym=pstf+))
+   ;;1   2   34     5
+   ("(.*)(RH)((BH)+)((PH)*)$"
+    (2 :otf=mlym=pstf+) (1 :otf=mlym=blwf+) (3 :otf=mlym=blwf+)
+    (5 :otf=mlym=pstf+))
+   ;;1              2
+   ("(.|.+BH|.+[^H])((PH)*)$"
+    (1 :otf=mlym=blwf+) (2 :otf=mlym=pstf+))))
  )
 
-;; Stage 2
-;; Apply GSUB features.
+;; Stage 4
+;; Final reordering (Move pre-base matra and pref after the last halant)
 (generator
  (0
   (cond
-   ;; An ordinary syllable.  The tested fonts make LA's below form
-   ;; with 1. 'half' + 'blws', 2. 'half' + 'pres' or 3. 'akhn'.
-   ;; 1   2        3  4
-   (" (m)?([CPH]*)(Z)([PHbpA]*) "
-    | (1 =) (2 otf:mlym=akhn,half,pstf,pres,abvs,blws+) (3 =)
-    (4 otf:mlym=pstf+) |)
-
-   ;; Explicit Halant.
-   (" ([CP]H)N "
-    | (1 = *) |)
-
-   ;; Forced chillu form.  According to Microsoft Typography
-   ;; <http://www.microsoft.com/typography/otfntdev/malayot/features.htm>
-   ;; 'chillu' glyphs are generated with the 'haln' feature.  However,
-   ;; some fonts generate them with 'half'.
-   (" ([CP]HJ) "
-    | (1 otf:mlym=haln,half+) |)
+   ;; With a pref, one or more intermediate-  and a final overt halant forms.
+   ;; 1  2         3
+   (" (r)([^ ]+HJ?)([^H ]+HN) "
+    | (2 = *) (1 =) (3 = *) |)
+
+   ;; With a pref and a final overt halant form.  Don't move the pref.
+   (" r[^H ]+HN "
+    = *)
+
+   ;; 1     2         3
+   (" (m?r?)([^ ]+HJ?)([^H ]+) "
+    | (2 = *) (1 = *) (3 = *) |)
 
    ("." =))
   *))
 
-;; Stage 3
-;; Second reordering.  If there are glyphs before the base, move left
-;; vowel sign to the left of the base.
+;; Stage 5
+;; Remove ZWNJ/ZWJ
 (generator
  (0
   (cond
-   ;; 1   2       3      4
-   (" (m)?([^Z ]*)([^Z])Z([^ ]*) "
-    | (2 = *) (1 =) (3 =) (4 = *) |)
+   ("[NJ]")
 
    ("." =))
   *))
 
-;; Stage 4
-;; Apply remaining GSUB and GPOS features to all syllables.  To get
-;; correct Y-YA and V-VA conjunctions, we must apply 'psts' to the
-;; entire syllable.
+;; Stage 6
+;; GPOS processing
 (generator
  (0
   (cond
    (" ([^ ]+) "
-    (1 otf:mlym=psts,haln+abvm,blwm,dist))
-   ("."
-    [ = ]))
+    (1 :otf=mlym=+abvm,blwm,dist))
+
+   ("." =))
   *))
 
-;; Copyright (C) 2003, 2004, 2005, 2007, 2008
+;; Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010
 ;;   National Institute of Advanced Industrial Science and Technology (AIST)
 ;;   Registration Number H15PRO112