Moved from the parent directory. Add layouter information.
authorntakahas <ntakahas>
Tue, 29 May 2007 09:08:59 +0000 (09:08 +0000)
committerntakahas <ntakahas>
Tue, 29 May 2007 09:08:59 +0000 (09:08 +0000)
37 files changed:
FLT/ARAB-OTF-NO-GPOS.flt [new file with mode: 0644]
FLT/ARAB-OTF.flt [new file with mode: 0644]
FLT/ARAB.flt [new file with mode: 0644]
FLT/BENG-OTF.flt [new file with mode: 0644]
FLT/DEVA-CDAC.flt [new file with mode: 0644]
FLT/DEVA-OTF.flt [new file with mode: 0644]
FLT/GUJR-OTF.flt [new file with mode: 0644]
FLT/GURU-OTF.flt [new file with mode: 0644]
FLT/HEBR-FF.flt [new file with mode: 0644]
FLT/HEBR.flt [new file with mode: 0644]
FLT/KHMR-ANLONG.flt [new file with mode: 0644]
FLT/KHMR-MULE.flt [new file with mode: 0644]
FLT/KHMR-OTF.flt [new file with mode: 0644]
FLT/KNDA-OTF.flt [new file with mode: 0644]
FLT/LAOO-ALICE.flt [new file with mode: 0644]
FLT/LAOO-GENERIC.flt [new file with mode: 0644]
FLT/LAOO-MULE.flt [new file with mode: 0644]
FLT/LAOO-OTF.flt [new file with mode: 0644]
FLT/MLYM-CDAC.flt [new file with mode: 0644]
FLT/MLYM-OTF.flt [new file with mode: 0644]
FLT/MLYM-RACHANA.flt [new file with mode: 0644]
FLT/MYMR-MYAZEDI.flt [new file with mode: 0644]
FLT/NO-CTL.flt [new file with mode: 0644]
FLT/ORYA-OTF.flt [new file with mode: 0644]
FLT/SINH-OTF.flt [new file with mode: 0644]
FLT/SYRC-OTF.flt [new file with mode: 0644]
FLT/TAML-CDAC.flt [new file with mode: 0644]
FLT/TAML-OTF.flt [new file with mode: 0644]
FLT/TELU-OTF.flt [new file with mode: 0644]
FLT/THAA-OTF.flt [new file with mode: 0644]
FLT/THAI-GENERIC.flt [new file with mode: 0644]
FLT/THAI-NORASI.flt [new file with mode: 0644]
FLT/THAI-OTF.flt [new file with mode: 0644]
FLT/THAI-TIS620.flt [new file with mode: 0644]
FLT/TIBT-MTIB.flt [new file with mode: 0644]
FLT/TIBT-MULE.flt [new file with mode: 0644]
FLT/TIBT-OTF.flt [new file with mode: 0644]

diff --git a/FLT/ARAB-OTF-NO-GPOS.flt b/FLT/ARAB-OTF-NO-GPOS.flt
new file mode 100644 (file)
index 0000000..98c8b3d
--- /dev/null
@@ -0,0 +1,259 @@
+;; ARAB-OTF-NO-GPOS.flt -- Font Layout Table for Arabic OpenType font sans GPOS
+;; Copyright (C) 2005, 2006, 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.
+
+;; 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.
+
+;;; <li> ARAB-OTF-NO-GPOS.flt
+;;;
+;;; For Arabic OpenType fonts that don't have GPOS table to draw the
+;;; Arabic script.
+
+(font layouter arab-otf-no-gpos nil
+      (font (nil nil unicode-bmp :otf=arab=init,medi,fina,liga+~mark)))
+
+;; Step 0: Move Kazakh high hamza.
+
+(category
+ ;; p: high hamza carrier (p for positive)
+ ;; n: high hamza suppressor (n for negative)
+ ;; x: don't care
+ (0x0600 0x06FF                ?x)
+ (0x0750 0x077F                ?x)             ; Arabic Supplement
+ (0x0674 0x0678                ?p)
+ (0x0643               ?n)
+ (0x06AF               ?n)
+ (0x06D5               ?n)
+ (0x200C               ?x)
+ (0x200D               ?x)
+ (0x25CC               ?x)
+ (0xFB50 0xFDFF                ?X)             ; Arabic Presentation Forms-A
+ (0xFE70 0xFEFC                ?X)             ; Arabic Presentation Forms-B
+ )
+
+(generator
+ (0
+  (cond
+   ;; If a presentation form is found, draw the whole sequence as is.
+   (".*X.*" = *)
+
+   (".*p.*"                            ; If a high hamza is found,
+    (cond
+     (".*n.*"                          ;   and a suppressor exists,
+      rmhamza *)                       ;   then remove the high hamza.
+     (0                                        ;   Otherwise, move the high
+      0x674 rmhamza *)))               ;   hamza to the beginning.
+   (0 = *)))                           ; If no high hamza, do nothing.
+
+ (rmhamza
+  (cond
+   ((0x0674)           )
+   ((0x0675)           0x0627)
+   ((0x0676)           0x0648)
+   ((0x0677)           0x06C7)
+   ((0x0678)           0x0649)
+   ("."                        =))))
+
+;; Step 1: ccmp
+
+(category
+ ;; D: Dual-joining (beh, teh, etc. & zwj)
+ ;; R: Right-joining (alef, dal, thal, reh, zain)
+ ;; U: Non-joining (Hamza, etc. & zwnj)
+ ;; T: Transparent (combining marks)
+ (0x060B 0x060F                ?U)
+ (0x0610 0x0615                ?T)
+ (0x061B               ?U)
+ (0x061E 0x061F                ?U)
+ (0x0621               ?U)
+ (0x0622 0x0623                ?R)
+ (0x0624               ?R)
+ (0x0625               ?R)
+ (0x0626               ?D)
+ (0x0627               ?R)
+ (0x0628               ?D)
+ (0x0629               ?R)
+ (0x062A 0x062E                ?D)
+ (0x062F 0x0632                ?R)
+ (0x0633 0x0647                ?D)
+ (0x0648               ?R)
+ (0x0649 0x064A                ?D)
+ (0x064B 0x065E                ?T)
+ (0x0660 0x066D                ?U)
+ (0x066E 0x066F                ?D)
+ (0x0670               ?T)
+ (0x0671 0x0673                ?R)
+ (0x0674 0x0678                ?U)
+ (0x0679 0x0687                ?D)
+ (0x0688 0x0699                ?R)
+ (0x069A 0x06C3                ?D)
+ (0x06C4 0x06CB                ?R)
+ (0x06CC 0x06CE                ?D)
+ (0x06CF               ?R)
+ (0x06D0 0x06D3                ?D)
+ (0x06D4               ?U)
+ (0x06D5               ?R)
+ (0x06D6 0x06E4                ?T)
+ (0x06E5 0x06E6                ?U)
+ (0x06E7 0x06E8                ?T)
+ (0x06E9               ?U)
+ (0x06EA 0x06ED                ?T)
+ (0x06EE 0x06EF                ?R)
+ (0x06F0 0x06F9                ?U)
+ (0x06FA 0x06FC                ?D)
+ (0x06FD 0x06FE                ?U)
+ (0x06FF               ?D)
+ (0x0750 0x0758                ?D)
+ (0x0759 0x075B                ?R)
+ (0x075C 0x076A                ?D)
+ (0x076B 0x076C                ?R)
+ (0x076D               ?D)
+ (0x200C               ?U)
+ (0x200D               ?D)
+ (0x25CC               ?U)
+ (0xFB50 0xFDFF                ?X)             ; Arabic Presentation Forms-A
+ (0xFE70 0xFEFC                ?X)             ; Arabic Presentation Forms-B
+ )
+
+;; (generator
+;;  (0
+;;   otf:arab=ccmp))
+
+;; Step 2: Initial, medial, or final.
+
+(generator
+ (0
+  (cond
+   (".*X.*" (cond ("[DRUX]T*" < = * >) ("." =)) *)
+
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      <
+      (1 otf:arab=init)
+      (2 = *)
+      >
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      <
+      (1 otf:arab=isol)
+      (2 = *)
+      >
+      (3 disjoin))))
+
+   ("([RU])(T*)(.*)"
+    <
+    (1 otf:arab=isol)
+    (2 = *)
+    >
+    (3 disjoin))
+
+   ("(T+)(.*)"
+    (1 = *)
+    (2 disjoin))))
+
+ (join
+  (cond
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      <
+      (1 otf:arab=medi)
+      (2 = *)
+      >
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      <
+      (1 otf:arab=fina)
+      (2 = *)
+      >
+      (3 disjoin))))
+
+   ("(.)(T*)(.*)"
+    <
+    (1 otf:arab=fina)
+    (2 = *)
+    >
+    (3 disjoin))))
+
+ (disjoin
+  (cond
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      <
+      (1 otf:arab=init)
+      (2 = *)
+      >
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      <
+      (1 otf:arab=isol)
+      (2 = *)
+      >
+      (3 disjoin))))
+
+   ("(.)(T*)(.*)"                      ; == ([RU])(T*)(.*)
+    <
+    (1 otf:arab=isol)
+    (2 = *)
+    >
+    (3 disjoin)))))
+
+;; Step 3: GPOS features.
+
+(generator
+ (0
+  (cond
+   ((0x0651 0x0650) tc+bc 0x064E tc+bc 0x0651) ; shadda + kasra
+   ((0x0651 0x064D) tc+bc 0x064B tc+bc 0x0651) ; shadda + kasratan
+   ((range 0x0610 0x0615) tc+bc =)
+   ((0x064B) tc+bc =)
+   ((0x064C) tc+bc =)
+   ((0x064D) bc-tc =)
+   ((0x064E) tc+bc =)
+   ((0x064F) tc+bc =)
+   ((0x0650) bc-tc =)
+   ((range 0x0651 0x0654) tc+bc =)
+   ((0x0655) bc-tc =)
+   ((0x0656) bc-tc =)
+   ((range 0x0657 0x065B) tc+bc =)
+   ((0x065C) bc-tc =)
+   ((0x065D) tc+bc =)
+   ((0x065E) tc+bc =)
+   ((0x0670) tc+bc =)
+   ((range 0x06D6 0x06DC) tc+bc =)
+   ((range 0x06DF 0x06E2) tc+bc =)
+   ((0x06E3) bc-tc =)
+   ((0x06E4) tc+bc =)
+   ((0x06E7) tc+bc =)
+   ((0x06E8) tc+bc =)
+   ((0x06EA) bc-tc =)
+   ((0x06EB) tc+bc =)
+   ((0x06EC) tc+bc =)
+   ((0x06ED) bc-tc =)
+   ((0x200C)   =)
+   ((0x200D)   =)
+   ("." =))
+  *))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/ARAB-OTF.flt b/FLT/ARAB-OTF.flt
new file mode 100644 (file)
index 0000000..71a529d
--- /dev/null
@@ -0,0 +1,233 @@
+;; ARAB-OTF.flt -- Font Layout Table for Arabic OpenType font
+;; Copyright (C) 2004, 2006, 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.
+
+;; 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.
+
+;;; <li> ARAB-OTF.flt
+;;;
+;;; For Arabic OpenType fonts to draw the Arabic script.
+
+(font layouter arab-otf nil
+      (font (nil nil unicode-bmp :otf=arab=init,medi,fina,liga+mark)))
+
+;; Step 0: Move Kazakh high hamza.
+
+(category
+ ;; p: high hamza carrier (p for positive)
+ ;; n: high hamza suppressor (n for negative)
+ ;; x: don't care
+ (0x0600 0x06FF                ?x)
+ (0x0750 0x077F                ?x)             ; Arabic Supplement
+ (0x0674 0x0678                ?p)
+ (0x0643               ?n)
+ (0x06AF               ?n)
+ (0x06D5               ?n)
+ (0x200C               ?x)
+ (0x200D               ?x)
+ (0x25CC               ?x)
+ (0xFB50 0xFDFF                ?X)             ; Arabic Presentation Forms-A
+ (0xFE70 0xFEFC                ?X)             ; Arabic Presentation Forms-B
+ )
+
+(generator
+ (0
+  (cond
+   ;; If a presentation form is found, draw the whole sequence as is.
+   (".*X.*" = *)
+
+   (".*p.*"                            ; If a high hamza is found,
+    (cond
+     (".*n.*"                          ;   and a suppressor exists,
+      rmhamza *)                       ;   then remove the high hamza.
+     (0                                        ;   Otherwise, move the high
+      0x674 rmhamza *)))               ;   hamza to the beginning.
+   (0 = *)))                           ; If no high hamza, do nothing.
+
+ (rmhamza
+  (cond
+   ((0x0674)           )
+   ((0x0675)           0x0627)
+   ((0x0676)           0x0648)
+   ((0x0677)           0x06C7)
+   ((0x0678)           0x0649)
+   ("."                        =))))
+
+;; Step 1: ccmp
+
+(category
+ ;; D: Dual-joining (beh, teh, etc. & zwj)
+ ;; R: Right-joining (alef, dal, thal, reh, zain)
+ ;; U: Non-joining (Hamza, etc. & zwnj)
+ ;; T: Transparent (combining marks)
+ (0x060B 0x060F                ?U)
+ (0x0610 0x0615                ?T)
+ (0x061B               ?U)
+ (0x061E 0x061F                ?U)
+ (0x0621               ?U)
+ (0x0622 0x0623                ?R)
+ (0x0624               ?R)
+ (0x0625               ?R)
+ (0x0626               ?D)
+ (0x0627               ?R)
+ (0x0628               ?D)
+ (0x0629               ?R)
+ (0x062A 0x062E                ?D)
+ (0x062F 0x0632                ?R)
+ (0x0633 0x0647                ?D)
+ (0x0648               ?R)
+ (0x0649 0x064A                ?D)
+ (0x064B 0x065E                ?T)
+ (0x0660 0x066D                ?U)
+ (0x066E 0x066F                ?D)
+ (0x0670               ?T)
+ (0x0671 0x0673                ?R)
+ (0x0674 0x0678                ?U)
+ (0x0679 0x0687                ?D)
+ (0x0688 0x0699                ?R)
+ (0x069A 0x06C3                ?D)
+ (0x06C4 0x06CB                ?R)
+ (0x06CC 0x06CE                ?D)
+ (0x06CF               ?R)
+ (0x06D0 0x06D3                ?D)
+ (0x06D4               ?U)
+ (0x06D5               ?R)
+ (0x06D6 0x06E4                ?T)
+ (0x06E5 0x06E6                ?U)
+ (0x06E7 0x06E8                ?T)
+ (0x06E9               ?U)
+ (0x06EA 0x06ED                ?T)
+ (0x06EE 0x06EF                ?R)
+ (0x06F0 0x06F9                ?U)
+ (0x06FA 0x06FC                ?D)
+ (0x06FD 0x06FE                ?U)
+ (0x06FF               ?D)
+ (0x0750 0x0758                ?D)
+ (0x0759 0x075B                ?R)
+ (0x075C 0x076A                ?D)
+ (0x076B 0x076C                ?R)
+ (0x076D               ?D)
+ (0x200C               ?U)
+ (0x200D               ?D)
+ (0x25CC               ?U)
+ (0xFB50 0xFDFF                ?X)             ; Arabic Presentation Forms-A
+ (0xFE70 0xFEFC                ?X)             ; Arabic Presentation Forms-B
+ )
+
+;; (generator
+;;  (0
+;;   otf:arab=ccmp))
+
+;; Step 2: Initial, medial, or final.
+
+(generator
+ (0
+  (cond
+   (".*X.*" (cond ("[DRUX]T*" < = * >) ("." =)) *)
+
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      <
+      (1 otf:arab=init)
+      (2 = *)
+      >
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      <
+      (1 otf:arab=isol)
+      (2 = *)
+      >
+      (3 disjoin))))
+
+   ("([RU])(T*)(.*)"
+    <
+    (1 otf:arab=isol)
+    (2 = *)
+    >
+    (3 disjoin))
+
+   ("(T+)(.*)"
+    (1 = *)
+    (2 disjoin))))
+
+ (join
+  (cond
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      <
+      (1 otf:arab=medi)
+      (2 = *)
+      >
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      <
+      (1 otf:arab=fina)
+      (2 = *)
+      >
+      (3 disjoin))))
+
+   ("(.)(T*)(.*)"
+    <
+    (1 otf:arab=fina)
+    (2 = *)
+    >
+    (3 disjoin))))
+
+ (disjoin
+  (cond
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      <
+      (1 otf:arab=init)
+      (2 = *)
+      >
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      <
+      (1 otf:arab=isol)
+      (2 = *)
+      >
+      (3 disjoin))))
+
+   ("(.)(T*)(.*)"                      ; == ([RU])(T*)(.*)
+    <
+    (1 otf:arab=isol)
+    (2 = *)
+    >
+    (3 disjoin)))))
+
+;; Step 3: Other GSUB features (ligatures, etc.)
+
+(generator
+ (0
+  otf:arab=rlig,calt,liga,dlig,cswh,mset))
+
+;; Step 4: GPOS features.
+
+(generator
+ (0
+  otf:arab=))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/ARAB.flt b/FLT/ARAB.flt
new file mode 100644 (file)
index 0000000..0a1b168
--- /dev/null
@@ -0,0 +1,558 @@
+;; ARAB.flt -- Font Layout Table for Arabic font (Unicode encoding)
+;; Copyright (C) 2003, 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.
+
+;; 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 arab nil
+      (font (nil bitstream\ cyberbase unicode-bmp)))
+
+;;; <li> ARAB.flt
+;;;
+;;; For Arabic fonts of Unicode encoding to draw Arabic script.
+
+;; phase 1: Kazakh high hamza
+(category
+ (0x0600 0x06FF                ?x)
+ (0x0675 0x0678                ?p)
+ (0x0643               ?n)
+ (0x06AF               ?n)
+ (0x06D5               ?n)
+ (0x200C               ?x)
+ (0x200D               ?x)
+ (0xFB50 0xFDFF                ?x)             ; Arabic Presentation Forms-A
+ (0xFE70 0xFEFC                ?x)             ; Arabic Presentation Forms-B
+ )
+
+(generator
+ (0
+  (cond
+   (".*p.*"
+    (cond
+     (".*n.*"
+      rmhamza *)
+     ("(.)(.*)"
+      (1 < 0x0674 rmhamza >)
+      (2 rmhamza *))))
+   (0 = *)))
+
+ (rmhamza
+  (cond
+   ((0x0675)   0x0627)
+   ((0x0676)   0x0648)
+   ((0x0677)   0x06C7)
+   ((0x0678)   0x0649)
+   ("."                =))))
+
+;; phase 2: ligatures
+(category
+ (0x0600 0x06FF                ?x)             ; general
+ (0x0622               ?a)             ; alef madda
+ (0x0623               ?b)             ; alef hamza above
+ (0x0625               ?c)             ; alef hamza below
+ (0x0627               ?d)             ; alef
+ (0x0644               ?l)             ; lam
+ (0x064B 0x0655                ?t)             ; combinings
+ (0x0670               ?t)             ; combining
+ (0x06D6 0x06ED                ?t)             ; combinings
+ (0x06E5               ?x)
+ (0x06E6               ?x)
+ (0x06E9               ?x)
+ (0x200C               ?x)
+ (0x200D               ?x)
+ (0xFB50 0xFDFF                ?x)
+ (0xFE70 0xFEFC                ?x)
+ )
+
+(generator
+ (0
+  (cond
+   ("l(t*)a(t*)"
+    0xFEF5
+    (1 = *)
+    (2 = *))
+   ("l(t*)b(t*)"
+    0xFEF7
+    (1 = *)
+    (2 = *))
+   ("l(t*)c(t*)"
+    0xFEF9
+    (1 = *)
+    (2 = *))
+   ("l(t*)d(t*)"
+    0xFEFB
+    (1 = *)
+    (2 = *))
+   ("."
+    =))
+  *))
+
+;; phase 3: joining
+(category
+ ;; D: Dual-joining (beh, teh, etc. & zwj)
+ ;; R: Right-joining (alef, dal, thal, reh, zain)
+ ;; U: Non-joining (Hamza, etc. & zwnj)
+ ;; T: Transparent (combining marks)
+ ;; P: Already in Arabic Presentation Form A & B
+ (0x060C 0x060F                ?U)
+ (0x0610 0x0615                ?T)
+ (0x061B               ?U)
+ (0x061F               ?U)
+ (0x0621               ?U)
+ (0x0622 0x0623                ?R)
+ (0x0624               ?R)
+ (0x0625               ?R)
+ (0x0626               ?D)
+ (0x0627               ?R)
+ (0x0628               ?D)
+ (0x0629               ?R)
+ (0x062A 0x062E                ?D)
+ (0x062F 0x0632                ?R)
+ (0x0633 0x0647                ?D)
+ (0x0648               ?R)
+ (0x0649 0x064A                ?D)
+ (0x064B 0x0658                ?T)
+ (0x0660 0x066D                ?U)
+ (0x066E 0x066F                ?D)
+ (0x0670               ?T)
+ (0x0671 0x0673                ?R)
+ (0x0674 0x0678                ?U)
+ (0x0679 0x0687                ?D)
+ (0x0688 0x0699                ?R)
+ (0x069A 0x06C3                ?D)
+ (0x06C4 0x06CB                ?R)
+ (0x06CC 0x06CE                ?D)
+ (0x06CF               ?R)
+ (0x06D0 0x06D3                ?D)
+ (0x06D4               ?U)
+ (0x06D5               ?R)
+ (0x06D6 0x06E4                ?T)
+ (0x06E5 0x06E6                ?U)
+ (0x06E7 0x06E8                ?T)
+ (0x06E9               ?U)
+ (0x06EA 0x06ED                ?T)
+ (0x06EE 0x06EF                ?R)
+ (0x06F0 0x06F9                ?U)
+ (0x06FA 0x06FC                ?D)
+ (0x06FD 0x06FE                ?U)
+ (0x06FF               ?D)
+ (0xFB50 0xFDFF                ?P)
+ (0xFE70 0xFEFC                ?P)
+ (0xFEF5               ?R)
+ (0xFEF7               ?R)
+ (0xFEF9               ?R)
+ (0xFEFB               ?R)
+ (0x200C               ?U)
+ (0x200D               ?D)
+ )
+
+(generator
+ (0
+  (cond
+   ("PT*"
+    = combining *)
+
+   ("D[^P]*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      (1 initial)
+      (2 combining *)
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      (1 isolated)
+      (2 combining *)
+      (3 disjoin))))
+
+   ("([RU])(T*)([^P]*)"
+    (1 isolated)
+    (2 combining *)
+    (3 disjoin))
+
+   ("(T+)([^P]*)"
+    (1 = *)
+    (2 disjoin)))
+
+  *)
+
+ (join
+  (cond
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      (1 medial)
+      (2 combining *)
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      (1 final)
+      (2 combining *)
+      (3 disjoin))))
+
+   ("(.)(T*)(.*)"                      ; == (R)(T*)(.*)
+    (1 final)
+    (2 combining *)
+    (3 disjoin))))
+
+ (disjoin
+  (cond
+   ("D.*"
+    (cond
+     ("(.)(T*)([DR].*)"
+      (1 initial)
+      (2 combining *)
+      (3 join))
+     ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
+      (1 isolated)
+      (2 combining *)
+      (3 disjoin))))
+
+   ("(.)(T*)(.*)"                      ; == ([RU])(T*)(.*)
+    (1 isolated)
+    (2 combining *)
+    (3 disjoin))))
+
+ (isolated
+  (cond
+   ((range 0x060C 0x060F)      =)
+   ((0x061B)   =)
+   ((0x061F)   =)
+   ((0x0621)   0xFE80)
+   ((0x0622)   0xFE81)
+   ((0x0623)   0xFE83)
+   ((0x0624)   0xFE85)
+   ((0x0625)   0xFE87)
+   ((0x0626)   0xFE89)
+   ((0x0627)   0xFE8D)
+   ((0x0628)   0xFE8F)
+   ((0x0629)   0xFE93)
+   ((0x062A)   0xFE95)
+   ((0x062B)   0xFE99)
+   ((0x062C)   0xFE9D)
+   ((0x062D)   0xFEA1)
+   ((0x062E)   0xFEA5)
+   ((0x062F)   0xFEA9)
+   ((0x0630)   0xFEAB)
+   ((0x0631)   0xFEAD)
+   ((0x0632)   0xFEAF)
+   ((0x0633)   0xFEB1)
+   ((0x0634)   0xFEB5)
+   ((0x0635)   0xFEB9)
+   ((0x0636)   0xFEBD)
+   ((0x0637)   0xFEC1)
+   ((0x0638)   0xFEC5)
+   ((0x0639)   0xFEC9)
+   ((0x0640)   0x0640)
+   ((0x063A)   0xFECD)
+   ((0x0641)   0xFED1)
+   ((0x0642)   0xFED5)
+   ((0x0643)   0xFED9)
+   ((0x0644)   0xFEDD)
+   ((0x0645)   0xFEE1)
+   ((0x0646)   0xFEE5)
+   ((0x0647)   0xFEE9)
+   ((0x0648)   0xFEED)
+   ((0x0649)   0xFEEF)
+   ((0x064A)   0xFEF1)
+   ((range 0x0660 0x066D)      =)
+   ((0x0671)   0xFB50)
+   ((0x0674)   =)
+   ((0x0677)   0xFBDD)
+   ((0x0679)   0xFB66)
+   ((0x067A)   0xFB5E)
+   ((0x067B)   0xFB52)
+   ((0x067E)   0xFB56)
+   ((0x067F)   0xFB62)
+   ((0x0680)   0xFB5A)
+   ((0x0683)   0xFB76)
+   ((0x0684)   0xFB72)
+   ((0x0686)   0xFB7A)
+   ((0x0687)   0xFB7E)
+   ((0x0688)   0xFB88)
+   ((0x068C)   0xFB84)
+   ((0x068D)   0xFB82)
+   ((0x068E)   0xFB86)
+   ((0x0691)   0xFB8C)
+   ((0x0698)   0xFB8A)
+   ((0x06A4)   0xFB6A)
+   ((0x06A6)   0xFB6E)
+   ((0x06A9)   0xFB8E)
+   ((0x06AD)   0xFBD3)
+   ((0x06AF)   0xFB92)
+   ((0x06B1)   0xFB9A)
+   ((0x06B3)   0xFB96)
+   ((0x06BA)   0xFB9E)
+   ((0x06BB)   0xFBA0)
+   ((0x06BE)   0xFBAA)
+   ((0x06C0)   0xFBA4)
+   ((0x06C1)   0xFBA6)
+   ((0x06C5)   0xFBE0)
+   ((0x06C6)   0xFBD9)
+   ((0x06C7)   0xFBD7)
+   ((0x06C8)   0xFBDB)
+   ((0x06C9)   0xFBE2)
+   ((0x06CB)   0xFBDE)
+   ((0x06CC)   0xFBFC)
+   ((0x06D0)   0xFBE4)
+   ((0x06D2)   0xFBAE)
+   ((0x06D3)   0xFBB0)
+   ((0x06D4)   =)
+   ((0x06D5)   0xFEE9)
+   ((0x06E5)   =)
+   ((0x06E6)   =)
+   ((0x06E9)   =)
+   ((range 0x06F0 0x06F9)      =)
+   ((0x06FD)   =)
+   ((0x06FE)   =)
+   ((0xFEF5)   =)
+   ((0xFEF7)   =)
+   ((0xFEF9)   =)
+   ((0xFEFB)   =)
+   ((0x200C)   =)
+   ((0x200D)   =)
+   ))
+
+ (final
+  (cond
+   ((0x0622)   0xFE82)
+   ((0x0623)   0xFE84)
+   ((0x0624)   0xFE86)
+   ((0x0625)   0xFE88)
+   ((0x0626)   0xFE8A)
+   ((0x0627)   0xFE8E)
+   ((0x0628)   0xFE90)
+   ((0x0629)   0xFE94)
+   ((0x062A)   0xFE96)
+   ((0x062B)   0xFE9A)
+   ((0x062C)   0xFE9E)
+   ((0x062D)   0xFEA2)
+   ((0x062E)   0xFEA6)
+   ((0x062F)   0xFEAA)
+   ((0x0630)   0xFEAC)
+   ((0x0631)   0xFEAE)
+   ((0x0632)   0xFEB0)
+   ((0x0633)   0xFEB2)
+   ((0x0634)   0xFEB6)
+   ((0x0635)   0xFEBA)
+   ((0x0636)   0xFEBE)
+   ((0x0637)   0xFEC2)
+   ((0x0638)   0xFEC6)
+   ((0x0639)   0xFECA)
+   ((0x0640)   0x0640)
+   ((0x063A)   0xFECE)
+   ((0x0641)   0xFED2)
+   ((0x0642)   0xFED6)
+   ((0x0643)   0xFEDA)
+   ((0x0644)   0xFEDE)
+   ((0x0645)   0xFEE2)
+   ((0x0646)   0xFEE6)
+   ((0x0647)   0xFEEA)
+   ((0x0648)   0xFEEE)
+   ((0x0649)   0xFEF0)
+   ((0x064A)   0xFEF2)
+   ((0x0671)   0xFB51)
+   ((0x0679)   0xFB67)
+   ((0x067A)   0xFB5F)
+   ((0x067B)   0xFB52)
+   ((0x067E)   0xFB57)
+   ((0x067F)   0xFB63)
+   ((0x0680)   0xFB5B)
+   ((0x0683)   0xFB77)
+   ((0x0684)   0xFB73)
+   ((0x0686)   0xFB7B)
+   ((0x0687)   0xFB7F)
+   ((0x0688)   0xFB89)
+   ((0x068C)   0xFB85)
+   ((0x068D)   0xFB83)
+   ((0x068E)   0xFB87)
+   ((0x0691)   0xFB8D)
+   ((0x0698)   0xFB8B)
+   ((0x06A4)   0xFB6B)
+   ((0x06A6)   0xFB6F)
+   ((0x06A9)   0xFB8F)
+   ((0x06AD)   0xFBD4)
+   ((0x06AF)   0xFB93)
+   ((0x06B1)   0xFB9B)
+   ((0x06B3)   0xFB97)
+   ((0x06BA)   0xFB9F)
+   ((0x06BB)   0xFBA1)
+   ((0x06BE)   0xFBAB)
+   ((0x06C0)   0xFBA5)
+   ((0x06C1)   0xFBA7)
+   ((0x06C5)   0xFBE1)
+   ((0x06C6)   0xFBDA)
+   ((0x06C7)   0xFBD8)
+   ((0x06C8)   0xFBDC)
+   ((0x06C9)   0xFBE3)
+   ((0x06CB)   0xFBDF)
+   ((0x06CC)   0xFBFD)
+   ((0x06D0)   0xFBE5)
+   ((0x06D2)    0xFBAF)
+   ((0x06D3)   0xFBB1)
+   ((0x06D5)   0xFEEA)
+   ((0xFEF5)   0xFEF6)
+   ((0xFEF7)   0xFEF8)
+   ((0xFEF9)   0xFEFA)
+   ((0xFEFB)   0xFEFC)
+   ((0x200C)   =)
+   ((0x200D)   =)
+   ))
+
+ (initial
+  (cond
+   ((0x0626)   0xFE8B)
+   ((0x0628)   0xFE91)
+   ((0x062A)   0xFE97)
+   ((0x062B)   0xFE9B)
+   ((0x062C)   0xFE9F)
+   ((0x062D)   0xFEA3)
+   ((0x062E)   0xFEA7)
+   ((0x0633)   0xFEB3)
+   ((0x0634)   0xFEB7)
+   ((0x0635)   0xFEBB)
+   ((0x0636)   0xFEBF)
+   ((0x0637)   0xFEC3)
+   ((0x0638)   0xFEC7)
+   ((0x0639)   0xFECB)
+   ((0x0640)   0x0640)
+   ((0x063A)   0xFECF)
+   ((0x0641)   0xFED3)
+   ((0x0642)   0xFED7)
+   ((0x0643)   0xFEDB)
+   ((0x0644)   0xFEDF)
+   ((0x0645)   0xFEE3)
+   ((0x0646)   0xFEE7)
+   ((0x0647)   0xFEEB)
+   ((0x0649)   0xFBE8)
+   ((0x064A)   0xFEF3)
+   ((0x0679)   0xFB68)
+   ((0x067A)   0xFB60)
+   ((0x067B)   0xFB54)
+   ((0x067E)   0xFB58)
+   ((0x067F)   0xFB64)
+   ((0x0680)   0xFB5C)
+   ((0x0683)   0xFB78)
+   ((0x0684)   0xFB74)
+   ((0x0686)   0xFB7C)
+   ((0x0687)   0xFB80)
+   ((0x06A4)   0xFB6C)
+   ((0x06A6)   0xFB70)
+   ((0x06A9)   0xFB90)
+   ((0x06AD)   0xFBD5)
+   ((0x06AF)   0xFB94)
+   ((0x06B1)   0xFB9C)
+   ((0x06B3)   0xFB98)
+   ((0x06BA)   0xFEE7)
+   ((0x06BB)   0xFBA2)
+   ((0x06BE)   0xFBAC)
+   ((0x06C1)   0xFBA8)
+   ((0x06CC)   0xFBFE)
+   ((0x06D0)   0xFBE6)
+   ((0x200C)   =)
+   ((0x200D)   =)
+   ))
+
+ (medial
+  (cond
+   ((0x0626)   0xFE8C)
+   ((0x0628)   0xFE92)
+   ((0x062A)   0xFE98)
+   ((0x062B)   0xFE9C)
+   ((0x062C)   0xFEA0)
+   ((0x062D)   0xFEA4)
+   ((0x062E)   0xFEA8)
+   ((0x0633)   0xFEB4)
+   ((0x0634)   0xFEB8)
+   ((0x0635)   0xFEBC)
+   ((0x0636)   0xFEC0)
+   ((0x0637)   0xFEC4)
+   ((0x0638)   0xFEC8)
+   ((0x0639)   0xFECC)
+   ((0x0640)   0x0640)
+   ((0x063A)   0xFED0)
+   ((0x0641)   0xFED4)
+   ((0x0642)   0xFED8)
+   ((0x0643)   0xFEDC)
+   ((0x0644)   0xFEE0)
+   ((0x0645)   0xFEE4)
+   ((0x0646)   0xFEE8)
+   ((0x0647)   0xFEEC)
+   ((0x0649)   0xFBE9)
+   ((0x064A)   0xFEF4)
+   ((0x0679)   0xFB69)
+   ((0x067A)   0xFB61)
+   ((0x067B)   0xFB55)
+   ((0x067E)   0xFB59)
+   ((0x067F)   0xFB65)
+   ((0x0680)   0xFB5D)
+   ((0x0683)   0xFB79)
+   ((0x0684)   0xFB75)
+   ((0x0686)   0xFB7D)
+   ((0x0687)   0xFB81)
+   ((0x06A4)   0xFB6D)
+   ((0x06A6)   0xFB71)
+   ((0x06A9)   0xFB91)
+   ((0x06AD)   0xFBD6)
+   ((0x06AF)   0xFB95)
+   ((0x06B1)   0xFB9D)
+   ((0x06B3)   0xFB99)
+   ((0x06BA)   0xFEE8)
+   ((0x06BB)   0xFBA3)
+   ((0x06BE)   0xFBAD)
+   ((0x06C1)   0xFBA9)
+   ((0x06CC)   0xFBFF)
+   ((0x06D0)   0xFBE7)
+   ((0x200C)   =)
+   ((0x200D)   =)
+   ))
+
+ (combining
+  (cond
+   ((0x0651 0x0650) tc+bc 0x064E tc+bc 0x0651) ; shadda + kasra
+   ((0x0651 0x064D) tc+bc 0x064B tc+bc 0x0651) ; shadda + kasratan
+   ((range 0x0610 0x0615) tc+bc =)
+   ((0x064B) tc+bc =)
+   ((0x064C) tc+bc =)
+   ((0x064D) bc-tc =)
+   ((0x064E) tc+bc =)
+   ((0x064F) tc+bc =)
+   ((0x0650) bc-tc =)
+   ((range 0x0651 0x0654) tc+bc =)
+   ((0x0655) bc-tc =)
+   ((0x0656) bc-tc =)
+   ((0x0657) tc+bc =)
+   ((0x0658) tc+bc =)
+   ((0x0670) tc+bc =)
+   ((range 0x06D6 0x06DC) tc+bc =)
+   ((range 0x06DF 0x06E2) tc+bc =)
+   ((0x06E3) bc-tc =)
+   ((0x06E4) tc+bc =)
+   ((0x06E7) tc+bc =)
+   ((0x06E8) tc+bc =)
+   ((0x06EA) bc-tc =)
+   ((0x06EB) tc+bc =)
+   ((0x06EC) tc+bc =)
+   ((0x06ED) bc-tc =)
+   ((0x200C)   =)
+   ((0x200D)   =)
+   ))
+ )
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/BENG-OTF.flt b/FLT/BENG-OTF.flt
new file mode 100644 (file)
index 0000000..fe76ba1
--- /dev/null
@@ -0,0 +1,486 @@
+;; 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.
+
+;; 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.
+
+;;; <li> BENG-OTF.flt
+;;;
+;;; For Bengali OpenType fonts to draw the Bengali script.  Tested with
+;;; MuktiNarrow.ttf <http://www.nongnu.org/freebangfont/index.html>
+;;; and
+;;; LikhanNormal.otf <http:http://www.stat.wisc.edu/~deepayan/Bengali/WebPage/Font/fonts.html>
+
+(font layouter beng-otf nil
+      (font (nil nil unicode-bmp :otf=beng=rphf)))
+
+(category
+ ;; C: consonant (excluding B, Y and R)
+ ;; B: consonant BA (below)
+ ;; Y: consonant YA (post)
+ ;; R: consonant RA (reph, below)
+ ;; n: NUKTA
+ ;; H: HALANT
+ ;; m: MATRA (pre)
+ ;; b: MATRA (below)
+ ;; p: MATRA (post)
+ ;; t: MATRA (two-part)
+ ;; A: vowel modifier (above)
+ ;; a: vowel modifier (post)
+ ;; V: independent vowel
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0964 0x0965        ?E)                     ; DANDA, DOUBLE DANDA
+ (0x0980 0x09FF        ?E)                     ; ELSE
+ (0x0981       ?A)                     ; SIGN CANDRABINDU (above)
+ (0x0982 0x0983        ?a)                     ; SIGN ANUSWAR, VISARGA (post)
+ (0x0985 0x098C        ?V)                     ; LETTER A .. VOCALIC L
+ (0x098F 0x0990        ?V)                     ; LETTER E .. AI
+ (0x0993 0x0994        ?V)                     ; LETTER O .. 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 (post)
+ (0x09BF       ?m)                     ; VOWEL SIGN I (pre)
+ (0x09C0       ?p)                     ; VOWEL SIGN II (post)
+ (0x09C1 0x09C4        ?b)                     ; VOWEL SIGN U, UU, R, RR (below)
+ (0x09C7 0x09C8        ?m)                     ; VOWEL SIGN E, AI (pre)
+ (0x09CB 0x09CC ?t)                    ; VOWEL SIGN O, AU (two-part)
+ (0x09CD       ?H)                     ; SIGN VIRAMA (HASANT)
+ (0x09CE       ?C)                     ; LETTER KHANDA TA
+ (0x09D7       ?p)                     ; AU LENGTH MARK
+ (0x09DC 0x09DD        ?C)                     ; LETTER RRA, RHA
+ (0x09DF       ?C)                     ; LETTER YYA
+ (0x09E0 0x09E1        ?V)                     ; LETTER VOCALIC RR, LL
+ (0x09E2 0x09E3        ?b)                     ; VOWEL SIGN L .. LL (below)
+ (0x09F0 0x09F1        ?C)                     ; LETTER RR', RR'' (assamese)
+ (0x09FE       ?x)                     ; mark #1 (internal use)
+ (0x09FF       ?y)                     ; mark #2 (internal use)
+ )
+
+;; Step 1 : Syllable identification.  Recognised syllables are quoted
+;; by the pseudo character, which is generated by the command "|" and
+;; has the category " " (space).
+(generator
+ (0
+  (cond
+   ;; Special case.  The sequence "C1 H N C2 m" is reordered as
+   ;; "C1 H m C2", not "m C1 H C2".  Besides, "C1 H" is drawn in the
+   ;; halant-form.
+   ("([CRBY]n?H)N"
+    < |
+    (1 otf:beng=hln)
+    | >)
+
+   ;; Case A-C are for those syllables that end with an explicit vowel
+   ;; mark and/or a vowel modifier.  They are divided into three cases
+   ;; for the readability of regular expression.  The leading
+   ;; consonant-Hasant repetition is analysed for reordering in the
+   ;; next step.  Two-part vowel, if any, is split for
+   ;; canonicalisation.
+
+   ;; Case A : A syllable ending with a vowel modifier.
+   ;;1    23                4          5       6   7
+   ("(RH)?(([CRBY]n?HJ?)*([CRBY]n?))([mbp]*)(t)?([Aa])"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (5 = *)
+    (6 split)
+    (7 =)
+    | >)
+
+   ;; Case B : A syllable ending with a two-part vowel.
+   ;;1    23                4          5
+   ("(RH)?(([CRBY]n?HJ?)*([CRBY]n?))(t)"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (5 split)
+    | >)
+
+   ;; Case C : A syllable ending with other vowel.  Note that a
+   ;; two-part vowel may be expressed with two vowel marks for
+   ;; backward compatibility.
+   ;;1    23                4          5
+   ("(RH)?(([CRBY]n?HJ?)*([CRBY]n?))([mbp]+)"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (5 = *)
+    | >)
+
+   ;; Case D : Ya-phalaa.  Reorder H and Y for the next step.
+   ;; The web page "Unicode FAQ for Indic Scripts and Languages"
+   ;; <http://www.unicode.org/faq/indic.html> says "it should be
+   ;; permissible for the Ya-phalla to be consistently formed by "ZWNJ
+   ;; + VIRAMA + YA".
+   ("([CRBY]n?N)(H)(Y)"
+    < |
+    (1 = *)
+    (3 =)
+    (2 =)
+    | >)
+
+   ;; Case E : No explicit vowel nor modifier.  If the syllable ends
+   ;; with a consonant, analyse it for reordering in the next step.
+   ;; Otherwise, just identify the syllable without changing anything.
+   ;;1    23                         4
+   ("(RH)?(([CRBY]n?HJ?)*[CRBY]n?)(HN|HJ|H)?"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (4 = *)
+    | >)
+
+   ;; Case F : Syllables that begin with an independent vowel.  An
+   ;; optional HYp sequence appears when this syllable represents the
+   ;; sound "a" in English "bat" (see the FAQ above).  If it appears,
+   ;; we reorder the H and Y for the next step.
+   ("(V)(HYp)?([aA])?"
+    < | (1 =) (2 ("HY(p)" 0x09AF 0x09CD (1 =))) (3 =) | >)
+
+   ("." =))
+  *)
+
+ ;; Set mark #1 (x) at the position where below consonants begin, and
+ ;; mark #2 (y) at the position to which below and above signs will be
+ ;; moved.
+ (set-marks
+  (cond
+   ;; Ending with Y.
+   ;;1        2            3  45        6
+   ("([CRBY]n?(HJ?Cn?)*)(H)(([RB]H)*)(Y)"
+    (1 = *)                            ; prebase & base
+    0x09FE                             ; mark #1
+    (4 = *)                            ; below consonants
+    0x09FF                             ; mark #2
+    (6 =)                              ; YA
+    (3 =))                             ; moved HASANT
+   ;; Ending with R or B.
+   ;;1        2            3  45
+   ("([CRBY]n?(HJ?Cn?)*)(H)(([RB]H)*[RB])"
+    (1 = *)                            ; prebase & base
+    0x09FE                             ; mark #1
+    (4 = *)                            ; below consonants 
+    (3 =)                              ; moved HASANT
+    0x09FF)                            ; mark #2
+   (".+"
+    = *
+    0x09FE                             ; mark #1
+    0x09FF)))                          ; mark #2
+
+ ;; Split two-part dependent vowel signs for canonicalisation.
+ (split
+  (cond
+   ((0x09CB)   0x09C7 0x09BE)
+   ((0x09CC)   0x09C7 0x09D7)))
+ )
+
+;; Step 2 : Move Reph and Matra if necessary.  From now on, we care
+;; only for those syllables that have been identified in Step 1.
+(generator
+ (0
+  (cond
+   ;; Special case: a single consonant and a Halant.
+   (" (.)xy(HJ?) "
+    |
+    0x09FE
+    (1 =)
+    (2 = *)
+    0x09FE
+    |)
+
+   ;; This is the most generic pattern.  It follows Cases A, B, C and
+   ;; E in Step 1.  Now Mark #1 is used to indicate the critical part
+   ;; that requires pre-base substitution in the following steps.
+
+   ;; 1    2         3        4    5   6   7   8   9   10
+   (" (RH)?([^ xy]+)x([^ y]*)y(YH)?(m)?(b)?(p)?(A)?(a)?(HJ|H)? "
+    |
+    (5 =)                              ; [Mpre]
+    ;; Actually, the nukt feature is not necessary for Bengali because
+    ;; all the necessary Nukta forms are precomposed in the Unicode
+    ;; standard.  Even if a Nukta consonant is given in the form of
+    ;; the combination of the base consonant and a Nukta sign, we can
+    ;; safely perform the composition here because it does not affect
+    ;; surrounding letters in the syllable.  The Akhand ligature
+    ;; operation is also applied here, before applying the half form
+    ;; operation because the Mukti font generates Akhand ligatures
+    ;; directly from the "C H C" sequence, not via the half form.
+    0x09FE                             ; begin Cpre & Cbase
+    (2 otf:beng=nukt,akhn)             ; {Cpre + H} + Cbase
+    0x09FE                             ; end Cpre & Cbase
+    (3 otf:beng=blwf)                  ; {Cbelow + H}
+    (6 =)                              ; [Mbelow]
+    (1 otf:beng=rphf)                  ; [Reph]
+    (8 =)                              ; [VMabove]
+    (4 otf:beng=pstf)                  ; [Cpost + H]
+    (7 =)                              ; [Mpost]
+    (9 =)                              ; [VMpost]
+    (10 = *)                           ; optional HASANT
+    |)
+
+   ;; Syllables that begin with an independent vowel (following up
+   ;; Step 1, Case F).  If a YH sequence exist, it is changed to the
+   ;; post-base form.  Syllables of this type do not require further
+   ;; modification.
+   (" (V)(YH)(.*) "
+    |
+    (1 =)
+    (2 otf:beng=pstf)
+    (3 = *)
+    |)
+
+   ;; Ya-phalaa (following up Step 1, Case D).  Remove N and change YH
+   ;; to the post base form.  Syllables of this type do not require
+   ;; further modification.
+   (" ([CBRY]n?)N(YH) "
+    |
+    (1 =)
+    (2 otf:beng=pstf)
+    |)
+
+   ("." =))
+  *))
+
+;; Step 3 : Now only those syllables that contain the pseudo character
+;; x require pre-base substition.  This is the most complicated part
+;; in this FLT.
+
+;; If the sequence "C1 H C2" makes ligature L12, L12 replaces the
+;; original sequence.
+
+;; To test the availability of such a ligature, we try to generate it
+;; using the pre-base substitute feature, then see whether succeeded
+;; or not.  In the case of failure, the pre-base feature does not
+;; change the original sequence.
+
+;; To create a ligature, the "C1 H" part must be first converted into
+;; the half form of C1.  Creating the half form of a consonant always
+;; succeeds.
+
+;; ligature(half(C1,H),C2)
+;; ==> ligature(C1half,C2)
+;; ==> L12         ; success
+;;     C1half C2   ; fail
+
+;; If the ligature is not available, the "C1 H" part must be converted
+;; into the _Halant_ (not half) form of C1.  However, there is no way
+;; to reconvert C1half into C1halant nor to revert back to "C1 H".
+;; Thus we duplicate the critical part in two different forms so that
+;; we can select the appropriate one in the next step.  The pseudo
+;; character x is used to indicate the boundaries.
+
+;; ... C1 H C2 ...  ==>  ... x C1halant C2 x L12 x ...
+
+;; If the length of the L12 part is one, ligature generation was
+;; successful.  In this case we wipe out the duplicated C1halant and
+;; C2.  Otherwise we remove L12.
+
+;; In very few cases (I found only one in the Mukti font), the "C1 H"
+;; part need to be converted into C1halant (instead of C1half) to make
+;; a ligature with C2.  So when we try to generate a ligature form, we
+;; apply the GSUB features "half", "haln" and "pres" in this order.
+
+(category
+ ;; C: consonant (excluding B, Y and R)
+ ;; H: HALANT
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0964 0x0965        ?E)                     ; DANDA, DOUBLE DANDA
+ (0x0980 0x09FF        ?E)                     ; ELSE
+ (0x09CD       ?H)                     ; SIGN VIRAMA (HASANT)
+ (0x0995       ?K)                     ; LETTER KA
+ (0x09B7       ?S)                     ; LETTER SSA
+ (0x09A3       ?M)                     ; LETTER NNA
+ (0x09AE       ?M)                     ; LETTER MA
+ (0x09FE       ?x)                     ; mark #1 (internal use)
+ )
+
+(generator
+ (0
+  (cond
+
+   ;; One pre-base and base.
+   ;; 1        23   4       5    6
+   (" ([^x ]*)x((.H)([^J]))(H)?x([^ ]*) "
+    |
+    (1 = *)
+    0x09FE                             ; x
+    (3 otf:beng=haln)                  ; C1halant
+    (4 =)                              ; C2
+    0x09FE                             ; x
+    (2 otf:beng=half,haln,pres)                ; ligature result
+    0x09FE                             ; x
+    (5 =)
+    (6 = *)
+    |)
+
+   ;; One pre-base with ZWJ.  According to the Unicode FAQ, the half
+   ;; form is forced in this case.  So we fake as if ligature
+   ;; generation was failed.
+   (" ([^x ]*)x(.H)J(.)?x([^ ]*) "
+    |
+    (1 = *)
+    0x09FE                             ; x
+    (2 otf:beng=half)                  ; C1half
+    (3 =)                              ; C2
+    0x09FE                             ; x
+    0x09FD                             ; pseudo result
+    0x09FD                             ; pseudo result
+    0x09FE                             ; x
+    (4 = *)
+    |)
+
+   ;; One pre-base possibly with ZWNJ.  Similar to above.
+   (" ([^x ]*)x(.H)N?(.)?x([^ ]*) "
+    |
+    (1 = *)
+    0x09FE                             ; x
+    (2 otf:beng=haln)                  ; C1halant
+    (3 =)                              ; C2
+    0x09FE                             ; x
+    0x09FD                             ; pseudo result
+    0x09FD                             ; pseudo result
+    0x09FE                             ; x
+    (4 = *)
+    |)
+
+   ;; Standalone base.  There is nothing more to do.
+   (" ([^x ]*)x(.)x([^ ]*) "
+    |
+    (1 = *)
+    (2 =)
+    (3 = *)
+    |)
+
+   ;; KA-SSA-NNA and KA-SSA-MA are the only pre-base ligatures that
+   ;; consist of three consonants.
+   ;; 1        23   4   5   6    7
+   (" ([^x ]*)x((KH)(SH)(M))(H)?x([^ ]*) "
+    |
+    (1 = *)
+    0x09FE                             ; x
+    (3 otf:beng=haln)                  ; KAhalant
+    (4 otf:beng=haln)                  ; SSAhalant
+    (5 =)                              ; NNA or MA
+    0x09FE                             ; x
+    (2 otf:beng=half,haln,pres)                ; ligature result
+    0x09FE                             ; x
+    (6 =)
+    (7 = *)
+    |)
+
+   ;; Two or more pre-bases plus base.  Give up.  Convert all
+   ;; pre-bases into halant form.
+   ;; 1        23             4       5
+   (" ([^x ]*)x(([^x]H[JN]?)+)([^x])?x([^ ]*) "
+    |
+    (1 = *)
+    0x09FE                             ; x
+    (2 force-haln)                     ; halant forms
+    (4 =)                              ; full form
+    0x09FE                             ; x
+    0x09FD                             ; pseudo result
+    0x09FD                             ; pseudo result
+    0x09FE                             ; x
+    (5 = *)
+    |)
+
+   ("." =))
+  *)
+
+ ;; This is to remove ZWNJ and ZWJ.  The half-form-force-effect of ZWJ
+ ;; is ignored.  Sorry.
+ (force-haln
+  (cond
+   ("([^JN]*)[JN](.*)"
+    (1 otf:beng=haln)
+    (2 force-haln))
+   (".+"
+    otf:beng=haln)))
+ )
+
+;; Step 4 : Select the appropriate representation.  Only those
+;; syllables that contain the virtual character x require
+;; modification.
+(generator
+ (0
+  (cond
+   ;; Only one glyph in the ligature section (between the second and
+   ;; the third x).  It means a ligature was successfully generated.
+   ;; C1halant and C2 (between the first and second x) are removed.
+   (" ([^x ]*)x[^x]+x(.)x([^ ]*) "
+    |
+    (1 = *)
+    (2 =)
+    (3 = *)
+    |)
+
+   ;; Otherwise halant and base forms are used.  The failed ligature
+   ;; is removed.
+   (" ([^x ]*)x([^x]+)x[^x]+x([^ ]*) "
+    |
+    (1 = *)
+    (2 = *)
+    (3 = *)
+    |)
+
+   ;; No need to care the other cases.
+   ("." =))
+  *))
+
+;; Step 5 : Select appropriate glyph variants for fine adjustments.
+;; Now the syllable boundary marks are removed so that the final step
+;; can find word boundaries.
+(generator
+ (0
+  (cond
+   (" ([^ ]+) "
+    (1 otf:beng=blws,abvs,psts,vatu))
+   ("."
+    [ otf:beng=+ ] ))
+  *)
+ )
+
+;; Step 6 : Word initial substitute.  As the syllable boundaries have
+;; been eliminated in the previous step, this rule is applied to a run
+;; of Bengali glyphs, i.e. word by word.  We finally apply the init
+;; feature to the word initial gylphs to get the final result.
+(generator
+ (0
+  ("(.)(.*)"
+   (1 otf:beng=init)
+   (2 = *))))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/DEVA-CDAC.flt b/FLT/DEVA-CDAC.flt
new file mode 100644 (file)
index 0000000..92c3d9b
--- /dev/null
@@ -0,0 +1,440 @@
+;; DEVA-CDAC.flt -- Font Layout Table for Devanagari (C-DAC font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> DEVA-CDAC.flt
+;;;
+;;; For the font DVYG0ntt.ttf (developed by C-DAC, encoding is ISFOC)
+;;; to draw Devanagari script.  The font is available at:
+;;; <ul>
+;;; <li>       infopage: http://www.iiit.net/ltrc/iscii/FAQ.htm#SEC2.1
+;;; <li> download: http://www.iiit.net/ltrc/iscii/iscii_plugin_linux.tar.gz
+;;; </ul>
+
+(font layouter deve-cdac nil
+      (font (nil dv-ttyogesh apple-roman)))
+
+(category
+ ;; A: ANUSVARA or CANDRABINDU
+ ;; C: CONSONANT (except for R)
+ ;; R: LETTER RA
+ ;; V: VOWEL INDEPENDENT
+ ;; N: NUKTA
+ ;; H: HALANT
+ ;; M: MATRA (VOWEL DEPENDENT, except for I)
+ ;; I: VOWEL SIGN I
+ ;; S: STRESS or TONE
+ ;; E: ELSE
+ (0x0900               ?E)
+ (0x0901 0x0902                ?A)             ; CANDRABINDU and ANUSVARA
+ (0x0903               ?E)             ; SIGN VISARGA
+ (0x0905 0x0914                ?V)             ; A .. AU
+ (0x0915 0x0939        ?C)             ; KA .. HA
+ (0x0930               ?R)             ; RA
+ (0x093C               ?N)             ; NUKTA
+ (0x093D               ?E)             ; AVAGRAHA
+ (0x093E 0x094C                ?M)             ; VOWEL SIGN AA .. AU
+ (0x093F               ?I)             ; VOWEL SIGN I
+ (0x094D               ?H)             ; SIGN VIRAMA (HARANT)
+ (0x0950               ?E)             ; OM
+ (0x0951 0x954         ?S)             ; UDATTA .. ACUTE
+ (0x0958 0x095E                ?C)             ; LETTER QA .. YYA
+ (0x0960 0x0961                ?V)             ; LETTER VOCALIC RR and LL
+ (0x0962 0x0963                ?M)             ; VOWEL SIGN VOCALIC L and LL
+ (0x0964 0x0970                ?E)             ; DANDA .. ABBREVIATION SIGN
+ )
+
+(generator
+ (0
+  (cond
+   ("VA?S?"
+    < | vowel * | >)
+   ("([RC]H)*[RC](H|[IM]?A?S?)?"
+    < |
+    (cond
+     ("RH.*" ;; with preceding RA HARANT
+      (cond
+       ("(RH)([^I]*)(I)(A?S?)"         ; with I
+       (3 vowel-sign-I)
+       (2 consonant *)
+       (1 preceding-r)
+       (4 post-modifier))
+       ("(RH)([^M]*)(M)(A?S?)"         ; with M
+       (2 consonant *)
+       (3 matra)
+       (1 preceding-r)
+       (4 post-modifier))
+       ("(RH)(.*)(H)$"                 ; with last HARANT
+       (2 consonant *)
+       (1 preceding-r)
+       (3 harant))
+       ("(RH)([^AS]*)(.*)"             ; otherwise
+       (2 consonant *)
+       (1 preceding-r)
+       (3 post-modifier))))
+     ;; without preceding RA HARANT
+     ("([^I]*)(I)(A?S?)"               ; with I
+      (2 vowel-sign-I)
+      (1 consonant *)
+      (3 post-modifier))
+     ("([^M]*)(M)(A?S?)"               ; with M
+      (1 consonant *)
+      (2 matra)
+      (3 post-modifier))
+     ("(.*)(H)$"                       ; with last HARANT
+      (1 consonant *)
+      (2 harant))
+     ("([^AS]*)(.*)"                   ; otherwise
+      (1 consonant *)
+      (3 post-modifier))
+     (".*"
+      consonant *))
+    | > )
+   ("."
+    independent))
+  *)
+
+ (vowel
+  (cond
+   ((0x0905)                           0x2B)
+   ((0x0906)                           0x2B 0xC9)
+   ((0x0907)                           0x3C)
+   ((0x0908 0x0901)                    0x3C 0xC7 0xC6)
+   ((0x0908)                           0x3C 0xC7)
+   ((0x0909)                           0x3D)
+   ((0x090A)                           0x3E 0xF0)
+   ((0x090B)                           0x40 0xF1)
+   ((0x090D 0x0901)                    0x42 0xC4)
+   ((0x090D 0x0902)                    0x42 0xC4)
+   ((0x090D)                           0x42 0xEC)
+   ((0x090E 0x0901)                    0x42 0xE0 0xC6)
+   ((0x090E)                           0x42 0xE0)
+   ((0x090F)                           0x42)
+   ((0x0910 0x0901)                    0x42 0xE4 0xC6)
+   ((0x0910)                           0x42 0xE4)
+   ((0x0911 0x0901)                    0x2B 0xC9 0xC4)
+   ((0x0911 0x0902)                    0x2B 0xC9 0xC4)
+   ((0x0911)                           0x2B 0xC9 0xEC)
+   ((0x0912 0x0901)                    0x2B 0xC9 0xE0 0xC6)
+   ((0x0912)                           0x2B 0xC9 0xE0)
+   ((0x0913 0x0901)                    0x2B 0xC9 0xE4 0xC6)
+   ((0x0913)                           0x2B 0xC9 0xE4)
+   ((0x0914 0x0901)                    0x2B 0xC9 0xE8 0xC6)
+   ((0x0914)                           0x2B 0xC9 0xE8)
+   ((0x0960)                           0x41 0xF1)))
+
+ (vowel-sign-I
+  ((0x093F)                            0xCA))
+
+ (preceding-r
+  ((0x0930 0x094D)                     0xC7))
+
+ (post-modifier
+  (cond
+   ((0x0901)                           0xC4)
+   ((0x0902)                           0xC6)
+   ((0x0951)                           0x27)
+   ((0x0952)                           bc.tc 0x2D)))
+
+ (harant
+  ((0x094D)                            0xC2))
+
+ (consonant
+  (cond
+   ((0x0915 0x094D 0x0924)             0x48 0xF2)
+   ((0x0915 0x094D 0x0930)             0x47 0xF2)
+   ((0x0915 0x094D 0x0937 0x094D)      0x49)
+   ((0x0915 0x094D 0x0937)             0x49 0xC9)
+   ((0x0915 0x094D)                    0x43)
+   ((0x0915)                           0x45 0xF2)
+   ((0x0916 0x094D 0x0930 0x094D)      0x4C)
+   ((0x0916 0x094D 0x0930)             0x4C 0xC9)
+   ((0x0916 0x094D)                    0x4A)
+   ((0x0916)                           0x4A 0xC9)
+   ((0x0917 0x094D 0x0930 0x094D)      0x4F)
+   ((0x0917 0x094D 0x0930)             0x4F 0xC9)
+   ((0x0917 0x094D)                    0x4D)
+   ((0x0917)                           0x4D 0xC9)
+   ((0x0918 0x094D 0x0930 0x094D)      0x51)
+   ((0x0918 0x094D 0x0930)             0x51 0xC9)
+   ((0x0918 0x094D)                    0x50)
+   ((0x0918)                           0x50 0xC9)
+   ((0x0919)                           0x52 0xF3)
+   ((0x091A 0x094D 0x0930 0x094D)      0x54)
+   ((0x091A 0x094D 0x0930)             0x54 0xC9)
+   ((0x091A 0x094D)                    0x53)
+   ((0x091A)                           0x53 0xC9)
+   ((0x091B)                           0x55 0xF4)
+   ((0x091C 0x094D 0x091E 0x094D)      0x59)
+   ((0x091C 0x094D 0x091E)             0x59 0xC9)
+   ((0x091C 0x094D 0x0930 0x094D)      0x58)
+   ((0x091C 0x094D 0x0930)             0x58 0xC9)
+   ((0x091C 0x094D)                    0x56)
+   ((0x091C)                           0x56 0xC9)
+   ((0x091D 0x094D 0x0930 0x094D)      0x5B)
+   ((0x091D 0x094D 0x0930)             0x5B 0xC9)
+   ((0x091D 0x094D)                    0x5A)
+   ((0x091D)                           0x5A 0xC9)
+   ((0x091E 0x094D)                    0x5C)
+   ((0x091E)                           0x5C 0xC9)
+   ((0x091F 0x094D 0x091F)             0x5E 0xF5)
+   ((0x091F 0x094D 0x0920)             0x5F 0xF5)
+   ((0x091F)                           0x5D 0xF5)
+   ((0x0920 0x094D 0x0920)             0x61 0xF6)
+   ((0x0920)                           0x60 0xF6)
+   ((0x0921 0x094D 0x0921)             0x64 0xF7)
+   ((0x0921 0x094D 0x0922)             0x65 0xF7)
+   ((0x0921)                           0x62 0xF7)
+   ((0x0922)                           0x66 0xF8)
+   ((0x0923 0x094D)                    0x68)
+   ((0x0923)                           0x68 0xC9)
+   ((0x0924 0x094D 0x0924 0x094D)      0x6B)
+   ((0x0924 0x094D 0x0924)             0x6B 0xC9)
+   ((0x0924 0x094D 0x0930 0x094D)      0x6A)
+   ((0x0924 0x094D 0x0930)             0x6A 0xC9)
+   ((0x0924 0x094D)                    0x69)
+   ((0x0924)                           0x69 0xC9)
+   ((0x0925 0x094D 0x0930 0x094D)      0x6D)
+   ((0x0925 0x094D 0x0930)             0x6D 0xC9)
+   ((0x0925 0x094D)                    0x6C)
+   ((0x0925)                           0x6C 0xC9)
+   ((0x0926 0x0943)                    0x6F 0xF9)
+   ((0x0926 0x094D 0x0926)             0x71 0xF9)
+   ((0x0926 0x094D 0x0927)             0x72 0xF9)
+   ((0x0926 0x094D 0x092E)             0x73)
+   ((0x0926 0x094D 0x092F)             0x74)
+   ((0x0926 0x094D 0x0930)             0x70 0xF9)
+   ((0x0926 0x094D 0x0935)             0x75 0xF9)
+   ((0x0926)                           0x6E 0xF9)
+   ((0x0927 0x094D 0x0930 0x094D)      0x77)
+   ((0x0927 0x094D 0x0930)             0x77 0xC9)
+   ((0x0927 0x094D)                    0x76)
+   ((0x0927)                           0x76 0xC9)
+   ((0x0928 0x094D 0x0928 0x094D)      0x7A)
+   ((0x0928 0x094D 0x0928)             0x7A 0xC9)
+   ((0x0928 0x094D 0x0930 0x094D)      0x79 0xC9)
+   ((0x0928 0x094D 0x0930)             0x79 0xC9)
+   ((0x0928 0x094D)                    0x78)
+   ((0x0928)                           0x78 0xC9)
+   ((0x0929)                           0x78 0xC3 0xC9)
+   ((0x092A 0x094D 0x0930 0x094D)      0x7C)
+   ((0x092A 0x094D 0x0930)             0x7C 0xC9)
+   ((0x092A 0x094D)                    0x7B)
+   ((0x092A)                           0x7B 0xC9)
+   ((0x092B 0x094D 0x0930)             0xA3 0xFB)
+   ((0x092B 0x094D)                    0x7D)
+   ((0x092B)                           0xA1 0xFB)
+   ((0x092C 0x094D 0x0930 0x094D)      0xA5)
+   ((0x092C 0x094D 0x0930)             0xA5 0xC9)
+   ((0x092C 0x094D)                    0xA4)
+   ((0x092C)                           0xA4 0xC9)
+   ((0x092D 0x094D 0x0930 0x094D)      0xA7)
+   ((0x092D 0x094D 0x0930)             0xA7 0xC9)
+   ((0x092D 0x094D)                    0xA6)
+   ((0x092D)                           0xA6 0xC9)
+   ((0x092E 0x094D 0x0930 0x094D)      0xA9)
+   ((0x092E 0x094D 0x0930)             0xA9 0xC9)
+   ((0x092E 0x094D)                    0xA8)
+   ((0x092E)                           0xA8 0xC9)
+   ((0x092F 0x094D 0x0930 0x094D)      0xAB)
+   ((0x092F 0x094D 0x0930)             0xAB 0xC9)
+   ((0x092F 0x094D)                    0xAA)
+   ((0x092F)                           0xAA 0xC9)
+   ((0x0930 0x0941)                    0xAF 0xFB)
+   ((0x0930 0x0942)                    0xB0 0xFC)
+   ((0x0930)                           0xAE 0xF7)
+   ((0x0931 0x094D)                    0xAD)
+   ((0x0931)                           0xAE 0xC3 0xF7)
+   ((0x0932 0x094D)                    0xB1)
+   ((0x0932)                           0xB1 0xC9)
+   ((0x0933 0x094D)                    0xB2)
+   ((0x0933)                           0xB3)
+   ((0x0934 0x094D)                    0xB2 0xC3)
+   ((0x0934)                           0xB3 0xC3)
+   ((0x0935 0x094D 0x0930 0x094D)      0xB5)
+   ((0x0935 0x094D 0x0930)             0xB5 0xC9)
+   ((0x0935 0x094D)                    0xB4)
+   ((0x0935)                           0xB4 0xC9)
+   ((0x0936 0x094D 0x0930 0x094D)      0xB8)
+   ((0x0936 0x094D 0x0930)             0xB8 0xC9)
+   ((0x0936 0x094D 0x0935 0x094D)      0xB7)
+   ((0x0936 0x094D 0x0935)             0xB7 0xC9)
+   ((0x0936 0x094D)                    0xB6)
+   ((0x0936)                           0xB6 0xC9)
+   ((0x0937 0x094D)                    0xB9)
+   ((0x0937)                           0xB9 0xC9)
+   ((0x0938 0x094D 0x0930 0x094D)      0xBB)
+   ((0x0938 0x094D 0x0930)             0xBB 0xC9)
+   ((0x0938 0x094D)                    0xBA)
+   ((0x0938)                           0xBA 0xC9)
+   ((0x0939 0x0943)                    0xBE)
+   ((0x0939 0x094D 0x092E)             0xC0)
+   ((0x0939 0x094D 0x092F)             0xC1)
+   ((0x0939 0x094D 0x0930)             0xBF)
+   ((0x0939 0x094D)                    0xBC)
+   ((0x0939)                           0xBD)
+   ((0x094D 0x092F)                    0xAC)
+   ((0x094D 0x0930)                    0xC5)
+   ((0x0958 0x094D)                    0x44)
+   ((0x0958)                           0x46 0xF2 0xF3)
+   ((0x0959 0x094D)                    0x4B)
+   ((0x0959)                           0x4B 0xC9)
+   ((0x095A 0x094D)                    0x4E)
+   ((0x095A)                           0x4E 0xC9)
+   ((0x095B 0x094D)                    0x57)
+   ((0x095B)                           0x57 0xC9)
+   ((0x095C)                           0x63 0xF7)
+   ((0x095D)                           0x67 0xF8)
+   ((0x095E 0x094D)                    0x7E)
+   ((0x095E)                           0xA2 0xFB)
+   ((0x095F)                           0xAA 0xC3 0xC9)
+   ((0x094D)                           0xC2)))
+
+ (matra
+  (cond
+   ((0x093E)                           0xC9)
+   ((0x093F 0x0901)                    0xCA 0xC6)
+   ((0x093F)                           0xCA)
+   ((0x0940 0x0901)                    0xD2 0xC6)
+   ((0x0940)                           0xD2)
+   ((0x0941)                           0xD6)
+   ((0x0942)                           0xDA)
+   ((0x0943)                           0xDE)
+   ((0x0944)                           0xDF)
+   ((0x0945)                           0xEC)
+   ((0x0946 0x0901)                    0xE0 0xC6)
+   ((0x0946)                           0xE0)
+   ((0x0947 0x0901)                    0xE4 0xC6)
+   ((0x0947)                           0xE4)
+   ((0x0948 0x0901)                    0xE8 0xC6)
+   ((0x0948)                           0xE8)
+   ((0x0949 0x0901)                    0xC9 0xC4)
+   ((0x0949 0x0902)                    0xC9 0xC4)
+   ((0x0949)                           0xC9 0xEC)
+   ((0x094A 0x0901)                    0xC9 0xE0 0xC6)
+   ((0x094A)                           0xC9 0xE0)
+   ((0x094B 0x0901)                    0xC9 0xE4 0xC6)
+   ((0x094B)                           0xC9 0xE4)
+   ((0x094C 0x0901)                    0xC9 0xE8 0xC6)
+   ((0x094C)                           0xC9 0xE8)))
+
+ (independent
+  (cond
+   ((0x0900)                           0x23 0xC7) ; fake!!
+   ((0x0903)                           0x26)
+   ((0x093C)                           0xC3)
+   ((0x093D)                           0x25)
+   ((0x0950)                           0x24) ;new
+   ((0x0951)                           0x27) ;new
+   ((0x0964)                           0x2A)
+   ((0x0965)                           0x2A 0x2A)
+   ((0x0966)                           0x30)
+   ((0x0967)                           0x31)
+   ((0x0968)                           0x32)
+   ((0x0969)                           0x33)
+   ((0x096A)                           0x34)
+   ((0x096B)                           0x35)
+   ((0x096C)                           0x36)
+   ((0x096D)                           0x37)
+   ((0x096E)                           0x38)
+   ((0x096F)                           0x39)
+   ((0x094D)                           0x23 Bc>10Bl 0xC2)
+   ((0x093F)                           0xCA Bc>10Bl 0x23)
+   ((0x0940)                           0x23 0xD2)
+   )))
+
+(category
+ ;; C: CONSONANTS
+ ;; I: VOWEL SIGN I
+ ;; R: RIGHT MODIFIER
+ ;; S: SPACING
+ ;; E: ELSE
+ ;;
+ (0x00 0xFF    ?E)
+ (0x3C 0xC1    ?C)
+ (0xC9         ?R)
+ (0xCA 0xD1    ?I)
+ (0xD2 0xD5    ?R)
+ (0xF0 0xFE    ?S))
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1
+     (cond
+      ("(I[^C]*)(CC[^R]*)(R.*)"
+       (1 rule-i-wide = *)
+       (2 rule-else = *))
+      ("(I[^C]*)(CC[^S]*)(S)(.*)"
+       (1 rule-i-wide = *)
+       (2 = *)
+       (4 rule-else = *)
+       (3 = *))
+      ("([^R]*)(R).*"
+       (0 rule-else = *))
+      ("([^S]*)(S)(.*)"
+       (1 rule-else = *)
+       (3 rule-else = *)
+       (2 = *))
+      (".*" = *))))
+   ("[^ ]*"
+    = *))
+  *)
+
+ (rule-i-wide
+  (cond
+   ((0xCA 0xC6)        0xCF)
+   ((0xCA 0xC7 0xC6)   0xD1)
+   ((0xCA 0xC7)        0xD0)
+   ((0xCA)     0xCE)))
+
+ (rule-else
+  (cond
+   ((0xC3 0xD6)        0xD7)
+   ((0xC3 0xDA)        0xDB)
+   ((0xC5 0xD6)        0xD8)
+   ((0xC5 0xDA)        0xDC)
+   ((0xC7 0xC4)        0xC8)
+   ((0xC7 0xC6)        0xC8)
+   ((0xCA 0xC6)        0xCB)
+   ((0xCA 0xC7 0xC6)   0xCD)
+   ((0xCA 0xC7)        0xCC)
+   ((0xD2 0xC6)        0xD3)
+   ((0xD2 0xC7 0xC6)   0xD5)
+   ((0xD2 0xC7)        0xD4)
+   ((0xE0 0xC6)        0xE1)
+   ((0xE0 0xC7 0xC6)   0xE3)
+   ((0xE0 0xC7)        0xE2)
+   ((0xE4 0xC6)        0xE5)
+   ((0xE4 0xC7 0xC6)   0xE7)
+   ((0xE4 0xC7)        0xE6)
+   ((0xE8 0xC6)        0xE9)
+   ((0xE8 0xC7 0xC6)   0xEB)
+   ((0xE8 0xC7)        0xEA)
+   ((0xEC 0xC6)        0xED)
+   ((0xEC 0xC7 0xC6)   0xEF)
+   ((0xEC 0xC7)        0xEE))))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/DEVA-OTF.flt b/FLT/DEVA-OTF.flt
new file mode 100644 (file)
index 0000000..bf9f7c6
--- /dev/null
@@ -0,0 +1,175 @@
+;; DEVA-OTF.flt -- Font Layout Table for Devanagari OpenType font
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> DEVA-OTF.flt
+;;;
+;;; For Devanagari OpenType fonts to draw the Devanagari script.
+
+(font layouter deva-otf nil
+      (font (nil nil unicode-bmp :otf=deva=rphf)))
+
+(category
+ ;; C: consonant (except for R)
+ ;; R: consonant RA
+ ;; n: NUKTA
+ ;; H: HALANT
+ ;; m: MATRA (pre)
+ ;; u: MATRA (above)
+ ;; b: MATRA (below)
+ ;; p: MATRA (post)
+ ;; A: vowel modifier (above)
+ ;; a: vowel modifier (post)
+ ;; S: stress sign (above)
+ ;; s: stress sign (below)
+ ;; V: independent vowel
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (#x0900 #x097F        ?E)                     ; ELSE
+ (#x0901       ?A)                     ; SIGN CANDRABINDU (above)
+ (#x0902       ?A)                     ; SIGN ANUSVARA (above)
+ (#x0903       ?a)                     ; SIGN VISARGA (post)
+ (#x0905 #x0914        ?V)                     ; LETTER A .. LETTER AU
+ (#x0915 #x0939 ?C)                    ; LETTER KA .. LETTER HA
+ (#x0930       ?R)                     ; LETTER RA
+ (#x093C       ?n)                     ; SIGN NUKTA
+ (#x093D       ?E)                     ; SIGN AVAGRAHA
+ (#x093E #x094C        ?p)                     ; VOWEL SIGN (post)
+ (#x093F       ?m)                     ; VOWEL SIGN I (pre)
+ (#x0941 #x0944        ?b)                     ; VOWEL SIGN (below)
+ (#x0945 #x0948        ?u)                     ; VOWEL SIGN (above)
+ (#x094D       ?H)                     ; SIGN VIRAMA (HALANT)
+ (#x0950       ?E)                     ; OM
+ (#x0951 #x0954        ?S)                 ; STRESS SIGN or TONE MARK (above)
+ (#x0952       ?s)                 ; STRESS SIGN or TONE MARK (below)
+ (#x0958 #x095E        ?C)                     ; LETTER QA .. LETTER YYA
+ (#x0960       ?V)                     ; LETTER VOCALIC RR
+ (#x0961       ?V)                     ; LETTER VOCALIC LL
+ (#x0962 #x0963        ?b)                     ; VOWEL SIGN (below)
+ (#x0964 #x0970        ?E)                     ; DANDA .. ABBREVIATION SIGN
+ (#x200C       ?N)                     ; ZWNJ
+ (#x200D       ?J)                     ; ZWJ
+ (#x097D       ?x)             ; internally used tag to indicate Reph
+ (#x097E       ?y)             ; internally used tag to indicate Mpost
+ (#x097F       ?z)             ; internally used tag to indicate Cbase
+ )
+
+;; The first stage is to extract a syllable and re-order characters in
+;; it.
+(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.
+   ("([CR]n?H)([NJ])"
+    < | (2 =) (1 = *) | > )
+
+   ;; A syllable starting with RH (Reph) and ending with a vowel
+   ;; and/or a vowel modifier.
+   ("(RH)(([CR]n?H)*[CR]n?)([mubp][Aa]?[Ss]?|[Aa][Ss]?|[Ss])"
+    < | (1 #x097D = =) (2 move-base-Halant) (4 reorder-post-base) | >)
+
+   ;; A syllable starting with RH (Reph) and ending without a vowel
+   ;; nor a vowel modifier.
+   ("(RH)(([CR]n?H)*[CR]n?)(H)?"
+    < | (1 #x097D = =) (2 move-base-Halant) (4 =) | >)
+
+   ;; A syllable starting with the other consonant and ending with a
+   ;; vowel and/or a vowel modifier.
+   ("(([CR]n?H)*[CR]n?)([mubp][Aa]?[Ss]?|[Aa][Ss]?|[Ss])"
+    < | (1 move-base-Halant) (3 reorder-post-base) | >)
+
+   ;; A syllable starting with the other consonant and ending without
+   ;; a vowel nor a vowel modifier.
+   ("(([CR]n?H)*[CR]n?)(H)?"
+    < | (1 move-base-Halant) (3 =) | >)
+
+   ;; A syllable starting with an independent vowel.
+   ("V[Aa]?[Ss]?"
+    < | = * | > )
+
+   ("." =))
+  *)
+
+ ;; Move Halant on a base consonant to the tail.
+ (move-base-Halant
+  (cond
+   ("(([CR]n?H)*[CR]n?)(H)(R)"
+    (1 = *)
+    (4 =)
+    (3 =))
+   (".*"
+    = *)))
+
+ ;; Re-order post modifiers.
+ (reorder-post-base
+  ;; 12   3   4   5    67   8     9   10
+  ("((m)|(u)|(b)|(p))?((A)|(a))?((S)|(s))?$"
+   (2 =) (4 =) (10 =) (3 =) (5 =)
+   #x097E
+   (7 =) (9 =) (8))))
+
+;; The second stage is to reorder Reph and Mpre.
+(generator
+ (0
+  (cond
+   (" [NJ]([^ ]*) "
+    = *)
+   (" (x(..))([CRnH]*) "
+    | (3 = *) (2 otf:deva=rphf) |)
+   (" (x(..))([CRnH]*)(m?)([^y]*)y([^ ]*) "
+    | (4 =) (3 = *) (5 = *) (2 otf:deva=rphf) (6 = *) |)
+   (" ([CRnH][CRnH]*) "
+    = *)
+   (" ([CRnH][CRnH]*)(m?)([^y]*)y([^ ]*) "
+    | (2 =) (1 = *) (3 = *) (4 = *) |)
+   ("." =))
+  *))
+
+;; The third stage is to drive OTF tables.  For the moment, we use
+;; the default LangSys, and try all GSUB/GPOS features except for the
+;; sequence followed by ZWNJ in which case try "nukt" and "haln"
+;; features only.
+(generator
+ (0
+  (cond
+   (" N([^ ]*) "
+    (1 otf:deva=nukt,haln))
+
+   (" J([^ ]*) "
+    (1 otf:deva))
+
+   (" ([^ ]*)(CH) "
+    (1 otf:deva=~rphf,*) (2 otf:deva=haln))
+
+   (" ([^ ]*) "
+    (1 otf:deva=~rphf,*))
+
+   ("."
+    \[ otf:deva=+ \] ))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/GUJR-OTF.flt b/FLT/GUJR-OTF.flt
new file mode 100644 (file)
index 0000000..1b877f3
--- /dev/null
@@ -0,0 +1,172 @@
+;; GUJR-OTF.flt -- Font Layout Table for Gujarati OpenType fonts
+;; 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.
+
+;; 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.
+
+;;; <li> GUJR-OTF.flt
+;;;
+;;; For Gujarati OpenType fonts to draw the Gujarati script.
+;;; Tested with padmaa-Medium-1.5.ttf <http://www.indictrans.org/>
+
+(font layouter gujr-otf nil
+      (font (nil nil unicode-bmp :otf=gujr=rphf)))
+
+(category
+ ;; C: general consonant
+ ;; R: RA
+ ;; V: independent vowel
+ ;; H: HALANT
+ ;; m: MATRA (pre)
+ ;; u: MATRA (above)
+ ;; b: MATRA (below)
+ ;; p: MATRA (post)
+ ;; A: vowel modifier (above)
+ ;; a: vowel modifier (post)
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0964       ?E)                     ; DANDA
+ (0x0965       ?E)                     ; DOUBLE DANDA
+ (0x0A80 0x0AFF        ?E)                     ; ELSE
+ (0x0A81       ?A)                     ; SIGN CANDRABINDU
+ (0x0A82       ?A)                     ; SIGN ANUSVARA
+ (0x0A83       ?a)                     ; SIGN VISARGA
+ (0x0A85 0x0A94        ?V)                     ; LETTER AA .. LETTER AU
+ (0x0A95 0x0AB9 ?C)                    ; LETTER KA .. LETTER HA
+ (0x0AB0       ?R)                     ; LETTER RA
+ (0x0ABC       ?n)                     ; SIGN NUKTA
+ (0x0ABE       ?p)                     ; VOWEL SIGN AA (post)
+ (0x0ABF       ?m)                     ; VOWEL SIGN I (pre)
+ (0x0AC0       ?p)                     ; VOWEL SIGN II (post)
+ (0x0AC1 0x0AC4        ?b)                     ; VOWEL SIGN U, UU, R, RR (below)
+ (0x0AC5 0x0AC8        ?u)                     ; VOWEL SIGN CANDRA E, E, AI (above)
+ (0x0AC9 0x0ACC        ?p)                     ; VOWEL SIGN CANDRA O, O, AU (post)
+ (0x0ACD       ?H)                     ; SIGN VIRAMA (HALANT)
+ (0x0AE0 0x0AE1        ?V)                     ; LETTER VOCALIC RR, LL
+ (0x0AE2 0x0AE3        ?b)                     ; VOWEL SIGN VOCALIC RR, LL (below)
+ (0x0AFF       ?X)                     ; internal use
+ )
+
+;; Step 1 : Syllable identification, Reph and base consonant movements.
+(generator
+ (0
+  (cond
+   ;; A syllable ending with a vowel sign and/or a vowel modifier.
+   ("(([CR]n?H)*[CR]n?)([mubp][Aa]?|[Aa])"
+    < | (1 move-reph-vattu) (3 = *) | >)
+
+   ;; Forced Halant or half form.
+   ("(([CR]n?H)*[CR]n?)(H[NJ])"
+    < | (1 move-reph-vattu) (3 = =) | >)
+
+   ;; A syllable without a vowel sign nor a vowel modifier.
+   ("([CR]n?H)*[CR]n?H?"
+    < | move-reph-vattu | >)
+
+   ;; A syllable starting with an independent vowel.
+   ("V[Aa]?"
+    < |  = * | >)
+
+   ("." =))
+  *)
+
+ ;; Move the leading RH and the Halant on the base consonant to
+ ;; appropriate positions.
+ ;; 0x0AFF indicates the destination of below-, above-, post Matras.
+ (move-reph-vattu
+  (cond
+   ;; Ending with Halnt.  Immitate a forced Halant form.
+   ("(.*)(H)$"
+    (1 move-reph-vattu) (2 =) 0x200C)
+
+   ;; Both Reph and Vattu.
+   ;;1   23                4  5
+   ("(RH)(([CR]n?H)*[CR]n?)(H)(R)$"
+    (2 = *) (5 =) (4 =) 0x0AFF (1 = =))
+
+   ;; A special case of above.
+   ("(RH)(R)$"
+    (2 =) 0x0AFF (1 = =))
+
+   ;; Reph but no Vattu.
+   ("(RH)(([CR]n?H)*Cn?)$"
+    (2 = *) 0x0AFF (1 = =))
+
+   ;; No Reph but Vattu.
+   ("(Cn?(H[CR]n?)*)(H)(R)$"
+    (1 = *) (4 =) (3 =) 0x0AFF)
+
+   ;; Neither Reph nor Vattu.
+   (".*"
+    = * 0x0AFF))))
+
+;; Step 2 : Matra movements and OTF forms.
+(generator
+ (0
+  (cond
+   ;; 1    2        3    4   5       6
+   (" (RH)?([^X ]*)X(RH)?(m)?([bup])?([Aa])? "
+    |
+    (4 =)
+    (1 otf:gujr=~rphf,~blwf,*)
+    (2 otf:gujr=~rphf,*)
+    (5 =)
+    (3 otf:gujr=rphf)
+    (6 =)
+    |)
+
+   (" (RH)?([^X ]*)X(RH)?(HJ) "
+    |
+    (1 = =)
+    (2 otf:gujr=~rphf)
+    (3 otf:gujr=rphf)
+    (4 = =)
+    |)
+
+   (" (RH)?([^X ]*)X(RH)?(H)N "
+    |
+    (1 otf:gujr=~rphf,~blwf,*)
+    (2 otf:gujr=~rphf,*)
+    (3 otf:gujr=rphf)
+    (4 =)
+    |)
+
+   ("." =))
+  *))
+
+;; Step 3 : OTF substitutions and positionings.
+(generator
+ (0
+  (cond
+   (" (.*)J "
+    (1 otf:gujr=~rphf,~blwf,*))
+   (" ([^ ]*) "
+    (1 otf:gujr=~rphf,~blwf,~half,~haln,*))
+   ("."
+    [ otf:gujr=+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/GURU-OTF.flt b/FLT/GURU-OTF.flt
new file mode 100644 (file)
index 0000000..704cdd1
--- /dev/null
@@ -0,0 +1,144 @@
+;; GURU-OTF.flt -- Font Layout Table for Gurmukhi OpenType fonts
+;; 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.
+
+;; 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.
+
+;;; <li> GURU-OTF.flt
+;;;
+;;; For Gurmukhi OpenType fonts to draw the Punjabi script.
+;;; Designed for saab.otf (version 0.91).
+;;; <http://guca.sourceforge.net/typography/fonts/saab/index.shtml>
+
+(font layouter guru-otf nil
+      (font (nil nil unicode-bmp :otf=guru=vatu)))
+
+(category
+ ;; C: general consonant
+ ;; Y: post-base consonat (YA)
+ ;; R: below-base consonat (RA, VA, HA)
+ ;; n: NUKTA
+ ;; H: HALANT
+ ;; m: MATRA (pre)
+ ;; u: MATRA (above)
+ ;; b: MATRA (below)
+ ;; p: MATRA (post)
+ ;; A: vowel modifier (above)
+ ;; a: vowel modifier (post)
+ ;; V: independent vowel
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0964       ?E)                     ; DANDA
+ (0x0965       ?E)                     ; DOUBLE DANDA
+ (0x0A00 0x0A7F        ?E)                     ; ELSE
+ (0x0A01       ?A)                     ; SIGN ADAK BINDI (above)
+ (0x0A02       ?A)                     ; SIGN BINDI (above)
+ (0x0A03       ?a)                     ; SIGN VISARGA (post)
+ (0x0A05 0x0A14        ?V)                     ; LETTER A .. LETTER AU
+ (0x0A15 0x0A38 ?C)                    ; LETTER KA .. LETTER SA
+ (0x0A2F       ?Y)                     ; LETTER YA
+ (0x0A30       ?R)                     ; LETTER RA
+ (0x0A35       ?R)                     ; LETTER VA
+ (0x0A39       ?R)                     ; LETTER HA
+ (0x0A3C       ?n)                     ; SIGN NUKTA
+ (0x0A3E       ?p)                     ; VOWEL SIGN AA (post)
+ (0x0A3F       ?m)                     ; VOWEL SIGN I (pre)
+ (0x0A40       ?p)                     ; VOWEL SIGN II (post)
+ (0x0A41       ?b)                     ; VOWEL SIGN U (below)
+ (0x0A42       ?b)                     ; VOWEL SIGN UU (below)
+ (0x0A47       ?u)                     ; VOWEL SIGN EE (above)
+ (0x0A48       ?u)                     ; VOWEL SIGN AI (above)
+ (0x0A4B       ?u)                     ; VOWEL SIGN OO (above)
+ (0x0A4C       ?u)                     ; VOWEL SIGN AU (above)
+ (0x0A4D       ?H)                     ; SIGN VIRAMA (HALANT)
+ (0x0A59 0x0A5E        ?C)                     ; LETTER KHHA .. LETTER FA
+ (0x0A70       ?A)                     ; TIPPI (above)
+ (0x0A7F       ?X)                     ; internal use
+ )
+
+;; Step 1 : Syllable identification and Halant movement.
+(generator
+ (0
+  (cond
+   ;; A syllable ending with a vowel sign and/or a vowel modifier.
+   ("(([CRY]n?H)*[CRY]n?)([mubp][Aa]?|[Aa])"
+    < | (1 move-base-Halant) (3 =) | >)
+
+   ;; A syllable without a vowel sign nor a vowel modifier.
+   ("(([CRY]n?H)*[CRY]n?)(H)?"
+    < | move-base-Halant | >)
+
+   ;; A syllable starting with an independent vowel.
+   ("V[Aa]?"
+    < | = * | > )
+
+   ("." =))
+  *)
+
+ ;; Move Halant on the base consonant to the tail.
+ ;; 0x0A7F indicates the position for above- or below Matra.
+ (move-base-Halant
+  (cond
+   ("(([CRY]n?H)*[CRY]n?)(H)(Y)$"
+    (1 = *)
+    0x0A7F
+    (4 =)
+    (3 =))
+   ("(([CRY]n?H)*[CRY]n?)(H)(R)$"
+    (1 = *)
+    (4 =)
+    (3 =)
+    0x0A7F)
+   ("([CRY]n?H)*[CRY]n?H$"
+    = * 0x200C)
+   (".*"
+    = * 0x0A7F))))
+
+;; Step 2 : Move Matra.
+(generator
+ (0
+  (cond
+   ;; 1          2    3   4      5   6
+   (" ([CRYnH]*)X(YH)?(m)?([ub])?(p)?([Aa])? "
+    | (3 =) (1 = *) (4 =) (2 = =) (5 =) (6 =) |)
+   ("." =))
+  *))
+
+;; Step 3 : Drive OTF tables.
+(generator
+ (0
+  (cond
+   (" ([^ ]*H)N "
+    (1 otf:guru=nukt))
+   (" ([^ ]*) "
+    (1 otf:guru=nukt,blwf,pstf,vatu,pres,abvs,blws,psts))
+   ((0x0A71)
+    otf:guru)
+   ("."
+    [ otf:guru=+ ] ))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/HEBR-FF.flt b/FLT/HEBR-FF.flt
new file mode 100644 (file)
index 0000000..1395e9a
--- /dev/null
@@ -0,0 +1,101 @@
+;; HEBR-FF.flt -- Font Layout Table for Hebrew fonts (Unicode encoding)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> HEBR-FF.flt
+;;;
+;;; For Hebrew fonts of Unicode encoding to draw the Hebrew script.
+;;; This is for such fonts that do not require an explicit combining
+;;; code because accents and points have negative lbearing.
+
+(font layouter hebr-ff nil
+      (font (nil nil unicode-bmp :lang=he,yi)))
+
+(category
+ (0x0590 0x05ff        ?h)                     ; hebrew
+ )
+
+(generator
+ (0
+  (cond
+   ((0x05d9 0x05b4) 0xfb1d)
+   ((0x05e9 0x05c1) 0xfb2a)
+   ((0x05e9 0x05c2) 0xfb2b)
+   ((0x05e9 0x05bc 0x05c1) 0xfb2c)
+   ((0x05e9 0x05bc 0x05c2) 0xfb2d)
+   ((0x05d0 0x05b7) 0xfb2e)
+   ((0x05d0 0x05b8) 0xfb2f)
+   ((0x05d0 0x05bc) 0xfb30)
+   ((0x05d1 0x05bc) 0xfb31)
+   ((0x05d2 0x05bc) 0xfb32)
+   ((0x05d3 0x05bc) 0xfb33)
+   ((0x05d4 0x05bc) 0xfb34)
+   ((0x05d5 0x05bc) 0xfb35)
+   ((0x05d6 0x05bc) 0xfb36)
+   ((0x05d8 0x05bc) 0xfb38)
+   ((0x05d9 0x05bc) 0xfb39)
+   ((0x05da 0x05bc) 0xfb3a)
+   ((0x05db 0x05bc) 0xfb3b)
+   ((0x05dc 0x05bc) 0xfb3c)
+   ((0x05de 0x05bc) 0xfb3e)
+   ((0x05e0 0x05bc) 0xfb40)
+   ((0x05e1 0x05bc) 0xfb41)
+   ((0x05e3 0x05bc) 0xfb43)
+   ((0x05e4 0x05bc) 0xfb44)
+   ((0x05e6 0x05bc) 0xfb46)
+   ((0x05e7 0x05bc) 0xfb47)
+   ((0x05e8 0x05bc) 0xfb48)
+   ((0x05e9 0x05bc) 0xfb49)
+   ((0x05ea 0x05bc) 0xfb4a)
+   ((0x05d5 0x05b9) 0xfb4b)
+   ((0x05d1 0x05bf) 0xfb4c)
+   ((0x05db 0x05bf) 0xfb4d)
+   ((0x05e4 0x05bf) 0xfb4e)
+   ;; The font FreeSerif.ttf does not have this glyph?!?
+   ;; ((0x05b0)        0x05b4 Bc-13Bc 0x05b4)
+   ("." =))
+  *))
+
+(category
+ (0x0590 0x05af        ?p)                     ; accents
+ (0x05d0 0x05ff        ?h)                     ; letters
+ (0xfb1d 0xfb4e        ?h)                     ; presentation forms
+ (0x05b0 0x05c4        ?p)                     ; points
+ (0x05be       ?h)                     ; punctuation
+ (0x05c0       ?h)                     ; punctuation
+ (0x05c3       ?h)                     ; punctuation
+ )
+
+(generator
+ (0
+  (cond
+   ("(h)(p+)"
+    <
+    = *
+    >)
+   ("." = *))
+  *)
+ )
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/HEBR.flt b/FLT/HEBR.flt
new file mode 100644 (file)
index 0000000..bf409a2
--- /dev/null
@@ -0,0 +1,100 @@
+;; HEBR.flt -- Font Layout Table for Hebrew font (Unicode encoding)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> HEBR.flt
+;;;
+;;; For Hebrew fonts of Unicode encoding to draw Hebrew script.  This
+;;; is for such a font that requires explicit combining code to draw
+;;; accents and points.
+
+(font layouter hebr nil
+      (font (nil freesans unicode-bmp)))
+
+(category
+ (0x0590 0x05ff        ?h)                     ; hebrew
+ )
+
+(generator
+ (0
+  (cond
+   ((0x05d9 0x05b4) 0xfb1d)
+   ((0x05e9 0x05c1) 0xfb2a)
+   ((0x05e9 0x05c2) 0xfb2b)
+   ((0x05e9 0x05bc 0x05c1) 0xfb2c)
+   ((0x05e9 0x05bc 0x05c2) 0xfb2d)
+   ((0x05d0 0x05b7) 0xfb2e)
+   ((0x05d0 0x05b8) 0xfb2f)
+   ((0x05d0 0x05bc) 0xfb30)
+   ((0x05d1 0x05bc) 0xfb31)
+   ((0x05d2 0x05bc) 0xfb32)
+   ((0x05d3 0x05bc) 0xfb33)
+   ((0x05d4 0x05bc) 0xfb34)
+   ((0x05d5 0x05bc) 0xfb35)
+   ((0x05d6 0x05bc) 0xfb36)
+   ((0x05d8 0x05bc) 0xfb38)
+   ((0x05d9 0x05bc) 0xfb39)
+   ((0x05da 0x05bc) 0xfb3a)
+   ((0x05db 0x05bc) 0xfb3b)
+   ((0x05dc 0x05bc) 0xfb3c)
+   ((0x05de 0x05bc) 0xfb3e)
+   ((0x05e0 0x05bc) 0xfb40)
+   ((0x05e1 0x05bc) 0xfb41)
+   ((0x05e3 0x05bc) 0xfb43)
+   ((0x05e4 0x05bc) 0xfb44)
+   ((0x05e6 0x05bc) 0xfb46)
+   ((0x05e7 0x05bc) 0xfb47)
+   ((0x05e8 0x05bc) 0xfb48)
+   ((0x05e9 0x05bc) 0xfb49)
+   ((0x05ea 0x05bc) 0xfb4a)
+   ((0x05d5 0x05b9) 0xfb4b)
+   ((0x05d1 0x05bf) 0xfb4c)
+   ((0x05db 0x05bf) 0xfb4d)
+   ((0x05e4 0x05bf) 0xfb4e)
+   ("." =))
+  *))
+
+(category
+ (0x0590 0x05af        ?p)                     ; accents
+ (0x05d0 0x05ff        ?h)                     ; letters
+ (0xfb1d 0xfb4e        ?h)                     ; presentation forms
+ (0x05b0 0x05c4        ?p)                     ; points
+ (0x05be       ?h)                     ; punctuation
+ (0x05c0       ?h)                     ; punctuation
+ (0x05c3       ?h)                     ; punctuation
+ )
+
+(generator
+ (0
+  (cond
+   ("(h)(p+)"
+    <
+    (1 =)
+    (2 ("." Bc.Bc =) *)
+    >)
+   ("." = *))
+  *)
+ )
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/KHMR-ANLONG.flt b/FLT/KHMR-ANLONG.flt
new file mode 100644 (file)
index 0000000..0bb7da2
--- /dev/null
@@ -0,0 +1,275 @@
+;; KHMR-ANLONG.flt -- Font Layout Table for Khmer (Anlong font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> KHMR-ANLONG.flt
+;;;
+;;; For the font ANLONG.TTF to draw Khmer script.  The font is
+;;; available at:
+;;; <ul>
+;;; <li> infopage: http://www.cambodia.org/fonts/index.html#dl
+;;; <li> download: http://www.cambodia.org/fonts/khmerfnt.zip
+;;; </ul>
+
+(font layouter khmr-anlong nil
+      (font (nil anlongvill\ khek apple-roman)))
+
+(category
+ ;; C: CONSONANT (except R and KHMER LETTER LA)
+ ;; R: KHMER LETTER RO
+ ;; c: KHMER SIGN COENG (function as virama)
+ ;; V: INDEPENDENT VOWEL (except Q)
+ ;; Q: CONJUNCT VOWEL QU, RY, QE
+ ;; v: DEPENDENT VOWEL
+ ;; s: SHIFT
+ ;; S: COMBINING SIGN
+ ;; E: ELSE
+ (0x1780 0x17A0        ?C)
+ (0x1789       ?N)                     ; exception of C (NYO)
+ (0x179A       ?R)                     ; exception of C (RO)
+ (0x17A1       ?E)                     ; ELSE
+ (0x17A2       ?C)
+ (0x17A3 0x17A4        ?E)                     ; ELSE
+ (0x17A5 0x17B3        ?V)
+ (0x17A7       ?Q)
+ (0x17AB       ?Q)
+ (0x17AF       ?Q)
+ (0x17B2       ?C)
+ (0x17B4 0x17FF        ?E)
+ (0x17B6 0x17C5        ?v)
+ (0x17C6       ?S)
+ (0x17C9 0x17CA        ?s)
+ (0x17CB 0x17D3        ?S)
+ (0x17D2       ?c))
+
+(generator
+ (0
+  (cond
+   ("([CNR]c[CNRQ])c(R)(s?v?S?)"
+    | (1 with-conjunct) (2 Bl.Br 0xEE) 0x00 (3 vowel-and-sign *) |)
+   ("([CNR]c[CNRQ])(s?v?S?)"
+    | (1 with-conjunct) 0x00 (2 vowel-and-sign *) |)
+   ("([CNR])(s?v?S?)"
+    | (1 independent) (2 vowel-and-sign *) |)
+   ("."
+    independent))
+  *)
+
+ (with-conjunct
+  (cond
+   ("(N)c(CRQ)"
+    (1 0x8B)
+    (2 conjunct))
+   ("(N)c(N)"
+    (1 0x8B)
+    (2 Br.Bl 0xDD))
+   ((0x17B3 0x17D2 0x1799)
+    0xB8)
+   ("(.)c(.)"
+    (1 independent)
+    (2 conjunct))))
+
+ (independent
+  (cond
+   ((range 0x1780 0x1788)      0x82)
+   ((0x1789)                   0x8C)
+   ((range 0x178A 0x1794)      0x91)
+   ((0x1795)                   0x9F)
+   ((range 0x1796 0x179C)      0xA1)
+   ((0x179D)                   < 0x84 cr-<cc 0xFA >)
+   ((0x179E)                   < 0x9B cr-<cc 0xFA >)
+   ((range 0x179F 0x17A2)      0xA8)
+   ((0x17A3)                   0xAB)
+   ((0x17A4)                   < 0xAB Br>Bl 0xBA >)
+   ((range 0x17A5 0x17A7)      0xAC)
+   ((0x17A8)                   < 0xAE Br.Bl 0xF4 >)
+   ((0x17A9)                   0xB9)
+   ((range 0x17AA 0x17B1)      0xAF)
+   ((0x17B2)                   0xB7)   ; same as 0xB6
+   ((0x17B3)                   < 0xAE tr<20bl 0xF8 >)
+   ((0x17B4)                   < 0xBA tr+bl 0xF5 >)
+   ((0x17B5)                   0xBA)
+   ((0x17B6)                   0xBA)
+   ((0x17B7)                   0xBB)
+   ((0x17B8)                   0xBD)
+   ((0x17B9)                   0xBF)
+   ((0x17BA)                   0xC1)
+   ((0x17BB)                   0xC3)
+   ((0x17BC)                   0xC5)
+   ((0x17BD)                   0xC7)
+   ((0x17BE)                   < 0xCD 0x20 0xBD >)
+   ((0x17BF)                   < 0xCD 0x20 Br<Bl 0xC9 >)
+   ((0x17C0)                   < 0xCD 0x20 Br<Bl 0xCB >)
+   ((range 0x17C1 0x17C3)      0xCD)
+   ((0x17C4)                   < 0xCD 0x20 Br<Bl 0xBA >)
+   ((0x17C5)                   < 0xCD 0x20 Br<Bl 0xD0 >)
+   ((0x17C6)                   0xD1)
+   ((0x17C7)                   0xD3)
+   ((0x17C8)                   0x3A)
+   ((0x17C9)                   0xF6)
+   ((range 0x17CA 0x17CB)      0xF4)
+   ((0x17CC)                   0xF8)
+   ((0x17CD)                   0xF7)
+   ((0x17CE)                   < 0x20 tc+80bc 0x2B >)
+   ((range 0x17CF 0x17D0)      0xF9)
+   ((0x17D1)                   < 0x20 tc+80bc 0x5F >)
+   ((0x17D2)                   < 0x20 bc-tc 0x5E >)
+   ((0x17D3)                   0xD1)
+   ((range 0x17D4 0x17D5)      0xFC)
+   ((0x17D6)                   0xFB)
+   ((0x17D7)                   0xFE)
+   ((0x17D8)                   < 0xFC 0xA6 0xFC >)
+   ((0x17D9)                   < 0x30 cr<10cl 0xD2 >)
+   ((0x17DA)                   0x8D)
+   ((0x17DB)                   < 0xFF br->10tl 0xC3 >)
+   ((0x17DC)                   0x53)
+   ((range 0x17E0 0x17E9)      0x30)))
+
+ (conjunct
+  (cond
+   ((0x1780)   br-tl 0xD4)
+   ((0x1781)   br-tl 0xD5)
+   ((0x1782)   br-tl 0xD6)
+   ((0x1783)   Br.Bl 0xD7)
+   ((0x1784)   br-tl 0xD8)
+   ((0x1785)   br-tl 0xD9)
+   ((0x1786)   br-tl 0xDA)
+   ((0x1787)   br-tl 0xDB)
+   ((0x1788)   Br.Bl 0xDC)
+   ((0x1789)   br-tl 0xDE)
+   ((0x178A)   br-tl 0xE3)
+   ((0x178B)   br-tl 0xDF)
+   ((0x178C)   br-tl 0xE0)
+   ((0x178D)   Br.Bl 0xE1)
+   ((0x178E)   br-tl 0xE2)
+   ((0x178F)   br-tl 0xE3)
+   ((0x1790)   br-tl 0xE4)
+   ((0x1791)   br-tl 0xE5)
+   ((0x1792)   br-tl 0xE6)
+   ((0x1793)   br-tl 0xE7)
+   ((0x1794)   Br.Bl 0xE8)
+   ((0x1795)   br-tl 0xE9)
+   ((0x1796)   br-tl 0xEA)
+   ((0x1797)   br-tl 0xEB)
+   ((0x1798)   br-tl 0xEC)
+   ((0x1799)   Br.Bl 0xED)
+   ((0x179A)   Bl+Bc 0xEE)
+   ((0x179B)   br-tl 0xEF)
+   ((0x179C)   br-tl 0xF0)
+   ((0x179D)   br-tl 0xD6 br.bl 0xFA)
+   ((0x179E)   Br.Bl 0xE8 br.bl 0xFA)
+   ((0x179F)   Br.Bl 0xF1)
+   ((0x17A0)   br-tl 0xF2)
+   ((0x17A2)   br-tl 0xF3)
+   ((0x17A7)   br-tl 0xD5 br.bl 0xC4)  ; ugly compromise
+   ((0x17AB)   br-tl 0xA1)             ; ugly compromise
+   ((0x17AF)   br-tl 0xB4)))           ; ugly compromise
+
+ (vowel-and-sign
+  (cond
+   ((0x17B6)   Br-Bl 0xBA)
+   ((0x17B7)   tr+bl 0xBB)
+   ((0x17B8)   tr+bl 0xBD)
+   ((0x17B9)   tr+bl 0xBF)
+   ((0x17BA)   tr+bl 0xC1)
+   ((0x17BB)   br+tr 0xC3)
+   ((0x17BC)   br-tl 0xC5)
+   ((0x17BD)   br-tl 0xC7)
+   ((0x17BE)   tr+bl 0xBD Bl.Br 0xCD)
+   ((0x17BF)   Br.Bl 0xC9 Bl.Br 0xCD)
+   ((0x17C0)   Br.Bl 0xCB Bl.Br 0xCD)
+   ((0x17C1)   Bl.Br 0xCD)
+   ((0x17C2)   Bl.Br 0xCE)
+   ((0x17C3)   Bl.Br 0xCF)
+   ((0x17C4)   Bl.Br 0xCD Br.Bl 0xBA)
+   ((0x17C5)   Bl.Br 0xCD Br.Bl 0xD0)
+   ((0x17C6)   tr+bl 0xD1)
+   ((0x17C7)   Br.Bl 0xD3)
+   ((0x17C8)   Br.Bl 0x3A)
+   ((0x17C9)   tr+bl 0xF6)
+   ((0x17CA)   tr+bl 0xF4)
+   ((0x17CB)   tr+bl 0xF5)
+   ((0x17CC)   tr+bl 0xF8)
+   ((0x17CD)   tr+bl 0xF7)
+   ((0x17CE)   tr+>br 0x2B)
+   ((0x17CF)   tr+bl 0xF9)
+   ((0x17D0)   tr+bl 0xFA))))
+
+(category
+ ;;    WIDTH   HEIGHT  DEPTH
+ ;; N: normal  normal  normal
+ ;; T: normal  high    normal
+ ;; W: wide    normal  normal
+ ;; n: normal  normal  deep
+ ;; w: wide    normal  deep
+ ;; V: right part of KHMER VOWEL SIGN YA and IE
+ ;; x: separator
+ (0x00 0xFF    ?N)
+ (0x00         ?x)
+ (0x85         ?W)
+ (0x89         ?T)
+ (0x8A 0x8B    ?W)
+ (0x8C         ?w)
+ (0x91 0x92    ?T)
+ (0x93 0x94    ?W)
+ (0x97         ?T)
+ (0x9F         ?T)
+ (0xA4         ?W)
+ (0xA6         ?W)
+ (0xA8 0xA9    ?W)
+ (0xAA         ?w)
+ (0xAC         ?T)
+ (0xAD         ?w)
+ (0xAF         ?T)
+ (0xB0 0xB3    ?n)
+ (0xB5         ?n)
+ (0xB6 0xB7    ?T)
+ (0xB8         ?w)
+ (0xC9         ?V)
+ (0xCB         ?V)
+ (0xD7         ?w)
+ (0xDC 0xDE    ?w)
+ (0xE1 0xE2    ?w)
+ (0xE8         ?w)
+ (0xED         ?w)
+ (0xF1         ?w))
+
+(generator
+ (0
+  (cond
+   (" ([^ x]*)x(V)([^ ]*) "
+    < (1 = *) (2 (cond ((0xC9) 0xCA) ((0xCB) 0xCC))) (3 = *) >)
+   (" ([^ x]*)x([^ ]*) "
+    < (1 = *) (2 = *) >)
+   (" (T[^V]*)(V)([^ ]*) "
+    < (1 = *) (2 (cond ((0xC9) Br.Bl 0xCA) ((0xCB) Br.Bl 0xCC))) (3 = *) >)
+   (" ([wn])(V)([^ ]*) "
+    < (1 = *) (2 (cond ((0xC9) 0xCA) ((0xCB) 0xCC))) (3 = *) >)
+   (" ([^ ]*) "
+    < (1 = *) >)
+   ("."
+    =))
+  *))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/KHMR-MULE.flt b/FLT/KHMR-MULE.flt
new file mode 100644 (file)
index 0000000..d290c79
--- /dev/null
@@ -0,0 +1,204 @@
+;; KHMR-MULE.flt -- Font Layout Table for Khmer (mule font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> KHMR-MULE.flt
+;;;
+;;; For Khmer fonts of mule encoding to draw Khmer script.  The font is
+;;; available at: <ftp://ftp.m17n.org/m17n-fonts/>
+
+(font layoutre khmr-mule nil
+      (font (mulekhmer-1)))
+
+(category
+ (0x1780 0x17A2        ?C) ;; C: CONSONANT (except R and KHMER LETTER LA)
+ (0x179A       ?R) ;; R: KHMER LETTER RO
+ (0x17A1       ?E) ;; E: ELSE
+ (0x17A3 0x17A4        ?E)
+ (0x17A5 0x17B3        ?V) ;; V: INDEPENDENT VOWEL (except Q)
+ (0x17A7       ?Q) ;; Q: CONJUNCT VOWEL QU, RY, QE
+ (0x17AB       ?Q)
+ (0x17AF       ?Q)
+ (0x17B2       ?C)
+ (0x17B4 0x17FF        ?E)
+ (0x17B6 0x17C5        ?v) ;; v: DEPENDENT VOWEL
+ (0x17C6       ?S) ;; S: COMBINING SIGN
+ (0x17C9 0x17CA        ?s) ;; s: SHIFT
+ (0x17CB 0x17D3        ?S)
+ (0x17D2       ?c) ;; c: KHMER SIGN COENG (function as virama)
+ )
+
+(generator
+ (0
+  (cond
+   ("[CR](c[CRQ])?(cR)?s?v?S?"
+    (cond
+     (".(c[CRQ])(cR)?s?v?S?"
+      < |
+      ("(.)c(.)(c(.))?" (1 independent) (2 conjunct) (4 conjunct))
+      vowel-and-sign *
+      | > )
+     ("[CR][svS][svS]*" < | independent vowel-and-sign * | > )
+     ("." independent)))
+   ("." independent))
+  *)
+
+ (independent
+  (cond
+   ((0x17D8)                   0xD4 0x9B 0xD4)
+   ((range 0x1780 0x17FF)      0x80)))
+
+ (conjunct
+  (cond
+   ((0x1783)   Br.Bc 0x43)
+   ((0x1788)   Br.Bc 0x48)
+   ((0x178D)   Br.Bc 0x4D)
+   ((0x1794)   Br.Bc 0x54)
+   ((0x1799)   Br.Bc 0x59)
+   ((0x179A)   Bl<Bc 0x5A)
+   ((range 0x179E 0x179F)      Br.Bc 0x5E)
+   ((range 0x1780 0x17AF)      bc-tc 0x40)
+   ))
+
+ (vowel-and-sign
+  (cond
+   ((0x17B6)   Br.Bl 0xB6)
+   ((0x17BB)   br+tr 0xBB)
+   ((0x17BC)   bc-tc 0xBC)
+   ((0x17BD)   bc-tc 0xBD)
+   ((0x17BE)   tc.bc 0xB8 Bl.Br 0xC1)
+   ((0x17BF)   Bl.Br 0xC1 Br.Bc 0x04)
+   ((0x17C0)   Bl.Br 0xC1 Br.Bc 0x05)
+   ((0x17C1)   Bl.Br 0xC1)
+   ((0x17C2)   Bl.Br 0xC2)
+   ((0x17C3)   Bl.Br 0xC3)
+   ((0x17C4)   Bl.Br 0xC1 Br.Bl 0xB6)
+   ((0x17C5)   Bl.Br 0xC1 Br.Bl 0x2D)
+   ((0x17C9)   tr+br 0xC9)
+   ((0x17CB)   tr+br 0xCB)
+   ((0x17CE)   tr+br 0xCE)
+   ((range 0x17B7 0x17D0)      tc+bc 0xB7))))
+
+(category
+ (0x00 0xFF    ?E)
+ (0x04 0x05    ?V)
+ (0x2D         ?V)
+ (0xB6         ?V)
+ (0xC6         ?C)
+ (0xCB         ?R)
+ (0xCC 0xCD    ?C)
+ (0xCE         ?R)
+ (0xCF 0xD0    ?C)
+ (0xD2         ?E))
+
+(generator
+ (0
+  (cond
+   ("VC" = tc>20bc =)
+   ("VR" = tr<20br =)
+   ("." =))
+  *))
+
+(category
+ (0x00 0xFF    ?E) ;; E: else
+ (0x40 0x6F    ?c) ;; c: conjunct CONSONANT
+ (0x49         ?n) ;; n: conjunct KHMER LETTER NYO
+ (0x59         ?y) ;; y: conjunct KHMER LETTER YO
+ (0x80 0xA2    ?C) ;; C: first CONSONANT
+ (0x89         ?N) ;; N: first KHMER LETTER NYO
+ (0xB2         ?Q) ;; Q: KHMER INDEPENDENT VOWEL QOO TYPE TWO
+ (0xC9 0xD1    ?S))
+
+(generator
+ (0
+  (cond
+   (" [^ ][^ ][^ ]* "
+    < =
+    (cond
+     ("N[cny]" 0x27 ((0x49) bc-tc 0x28) =)
+     ("Qy"     0x2B))
+    = * > )
+   ("[^ ]*" = * ))
+  *))
+
+(category
+ (0x00 0x7F    ?n) ;; n: width:normal height:normal depth:deep
+ (0x04 0x05    ?V) ;; V: right part of KHMER VOWEL SIGN YA and IE
+ (0x26         ?w) ;; w: width:wide height:normal depth:deep
+ (0x27         ?W) ;; W: width:wide height:normal depth:normal
+ (0x28         ?w)
+ (0x2A         ?w)
+ (0x2C         ?N) ;; N: width:normal height:normal depth:normal
+ (0x43         ?w)
+ (0x48 0x49    ?w)
+ (0x4D 0x4E    ?w)
+ (0x5A         ?r) ;; r: conjunct KHMER LETTER RO
+ (0x60         ?w)
+ (0x80 0xFF    ?N)
+ (0x83         ?W)
+ (0x84         ?T) ;; T: width:normal height:high depth:normal
+ (0x87         ?T)
+ (0x88 0x89    ?W)
+ (0x8A 0x8B    ?T)
+ (0x8D 0x8E    ?W)
+ (0x90         ?T)
+ (0x95         ?T)
+ (0x99         ?W)
+ (0x9B         ?W)
+ (0x9F 0xA0    ?W)
+ (0xA6         ?W))
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    <
+    (1
+     (cond
+      ("(Wnr)([^V]*)(V)?(.*)" = *)
+      ("(Tnr)([^V]*)(V)?(.*)"
+       (1 = = ((0x5A) Bl<Bc 0x20) =) (2 = *) (3 high-deep-YA-IE =) (4 = *))
+      ("(..r)([^V]*)(V)?(.*)"
+       (1 = = ((0x5A) Bl<Bc 0x20) =) (2 = *) (3 deep-YA-IE =) (4 = *))
+      ("(T[nw][^V]*)(V)?(.*)"
+       (1 = *) (2 high-deep-YA-IE =) (3 = *))
+      ("(.[nw][^V]*)(V)?(.*)"
+       (1 = *) (2 deep-YA-IE =) (3 = *))
+      ("(T^V*)(V)?(.*)"
+       (1 = *) (2 high-YA-IE =) (3 = *))
+      (".*" = *)))
+    >)
+   ("[^ ]*" = *))
+  *)
+
+ (deep-YA-IE
+  ((range 0x04 0x05)   Br.Bc 0x24))
+
+ (high-deep-YA-IE
+  ((range 0x04 0x05)   Br.Bc 0x34))
+
+ (high-YA-IE
+  ((range 0x04 0x05)   Br.bc 0x14)))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/KHMR-OTF.flt b/FLT/KHMR-OTF.flt
new file mode 100644 (file)
index 0000000..b3b103b
--- /dev/null
@@ -0,0 +1,246 @@
+;; KHMR-OTF.flt -- Font Layout Table for Khmer OpenType fonts
+;; Copyright (C) 2005, 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.
+
+;; 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.
+
+;;; <li> KHMR-OTF.flt
+;;;
+;;; For Khmer OpenType fonts to draw Khmer.
+;;; A Font is available from 
+;;; <http://www.khmeros.info/drupal/?q=en/download/fonts>.
+
+(font layouter khmr-otf nil
+      (font (nil nil unicode-bmp :otf=khmr=pres)))
+
+(category
+ ;; E : else
+ ;; C : consonant & independent vowel
+ ;; R : RO
+ ;; r : ROBAT
+ ;; m : vowel sign (pre)
+ ;; b : vowel sign (below)
+ ;; a : vowel sign (above)
+ ;; A : vowel sign (two-part, above)
+ ;; p : vowel sign (post)
+ ;; P : vowel sign (two-part, post)
+ ;; s : sign (above)
+ ;; S : sign (post)
+ ;; c : consonant shifter
+ ;; H : COENG
+ ;; N : ZERO WIDTH NON-JOINER
+ ;; J : ZERO WIDTH JOINER
+ (0x1780 0x17FF ?E)
+ (0x19E0 0x19FF ?E)
+ (0x1780 0x17B3 ?C)
+ (0x179A       ?R)
+;; (0x17A3 0x17B3 ?V)
+ (0x17B6       ?p)
+ (0x17B7 0x17BA ?a)
+ (0x17BB 0x17BD ?b)
+ (0x17BE       ?A)
+ (0x17BF 0x17C0 ?P)
+ (0x17C1 0x17C3 ?m)
+ (0x17C4 0x17C5 ?P)
+ (0x17C6       ?s)
+ (0x17C7 0x17C8 ?S)
+ (0x17C9 0x17CA ?c)
+ (0x17CB 0x17D1 ?s)
+ (0x17CC       ?r)
+ (0x17D2       ?H)
+ (0x17D3       ?s)
+ (0x17DD       ?s)
+ (0x200C       ?N)
+ (0x200D       ?J)
+ )
+
+;; Generic syllable pattern is as follows.
+;; [CR](r|N?c)?(HCr?)*(HR)?(HCr?)*[NJ]?(m|b|a|A|p|P)?s*S?(H[CR])?
+
+;; Step 0.
+;; Move m to the beginning.
+;; Split A and P.
+;; Exchange the order of pP and s.
+;; Move HR before the base.
+
+(generator
+ (0
+  (cond
+
+   ;; pre vowel sign
+   ;;1    2       3       4  5     67            8  9    10
+   ("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?)(m)(s*S?(H[CR])?)"
+    < |
+    (8 =)
+    (4 = =)
+    (1 = *)
+    (5 =)
+    (6 = *)
+    (9 = *)
+    | > )
+
+   ;; two-part above vowel sign
+   ;;1    2       3       4  5     67                8
+   ("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?As*S?(H[CR])?)"
+    < |
+    0x17C1
+    (4 = =)
+    (1 = *)
+    (5 =)
+    (6 = *)
+    | > )
+
+   ;; post vowel sign
+   ;;1    2       3       4  5     67            8  9   10 11
+   ("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?)(p)(s*)(S?(H[CR])?)"
+    < |
+    (4 = =)
+    (1 = *)
+    (5 =)
+    (6 = *)
+    (9 = *)
+    (8 =)
+    (10 = *)
+    | > )
+
+   ;; two-part post vowel sign
+   ;;1    2       3       4  5     67            8  9   10 11
+   ("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?)(P)(s*)(S?(H[CR])?)"
+    < |
+    0x17C1
+    (4 = =)
+    (1 = *)
+    (5 =)
+    (6 = *)
+    (9 = *)
+    (8 =)
+    (10 = *)
+    | > )
+
+   ;; other vowel signs or no vowel sign
+   ;;1    2       3       4  5     67                     8
+   ("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?[b|a]?s*S?(H[CR])?)"
+    < |
+    (4 = =)
+    (1 = *)
+    (5 =)
+    (6 = *)
+    | > )
+
+   ("." =))
+  *))
+
+;; Now a syllable looks like below.
+;; m?(HR)?[CR](r|N?c)?(HCr?)*[NJ]?(b|a|A)?s*(p|P)?S?(H[CR])?
+
+;; Step 1.
+;; Set the form of consonant shifter.
+
+(generator
+ (0
+  (cond
+   ;; shifter + above vowel sign without ZWNJ
+   ;; Shifter take blwf.  HR takes pref.  HC's take blwf or pstf.
+   ;; 1   2    3     4      5     6     7     8
+   (" (m)?(HR)?([CR]c(HCr?)*(N|J)?(a|A))(s*S?)(H[CR])? "
+    |
+    (1 =)
+    (2 otf:khmr=pref+)
+    (3 otf:khmr=blwf,abvf,pstf+)
+    (7 = *)
+    (8 otf:khmr=blwf,pstf+)
+    | )
+
+   ;; shifter + ZWNJ + above vowel sign, or, shifter without above vowel sign
+   ;; Shifter stays above.  HR takes pref.  HC's take blwf or pstf.
+   ;; 1   2    3        45       6           7   8     9   10  11
+   (" (m)?(HR)?([CR]N?c)((HCr?)*)([NJ]?[ba]?)(A)?(s*p?)(P)?(S)?(H[CR])? "
+    |
+    (1 =)
+    (2 otf:khmr=pref+)
+    (3 = *)
+    (4 otf:khmr=blwf,pstf+)
+    (6 = *)
+    (7 otf:khmr=abvf+)
+    (8 = *)
+    (9 otf:khmr=pstf+)
+    (10 =)
+    (11 otf:khmr=blwf,pstf+)
+    | )
+
+   ;; no shifter
+   ;; 1   2    3       45       6           7   8     9   10  11
+   (" (m)?(HR)?([CR]r?)((HCr?)*)([NJ]?[ba]?)(A)?(s*p?)(P)?(S)?(H[CR])? "
+    |
+    (1 =)
+    (2 otf:khmr=pref+)
+    (3 = *)
+    (4 otf:khmr=blwf,pstf+)
+    (6 = *)
+    (7 otf:khmr=abvf+)
+    (8 = *)
+    (9 otf:khmr=pstf+)
+    (10 =)
+    (11 otf:khmr=blwf,pstf+)
+    | )
+
+   ("." =))
+  *))
+
+;; Now a syllable looks like below.  ~ characters are OTF feature applied.
+;; m?(HR)?[CR](r|c)?(HCr?)*[NJ]?(b|a|A)?s*(p|P)?S?(H[CR])?
+;;    ~~   ~~    ~   ~~~~            ~       ~     ~~~~~
+
+;; Step 2.
+;; Concatenate adjacent Khmer syllables.
+;; Remove J.  Retain N to prevent ligature.
+
+(generator
+ (0
+  (cond
+   ("  ")
+   ("J")
+   ("." =))
+  *))
+
+;; Step 3.
+;; Apply other OTF features.
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1 otf:khmr=pres,blws,abvs,psts,clig))
+   ("."
+    [ otf:khmr=+ ]))
+  *))
+
+;; Step 4.
+;; Remove N to clean up.
+(generator
+ (0
+  (cond
+   ("N")
+   ("." =))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/KNDA-OTF.flt b/FLT/KNDA-OTF.flt
new file mode 100644 (file)
index 0000000..ee92d44
--- /dev/null
@@ -0,0 +1,170 @@
+;; KNDA-OTF.flt -- Font Layout Table for Kannada OpenType fonts
+;; 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.
+
+;; 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.
+
+;;; <li> KNDA-OTF.flt
+;;;
+;;; For Kannada OpenType fonts to draw Kannada.
+;;; Designed for Sampige.ttf <http://kannada.sourceforge.net/>
+
+(font layouter knda-otf nil
+      (font (nil nil unicode-bmp :otf=knda=rphf)))
+
+(category
+ ;; C: general consonant
+ ;; R: no below-base consonat (RRA, NNNA, LLLA)
+ ;; r: RA
+ ;; H: HALANT
+ ;; u: MATRA (above)
+ ;; p: MATRA (post)
+ ;; t: MATRA (two-part)
+ ;; T: MATRA (three-part)
+ ;; a: vowel modifier (post)
+ ;; V: independent vowel
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0964       ?E)                     ; DANDA
+ (0x0965       ?E)                     ; DOUBLE DANDA
+ (0x0C80 0x0CFF        ?E)                     ; ELSE
+ (0x0C82       ?a)                     ; SIGN ANUSVARA
+ (0x0C83       ?a)                     ; SIGN VISARGA
+ (0x0C85 0x0C94        ?V)                     ; LETTER A .. LETTER AU
+ (0x0C95 0x0CB9 ?C)                    ; LETTER KA .. LETTER HA
+ (0x0CB0       ?r)                     ; LETTER RA
+ (0x0CBC       ?n)                     ; SIGN NUKTA
+ (0x0CBD       ?E)                     ; SIGN AVAGRAHA
+ (0x0CBE       ?p)                     ; VOWEL SIGN AA (post)
+ (0x0CBF       ?u)                     ; VOWEL SIGN I (above)
+ (0x0CC0       ?t)                     ; VOWEL SIGN II (two-part)
+ (0x0CC1 0x0CC4        ?p)                     ; VOWEL SIGN U, UU, R, RR (post)
+ (0x0CC6       ?u)                     ; VOWEL SIGN E (above)
+ (0x0CC7 0x0CCA        ?t)                     ; VOWEL SIGN EE, AI, O (two-part)
+ (0x0CCB       ?T)                     ; VOWEL SIGN OO (three-part)
+ (0x0CCC       ?u)                     ; VOWEL SIGN AU (above)
+ (0x0CCD       ?H)                     ; SIGN VIRAMA (HALANT)
+ (0x0CD5       ?l)                     ; LENGTH MARK (length post)
+ (0x0CD6       ?l)                     ; AI LENGTH MARK (length post)
+ (0x0CDE       ?C)                     ; LETTER FA (LLLA)
+ (0x0CE0 0x0CE1        ?V)                     ; LETTER VOCALIC RR, LL
+ (0x0CFD       ?Z)                     ; internal use
+ (0x0CFE       ?Y)                     ; internal use
+ (0x0CFF       ?X)                     ; internal use
+ )
+
+;; Step 1 : Syllable identification and Halant movement.
+(generator
+ (0
+  (cond
+   ;; A syllable containing a three-part vowel sign.
+   ("([CRr](H[Cr])*)(T)(a)?"
+    < | (1 move-base-Halant) (3 0x0CC6 0x0CC2 0x0CD5) (4 =) | >)
+
+   ;; A syllable containing a two-part vowel sign.
+   ("([CRr](H[Cr])*)(t)(a)?"
+    < | (1 move-base-Halant) (3 two-part) (4 =) | >)
+
+   ;; A syllable ending with vowel signs and/or a vowel modifier.
+   ("([CRr](H[Cr])*)([upl]+a?|a)"
+    < | (1 move-base-Halant) (3 = *) | >)
+
+   ;; Forced Halant form.
+   ("((RH)?([Cr]H)*)([Cr]H)N"
+    < | (1 move-base-Halant) | >
+    < | (4 move-base-Halant) | >)
+
+   ;; Forced Half form.
+   ("((RH)?([Cr]H)*)([Cr]H)J"
+    < | (1 move-base-Halant) >
+    < | (4 otf:knda=blwf) | >)
+
+   ;; A syllable without a vowel sign nor a vowel modifier.
+   ("[CRr](H[Cr])*H?"
+    < | move-base-Halant | >)
+
+   ;; A syllable starting with an independent vowel.
+   ("Va?"
+    < | = * | > )
+
+   ("." =))
+  *)
+
+ ;; Move Halant on the base consonant to the tail if the syllable ends
+ ;; with a consonant.
+ ;; A leading 0x0CFF means Halant movement.
+ ;; A leading 0x0CFE means a syllable ending with a Halant.
+ ;; A leading 0x0CFD means Halant & Reph movements.
+ (move-base-Halant
+  (cond
+   (".*H$"
+    0x0CFE = *)
+   ("(rH)(.)$"
+    0x0CFD (2 =) (1 = =))
+   ("(rH)(.)(H)(.*)"
+    0x0CFD (2 =) (4 = *) (3 =) (1 = =))
+   ("(.)(H)(.*)"
+    0x0CFF (1 =) (3 = *) (2 =))
+   (".*"
+    = *)))
+
+ ;; Divide a two-part Matra into elements.
+ (two-part
+  (cond
+   ((0x0CC0)   0x0CBF 0x0CD5)
+   ((0x0CC7)   0x0CC6 0x0CD5)
+   ((0x0CC8)   0x0CC6 0x0CD6)
+   ((0x0CCA)   0x0CC6 0x0CC2)))
+ )
+
+;; Step 2 : Move Matra if applicable.
+;; The base consonant in a Halant-ending syllable is changed into Halant form.
+(generator
+ (0
+  (cond
+   ;;  1  2       3   4   5   6   7
+   (" Z(.)([CrH]*)(rH)(u)?(p)?(l*)(a)? "
+    | (1 =) (4 =) (5 =) (2 = *) (6 = *) (3 otf:knda=rphf) (7 =) |)
+   ;;  1  2       3   4   5   6
+   (" X(.)([CrH]*)(u)?(p)?(l*)(a)? "
+    | (1 =) (3 =) (4 =) (2 = *) (5 = *) (6 =) |)
+   (" Y(..)([^ ]*) "
+    ;; Sampige.ttf lacks the haln feature, so "otf:knda=haln" does not work.
+    | (1 otf:knda=~rphf,~blwf,*) (2 = *) |)
+   ("." =))
+  *))
+
+;; Step 3 : Drive OTF tables.
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1 otf:knda=~rphf,*))
+   ("."
+    [ otf:knda=+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/LAOO-ALICE.flt b/FLT/LAOO-ALICE.flt
new file mode 100644 (file)
index 0000000..87d2dfa
--- /dev/null
@@ -0,0 +1,210 @@
+;; LAOO-ALICE.flt -- Font Layout Table for Lao (Alice font)
+;; Copyright (C) 2003, 2004, 2005, 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.
+
+;; 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.
+
+;;; <li> LAOO-ALICE.flt
+;;;
+;;; For the font ALICE0.TTF to draw Lao script.  The font is
+;;; available at:
+;;; <ul>
+;;; <li> infopage: http://seasrc.th.net/font/font.htm
+;;; <li> download: http://seasrc.th.net/font/fontlao.dir/alice0.zip
+;;; </ul>
+
+(font layouter laoo-alice nil
+      (font (nil alice0\ lao apple-roman)
+           (nil alice0\ lao iso8859-1)))
+
+(category
+ ;; C: CONSONANT (except for c and s)
+ ;; c: TALL CONSONANT
+ ;; s: LAO SEMIVOWEL SIGN LO
+ ;; A: VOWEL AM
+ ;; V: VOWEL UPPER
+ ;; v: VOWEL LOWER
+ ;; T: TONE
+ ;; I: INDEPENDENT VOWEL (except for A)
+ ;; S: SIGN
+ (0x0E81 0x0E82        ?C)
+ (0x0E84       ?C)
+ (0x0E87 0x0E88        ?C)
+ (0x0E8A       ?C)
+ (0x0E8D       ?C)
+ (0x0E94 0x0E97        ?C)
+ (0x0E99 0x0E9E        ?C)
+ (0x0E9B       ?c)
+ (0x0E9D       ?c)
+ (0x0E9F       ?c)
+ (0x0EA1 0x0EA3        ?C)
+ (0x0EA2       ?c)
+ (0x0EA5       ?C)
+ (0x0EA7       ?C)
+ (0x0EAA 0x0EAB        ?C)
+ (0x0EAD 0x0EAE        ?C)
+ (0x0EAF       ?S)
+ (0x0EB0       ?I)
+ (0x0EB1       ?V)
+ (0x0EB2       ?I)
+ (0x0EB3       ?A)
+ (0x0EB4 0x0EB7        ?V)
+ (0x0EB8 0x0EB9        ?v)
+ (0x0EBB       ?V)
+ (0x0EBC       ?s)
+ (0x0EBD       ?I)
+ (0x0EC0 0x0EC4 ?I)
+ (0x0EC6       ?S)
+ (0x0EC8 0x0ECC        ?T)
+ (0x0ECD       ?V)
+ (0x0EDC 0x0EDD ?C))
+
+(generator
+ (0
+  (cond
+   ("(Cs?)(T?A)"
+    < (1 independent semi-vowel) (2 am-after-normal-c) > )
+   ("(cs?)(T?A)"
+    < (1 independent semi-vowel) (2 am-after-tall-c) > )
+   ("(Cs?)([vV]?T?)"
+    < (1 independent semi-vowel) (2 vowel-tone-after-c *) > )
+   ("(cs?)([vV]?T?)"
+    < (1 independent semi-vowel) (2 Br<Bl vowel-tone-after-c *) > )
+   ("[sVvTA]"
+    [ isolated-dependent ])
+   ("."
+    independent))
+  *)
+
+ (independent
+  (cond
+   ((0x0E81)   0xA1)
+   ((0x0E82)   0xA2)
+   ((0x0E84)   0xA3)
+   ((0x0E87)   0xA4)
+   ((0x0E88)   0xA5)
+   ((0x0E8A)   0xA7)
+   ((0x0E8D)   0xA8)
+   ((0x0E94)   0xA9)
+   ((0x0E95)   0xAA)
+   ((0x0E96)   0xAB)
+   ((0x0E97)   0xEA)
+   ((0x0E99)   0xAD)
+   ((0x0E9A)   0xAE)
+   ((0x0E9B)   0xAF)
+   ((0x0E9C)   0xB0)
+   ((0x0E9D)   0xB1)
+   ((0x0E9E)   0xB2)
+   ((0x0E9F)   0xB3)
+   ((0x0EA1)   0xB4)
+   ((0x0EA2)   0xB5)
+   ((0x0EA3)   0xEB)
+   ((0x0EA5)   0xEC)
+   ((0x0EA7)   0xB8)
+   ((0x0EAA)   0xA6)
+   ((0x0EAB)   0xB9)
+   ((0x0EAD)   0xBA)
+   ((0x0EAE)   0xBB)
+   ;; ((0x0EAF)        ??)
+   ((0x0EB0)   0xBD)
+   ((0x0EB2)   0xBE)
+   ((0x0EB3)   0xBF)
+   ((0x0EB4)   [ 0xF2 ])
+   ((0x0EBD)   0xBC)
+   ((0x0EC0)   0xC0)
+   ((0x0EC1)   0xC1)
+   ((0x0EC2)   0xC2)
+   ((0x0EC3)   0xC3)
+   ((0x0EC4)   0xC4)
+   ((0x0EC6)   0xC5)
+   ((0x0EC6)   0xC5)
+   ((0x0EDC)   0xCE)
+   ((0x0EDD)   0xCF)))
+
+ (semi-vowel
+  ((0x0EBC)    0xF9))
+
+ (am-after-normal-c
+  (cond
+   ((0x0EB3)           0xED)
+   ((0x0EC8 0x0EB3)    0xEE)
+   ((0x0EC9 0x0EB3)    0xEF)
+   ((0x0ECA 0x0EB3)    0xFC 0xED)
+   ((0x0ECB 0x0EB3)    0xFD 0xED)
+   ((0x0ECC 0x0EB3)    0xFE 0xED)))
+
+ (am-after-tall-c
+  (cond
+   ((0x0EB3)           0xD6 0xBE)
+   ((0x0EC8 0x0EB3)    0xD2 0xBE)
+   ((0x0EC9 0x0EB3)    0xD3 0xBE)
+   ((0x0ECA 0x0EB3)    0xFC 0xF0 0xBE)
+   ((0x0ECB 0x0EB3)    0xFD 0xF0 0xBE)
+   ((0x0ECC 0x0EB3)    0xFE 0xF0 0xBE)))
+
+ (vowel-tone-after-c
+  (cond
+   ((0x0EB1 0x0EC8)    0x84)
+   ((0x0EB1 0x0EC9)    0x98)
+   ((0x0EB1)           0xD7)
+   ((0x0EB4 0x0EC8)    0x85)
+   ((0x0EB4 0x0EC9)    0x99)
+   ((0x0EB4)           0xD8)
+   ((0x0EB5 0x0EC8)    0x86)
+   ((0x0EB5 0x0EC9)    0x9A)
+   ((0x0EB5)           0xD9)
+   ((0x0EB6 0x0EC8)    0x87)
+   ((0x0EB6 0x0EC9)    0x9B)
+   ((0x0EB6)           0xDA)
+   ((0x0EB7 0x0EC8)    0x88)
+   ((0x0EB7 0x0EC9)    0x9C)
+   ((0x0EB7)           0xDB)
+   ((0x0EB8)           0xF7)
+   ((0x0EB9)           0xF8)
+   ((0x0EBB 0x0EC8)    0x89)
+   ((0x0EBB 0x0EC9)    0x9D)
+   ((0x0EBB)           0xDC)
+   ((0x0EC8)           tr+bl 0xC8)
+   ((0x0EC9)           tr+bl 0xC9)
+   ((0x0ECA)           tr+bl 0xCA)
+   ((0x0ECB)           tr+bl 0xCB)
+   ((0x0ECC)           tr+bl 0xCC)
+   ((0x0ECD)           0xD6)))
+
+ (isolated-dependent
+  (cond
+   ((0x0EB1)   0xF1)
+   ((0x0EB4)   0xF2)
+   ((0x0EB5)   0xF3)
+   ((0x0EB6)   0xF4)
+   ((0x0EB7)   0xF5)
+   ((0x0EB8)   0xF7)
+   ((0x0EB9)   0xF8)
+   ((0x0EBB)   0xF6)
+   ((0x0EC8)   0xC8)
+   ((0x0EC9)   0xC9)
+   ((0x0ECA)   0xCA)
+   ((0x0ECB)   0xCB)
+   ((0x0ECC)   0xCC)
+   ((0x0ECD)   0xD6))))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/LAOO-GENERIC.flt b/FLT/LAOO-GENERIC.flt
new file mode 100644 (file)
index 0000000..a4fda49
--- /dev/null
@@ -0,0 +1,91 @@
+;; LAOO-GENERIC.flt -- Font Layout Table for Lao
+;; Copyright (C) 2005, 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.
+
+;; 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.
+
+;;; <li> LAOO-GENERIC.flt
+
+(font layouter laoo-generic nil
+      (font (nil nil unicode-bmp :lang=lo)))
+
+(category
+ ;; C: CONSONANT (except for c and s)
+ ;; c: TALL CONSONANT
+ ;; s: LAO SEMIVOWEL SIGN LO
+ ;; A: VOWEL AM
+ ;; V: VOWEL UPPER
+ ;; v: VOWEL LOWER
+ ;; T: TONE
+ ;; I: INDEPENDENT VOWEL (except for A)
+ ;; S: SIGN
+ (0x0E81 0x0E82        ?C)
+ (0x0E84       ?C)
+ (0x0E87 0x0E88        ?C)
+ (0x0E8A       ?C)
+ (0x0E8D       ?C)
+ (0x0E94 0x0E97        ?C)
+ (0x0E99 0x0E9E        ?C)
+ (0x0E9B       ?c)
+ (0x0E9D       ?c)
+ (0x0E9F       ?c)
+ (0x0EA1 0x0EA3        ?C)
+ (0x0EA2       ?c)
+ (0x0EA5       ?C)
+ (0x0EA7       ?C)
+ (0x0EAA 0x0EAB        ?C)
+ (0x0EAD 0x0EAE        ?C)
+ (0x0EAF       ?S)
+ (0x0EB0       ?I)
+ (0x0EB1       ?V)
+ (0x0EB2       ?I)
+ (0x0EB3       ?A)
+ (0x0EB4 0x0EB7        ?V)
+ (0x0EB8 0x0EB9        ?v)
+ (0x0EBB       ?V)
+ (0x0EBC       ?s)
+ (0x0EBD       ?I)
+ (0x0EC0 0x0EC4 ?I)
+ (0x0EC6       ?S)
+ (0x0EC8 0x0ECC        ?T)
+ (0x0ECD       ?V)
+ (0x0ED0 0x0ED9 ?I)
+ (0x0EDC 0x0EDD ?C))
+
+(generator
+ (0
+  (cond
+   ("(Cs?)(T)?(A)"
+    < (1 = =) 0x0ECD (2 tr+bl =) (3 0x0EB2) > )
+   ("(cs?)(T)?(A)"
+    < (1 = =) Br<10Bl 0x0ECD (2 tr+<10bl =) (3 0x0EB2) > )
+   ("(Cs?[vV]?)(T)?"
+    < (1 = *) (2 tr+bl =) > )
+   ("(cs?)([vV])?(T)?"
+    < (1 = *) (2 (cond ("v" =) ("." Br<10Bl =))) (3 tr+<10bl =) > )
+   ("[sVvTA]"
+    [ = ])
+   ("."
+    =))
+  *))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/LAOO-MULE.flt b/FLT/LAOO-MULE.flt
new file mode 100644 (file)
index 0000000..064077f
--- /dev/null
@@ -0,0 +1,131 @@
+;; LAOO-MULE.flt -- Font Layout Table for Lao (mule font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> LAOO-MULE.flt
+;;;
+;;; For Lao fonts of mule encoding to draw Lao script.  The font is
+;;; available at:
+;;; <ul>
+;;; <li> infopage: http://www.gnu.org/directory/localization/intlfonts.html
+;;; <li> download: ftp://ftp.gnu.org/pub/gnu/intlfonts/intlfonts-1.2.1.tar.gz
+;;; </ul>
+
+(font layouter laoo-mule nil
+      (font (mulelao-1)))
+
+(category
+ ;; C: CONSONANT (except c and s)
+ ;; c: TALL CONSONANT
+ ;; s: LAO SEMIVOWEL SIGN LO
+ ;; V: VOWEL UPPER
+ ;; v: VOWEL LOWER
+ ;; T: TONE
+ ;; I: INDEPENDENT
+ ;;
+ (0x0E80 0x0EDF        ?I)
+ (0x0E81 0x0E82        ?C)
+ (0x0E84       ?C)
+ (0x0E87 0x0E88        ?C)
+ (0x0E8A       ?C)
+ (0x0E8D       ?C)
+ (0x0E94 0x0E97        ?C)
+ (0x0E99 0x0E9E        ?C)
+ (0x0E9B       ?c)
+ (0x0E9D       ?c)
+ (0x0E9F       ?c)
+ (0x0EA1 0x0EA3        ?C)
+ (0x0EA2       ?c)
+ (0x0EA5       ?C)
+ (0x0EA7       ?C)
+ (0x0EAA 0x0EAB        ?C)
+ (0x0EAD 0x0EAE        ?C)
+ (0x0EB1       ?V)
+ (0x0EB4 0x0EB7        ?V)
+ (0x0EB8 0x0EB9        ?v)
+ (0x0EBB       ?V)
+ (0x0EBC       ?s)
+ (0x0EC8 0x0ECC        ?T)
+ (0x0ECD       ?V))
+
+(generator
+ (0
+  (cond
+   ("cs?(VT?|v?T)"
+    <
+    ("(cs?)" independent semi-vowel)
+    ("VT?" composed-non-relative composed-relative *)
+    (".*" composed-non-relative *)
+    > )
+   ("Cs?[vV]?T?"
+    < independent semi-vowel composed-relative * > )
+   ("[^Cs]*"
+    independent *))
+  *)
+
+ (independent
+  ((range 0x0E80 0x0EDF) 0xA0))
+
+ (composed-relative
+  (cond
+   ((0x0EB1)   tc+bc 0xD1)
+   ((0x0EB4)   tc+bc 0xD4)
+   ((0x0EB5)   tc+bc 0xD5)
+   ((0x0EB6)   tc+bc 0xD6)
+   ((0x0EB7)   tc+bc 0xD7)
+   ((0x0EB8)   bc+tc 0xD8)
+   ((0x0EB9)   bc+tc 0xD9)
+   ((0x0EBB)   tc+bc 0xDB)
+   ((0x0EC7)   tc+bc 0xE7)
+   ((0x0EC8)   tc+bc 0xE8)
+   ((0x0EC9)   tc+bc 0xE9)
+   ((0x0ECA)   tc+bc 0xEA)
+   ((0x0ECB)   tc+bc 0xEB)
+   ((0x0ECC)   tc+bc 0xEC)
+   ((0x0ECD)   tc+bc 0xED)
+   ((0x0ECE)   tc+bc 0xEE)))
+
+ (semi-vowel
+  ((0x0EBC)    Bc-Bc 0xDC))
+
+ (composed-non-relative
+  (cond
+   ((0x0EB1)   Bc-Bc 0xD1)
+   ((0x0EB4)   Bc-Bc 0xD4)
+   ((0x0EB5)   Bc-Bc 0xD5)
+   ((0x0EB6)   Bc-Bc 0xD6)
+   ((0x0EB7)   Bc-Bc 0xD7)
+   ((0x0EB8)   Bc-Bc 0xD8)
+   ((0x0EB9)   Bc-Bc 0xD9)
+   ((0x0EBB)   Bc-Bc 0xDB)
+   ((0x0E47)   Bc-Bc 0xE7)
+   ((0x0E48)   Bc-Bc 0xE8)
+   ((0x0E49)   Bc-Bc 0xE9)
+   ((0x0E4A)   Bc-Bc 0xEA)
+   ((0x0E4B)   Bc-Bc 0xEB)
+   ((0x0E4C)   Bc-Bc 0xEC)
+   ((0x0E4D)   Bc-Bc 0xED)
+   ((0x0E4E)   Bc-Bc 0xEE))))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/LAOO-OTF.flt b/FLT/LAOO-OTF.flt
new file mode 100644 (file)
index 0000000..705a16b
--- /dev/null
@@ -0,0 +1,80 @@
+;; LAOO-OTF.flt -- Font Layout Table for Lao
+;; Copyright (C) 2006, 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.
+
+;; 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.
+
+;;; <li> LAOO-OTF.flt
+
+(font layouter laoo-otf nil
+      (font (nil phetsarath\ ot unicode-bmp)))
+
+(category
+ ;; C: CONSONANT
+ ;; S: LAO SEMIVOWEL SIGN LO
+ ;; A: VOWEL AM
+ ;; V: DEPENDENT VOWEL
+ ;; T: TONE
+ ;; I: OTHER INDEPENDENT
+ (0x0E81 0x0EAE        ?C)
+ (0x0EAF 0x0EB0        ?I)
+ (0x0EB1       ?V)
+ (0x0EB2       ?I)
+ (0x0EB3       ?A)
+ (0x0EB4 0x0EBB        ?V)
+ (0x0EBC       ?S)
+ (0x0EBD 0x0EC6        ?I)
+ (0x0EC8 0x0ECC        ?T)
+ (0x0ECD       ?V)
+ (0x0ED0 0x0ED9 ?I)
+ (0x0EDC 0x0EDD ?C)
+
+ (0x25CC       ?I))
+
+;; The only GSUB is the decomposition of AM.  We do it by hand because
+;; it requires reordering in addition to decomposition.
+
+(generator
+ (0
+  (cond
+   ("(CS?)(T)?A"
+    < | (1 = *) 0x0ECD (2 =) 0x0EB2 | > )
+   ("CS?V?T?"
+    < | = * | > )
+   ("[SVT]"
+    < | 0x25CC = | > )
+   ("."
+    =))
+  *))
+
+;; Then apply all GPOS features.
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1 otf:lao\ =))
+   ("."
+    [ otf:lao\ =+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/MLYM-CDAC.flt b/FLT/MLYM-CDAC.flt
new file mode 100644 (file)
index 0000000..f4460d2
--- /dev/null
@@ -0,0 +1,242 @@
+;; MLYM-CDAC.flt -- Font Layout Table for Malayalam (C-DAC font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> MLYM-CDAC.flt
+;;;
+;;; For the font MLKR0ntt.ttf (developped by C-DAC, encoding is ISFOC)
+;;; to draw Malayalam script.  The font is available at:
+;;; <ul>
+;;; <li>       infopage: http://www.iiit.net/ltrc/iscii/FAQ.htm#SEC2.1
+;;; <li> download: http://www.iiit.net/ltrc/iscii/iscii_plugin_linux.tar.gz
+;;; </ul>
+
+(font layouter mlym-cdac nil
+      (font (malayalam-cdac)
+           (nil ml-ttkarthika apple-roman)))
+
+(category
+ (0x0D00 0x0D7F        ?E)                     ; all malayalam characters
+ (0x0D02       ?A)                     ; ANUSVARA
+ (0x0D03       ?G)                     ; VISARGA
+ (0x0D05 0x0D14        ?V)                     ; independent vowel
+ (0x0D15 0x0D39 ?C)                    ; consonant
+ (0x0D3E 0x0D4C ?M)                    ; dependent vowel (MATRA)
+ (0x0D4D       ?H)                     ; HALANT
+ )
+
+(generator
+ (0
+  (cond
+   ("(VA?)|G|((CH)?(CH)?(CH)?CH)?C(H|M?[AH]?)?" | glyph * |)
+   ("." glyph ))
+  * )
+
+ (glyph
+  (cond
+   ;; various sign
+   ((0x0D02)                   0x77)
+   ((0x0D03)                   0x78)
+   ;; Independent Vowels
+   ((0x0D05)                   0x41)
+   ((0x0D06)                   0x42)
+   ((0x0D07)                   0x43)
+   ((0x0D08)                   0x43 0x75)
+   ((0x0D09)                   0x44)
+   ((0x0D0A)                   0x44 0x75)
+   ((0x0D0B)                   0x45)
+   ((0x0D0C)                   0x23)
+   ((0x0D0E)                   0x46)
+   ((0x0D0F)                   0x47)
+   ((0x0D10)                   0x73 0x46)
+   ((0x0D12)                   0x48)
+   ((0x0D13)                   0x48 0x6D)
+   ((0x0D14)                   0x48 0x75)
+   ;; Consonants
+   ((0x0D15 0x0D4D 0x0D15 0x0D41)              0xE7)
+   ((0x0D15 0x0D4D 0x0D15)     0xA1)
+   ((0x0D15 0x0D4D 0x0D33)     0xA2)
+   ((0x0D15 0x0D4D 0x0D37)     0xA3)
+   ((0x0D15 0x0D4D 0x0D1F)     0xCE)
+   ((0x0D15 0x0D4D 0x0D24)     0xE0)
+   ((0x0D15 0x0D41)            0xE6)
+   ((0x0D15 0x0D41)            0xE6)
+   ((0x0D15)                   0x49)
+   ((0x0D16)                   0x4A)
+   ((0x0D17 0x0D4D 0x0D17)     0xA4)
+   ((0x0D17 0x0D4D 0x0D32)     0xA5)
+   ((0x0D17 0x0D4D 0x0D2E)     0xDC)
+   ((0x0D17 0x0D4D 0x0D28)     0xE1)
+   ((0x0D17)                   0x4B)
+   ((0x0D18)                   0x4C)
+   ((0x0D19 0x0D4D 0x0D15)     0xA6)
+   ((0x0D19 0x0D4D 0x0D19)     0xA7)
+   ((0x0D19 0x0D4D 0x0D15 0x0D41)              0xE8)
+   ((0x0D19)                   0x4D)
+   ((0x0D1A 0x0D4D 0x0D1A)     0xA8)
+   ((0x0D1A 0x0D4D 0x0D1B)     0xD1)
+   ((0x0D1A)                   0x4E)
+   ((0x0D1B)                   0x4F)
+   ((0x0D1C 0x0D4D 0x0D1C)     0xD6)
+   ((0x0D1C 0x0D4D 0x0D1E)     0xDA)
+   ((0x0D1C)                   0x50)
+   ((0x0D1D)                   0x51)
+   ((0x0D1E 0x0D4D 0x0D1A)     0xA9)
+   ((0x0D1E 0x0D4D 0x0D1E)     0xAA)
+   ((0x0D1E)                   0x52)
+   ((0x0D1F 0x0D4D 0x0D1F)     0xAB)
+   ((0x0D1F)                   0x53)
+   ((0x0D20)                   0x54)
+   ((0x0D21 0x0D4D 0x0D21)     0xCD)
+   ((0x0D21)                   0x55)
+   ((0x0D22)                   0x56)
+   ((0x0D23 0x0D41 0x0D4D)     0xAC)
+   ((0x0D23 0x0D41)            0xE9)
+   ((0x0D23 0x0D4D 0x0D1F)     0xAD)
+   ((0x0D23 0x0D4D 0x0D23)     0xAE)
+   ((0x0D23 0x0D4D 0x0D2E)     0xD7)
+   ((0x0D23 0x0D4D 0x0D21)     0xDE)
+   ((0x0D23)                   0x57)
+   ((0x0D24 0x0D4D 0x0D24)     0xAF)
+   ((0x0D24 0x0D4D 0x0D25)     0xB0)
+   ((0x0D24 0x0D4D 0x0D38)     0xD5)
+   ((0x0D24 0x0D4D 0x0D2D)     0xDB)
+   ((0x0D24 0x0D4D 0x0D2E)     0xDF)
+   ((0x0D24)                   0x58)
+   ((0x0D25)                   0x59)
+   ((0x0D26 0x0D4D 0x0D26)     0xB1)
+   ((0x0D26 0x0D4D 0x0D27)     0xB2)
+   ((0x0D26)                   0x5A)
+   ((0x0D27)                   0x5B)
+   ((0x0D28 0x0D41 0x0D4D)     0xB3)
+   ((0x0D28 0x0D41)            0xEB)
+   ((0x0D28 0x0D4D 0x0D24)     0xB4)
+   ((0x0D28 0x0D4D 0x0D26)     0xB5)
+   ((0x0D28 0x0D4D 0x0D28 0x0D41)              0xEC)
+   ((0x0D28 0x0D4D 0x0D28)     0xB6)
+   ((0x0D28 0x0D4D 0x0D2E)     0xB7)
+   ((0x0D28 0x0D4D 0x0D27)     0xD4)
+   ((0x0D28 0x0D4D 0x0D25)     0xD9)
+   ((0x0D28 0x0D4D 0x0D31)     0xE2)
+   ((0x0D28)                   0x5C)
+   ((0x0D2A 0x0D4D 0x0D2A)     0xB8)
+   ((0x0D2A 0x0D4D 0x0D32)     0xB9)
+   ((0x0D2A)                   0x5D)
+   ((0x0D2B)                   0x5E)
+   ((0x0D2C 0x0D4D 0x0D2C)     0xBA)
+   ((0x0D2C 0x0D4D 0x0D32)     0xBB)
+   ((0x0D2C 0x0D4D 0x0D27)     0xCF)
+   ((0x0D2C 0x0D4D 0x0D26)     0xD0)
+   ((0x0D2C)                   0x5F)
+   ((0x0D2D)                   0x60)
+   ((0x0D2E 0x0D4D 0x0D2A)     0xBC)
+   ((0x0D2E 0x0D4D 0x0D2E)     0xBD)
+   ((0x0D2E 0x0D4D 0x0D32)     0xBE)
+   ((0x0D2E)                   0x61)
+   ((0x0D2F)                   0x62)
+   ((0x0D2F 0x0D4D 0x0D2F)     0xBF)
+   ((0x0D2F 0x0D4D 0x0D15 0x0D4D 0x0D15)               0xED)
+   ((0x0D30 0x0D41 0x0D4D)     0xC0)
+   ((0x0D30 0x0D41)            0xEA)
+   ((0x0D30)                   0x63)
+   ((0x0D31 0x0D4D 0x0D31)     0xE4)
+   ((0x0D31 0x0D4D)            0xC0)
+   ((0x0D31 0x0D41 0x0D4D)     0xC0)
+   ((0x0D31)                   0x64)
+   ((0x0D32 0x0D41 0x0D4D)     0xC2)
+   ((0x0D32 0x0D4D 0x0D32)     0xC3)
+   ((0x0D32 0x0D4D 0x0D2A)     0xE5)
+   ((0x0D32)                   0x65)
+   ((0x0D33 0x0D41 0x0D4D)     0xC4)
+   ((0x0D33 0x0D4D 0x0D33)     0xC5)
+   ((0x0D33)                   0x66)
+   ((0x0D34)                   0x67)
+   ((0x0D35 0x0D4D 0x0D35)     0xC6)
+   ((0x0D35)                   0x68)
+   ((0x0D36 0x0D4D 0x0D32)     0xC7)
+   ((0x0D36 0x0D4D 0x0D36)     0xC8)
+   ((0x0D36 0x0D4D 0x0D1A)     0xDD)
+   ((0x0D36)                   0x69)
+   ((0x0D37 0x0D4D 0x0D1F)     0xE3)
+   ((0x0D37)                   0x6A)
+   ((0x0D38 0x0D4D 0x0D32)     0xC9)
+   ((0x0D38 0x0D4D 0x0D38)     0xCA)
+   ((0x0D38 0x0D4D 0x0D31 0x0D4D 0x0D31)               0xCC)
+   ((0x0D38 0x0D4D 0x0D25)     0xD8)
+   ((0x0D38)                   0x6B)
+   ((0x0D39 0x0D4D 0x0D32)     0xCB)
+   ((0x0D39 0x0D4D 0x0D2E)     0xD2)
+   ((0x0D39 0x0D4D 0x0D28)     0xD3)
+   ((0x0D39)                   0x6C)
+   ;; Dependent vowel signs
+   ((0x0D3E)                   0x6D)
+   ((0x0D3F)                   0x6E)
+   ((0x0D40)                   0x6F)
+   ((0x0D41)                   0x70)
+   ((0x0D42)                   0x71)
+   ((0x0D43)                   0x72)
+   ((0x0D46)                   0x73)
+   ((0x0D47)                   0x74)
+   ((0x0D48)                   0x73 0x73)
+   ((0x0D4A)                   0x73 0x6D)
+   ((0x0D4B)                   0x74 0x6D)
+   ((0x0D4C)                   0x75)
+   ;; Various signs
+   ((0x0D4D 0x0D2F 0x0D41)     0x7C)
+   ((0x0D4D 0x0D2F 0x0D42)     0x7D)
+   ((0x0D4D 0x0D2F)            0x79)
+   ((0x0D4D 0x0D30 0x0D4D)     0x72)
+   ((0x0D4D 0x0D30)            0x7B)
+   ((0x0D4D 0x0D31 0x0D4D)     0x72)
+   ((0x0D4D 0x0D31)            0x7B)
+   ((0x0D4D 0x0D35)            0x7A)
+   ((0x0D4D 0x0D4D)            0x76)
+   ((0x0D4D)                   0x76)
+   ((0x0D57)                   0x75))))
+
+(category
+ (0x00 0xFF    ?M)
+ (0x49 0x6C    ?C)
+ (0x73         ?E)                     ; E
+ (0x74         ?e)                     ; EE
+ (0x79         ?Y)                     ; yakar
+ (0x7A         ?V)                     ; vakar
+ (0x7B         ?R)                     ; rrakar
+ (0xA1 0xE5    ?C))
+
+(generator
+ (0
+  (cond
+   (" (C[YV]?)(R) "
+    < (2 =) (1 = *) >)
+   (" (R?C[YV]?)(EE?) "
+    < (2 = *) (1 = *) >)
+   (" (R?C[YV]?)(e) "
+    < (2 = ) (1 = *) >)
+   (" ([^ ]*) "
+    < (1 = *) >)
+   ("." [ = ]))
+  *))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/MLYM-OTF.flt b/FLT/MLYM-OTF.flt
new file mode 100644 (file)
index 0000000..8cbb821
--- /dev/null
@@ -0,0 +1,207 @@
+;; MLYM-OTF.flt -- Font Layout Table for Malayalam OpenType font
+;; Copyright (C) 2003, 2004, 2005, 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.
+
+;; 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.
+
+;;; <li> MLYM-OTF.flt
+;;;
+;;; For Malayalam OpenType fonts to draw the reformed Malayalam script.
+
+(font layouter mlym-otf nil
+      (font (nil nil unicode-bmp :otf=mlym=haln)))
+
+;; 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:
diff --git a/FLT/MLYM-RACHANA.flt b/FLT/MLYM-RACHANA.flt
new file mode 100644 (file)
index 0000000..9b41b86
--- /dev/null
@@ -0,0 +1,133 @@
+;; MLYM-RACHANA.flt -- Font Layout Table for Malayalam Rachana font
+;; Copyright (C) 2005, 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.
+
+;; 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.
+
+;;; <li> MLYM-RACHANA.flt
+;;;
+;;; For the Rachana Malayalam fonts to draw the traditional Malayalam
+;;; script.  This fonts handles virtually all ligatures with the AKHN
+;;; feature without character reordering.
+
+(font layouter mlym-rachana nil
+      (font (nil rachana unicode-bmp)))
+
+;; The first stage is to extract a syllable and re-order characters.
+(category
+ ;; C: consonant
+ ;; H: HALANT
+ ;; m: MATRA (Mpre)
+ ;; p: MATRA (Mpost)
+ ;; t: MATRA (two-part: Mpre+Mpost)
+ ;; A: vowel modifier (post) (ANUSVARA and VISARGA)
+ ;; V: independent vowel
+ ;; E: else (all other independnt characters)
+ (0x0D00 0x0D7F        ?E)                     ; else
+ (0x0D02 0x0D03        ?A)                     ; ANUSVARA & VISARGA
+ (0x0D05 0x0D14        ?V)                     ; independent vowel
+ (0x0D15 0x0D39 ?C)                    ; consonant
+ (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
+ (0x0D7F       ?x)                     ; Internal use
+ (0x200C       ?N)                     ; ZERO WIDTH NON-JOINER
+ (0x200D       ?J)                     ; ZERO WIDTH JOINER
+ )
+
+;; Step 0.  Syllable identification.
+(generator
+ (0
+  (cond
+   ;; Halant + ZWNJ -- forced explicit halant.
+   ("((CH)*C)HN"
+    < | (1 otf:mlym=akhn,psts,haln) 0x0D4D | >)
+
+   ;; Halant + ZWJ -- forced cillaksaram.
+   ("(CH)*(CH)J"
+    < | (1 otf:mlym=akhn,psts,haln) (2 otf:mlym=haln) | >)
+
+   ;; Pre-consonant vowel is temporarily moved to the leftmost
+   ;; position to permit consonant ligature.
+   ("((CH)*C)(m)(A?)"
+    < | (3 =) (1 otf:mlym=akhn,psts,haln) 0x0D7F (4 =) | >)
+
+   ;; Two-part vowel sign.
+   ("((CH)*C)(t)(A?)"
+    < | (3 pre) (1 otf:mlym=akhn,psts,haln) 0x0D7F (3 post) (4 =) | >)
+
+   ;; Post-consonant vowel sign and/or vowel modifier.
+   ("((CH)*C(pA?|A))"
+    < | (1 otf:mlym=akhn,psts,haln) | >)
+
+   ;; No vowel sign.
+   ("((CH)*C(H?))"
+    < | (1 otf:mlym=akhn,psts,haln) | >)
+
+   ;; A syllable starting with an independent vowel.
+   ("(VA?)"
+    < | (1 = *) | >)
+
+   ;; Other dedependent character.
+   ("[Apmt]" [ = ])
+
+   ;; Other independent character.
+   ("." =))
+  *)
+
+ ;; Former part of two-part vowel sign.
+ (pre
+  (cond
+   ((0x0D4A) 0x0D46)
+   ((0x0D4B) 0x0D47)
+   ((0x0D4C) 0x0D46)))
+
+ ;; Latter part of two-part vowel sign.
+ (post
+  (cond
+   ((0x0D4A) 0x0D3E)
+   ((0x0D4B) 0x0D3E)
+   ((0x0D4C) 0x0D57))))
+
+;; Step 1.  Move Mpre to the left of base consonant(-cluster).
+(generator
+ (0
+  (cond
+   (" (m)([^x]*)([^x])x([^ ]*) "
+    (2 = *) (1 =) (3 =) (4 = *))
+   ("."
+    =))
+  *))
+
+;; Step 2. Finalise.
+(generator
+ (0
+  (cond
+   (" ([^ ]*) " (1 otf:mlym=+))
+   ("." =))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/MYMR-MYAZEDI.flt b/FLT/MYMR-MYAZEDI.flt
new file mode 100644 (file)
index 0000000..4de4b2b
--- /dev/null
@@ -0,0 +1,376 @@
+;; MYMR-MYAZEDI.flt -- Font Layout Table for Myanmar (Zedi font)
+;; Copyright (C) 2004, 2005, 2006, 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.
+
+;; 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.
+
+;;; <li> MYMR-MYAZEDI.flt
+;;;
+;;; For the Myanmar Zedi family fonts to draw Myanmar script.
+;;; <ul>
+;;; <li> download: http://www.myazedi.com/downloads/MyaZedi_M17N.ttf
+;;; </ul>
+
+(font layouter mymr-myazedi nil
+      (font (nil myazedi_m17n unicode-bmp)))
+
+;; 1st stage
+;; Extract syllable while detecting Kinzi, substituting subscripts,
+;; and removing Halants.
+
+(category
+ (0x1000 0x107F ?O)                    ; other
+ (0x1000 0x1021 ?C)                    ; consonant except for c, K, n, M
+ (0x1000 0x1003 ?c)                    ; consonant that has subscript form
+ (0x1004       ?K)                     ; consonant NGA
+ (0x1005 0x1008 ?c)
+ (0x100B 0x100C ?c)
+ (0x100F 0x1019 ?c)
+ (0xE014       ?c)
+ (0xE01B       ?c)
+ (0x1014       ?n)                     ; consonant NA
+ (0x101C       ?c)
+ ;; cosonants that can be a Medial
+ (0x101A       ?M)                     ; medial Ya
+ (0x101B       ?M)                     ; medial Ra 
+ (0x101D       ?M)                     ; medial Wa
+ (0x101F       ?M)                     ; medial Ha
+ (0x1021 0x102A ?I)                    ; independent vowel
+ (0x102C 0x1032        ?V)                     ; dependent Vowel
+ (0x1036       ?A)                     ; sign ANUSVARA
+ (0x1037 0x1038        ?S)                     ; other sign
+ (0x1039       ?H)                     ; HALANT (VIRAMA)
+ (0x200C       ?N)                     ; ZWNJ (Zero Width Non Joiner)
+ (0x200D       ?J)                     ; ZWJ (Zero Width Joiner)
+ )
+
+(generator
+ (0
+  (cond
+   ;; The following regular expression matches a graphme cluster pattern
+   ;; described in Table 10-3 of the Unicode Standard 4.0 except for
+   ;; Kinzi which is encoded by the sequence "U+1004 U+1039 U+200D".
+   ;; 
+   ;;<-1-><---------2--------><--4--><--6--->  <7->
+   ;;              <---3--->   <5->
+   ("(KHJ)([CcnKMr](H[CcnK])?)((HM)*)(V*A?H?)N?(S*)"
+    | < (1 0xE390) (2 consonant) (4 remove-halant *) (6 = *) (7 = *) > |)
+
+   ;; Irregular independent Kinzi
+   ("KHJ"
+    [ 0xE390 ])
+
+   ;; Cluster without Kinzi
+   ("([CcnKMr](H[CcnK])?)((HM)*)(V*A?H?)N?(S*)"
+    | < (1 consonant) (3 remove-halant *) (5 = *) (6 = *) > |)
+
+   ;; Fixme: I'm not sure about the syllable pattern for an
+   ;; independent vowel.
+   ("IV*[AS]*"
+    | < = * > |)
+
+   ;; Treat anything else as a single character.
+   ("."
+    [ = ]))
+  *)
+
+ (consonant
+  (cond
+   ((0x100B 0x1039 0x100C) 0xE10C)
+   ((0x100D 0x1039 0x100D) 0xE00D)
+   ((0x100E 0x1039 0x100D) 0xE10D)
+   ((0x100F 0x1039 0x100D) 0xE20D)
+   ((0x101E 0x1039 0x101E) 0xE01E)
+   ("(n)H([cn])" 0xE140 (2 subscript))
+   ("(.)H([cn])" (1 =) (2 subscript))
+   ("(.)H(.)" (1 =) (2 =))
+   ("." =)))
+
+ (subscript
+  (cond ((range 0x1000 0x101C) 0xE000)))
+
+ (remove-halant
+  (cond
+   ((0x1039))
+   ("." =))))
+
+;; 2nd stage
+;; Handle medials.
+
+(category
+ (0x1000 0x107F ?O)                    ; other
+ (0x1000 0x1021 ?W)                    ; wide consonant
+ (0x1001 0x1002 ?S)                    ; single-width consonant
+ (0x1004 0x1005 ?S)
+ (0x1007 0x1008        ?S)
+ (0x100B 0x100E        ?S)
+ (0x1012 0x1017 ?S)
+ (0x1019       ?S)
+ (0x101A       ?a)                     ; medial Ya
+ (0x101B       ?b)                     ; medial Ra
+ (0x101D       ?d)                     ; medial Wa
+ (0x101F       ?f)                     ; medial Ha
+ (0x1020       ?S)
+ (0x102D 0x102E ?V)                    ; dependent vowel (upper)
+ (0x1032       ?V)
+ (0x200C       ?N)                     ; ZWNJ
+ (0xE000 0xE3FF ?O)
+ (0xE000 0xE01E ?w)                    ; wide subscript
+ (0xE001 0xE002 ?s)                    ; single-width subscript
+ (0xE005       ?s)
+ (0xE007       ?s)
+ (0xE00B       ?s)
+ (0xE012 0xE017 ?s)
+ (0xE019       ?s)
+ (0xE10C 0xE10D ?s)
+ (0xE140       ?s)
+ (0xE20D       ?w)
+ (0xE390       ?K)                     ; Kinzi
+ )
+
+(generator
+ (0
+  (cond
+   (" (K)?([WSabdfws][WSKws]?[abdf][abdf]*[^ ]*) "
+    | (1 =) (2 medial = *) |)
+   (" ([^ ]*) "
+    = *)
+   ("."
+    =))
+  *)
+
+ (medial
+  (cond
+   ;; Medial Ya (U+101A)
+   ("(..?)adf" (1 = *) 0xE1A2)
+   ("(..?)ad"  (1 = *) 0xE1A4)
+   ("(..?)af"  (1 = *) 0xE1A3)
+   ("(..?)a"   (1 = *) 0xE1A1)
+
+   ;; Medial Ra (U+101B)
+   ("([Waf]|.[Ww])bdf" 0xE1BA (1 = *))
+   ("(..?)bdf"         0xE1B9 (1 = *))
+   ("([Waf]|.[Ww])bd"  0xE1B8 (1 = *))
+   ("(..?)bd"          0xE1B7 (1 = *))
+   ("([Waf]|.[Ww])b(f)?(V)"    0xE1B6 (1 = *) (2 0xE1F3) (3 =))
+   ("(..?)b(f)?(V)"            0xE1B5 (1 = *) (2 0xE1F3) (3 =))
+   ;; Single-width consonant + a wide subscript + Medial Ra.
+   ;; To use glyph E1B4, we must shift the single-width consonant to
+   ;; the right.
+   ("([Sd][Ww])b"      0xE1B4 Br>32Bl (1 = *))
+   ("([Waf].|.[Ww])b"  0xE1B4 (1 = *))
+   ("(s|..)b"          0xE1B3 (1 = *))
+   ("([Waf])b(f)?"     0xE1B2 (1 = *) (2 0xE1F3))
+   ("(.)b(f)?"         0xE1B1 (1 = *) (2 0xE1F3))
+   
+   ;; Medial Wa (U+101D)
+   ("(..?)df"          (1 = *) 0xE1D1)
+   ("(..?)d"           (1 = *) 0xE01D)
+
+   ;; Medial Ha (U+101F)
+   ((0x100A 0x101F)    0x100A 0xE1F3)
+   ("(..?)f"           (1 = *) 0xE1F1))))
+
+;; 3rd stage
+;; Reorder Kinzi and Vowel E.  Handle Kinzi-vowel combination.
+
+(category
+ (0x1000 0x107F ?O)
+ (0x1000 0x1021 ?C)                    ; Consonants except for c
+ (0x1001 0x1002 ?c)                    ; Consonants affecting the shape of 
+ (0x1004       ?c)                     ;   the following vowel U+102C
+ (0x1012       ?c)
+ (0x1015       ?c)
+ (0x101D       ?c)
+ (0x1008       ?b)
+ (0x100A 0x100D        ?b)
+ (0x1020       ?b)
+ (0x1025       ?b)
+ (0x102C       ?A)                     ; Vowel AA
+ (0x102D       ?i)                     ; Vowel I
+ (0x102E       ?I)                     ; Vowel II
+ (0x102F       ?u)                     ; Vowel U
+ (0x1030       ?U)                     ; Vowel UU
+ (0x1031       ?e)                     ; Vowel E
+ (0x1032       ?V)                     ; Vowel AI
+ (0x1036 0x1038        ?D)
+ (0x1039       ?H)
+ (0x200C       ?N)
+ (0x200D       ?J)
+ (0xE000 0xE3FF ?O)
+ (0xE000 0xE01D ?b)
+ (0xE140       ?B)
+ (0xE1A1 0xE1B0 ?b)
+ (0xE1B1 0xE1BA ?B)
+ (0xE1D1 0xE1F1 ?B)
+ (0xE20D       ?b)
+ (0xE390       ?K)                     ; Kinzi
+ )
+
+(generator
+ (0
+  (cond
+   (" K([CcbB]*)(e)([^ ]*) "
+    | (2 =) (1 = *) (3 kinzi-vowel = *) |)
+   (" K([CcbB]*)([^ ]*) "
+    | (1 = *) (2 kinzi-vowel = *) |)
+   (" ([CcbB]*)(e)([^ ]*) "
+    | (2 =) (1 = *) (3 = *) |)
+   (" ([^ ]*) "
+    = *)
+   ("."
+    =))
+  *)
+
+ (kinzi-vowel
+  (cond
+   ((0x102D) 0xE391)
+   ((0x102E) 0xE391)
+   ((0x1036) 0xE393)
+   0xE390)))
+
+;; 4th stage
+;; Various glyph substitions.
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    |
+    (1
+     (cond
+      ;; Consonant substituion.
+      ((0x1009 0x1039) 0x1025 0x1039)
+      ((0x1009 0xE005) 0xE109 Br>5Bl 0xE005)
+;;       ((0x101B 0x102F) 0xE01B 0x102F)
+;;       ((0x101B 0x1030) 0xE01B 0x1030)
+;;       ((0x1014 0x102F) 0xE140 0x102F)
+;;       ((0x1014 0x1030) 0xE140 0x1030)
+
+;;       ;; Sign substituion.
+;;       ((0x102F 0x1037) 0x102F 0xE137)
+;;       ((0x1030 0x1037) 0x1030 0xE137)
+;;       ((0xE01D 0x1037) 0xE01D 0xE137)
+;;       ((0xE1A1 0x1036 0x1037) 0xE1A1 0x1036 0xE137)
+;;       ((0xE1A1 0x1032 0x1037) 0xE1A1 0x1032 0xE137)
+;;       ((0xE01D 0x1032 0x1037) 0xE01D 0x1032 0xE137)
+;;       ((0xE01D 0x1036 0x1037) 0xE01D 0x1036 0xE137)
+
+      ;; Vowel substituion.
+      ((0xE1F1 0x102F) 0xE1F2)
+      ((0xE1F1 0x102D 0x102F)  0xE1F2 0x102D)
+      ((0xE1F1 0x102E 0x102F)  0xE1F2 0x102E)
+      ((0xE1F1 0x1032 0x102F)  0xE1F2 0x1032)
+      ("BcK?A"         = = = =)
+      ("cAH"           = 0xE02D)
+      ("cA"            = 0xE02C)
+      ("cKA"           = = Br>Bl 0xE02C)
+      ((0x1012 0xE012 0x102C 0x1039) = = 0xE02D)
+      ((0x1012 0xE01D 0x102C 0x1039) = = 0xE02D)
+      ((0x1012 0xE012 0x102C) = = 0xE02C)
+      ((0x1012 0xE01D 0x102C) = = 0xE02C)
+      ((0x102D 0x1036) 0xE2D1)
+      ("([bB][^u]*)u"  (1 = *) 0xE2F1)
+      ("([bB][^u]*)U"  (1 = *) 0xE2F2)
+      ("." =))
+     *)
+    |)
+   ("."
+    =))
+  *))
+
+;; 5th stage
+;; Adjust below characters (U+102F, U+1037, etc)
+
+(category
+ (0x1000 0x107F ?O)
+ (0x200C 0x200D        ?O)
+ (0xE000 0xE3FF ?O)
+ (0x1014       ?T)                     ; tall consonant (substituted)
+ (0x101B       ?T)
+ (0x102F 0x1030        ?B)                     ; below position (substitute tall one)
+ (0x1037       ?b)                     ; shift to right
+ (0xE01D       ?B)
+ (0xE1A1       ?B)
+ (0xE1D1       ?B)
+ (0xE1B1 0xE1BA ?L)
+ (0xE1F1 0xE1F2        ?B)
+ (0xE2F1 0xE2F2 ?L)                    ; has lower part
+ )
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    |
+    (1
+     (cond
+      ("(T)(B)([OL])?(b)?"
+       (1 (cond ((0x1014) 0xE140) ((0x101B) 0xE01B)))
+       (2 =)
+       (3 = *)
+       (4 0xE137))
+      ("([TBL])(O*)?(b)"
+       (1 =) (2 = *) (3 0xE137))
+      ("." =))
+     *)
+    |)
+   ("OO*" = *)
+   ("." =))
+  *))
+
+;; 6th stage
+;; Adjust conbination of normal consonant and wide subconsonant.
+
+(category
+ (0x1000 0x107F ?O)
+ (0x200C 0x200D        ?O)
+ (0xE000 0xE3FF ?O)
+ (0x1001 0x1002 ?n)
+ (0x1004 0x1005 ?n)
+ (0x1007       ?n)
+ (0x100E       ?n)
+ (0x1012 0x1013 ?n)
+ (0x1015 0x1017 ?n)
+ (0x1019       ?n)
+ (0x101D       ?n)
+ (0xE000       ?w)
+ (0xE003       ?w)
+ (0xE006       ?w)
+ (0xE00C       ?w)
+ (0xE00F       ?w)
+ (0xE010 0xE011 ?w)
+ (0xE018       ?w))
+
+(generator
+ (0
+  (cond
+   (" (n)(w)([^ ]*) "
+    \[ (1 =) (2 Br>17Bl =) (3 = *))
+   (" ([^ ]*) "
+    (1 = *))
+   ("."
+    =))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; coding: utf-8
+;; End:
diff --git a/FLT/NO-CTL.flt b/FLT/NO-CTL.flt
new file mode 100644 (file)
index 0000000..4d8582d
--- /dev/null
@@ -0,0 +1,42 @@
+;; NO-CLT.flt -- Font Layout Table suppressing Complex Text Layout
+;; Copyright (C) 2003, 2004, 2005
+;;   National Institute of Advanced Industrial Science and Technology (AIST)
+;;   Registration Number H15PRO112
+
+;; This file is 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.
+
+;;; <li> NO-CTL.flt
+;;;
+;;; This is to suppress Complex Text Layout for many scripts.  This
+;;; FLT can be used for fonts that have Unicode encoding.  Even if a
+;;; glyph in a font has zero width, the glyph is displayed as if it is
+;;; a spacing glyph.
+
+(category
+ (0x0000 0x10FFFF ?C)
+)
+
+(generator
+ (0
+  (cond 
+   ("C" [ = ]))
+  *))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/ORYA-OTF.flt b/FLT/ORYA-OTF.flt
new file mode 100644 (file)
index 0000000..ebd6ef5
--- /dev/null
@@ -0,0 +1,322 @@
+;; ORYA-OTF.flt -- Font Layout Table for Oriya 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.
+
+;; 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.
+
+;;; <li> ORYA-OTF.flt
+;;;
+;;; For Oriya OpenType fonts to draw the Oriya script.  Tested with
+;;; utkalm.ttf <http://oriya.sarovar.org/download/utkalm.ttf.gz>
+
+(font layouter orya-otf nil
+      (font (nil nil unicode-bmp :otf=orya=rphf)))
+
+(category
+ ;; C: consonant (excluding Y and R)
+ ;; R: consonant RA (reph, below)
+ ;; B: consonant (below)
+ ;; Y: consonant YA, YYA (post)
+ ;; n: NUKTA
+ ;; H: HALANT
+ ;; m: MATRA (pre)
+ ;; u: MATRA (above)
+ ;; b: MATRA (below)
+ ;; p: MATRA (post)
+ ;; t: MATRA (two-part)
+ ;; A: vowel modifier (above)
+ ;; a: vowel modifier (post)
+ ;; V: independent vowel
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0664 0x0665        ?E)                     ; DANDA, DOUBLE DANDA
+ (0x0B00 0x0B7F        ?E)                     ; ELSE
+ (0x0B01       ?A)                     ; SIGN CANDRABINDU (above)
+ (0x0B02 0x0B03        ?a)                     ; SIGN ANUSWAR, VISARGA (post)
+ (0x0B05 0x0B0C        ?V)                     ; LETTER A .. VOCALIC L
+ (0x0B0F 0x0B10        ?V)                     ; LETTER E .. AI
+ (0x0B13 0x0B14        ?V)                     ; LETTER O .. AU
+ (0x0B15 0x0B39        ?C)                     ; LETTER KA .. HA
+ (0x0B24       ?B)                     ; LETTER TA
+ (0x0B28       ?B)                     ; LETTER NA
+ (0x0B2C       ?B)                     ; LETTER BA
+ (0x0B2D       ?B)                     ; LETTER BHA
+ (0x0B2E       ?B)                     ; LETTER MA
+ (0x0B2F       ?Y)                     ; LETTER YA
+ (0x0B30       ?R)                     ; LETTER RA
+ (0x0B32       ?B)                     ; LETTER LA
+ (0x0B33       ?B)                     ; LETTER LLA
+ (0x0B35       ?B)                     ; LETTER VA
+ (0x0B3C       ?n)                     ; SIGN NUKTA
+ (0x0B3E       ?p)                     ; VOWEL SIGN AA (post)
+ (0x0B3F       ?u)                     ; VOWEL SIGN I (above)
+ (0x0B40       ?p)                     ; VOWEL SIGN II (post)
+ (0x0B41 0x0B43        ?b)                     ; VOWEL SIGN U, UU, R (below)
+ (0x0B47       ?m)                     ; VOWEL SIGN E (pre)
+ (0x0B48 0x0B4C ?t)                    ; VOWEL SIGN AI, O, AU (two-part)
+ (0x0B4D       ?H)                     ; SIGN VIRAMA (HALANT)
+ (0x0B56       ?u)                     ; AI LENGTH MARK
+ (0x0B57       ?p)                     ; AU LENGTH MARK
+ (0x0B5C 0x0B5D        ?C)                     ; LETTER RRA, RHA
+ (0x0B5F       ?Y)                     ; LETTER YYA
+ (0x0B60 0x0B61        ?V)                     ; LETTER VOCALIC RR, LL
+ (0x0B71       ?C)                     ; LETTER WA
+ (0x0B7E       ?x)                     ; mark #1 (internal use)
+ (0x0B7F       ?y)                     ; mark #2 (internal use)
+ )
+
+;; Step 1 : Syllable identification.  Recognised syllables are quoted
+;; by the pseudo character, which is generated by the command "|" and
+;; has the category " " (space).
+(generator
+ (0
+  (cond
+   ;; Case F : Syllables containing an independent vowel.
+    ("(RH)?(V)(a)?(A)?"
+    < |
+    (2 =)
+    (1 = =)
+    (3 =)
+    (4 =)
+    | >)
+
+   ;; Case A-C are for those syllables that end with an explicit vowel
+   ;; mark and/or a vowel modifier.  They are divided into three cases
+   ;; for readability of the regular expressions.  The leading
+   ;; consonant-Halant repetition is analysed for reordering in the
+   ;; next step.  A two-part vowel, if any, is split for
+   ;; canonicalisation.
+
+   ;; Case A : A syllable ending with a vowel modifier.
+   ("(RH)?(([CRBY]n?H[NJ]?)*([CRBY]n?))([mbup]*)(t)?([Aa])"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (5 = *)
+    (6 split)
+    (7 =)
+    | >)
+
+   ;; Case B : A syllable ending with a two-part vowel.
+   ("(RH)?(([CRBY]n?H[NJ]?)*([CRBY]n?))(t)"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (5 split)
+    | >)
+
+   ;; Case C : A syllable ending with other vowel(s).  Note that a
+   ;; two-part vowel may be expressed with two vowel marks for
+   ;; backward compatibility.
+   ("(RH)?(([CRBY]n?H[NJ]?)*([CRBY]n?))([mbup]+)"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (5 = *)
+    | >)
+
+   ;; Case E : No explicit vowel nor modifier.  If the syllable ends
+   ;; with a consonant, analyse it for reordering in the next step.
+   ;; Otherwise, just identify the syllable without changing anything.
+   ;;1    23                         4
+   ("(RH)?(([CRBY]n?H[NJ]?)*[CRBY]n?)(HN|HJ|H)?"
+    < |
+    (1 = =)
+    (2 set-marks)
+    (4 = *)
+    | >)
+
+   ("." =))
+  *)
+
+ ;; Set mark #1 (x) at the position where below consonants begin, and
+ ;; mark #2 (y) at the position to which below and above signs will be
+ ;; moved.
+ (set-marks
+  (cond
+   ;; Ending with Y.
+   ;;1        2            3  45        6
+   ("([CRBY]n?(H[NJ]?Cn?)*)(H)(([RB]H)*)(Y)$"
+    (1 = *)                            ; prebase & base
+    0x0B7E                             ; below begin
+    (4 = *)                            ; below consonants
+    0x0B7F                             ; below end
+    (6 =)                              ; YA
+    (3 =))                             ; moved HALANT
+   ;; Ending with R or B.
+   ;;1        2            3  45
+   ("([CRBY]n?(H[NJ]?Cn?)*)(H)(([RB]H)*[RB])$"
+    (1 = *)                            ; prebase & base
+    0x0B7E                             ; below begin
+    (4 = *)                            ; below consonants 
+    (3 =)                              ; moved HALANT
+    0x0B7F)                            ; below end
+   (".+"
+    = *
+    0x0B7E                             ; below begin
+    0x0B7F)))                          ; below end
+
+ ;; Split two-part dependent vowel signs for canonicalisation.
+ (split
+  (cond
+   ((0x0B48)   0x0B47 0x0B56)
+   ((0x0B4B)   0x0B47 0x0B3E)
+   ((0x0B4C)   0x0B47 0x0B57)))
+ )
+
+;; Step 2 : Move Reph and Matra if necessary.  From now on, we care
+;; only for those syllables that have been identified in Step 1.
+(generator
+ (0
+  (cond
+   ;; Special case: a single consonant and a Halant.
+   (" (.)xy(H[NJ]?) "
+    |
+    (1 =)
+    (2 = *)
+    |)
+
+   ;; This is the most generic pattern.  It follows Case A-C and a
+   ;; part of Case E in Step 1.  Now Mark #1 is used to indicate the
+   ;; critical part that requires pre-base substitution in the
+   ;; following steps.
+
+   ;; 1    2         3        4    5   6   7   8   9   10  11
+   (" (RH)?([^ xy]+)x([^ y]*)y(YH)?(m)?(b)?(u)?(p)?(A)?(a)?(HN|HJ|H)? "
+    |
+    (5 =)                              ; [Mpre]
+    ;; We can safely perform Nukta composition here because it does
+    ;; not affect surrounding letters in the syllable.  The Akhand
+    ;; ligature operation is also applied here, before applying the
+    ;; half form operation because the Utkal font generates Akhand
+    ;; ligatures directly from the "C H C" sequence, not via the half
+    ;; form.
+    0x0B7E                             ; begin Cpre & Cbase
+    (2 otf:orya=nukt,akhn+)            ; {Cpre + H} + Cbase
+    0x0B7E                             ; end Cpre & Cbase
+    (3 otf:orya=blwf+)                 ; {Cbelow + H}
+    (6 =)                              ; [Mbelow]
+    (7 =)                              ; [Mabove]
+    (1 otf:orya=rphf+)                 ; [Reph]
+    (4 otf:orya=pstf+)                 ; [Cpost + H]
+    (8 =)                              ; [Mpost]
+    (9 =)                              ; [VMabove]
+    (10 =)                             ; [VMpost]
+    (11 = *)                           ; optional HALANT
+    |)
+
+   ;; Syllables that begin with an independent vowel (following up
+   ;; Step 1, Case F).  Syllables of this type do not require further
+   ;; modification.
+   (" (V)(RH)(.*) "
+    |
+    (1 =)
+    (2 otf:orya=rphf+)
+    (3 = *)
+    |)
+
+   ("." =))
+  *))
+
+;; Step 3 : Now only those syllables that contain the pseudo character
+;; x require pre-base substition.  Unlike the Mukti font for Bengali,
+;; the Utkal font can produce the ligature for "C1 H C2" from
+;; "C1halant" and "C2".  If such a ligature is not available, we get a
+;; sequence consisting of "C1halant" and "C2", which is satisfactory.
+
+(generator
+ (0
+  (cond
+   (" (.H)J "
+    |
+    (1 otf:orya=half+)
+    |)
+   (" (.H)N? "
+    |
+    (1 otf:orya=haln+)
+    |)
+   (" ([^x ]?x)([^x ]*)(x[^ ]*) "
+    |
+    (1 = *)
+    (2 pres)
+    (3 = *)
+    |)
+   ("." =))
+  *)
+
+ (pres
+  (cond
+   ("([^NJ]*)(.H)J(.*)"
+    (1 otf:orya=haln,pres+)
+    (2 otf:orya=half+)
+    (3 pres))
+   ("([^N]*)(H)N(.*)"
+    (1 otf:orya=haln,pres+)
+    (2 =)
+    (3 pres))
+   (".*"
+    otf:orya=haln,pres+)))
+    
+ )
+
+;; Step 4 : Mpre/Cpre reordering.  If the pre-base substitution in
+;; the previous step results in more than one glyph, and there is an
+;; Mpre in this syllable, then move the Mpre before the Cbase.
+;; i.e. [Mpre]{Kh}Kf... -> {Kh}[Mpre]Kf...
+
+(generator
+ (0
+  (cond
+   (" ([^x ])x([^x ]+)([^x ])x([^x ]*) "
+    |
+    (2 = *)
+    (1 =)
+    (3 =)
+    (4 = *)
+    |)
+   (" ([^x ])?x([^x ]*)x([^ ]*) "
+    |
+    (1 =)
+    (2 = *)
+    (3 = *)
+    |)
+   ("." =))
+  *))
+
+;; Step 5 : Substitutions & positioning.
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    ;; FIXME : The pres below is for the TTA ligature in the Utkal
+    ;; font.  It should be removed once the font is updated.
+    (1 otf:orya=vatu,abvs,blws,psts,pres))
+   ("."
+    [ otf:orya=+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/SINH-OTF.flt b/FLT/SINH-OTF.flt
new file mode 100644 (file)
index 0000000..c55089f
--- /dev/null
@@ -0,0 +1,131 @@
+;; SINH-OTF.flt -- Font Layout Table for Sinhala OpenType fonts
+;; Copyright (C) 2004, 2005, 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.
+
+;; 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.
+
+;;; <li> SINH-OTF.flt
+;;;
+;;; For Sinhala OpenType fonts to draw Sinhala.
+;;; A Font is available from <http://sinhala.linux.lk/>.
+
+(font layouter sinh-otf nil
+      (font (nil nil unicode-bmp :otf=sinh=akhn)))
+
+(category
+ ;; V : independent vowels
+ ;; C : consonants
+ ;; H : AL-LAKUNA (virama)
+ ;; m : KOMBUVA
+ ;; M : DIGA KOMBUVA
+ ;; b : below-consonant vowel signs
+ ;; u : above-consonant vowel signs
+ ;; p : post-consonant vowel signs
+ ;; q : AELA-PILLA
+ ;; r : GAYANUKITTA
+ ;; s : KOMBUVA HAA AELA-PILLA
+ ;; t : two-part vowel sign
+ ;; a : AVUSVARAYA & VISARGAYA
+ ;; E : else
+ ;; J : ZERO WIDTH JOINER
+ (0x0D80 0x0DFF ?E)
+ (0x0D82 0x0D83 ?a)
+ (0x0D85 0x0D96 ?V)
+ (0x0D96 0x0DC6 ?C)
+ (0x0DCA       ?H)
+ (0x0DCF       ?q)
+ (0x0DD0 0x0DD1 ?p)
+ (0x0DD2 0x0DD3 ?u)
+ (0x0DD4 0x0DD6 ?b)
+ (0x0DD8       ?p)
+ (0x0DD9       ?m)
+ (0x0DDA       ?t)
+ (0x0DDB       ?M)
+ (0x0DDC       ?s)
+ (0x0DDD 0x0DDE ?t)
+ (0x0DDF       ?r)
+ (0x0DF2 0x0DF3 ?p)
+ (0x200D       ?J)
+ )
+
+;; Step 0 : Syllable identification
+(generator
+
+ (0
+  (cond
+   ;; A syllable containing a completely decomposed two-part vowel sign.
+   ("(C(HJ[CR])*)(m(H|qH?|r)a?)"
+    < | (1 otf:sinh=akhn,vatu,pres) (3 = *) | >)
+
+   ;; A syllable containing KOMBUVA HAA AELA-PILLA.
+   ("(C(HJ[CR])*)(s)(H)?(a)?"
+    < | (1 otf:sinh=akhn,vatu,pres) (3 two-part) (4 =) (5 =) | >)
+
+   ;; A syllable with a two-part vowel sign.
+   ("(C(HJ[CR])*)(t)(a)?"
+    < | (1 otf:sinh=akhn,vatu,pres) (3 two-part) (4 =) | >)
+
+   ;; A syllable with a vowel sign and/or a various sign.
+   ("(C(HJ[CR])*)([mMbupqr]a?|a)"
+    < | (1 otf:sinh=akhn,vatu,pres) (3 = *) | >)
+
+   ;; No signs.
+   ("C(HJ[CR])*H?"
+    < | otf:sinh=akhn,vatu,pres | >)
+
+   ;; Independent vowels.
+   ("Va?"
+    < | = * | >)
+
+   ("." =))
+  *)
+
+ ;; Split two-part dependent vowel signs for canonicalisation.
+ (two-part
+  (cond
+   ((0x0DDA)   0x0DD9 0x0DCA)
+   ((0x0DDC)   0x0DD9 0x0DCF)
+   ((0x0DDD)   0x0DD9 0x0DCF 0x0DCA)
+   ((0x0DDE)   0x0DD9 0x0DDF)))
+ )
+
+;; Step 1 : Move pre-consonant signs.
+(generator
+ (0
+  (cond
+   ;; 1             2     3   4   5   6   7   8   9
+   (" ([^ mMbupqr]+)(m|M)?(b)?(u)?(p)?(q)?(r)?(H)?(a)? "
+    | (2 =) (1 = *) (3 =) (4 =) (5 =) (6 =) (7 =) (8 =) (9 =) |)
+   ("." =))
+  *))
+
+;; Step 2 : OTF substitutions.
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1 otf:sinh))
+   ("."
+    [ otf:sinh=+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/SYRC-OTF.flt b/FLT/SYRC-OTF.flt
new file mode 100644 (file)
index 0000000..39a86b1
--- /dev/null
@@ -0,0 +1,183 @@
+;; SYRC-OTF.flt -- Font Layout Table for Syriac 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.
+
+;; 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.
+
+;;; <li> SYRC-OTF.flt
+;;;
+;;; For Syriac OpenType fonts to draw the Syriac script.
+
+(font layouter syrc-otf nil
+      (font (nil nil unicode-bmp :otf=syrc)))
+
+;; Step 1: Initial, medial, or final.
+
+(category
+ ;; D: Dual-joining
+ ;; R: Right-joining
+ ;; U: Non-joining
+ ;; T: Transparent
+ ;; A: ALAPH
+ ;; r: DALATH, RISH, DOTLESS DALATH RISH
+
+ (0x0700 0x071F        ?U)
+ (0x0710       ?A)
+ (0x0711       ?T)
+ (0x0712 0x072E ?D)
+ (0x0715 0x0716        ?r)
+ (0x0717 0x0719        ?R)
+ (0x071E       ?R)
+ (0x0728       ?R)
+ (0x072A       ?r)
+ (0x072C       ?R)
+ (0x072F       ?R)
+ (0x0730 0x074A ?T)
+ (0x074D       ?R)
+ (0x074E 0x074F        ?D)
+
+ (0x0303       ?T)
+ (0x0330       ?T)
+ (0x0304       ?T)
+ (0x0331       ?T)
+ (0x0307       ?T)
+ (0x0323       ?T)
+ (0x0308       ?T)
+ (0x030A       ?T)
+ (0x0325       ?T)
+ (0x0324       ?T)
+ (0x032D       ?T)
+ (0x032E       ?T)
+
+ (0x064B 0x0655        ?T)
+ (0x0670       ?T)
+
+ (0x200C       ?U)
+ (0x200D       ?D)
+ )
+
+(generator
+ (0
+  (cond
+   ("(r)(T*)(.*)"
+    (1 otf:syrc=isol)
+    (2 = *)
+    (3 dalath-rish))
+
+   ("(D)(T*)([DRAr].*)"
+    (1 otf:syrc=init)
+    (2 = *)
+    (3 join))
+
+   ("(T+)(.*)"
+    (1 = *)
+    (2 disjoin))
+
+   ("(.)(T*)(.*)"
+    (1 otf:syrc=isol)
+    (2 = *)
+    (3 disjoin))))
+
+ (join
+  (cond
+   ("(r)(T*)(.*)"
+    (1 otf:syrc=fina)
+    (2 = *)
+    (3 dalath-rish))
+
+   ("(D)(T*)([DRrA].*)"
+    (1 otf:syrc=medi)
+    (2 = *)
+    (3 join))
+
+   ("(.)(T*)(.*)"
+    (1 otf:syrc=fina)
+    (2 = *)
+    (3 disjoin))))
+
+ (disjoin
+  (cond
+   ("(D)(T*)([DRAr].*)"
+    (1 otf:syrc=init)
+    (2 = *)
+    (3 join))
+
+   ("(r)(T*)(.*)"
+    (1 otf:syrc=isol)
+    (2 = *)
+    (3 dalath-rish))
+
+   ("(A)(T*)([DRAr].*)"
+    (1 otf:syrc=med2)
+    (2 = *)
+    (3 disjoin))
+
+   ("(A)(T*)(.*)"
+    (1 otf:syrc=fin2)
+    (2 = *)
+    (3 disjoin))
+
+   ("(.)(T*)(.*)"
+    (1 otf:syrc=isol)
+    (2 = *)
+    (3 disjoin))))
+
+ (dalath-rish
+  (cond
+   ("(D)(T*)([DRAr].*)"
+    (1 otf:syrc=init)
+    (2 = *)
+    (3 join))
+
+   ("(r)(T*)(.*)"
+    (1 otf:syrc=isol)
+    (2 = *)
+    (3 dalath-rish))
+
+   ("(A)(T*)([DRAr].*)"
+    (1 otf:syrc=med2)
+    (2 = *)
+    (3 disjoin))
+
+   ("(A)(T*)(.*)"
+    (1 otf:syrc=fin3)
+    (2 = *)
+    (3 disjoin))
+
+   ("(.)(T*)(.*)"
+    (1 otf:syrc=isol)
+    (2 = *)
+    (3 disjoin)))))
+
+;; Step 2: Other GSUB features (ligatures, etc.)
+
+(generator
+ (0
+  otf:syrc=rlig,calt,liga,dlig))
+
+;; Step 3: GPOS features.
+
+(generator
+ (0
+  otf:syrc=))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/TAML-CDAC.flt b/FLT/TAML-CDAC.flt
new file mode 100644 (file)
index 0000000..7c0d139
--- /dev/null
@@ -0,0 +1,345 @@
+;; TAML-CDAC.flt -- Font Layout Table for Tamil (C-DAC font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> TAML-CDAC.flt
+;;;
+;;; For the font TMVL0ntt.ttf (developped by C-DAC, encoding is ISFOC)
+;;; to draw Tamil script.  The font is available at:
+;;; <ul>
+;;; <li>       infopage: http://www.iiit.net/ltrc/iscii/FAQ.htm#SEC2.1
+;;; <li> download: http://www.iiit.net/ltrc/iscii/iscii_plugin_linux.tar.gz
+;;; </ul>
+
+(font layouter taml-cdac nil
+      (font (nil tm-ttvalluvar apple-roman)))
+
+(category
+ ;; C: CONSONANT
+ ;; I: INDEPENDENT VOWEL
+ ;; R: DEPENDENT VOWEL RIGHT
+ ;; L: DEPENDENT VOWEL LEFT
+ ;; B: DEPENDENT VOWEL LEFT AND RIGHT TYPE 1
+ ;; b: DEPENDENT VOWEL LEFT AND RIGHT TYPE 2
+ ;; V: VIRAMA
+ ;; E: ELSE
+ ;;
+ (0x0B83       ?E)
+ (0x0B85 0x0B8A        ?I)
+ (0x0B8E 0x0B90        ?I)
+ (0x0B92 0x0B94        ?I)
+ (0x0B95       ?C)
+ (0x0B99 0x0B9A        ?C)
+ (0x0B9C       ?C)
+ (0x0B9E 0x0B9F        ?C)
+ (0x0BA3 0x0BA4        ?C)
+ (0x0BA8 0x0BAA        ?C)
+ (0x0BAE 0x0BB5        ?C)
+ (0x0BB7 0x0BB9        ?C)
+ (0x0BBE 0x0BC2        ?R)
+ (0x0BC6 0x0BC8        ?L)
+ (0x0BCA       ?B)
+ (0x0BCB       ?b)
+ (0x0BCC       ?B)
+ (0x0BCD       ?V)
+ (0x0BD7       ?E))
+
+;; CHAR->GLYPH STAGE
+(generator
+ (0
+  (cond
+   ("((CV)*)(C)(R)"
+    (1 consonant-virama *)
+    (3 consonant)
+    (4 dependent-vowel))
+   ("((CV)*)(C)(L)"
+    < |
+    (4 dependent-vowel)
+    (1 consonant-virama *)
+    (3 consonant)
+    | >)
+   ("((CV)*)(C)(B)"
+    < |
+    0xAA
+    (1 consonant-virama *)
+    (3 consonant)
+    (4 dependent-vowel)
+    | >)
+   ("((CV)*)(C)(b)"
+    < |
+    0xAB
+    (1 consonant-virama *)
+    (3 consonant)
+    (4 dependent-vowel)
+    | >)
+   ("CV"
+    < consonant-virama >)
+   ("[RLBb]"
+    isolated-dependent-vowel)
+   ("." independent consonant))
+  *)
+
+ (consonant-virama
+  (cond
+   ((0x0B95 0x0BCD)    0xE8 0xA2)      ; k
+   ((0x0B99 0x0BCD)    0xE9 0xA2)      ; n^
+   ((0x0B9A 0x0BCD)    0xEA 0xA2)      ; c
+   ((0x0B9E 0x0BCD)    0xEB 0xA2)      ; n~
+   ((0x0B9F 0x0BCD)    0xEC 0xA2)      ; t.
+   ((0x0BA3 0x0BCD)    0xED 0xA2)      ; n.
+   ((0x0BA4 0x0BCD)    0xEE 0xA2)      ; t
+   ((0x0BA8 0x0BCD)    0xEF 0xA2)      ; n
+   ((0x0BAA 0x0BCD)    0xF0 0xA2)      ; p
+   ((0x0BAE 0x0BCD)    0xF1 0xA2)      ; m
+   ((0x0BAF 0x0BCD)    0xF2 0xA2)      ; y
+   ((0x0BB0 0x0BCD)    0xF3 0xA2)      ; r
+   ((0x0BB2 0x0BCD)    0xF4 0xA2)      ; l
+   ((0x0BB5 0x0BCD)    0xF5 0xA2)      ; v
+   ((0x0BB4 0x0BCD)    0xF6 0xA2)      ; l_
+   ((0x0BB3 0x0BCD)    0xF7 0xA2)      ; l.
+   ((0x0BB1 0x0BCD)    0xF8 0xA2)      ; r_
+   ((0x0BA9 0x0BCD)    0xA1)           ; n_
+   ((0x0BB8 0x0BCD)    0x76)           ; s
+   ((0x0BB7 0x0BCD)    0x77)           ; s'
+   ((0x0B9C 0x0BCD)    0x78)           ; j
+   ((0x0BB9 0x0BCD)    0x79)           ; h
+   ))
+
+ (consonant
+  (cond
+   ((0x0B95)   0xE8)                   ; k
+   ((0x0B99)   0xE9)                   ; n^
+   ((0x0B9A)   0xEA)                   ; c
+   ((0x0B9E)   0xEB)                   ; n~
+   ((0x0B9F)   0xEC)                   ; t.
+   ((0x0BA3)   0xED)                   ; n.
+   ((0x0BA4)   0xEE)                   ; t
+   ((0x0BA8)   0xEF)                   ; n
+   ((0x0BAA)   0xF0)                   ; p
+   ((0x0BAE)   0xF1)                   ; m
+   ((0x0BAF)   0xF2)                   ; y
+   ((0x0BB0)   0xF3)                   ; r
+   ((0x0BB2)   0xF4)                   ; l
+   ((0x0BB5)   0xF5)                   ; v
+   ((0x0BB4)   0xF6)                   ; l_
+   ((0x0BB3)   0xF7)                   ; l.
+   ((0x0BB1)   0xF8)                   ; r_
+   ((0x0BA9)   0xF9)                   ; n_
+   ((0x0BB8)   0xFA)                   ; s
+   ((0x0BB7)   0xFB)                   ; s'
+   ((0x0B9C)   0xFC)                   ; j
+   ((0x0BB9)   0xFD)                   ; h
+   ))
+   
+ (dependent-vowel
+  (cond
+   ((0x0BBE)   0xA3)                   ; a~
+   ((0x0BBF)   0xA4)                   ; i
+   ((0x0BC0)   0xA6)                   ; i~
+   ((0x0BC1)   0xA7)                   ; u
+   ((0x0BC2)   0xA8)                   ; u~
+   ((0x0BC6)   0xAA)                   ; e
+   ((0x0BC7)   0xAB)                   ; e~
+   ((0x0BC8)   0xAC)                   ; ai
+   ((0x0BCA)   0xA3)                   ; o (right part)
+   ((0x0BCB)   0xA3)                   ; o~ (right part)
+   ((0x0BCC)   0xF7)                   ; au (right part)
+   ))
+
+ (independent
+  (cond
+   ;; VOWELS
+   ((0x0B85)   0xDC)                   ; a
+   ((0x0B86)   0xDD)                   ; a~
+   ((0x0B87)   0xDE)                   ; i
+   ((0x0B88)   0xDF)                   ; i~
+   ((0x0B89)   0xE0)                   ; u
+   ((0x0B8A)   0xE1)                   ; u~
+   ((0x0B8E)   0xE2)                   ; e
+   ((0x0B8F)   0xE3)                   ; e~
+   ((0x0B90)   0xE4)                   ; ai
+   ((0x0B92)   0xE5)                   ; o
+   ((0x0B93)   0xE6)                   ; o~
+   ((0x0B94)   0xE5 0xF7)              ; au
+   ;; VISARGA
+   ((0x0B83)   0xE7)
+   ))
+
+ (isolated-dependent-vowel
+  (cond
+   ((0x0BBE)   0x81 0xA3)              ; a~
+   ((0x0BBF)   0x81 0xA4)              ; i
+   ((0x0BC0)   0x81 0xA6)              ; i~
+   ((0x0BC1)   0x81 0xA7)              ; u
+   ((0x0BC2)   0x81 0xA8)              ; u~
+   ((0x0BC6)   0xAA 0x81)              ; e
+   ((0x0BC7)   0xAB 0x81)              ; e~
+   ((0x0BC8)   0xAC 0x81)              ; ai
+   ((0x0BCA)   0xAA 0x81 0xA3)         ; o
+   ((0x0BCB)   0xAB 0x81 0xA3)         ; o~
+   ((0x0BCC)   0xAA 0x81 0xF7)         ; au
+   )))
+
+;; LIGATURE STAGE
+(category
+ ;; C: CONSONANT (except for K, R, S)
+ ;; K: CONSONANT K
+ ;; R: CONSONANT R
+ ;; S: CONSONANT S'
+ ;; V: LIGATURE VOWEL (except for I,i)
+ ;; I: DEPENDENT VOWEL I
+ ;; i: DEPENDENT VOWEL I~
+ ;; L: LEFT PART OF VOWEL 
+ ;; v: VIRAMA
+ ;; E: ELSE
+ ;;
+ (0x00 0xFF    ?E)
+ (0xA2         ?v)
+ (0xE9 0xFD    ?C)
+ (0xE8         ?K)
+ (0xF3         ?R)
+ (0xFB         ?S)
+ (0xA4         ?I)                     ; i
+ (0xA6         ?i)                     ; i~
+ (0xA7 0xA8    ?V)                     ; u, u~
+ (0xAA 0xAC    ?L)
+ )
+
+(generator
+ (0
+  (cond
+   ;; 1  23      4      5    6
+   (" (L)(([CKRS](v)?)*)(KvS)(.)? "
+    (2 = *) (1 =) (5 0xFE) (6 =))
+   ;; 1  23      4      5
+   (" (L)(([CKRS](v)?)*)([CKRS].?) "
+    (2 = *) (1 =) (5 = =))
+   ("KvS[Iiv]?"
+    ligature-ks)
+   ("[CKRS][IiV]"
+    ligature = =)
+   ("SvRi"     0xFF)
+   ("."
+    =))
+  *)
+     
+ (ligature-ks
+  (cond
+   ((0xE8 0xA2 0xFB 0xA4)      0x56)   ; ksi
+   ((0xE8 0xA2 0xFB 0xA6)      0x72)   ; ksi~
+   ((0xE8 0xA2 0xFB 0xA2)      0x7A)   ; ks
+   ((0xE8 0xA2 0xFB)           0xFE)   ; ks
+   ))
+
+ (ligature
+  (cond
+   ((0xE8 0xA2 0x76 0xA2)      0x7A)   ; ks.
+
+   ((0xE8 0xA4)                0x41)           ; ki
+   ((0xE9 0xA4)                0x42)           ; n^i
+   ((0xEA 0xA4)                0x43)           ; ci
+   ((0xEB 0xA4)                0x44)           ; n~i
+   ((0xEC 0xA4)                0xAE)           ; t.i
+   ((0xED 0xA4)                0x45)           ; n.i
+   ((0xEE 0xA4)                0x46)           ; ti
+   ((0xEF 0xA4)                0x47)           ; ni
+   ((0xF0 0xA4)                0x48)           ; pi
+   ((0xF1 0xA4)                0x49)           ; mi
+   ((0xF2 0xA4)                0x4A)           ; yi
+   ((0xF3 0xA4)                0x4B)           ; ri
+   ((0xF4 0xA4)                0x4C)           ; li
+   ((0xF5 0xA4)                0x4D)           ; vi
+   ((0xF6 0xA4)                0x4E)           ; l_i
+   ((0xF7 0xA4)                0x4F)           ; l.i
+   ((0xF8 0xA4)                0x50)           ; r_i
+   ((0xF9 0xA4)                0x51)           ; n_i
+   ((0xFA 0xA4)                0x52)           ; si
+   ((0xFB 0xA4)                0x53)           ; s'i
+   ((0xFC 0xA4)                0x54)           ; ji
+   ((0xFD 0xA4)                0x55)           ; hi
+
+   ((0xE8 0xA6)                0x57)           ; ki~
+   ((0xE9 0xA6)                0x58)           ; n^i~
+   ((0xEA 0xA6)                0x59)           ; ci~
+   ((0xEB 0xA6)                0x5A)           ; n~i~
+   ((0xEC 0xA6)                0xAF)           ; t.i~
+   ((0xED 0xA6)                0x61)           ; n.i~
+   ((0xEE 0xA6)                0x62)           ; ti~
+   ((0xEF 0xA6)                0x63)           ; ni~
+   ((0xF0 0xA6)                0x64)           ; pi~
+   ((0xF1 0xA6)                0x65)           ; mi~
+   ((0xF2 0xA6)                0x66)           ; yi~
+   ((0xF3 0xA6)                0x67)           ; ri~
+   ((0xF4 0xA6)                0x68)           ; li~
+   ((0xF5 0xA6)                0x69)           ; vi~
+   ((0xF6 0xA6)                0x6A)           ; l_i~
+   ((0xF7 0xA6)                0x6B)           ; l.i~
+   ((0xF8 0xA6)                0x6C)           ; r_i~
+   ((0xF9 0xA6)                0x6D)           ; n_i~
+   ((0xFA 0xA6)                0x6E)           ; si~
+   ((0xFB 0xA6)                0x6F)           ; s'i~
+   ((0xFC 0xA6)                0x70)           ; ji~
+   ((0xFD 0xA6)                0x71)           ; hi~
+
+   ((0xE8 0xA7)                0xB0)           ; ku
+   ((0xE9 0xA7)                0xB1)           ; n^u
+   ((0xEA 0xA7)                0xB2)           ; cu
+   ((0xEB 0xA7)                0xB3)           ; n~u
+   ((0xEC 0xA7)                0xB4)           ; t.u
+   ((0xED 0xA7)                0xB5)           ; n.u
+   ((0xEE 0xA7)                0xB6)           ; tu
+   ((0xEF 0xA7)                0xB8)           ; nu
+   ((0xF0 0xA7)                0xB9)           ; pu
+   ((0xF1 0xA7)                0xBA)           ; mu
+   ((0xF2 0xA7)                0xBB)           ; yu
+   ((0xF3 0xA7)                0xBC)           ; ru
+   ((0xF4 0xA7)                0xBD)           ; lu
+   ((0xF5 0xA7)                0xBE)           ; vu
+   ((0xF6 0xA7)                0xBF)           ; l_u
+   ((0xF7 0xA7)                0xC0)           ; l.u
+   ((0xF8 0xA7)                0xC1)           ; r_u
+   ((0xF9 0xA7)                0xC2)           ; n_u
+
+   ((0xE8 0xA8)                0xC3)           ; ku~
+   ((0xE9 0xA8)                0xC4)           ; n^u~
+   ((0xEA 0xA8)                0xC5)           ; cu~
+   ((0xEB 0xA8)                0xC6)           ; n~u~
+   ((0xEC 0xA8)                0xC7)           ; t.u~
+   ((0xED 0xA8)                0xC8)           ; n.u~
+   ((0xEE 0xA8)                0xC9)           ; tu~
+   ((0xEF 0xA8)                0xCB)           ; nu~
+   ((0xF0 0xA8)                0xCC)           ; pu~
+   ((0xF1 0xA8)                0xCD)           ; mu~
+   ((0xF2 0xA8)                0xCE)           ; yu~
+   ((0xF3 0xA8)                0xCF)           ; ru~
+   ((0xF4 0xA8)                0xD6)           ; lu~
+   ((0xF5 0xA8)                0xD7)           ; vu~
+   ((0xF6 0xA8)                0xD8)           ; l_u~
+   ((0xF7 0xA8)                0xD9)           ; l.u~
+   ((0xF8 0xA8)                0xDA)           ; r_u~
+   ((0xF9 0xA8)                0xDB)           ; n_u~
+   ))
+ )
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/TAML-OTF.flt b/FLT/TAML-OTF.flt
new file mode 100644 (file)
index 0000000..8e18a5f
--- /dev/null
@@ -0,0 +1,121 @@
+;; TAML-OTF.flt -- Font Layout Table for Tamil OpenType fonts
+;; Copyright (C) 2004, 2006, 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.
+
+;; 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.
+
+;;; <li> TAML-OTF.flt
+;;;
+;;; For Tamil OpenType fonts to draw Tamil.
+;;; Fonts are available from <http://sourceforge.net/projects/tamillinux/>.
+
+(font layouter taml-otf nil
+      (font (nil nil unicode-bmp :otf=taml=akhn)))
+
+(category
+ ;; C: general consonant
+ ;; V: independent vowel
+ ;; H: HALANT
+ ;; m: MATRA (pre)
+ ;; u: MATRA (above)
+ ;; b: MATRA (below)
+ ;; p: MATRA (post)
+ ;; A: vowel modifier (above)
+ ;; a: vowel modifier (post)
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0964       ?E)                     ; DANDA
+ (0x0965       ?E)                     ; DOUBLE DANDA
+ (0x0B80 0x0BFF        ?E)                     ; ELSE
+ (0x0B85 0x0B94        ?V)                     ; LETTER AA .. LETTER AU
+ (0x0B95 0x0BB9 ?C)                    ; LETTER KA .. LETTER HA
+ (0x0BBE       ?p)                     ; VOWEL SIGN AA (post)
+ (0x0BBF       ?p)                     ; VOWEL SIGN I (post)
+ (0x0BC0       ?u)                     ; VOWEL SIGN II (above)
+ (0x0BC1       ?b)                     ; VOWEL SIGN U (below)
+ (0x0BC2       ?b)                     ; VOWEL SIGN UU (below)
+ (0x0BC6 0x0BC8        ?m)                     ; VOWEL SIGN E, EE, AI (pre)
+ (0x0BCA 0x0BCC        ?t)                     ; VOWEL SIGN O, OO, AU (two-part)
+ (0x0BCD       ?H)                     ; VIRAMA
+ (0x0BD7       ?p)                     ; AU LENGTH MARK (post)
+ )
+
+;; Step 1 : Syllable identification.
+(generator
+ (0
+  (cond
+   ;; Special ligature SRI
+   ((0x0BB8 0x0BCD 0x0BB0 0x0BC0)
+    otf:taml=akhn)
+
+   ;; A syllable ending with a two-part vowel sign.
+   ("((CH)*C)(t)"
+    < | (1 otf:taml=akhn) (3 two-part) | >)
+
+   ;; A syllable ending with a vowel sign.
+   ("((CH)*C)([mubp])"
+    < | (1 otf:taml=akhn) (3 =) | >)
+
+   ;; No vowel sign.
+   ("(CH)*CH?"
+    < | otf:taml=akhn | >)
+
+   ;; A variation of AU.
+   ((0x0B92 0x0BD7)
+    0x0B94)
+
+   ("." =))
+  *)
+
+ (two-part
+  (cond
+   ((0x0BCA)
+    0x0BC6 0x0BBE)
+   ((0x0BCB)
+    0x0BC7 0x0BBE)
+   ((0x0BCC)
+    0x0BC6 0x0BD7))))
+
+;; Step 2 : Matra movements.
+(generator
+ (0
+  (cond
+   (" ([^ mubp]*)([^ mubp])(m)?([ubp])? "
+    | (1 = *) (3 =) (2 =) (4 =) |)
+   ("." =))
+  *))
+
+;; Step 3 : OTF substitutions and positionings.
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1 otf:taml))
+   ("."
+    [ otf:taml=+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/TELU-OTF.flt b/FLT/TELU-OTF.flt
new file mode 100644 (file)
index 0000000..efe66d5
--- /dev/null
@@ -0,0 +1,141 @@
+;; TELU-OTF.flt -- Font Layout Table for Telugu OpenType fonts
+;; 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.
+
+;; 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.
+
+;;; <li> TELU-OTF.flt
+;;;
+;;; For Telugu OpenType fonts to draw Telugu.
+;;; Designed for Pothana2000.ttf <http://www.kavya-nandanam.com/>
+
+(font layouter telu-otf nil
+      (font (nil nil unicode-bmp :otf=telu=haln)))
+
+(category
+ ;; C: general consonant
+ ;; R: no below-base consonat (RRA, NNNA, LLLA)
+ ;; H: HALANT
+ ;; u: MATRA (above)
+ ;; b: MATRA (below)
+ ;; p: MATRA (post)
+ ;; t: MATRA (two-part)
+ ;; a: vowel modifier (post)
+ ;; V: independent vowel
+ ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
+ ;; J: ZWJ (ZERO WIDTH JOINER)
+ ;; E: ELSE
+ ;;
+ (0x200C       ?N)                     ; ZWNJ
+ (0x200D       ?J)                     ; ZWJ
+ (0x0964       ?E)                     ; DANDA
+ (0x0965       ?E)                     ; DOUBLE DANDA
+ (0x0C00 0x0C7F        ?E)                     ; ELSE
+ (0x0C01 0x0C03        ?a)                     ; post signs
+ (0x0C05 0x0C14        ?V)                     ; LETTER A .. LETTER AU
+ (0x0C15 0x0C39 ?C)                    ; LETTER KA .. LETTER HA
+ (0x0C29       ?R)                     ; LETTER NNNA
+ (0x0C31       ?R)                     ; LETTER RRA
+ (0x0C34       ?R)                     ; LETTER LLLA
+ (0x0C3E 0x0C40        ?u)                     ; VOWEL SIGN AA, I, II (above)
+ (0x0C41 0x0C44        ?p)                     ; VOWEL SIGN U, UU, R, RR (post)
+ (0x0C46 0x0C47        ?u)                     ; VOWEL SIGN E, EE (above)
+ (0x0C48       ?t)                     ; VOWEL SIGN AI (two-part)
+ (0x0C4A 0x0C4C        ?u)                     ; VOWEL SIGN O, OO, AU (above)
+ (0x0C4D       ?H)                     ; SIGN VIRAMA (HALANT)
+ (0x0C55       ?u)                     ; LENGTH MARK (above)
+ (0x0C56       ?b)                     ; AI LENGTH MARK (below)
+ (0x0C60 0x0C61        ?V)                     ; LETTER VOCALIC RR, LL
+ (0x0C7E       ?Y)                     ; internal use
+ (0x0C7F       ?X)                     ; internal use
+ )
+
+;; Step 1 : Syllable identification and Halant movement.
+(generator
+ (0
+  (cond
+   ;; A syllable containing a two-part vowel sign.
+   ("([CR](HC)*)(t)(a)?"
+    < | (1 move-base-Halant) (3 0x0C46 0x0C56) (4 =) | >)
+
+   ;; A syllable ending with vowel signs and/or a vowel modifier.
+   ("([CR](HC)*)([ubp]+a?|a)"
+    < | (1 move-base-Halant) (3 = *) | >)
+
+   ;; Forced Halant form
+   ("((RH)?(CH)*)(CH)N"
+    (1 < | move-base-Halant | >)
+    (4 < | move-base-Halant | >))
+
+   ;; Forced Below form
+   ("((RH)?(CH)*)(CH)J"
+    (1 < | move-base-Halant >)
+    (4 < | otf:telu=blwf | >))
+
+   ;; A syllable without a vowel sign nor a vowel modifier.
+   ("[CR](HC)*H?"
+    < | move-base-Halant | >)
+
+   ;; A syllable starting with an independent vowel.
+   ("Va?"
+    < | = * | > )
+
+   ("." =))
+  *)
+
+ ;; Move Halant on the base consonant to the tail if the syllable ends
+ ;; with a consonant.
+ ;; A leading 0x0C7F means Halant movement.
+ ;; A leading 0x0C7E means a syllable ending with a Halant.
+ (move-base-Halant
+  (cond
+   (".*H$"
+    0x0C7E = *)
+   ("(.)(H)(.*)"
+    0x0C7F (1 =) (3 = *) (2 =))
+   (".*"
+    = *))))
+
+;; Step 2 : Move Matra if applicable.
+;; The base consonant in a Halant-ending syllable is changed into Halant form.
+(generator
+ (0
+  (cond
+   ;;  1  2      3   4   5   6
+   (" X(.)([CH]*)(u)?(b)?(p)?(a)? "
+    | (1 =) (3 =) (4 =) (5 =) (2 = *) (6 =) |)
+   (" Y(..)([^ ]*) "
+    | (1 otf:telu=haln) (2 = *) |)
+   ("." =))
+  *))
+
+;; Step 3 : Drive OTF tables.
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1 otf:telu))
+   ("."
+    [ otf:telu=+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/THAA-OTF.flt b/FLT/THAA-OTF.flt
new file mode 100644 (file)
index 0000000..4df79ae
--- /dev/null
@@ -0,0 +1,54 @@
+;; THAA.flt -- Font Layout Table for Thaana OpenType font
+;; Copyright (C) 2004, 2005, 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.
+
+;; 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.
+
+;;; <li> THAA-OTF.flt
+;;;
+;;; For Thaana OpenType fonts to draw the Thaana script.
+
+(font layouter thaa-otf nil
+      (font (nil nil unicode-bmp :otf=thaa)))
+
+(category
+ (0x0780 0x07a5        ?c)                     ; consonants
+ (0x07a6 0x07b0        ?v)                     ; vowels
+ (0x07b1       ?c)                     ; consonant
+ )
+
+;; Grouping.
+(generator
+ (0
+  (cond
+   ;; GPOS of OTF wil override this combining rule.
+   ("cv" < = Bl.Bl = >)
+   ("v" [ = ])
+   ("." =))
+  *))
+
+;; Drive OTF.
+(generator
+ (0
+  otf:thaa=+mark))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/THAI-GENERIC.flt b/FLT/THAI-GENERIC.flt
new file mode 100644 (file)
index 0000000..260fba6
--- /dev/null
@@ -0,0 +1,78 @@
+;; THAI-GENERIC.flt -- Font Layout Table for Thai (proportional font)
+;; Copyright (C) 2005, 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.
+
+;; 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.
+
+;;; <li> THAI-GENERIC.flt
+;;;
+;;; For the Thai proportional fonts to draw Thai script.
+
+(font layouter thai-generic nil
+      (font (nil nil unicode-bmp :lang=th)))
+
+(category
+ ;; C: CONSONANT normal
+ ;; c: CONSONANT tall
+ ;; d: CONSONANT deep
+ ;; A: SARA-AM
+ ;; V: VOWEL upper, NIKHAHIT, and YAMAKKAN
+ ;; v: VOWEL lower
+ ;; T: TONE
+ ;; I: OTHER INDEPENDENT
+ (0x0E01 0x0E2E        ?C)
+ (0x0E0D 0x0E10        ?d)
+ (0x0E1B       ?c)
+ (0x0E1D       ?c)
+ (0x0E1F       ?c)
+ (0x0E2C       ?c)
+ (0x0E2F 0x0E32        ?I)
+ (0x0E31       ?V)
+ (0x0E33       ?A)
+ (0x0E34 0x0E37        ?V)
+ (0x0E38 0x0E3A        ?v)
+ (0x0E3F 0x0E46 ?I)
+ (0x0E47       ?V)
+ (0x0E48 0x0E4C        ?T)
+ (0x0E4D 0x0E4E        ?V)
+ (0x0E4F 0x0E5B ?I))
+
+(generator
+ (0
+  (cond
+   ("([Cd])(T)?(A)"
+    < (1 = 0x0E4D) (2 tr+bl =) (3 0x0E32) > )
+   ("(c)(T)?(A)"
+    < (1 = Br<13Bl 0x0E4D) (2 tr+<13bl =) (3 0x0E32) > )
+   ("(C[vV]?)(T)?"
+    < (1 = =) (2 tr+bl =) > )
+   ("(c)([vV])?(T)?"
+    < (1 = *) (2 (cond ("v" =) ("." Br<8Bl =))) (3 tr+<8bl =) > )
+   ("(d)([vV])?(T)?"
+    < (1 = *) (2 (cond ("v" br-tl =) ("." =))) (3 tr+bl =) > )
+   ("[VvTA]"
+    [ = ])
+   ("."
+    =))
+  *))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/THAI-NORASI.flt b/FLT/THAI-NORASI.flt
new file mode 100644 (file)
index 0000000..081cff9
--- /dev/null
@@ -0,0 +1,127 @@
+;; THAI-NORASI.flt -- Font Layout Table for Thai (Norasi font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> THAI-NORASI.flt
+;;;
+;;; For the Thai Norasi family fonts to draw Thai script.  The fonts are
+;;; available at:
+;;; <ul>
+;;; <li> infopage: <http://packages.debian.org/stable/x11/xfonts-thai-ttf.html>
+;;; </ul>
+
+(font layouter thai-norasi nil
+      (font (nil norasi unicode-bmp)))
+
+;; 1st stage: basic composition of CVT
+(category
+ ;; C: CONSONANT
+ ;; V: VOWEL upper and lower
+ ;; A: SARA-AM
+ ;; T: TONE
+ ;; E: else
+ (0x0E00 0x0E5F ?E)
+ (0x0E01 0x0E2E        ?C)
+ (0x0E31       ?V)
+ (0x0E33       ?A)
+ (0x0E34 0x0E3A        ?V)
+ (0x0E47       ?V)
+ (0x0E48 0x0E4E        ?T)
+ )
+
+(generator
+ (0
+  (cond
+   ("(C)(T)?(A)"                       ; SARA-AM -> NIKHAHIT+SARA-AA
+    (1 = 0x0E4D) (2 =) (3 0x0E32))
+   ("(C)(T)(V)?"                       ; CTV -> CVT
+    (1 =) (3 =) (2 =))
+   ("(C)(V)?(T)?"
+    (1 =) (2 =) (3 =))
+   ("[^C]"
+    [ = ]))
+  *))
+
+(category
+ ;; C: CONSONANT tall
+ ;; c: CONSONANT normal
+ ;; d: CONSONANT deep
+ ;; V: VOWEL upper, NIKHAHIT, and YAMAKKAN
+ ;; v: VOWEL lower
+ ;; T: TONE
+ ;; E: ELSE
+ (0x0E00 0x0E5F        ?E)
+ (0x0E01 0x0E2E        ?c)
+ (0x0E0D 0x0E10        ?d)
+ (0x0E1B       ?C)
+ (0x0E1D       ?C)
+ (0x0E1F       ?C)
+ (0x0E2C       ?C)
+ (0x0E31       ?V)
+ (0x0E34 0x0E37        ?V)
+ (0x0E38 0x0E3A        ?v)
+ (0x0E47       ?V)
+ (0x0E48 0x0E4C        ?T)
+ (0x0E4D 0x0E4E        ?V))
+
+(generator
+ (0
+  (cond 
+   ("(C)(V)(T)?"
+    < (1 =) (2 vowel-upper-left) (3 tone-high-left) >)
+   ("(C)(v)?(T)?"
+    < (1 =) (2 =) (3 tone-low-left) >)
+   ("([cd])(V)(T)?"
+    < (1 =) (2 =) (3 =) >)
+   ("(c)(v)?(T)?"
+    < (1 =) (2 =) (3 tone-low) >)
+   ("(d)(v)?(T)?"
+    < (1 =) (2 vowel-deep) (3 tone-low) >)
+   ("[VvT]"
+    [ = ])
+   ("."
+    =))
+  *)
+
+ (vowel-upper-left
+  (cond
+   ((0x0E31) =)
+   ((range 0x0E34 0x0E37) 0xF701)
+   ((0x0E47) =)
+   ((0x0E4D) 0xF711)
+   ((0x0E4E) =)))
+
+ (vowel-deep
+  ((range 0x0E38 0x0E3A) 0xF718))
+
+ (tone-high-left
+  ((range 0x0E48 0x0E4C) 0xF713))
+
+ (tone-low-left
+  ((range 0x0E48 0x0E4C) 0xF705))
+
+ (tone-low
+  ((range 0x0E48 0x0E4C) 0xF70A)))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/THAI-OTF.flt b/FLT/THAI-OTF.flt
new file mode 100644 (file)
index 0000000..01f75b7
--- /dev/null
@@ -0,0 +1,98 @@
+;; THAI-OTF.flt -- Font Layout Table for Thai
+;; Copyright (C) 2006, 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.
+
+;; 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.
+
+;;; <li> THAI-OTF.flt
+
+(font layouter thai-otf nil
+      (font (nil nil unicode-bmp :otf=thai+mark,mkmk)))
+
+(category
+ ;; C: CONSONANT
+ ;; A: SARA-AM
+ ;; i: SARA I, SARA U (below vowel 1, above vowel 1)
+ ;; I: SARA II, SARA UEE (above vowel 3)
+ ;; U: MAIHAN-AKAT, SARA UE, SARA UU (above vowel 2, below vowel 2)
+ ;; P: PHINTHU, YAMAKKARN (below diacritic, above diacritic 3)
+ ;; T: TONE
+ ;; N: THANTHAKHAT, NIKHAHIT (above diacritic 1)
+ ;; M: MAITAIKHU (above diacritic 2)
+ ;; X: OTHER INDEPENDENT
+ (0x0E01 0x0E23        ?C)
+ (0x0E24       ?X)
+ (0x0E25       ?C)
+ (0x0E26 0x0E2E ?C)
+ (0x0E2F 0x0E30        ?X)
+ (0x0E31       ?U) ;; av2
+ (0x0E32       ?X)
+ (0x0E33       ?A)
+ (0x0E34       ?i) ;; av1
+ (0x0E35       ?I) ;; av3
+ (0x0E36       ?U) ;; av2
+ (0x0E37       ?I) ;; av3
+ (0x0E38       ?i) ;; bv1
+ (0x0E39       ?U) ;; bv2
+ (0x0E3A       ?P) ;; bd
+ (0x0E3F 0x0E46 ?X)
+ (0x0E47       ?M) ;; ad2
+ (0x0E48 0x0E4B        ?T)
+ (0x0E4C 0x0E4D        ?N) ;; ad1
+ (0x0E4E       ?P) ;; ad3
+ (0x0E4F 0x0E5B ?X)
+ (0x25CC       ?X))
+
+;; Perform GSUB.  The decomposition of AM is done by hand because it
+;; requires reordering in addition to decomposition.
+
+(generator
+ (0
+  (cond
+   ("(C)(T)?A"
+    < | (1 =) 0x0E4D (2 =) 0x0E32 | > )
+   ("C[UiI]T"
+    < | = * | > )
+   ("CiN"
+    < | = * | > )
+   ("CIM"
+    < | = * | > )
+   ("C[iIUPTNM]?"
+    < | = * | > )
+   ("[iIUPTNM]"
+    < | 0x25CC = | > )
+   ("."
+    =))
+  *))
+
+;; Perform GPOS.
+
+(generator
+ (0
+  (cond
+   (" ([^ ]*) "
+    (1 otf:thai))
+   ("."
+    [ otf:thai=+ ]))
+  *))
+
+;; Local Variables:
+;; mode: emacs-lisp
+;; End:
diff --git a/FLT/THAI-TIS620.flt b/FLT/THAI-TIS620.flt
new file mode 100644 (file)
index 0000000..37ee3b6
--- /dev/null
@@ -0,0 +1,81 @@
+;; THAI-TIS620.flt -- Font Layout Table for Thai (TIS620 font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> THAI-TIS620.flt
+;;;
+;;; For fixed width fonts of TIS620 encoding to draw Thai script.
+
+(font layouter thai-tis620 nil
+      (font (tis620.2529-1)
+           (tis620.2533-0)))
+
+(category
+ ;; C: CONSONANT
+ ;; V: VOWEL UPPER
+ ;; v: VOWEL LOWER
+ ;; T: TONE
+ ;; I: INDEPENDENT
+ ;;
+ (0x0E01 0x0E2E        ?C)
+ (0x0E2F 0x0E5B        ?I)
+ (0x0E31               ?V)
+ (0x0E34 0x0E37        ?V)
+ (0x0E38 0x0E3A        ?v)
+ (0x0E47               ?V)
+ (0x0E48 0x0E4E        ?T)
+ )
+
+(generator
+ (0
+  (cond
+   ("C([vV])?T?"
+    independent dependent * )
+   ("[^C]*"
+    independent *))
+  *)
+
+ (independent
+  ((range 0x0E00 0x0E5F) 0xA0))
+
+ (dependent
+  (cond
+   ((0x0E31)   tc+bc 0xD1)
+   ((0x0E34)   tc+bc 0xD4)
+   ((0x0E35)   tc+bc 0xD5)
+   ((0x0E36)   tc+bc 0xD6)
+   ((0x0E37)   tc+bc 0xD7)
+   ((0x0E38)   bc-tc 0xD8)
+   ((0x0E39)   bc-tc 0xD9)
+   ((0x0E3A)   bc-tc 0xDA)
+   ((0x0E47)   tc+bc 0xE7)
+   ((0x0E48)   tc+bc 0xE8)
+   ((0x0E49)   tc+bc 0xE9)
+   ((0x0E4A)   tc+bc 0xEA)
+   ((0x0E4B)   tc+bc 0xEB)
+   ((0x0E4C)   tc+bc 0xEC)
+   ((0x0E4D)   tc+bc 0xED)
+   ((0x0E4E)   tc+bc 0xEE))))
+
+;; Local Variables:
+;; mode: lisp
+;; End:
diff --git a/FLT/TIBT-MTIB.flt b/FLT/TIBT-MTIB.flt
new file mode 100644 (file)
index 0000000..7ec3785
--- /dev/null
@@ -0,0 +1,263 @@
+;; TIBT-MTIB.flt -- Font Layout Table for Tibetan (Tomabechi font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> TIBT-MTIB.flt
+;;;
+;;; For the Tibetan TrueType font developped by Dr. Tomabechi to draw
+;;; Tibetan script.  The font is available at:
+;;; <ul>
+;;; <li> infopage: http://www.m17n.org/emacs-ttf/
+;;; <li> download: http://www.m17n.org/emacs-ttf/fonts/tibetan/mtib.ttf
+;;; </ul>
+
+(font layouter tibt-mtib nil
+      (font (nil mtib unicode-bmp)))
+
+(category
+ ;; Tibetan character category for rendering
+ ;;   C: CONSONANTS (except R)
+ ;;   R: LETTER RA (RA-MGO)
+ ;;   S: SUBJOINED CONSONANTS (except s)
+ ;;   s: SUBJOINED CONSONANTS (don't modify RA-MGO)
+ ;;   V: VOWEL (except a and A)
+ ;;   a: VOWEL SIGN A (invisible when composed)
+ ;;   A: VOWEL SIGN AA (don't make preceding C shorter)
+ ;;   M: MODIFIER
+ ;;   E: ELSE
+ ;;
+ (0x0F00 0x0FCF                ?E)             ; ELSE
+ (0x0F19               ?M)             ; ASTROLOGICAL SIGN SDONG TSHUGS
+ (0x0F35               ?M)             ; MARK NGAS BZUNG NYI ZLA
+ (0x0F37               ?M)             ; MARK NGAS BZUNG SGOR RTAGS
+ (0x0F39               ?M)             ; MARK TSA -PHRU
+ (0x0F40 0x0F6A                ?C)             ; LETTER KA .. LETTER FIXED-FORM RA
+ (0x0F62               ?R)             ; LETTER RA
+ (0x0F70               ?a)             ; VOWEL SIGN A
+ (0x0F71               ?A)             ; VOWEL SIGN AA
+ (0x0F72 0x0F7D                ?V)             ; VOWEL SIGN I .. VOWEL SIGN OO
+ (0x0F7E               ?M)             ; SIGN RJES SU NGA RO
+ (0x0F80               ?V)             ; VOWEL SIGN REVERSED I
+ (0x0F81               ?V)             ; VOWEL SIGN REVERSED II
+ (0x0F82               ?M)             ; SIGN NYI ZLA NAA DA
+ (0x0F83               ?M)             ; SIGN SNA LDAN
+ (0x0F84               ?V)             ; MARK HALANTA
+ ;; SIGN LCI RTAGS .. SIGN GRU MED RGYINGS
+ (0x0F86 0x0F8B                ?M)
+ ;; SUBJOINED LETTER KA .. SUBJOINED LETTER FIXED-FORM RA
+ (0x0F90 0x0FBC                ?s)
+ (0x0FAD               ?S)
+ (0x0FB1 0x0FB2                ?S)
+ (0x0FC6               ?M))
+
+(generator
+ (0
+  (cond
+   ("[CR][Ss]*[VaA]*M*"
+    <
+    (cond
+     ("R[^SA].*"                       ; ར[^ྭྱྲཱ]
+      ((0x0F62) 0xE083)                        ; convert ར to upper form
+      subjoined *
+      dependent-vowel-modifier *)
+     (".A.*"                           ; Cཱ (don't make C shorter)
+      =
+      dependent-vowel-modifier *)
+     (".[Ss].*"
+      |
+      short-consonant
+      subjoined *
+      dependent-vowel-modifier *
+      |)
+     (".*"
+      =
+      dependent-vowel-modifier * )
+     )
+    >)
+   ("[VaAM]"
+    < 0xE07A dependent-vowel-modifier >)
+   ("[Ss]"
+    < 0xE07A subjoined >)
+   ("."
+    =))
+  *)
+
+ (short-consonant
+  (cond
+   ((0x0F5D)                   0x0FBA)
+   ((0x0F61)                   0x0FBB)
+   ((0x0F62)                   0x0FBC)
+   ((0x0F6A)                   0x0FBC)
+   ((range 0x0F40 0x0F69)      0x0F90)))
+
+ (subjoined
+  ((range 0x0F90 0x0FB9) bc.tc =))
+
+ (dependent-vowel-modifier
+  (cond
+   ((0x0F18)   bl.tc =)
+   ((0x0F19)   bc.tc =)
+   ((0x0F35)   bc.tc =)
+   ((0x0F37)   bc.tc =)
+   ((0x0F39)   tc.bc =)
+   ((0x0F70)   )                       ; invisible
+   ((0x0F71)   bc.tc =)
+   ((0x0F72)   tc.bc =)
+   ((0x0F73)   bc.tc 0x0F71 tc.bc 0x0F72)
+   ((0x0F74)   bc.tc =)
+   ((0x0F75)   bc.tc =)
+   ((0x0F76)   bc.tc 0x0FB2 tc.bc 0x0F72)
+   ((0x0F77)   bc.tc 0x0FB2 bc.tc 0x0F71 tc.bc 0x0F80)
+   ((0x0F78)   bc.tc 0x0FB3 tc.bc 0x0F80)
+   ((0x0F79)   bc.tc 0x0FB3 bc.tc 0x0F71 tc.bc 0x0F80)
+   ((0x0F7A)   tc.bc =)
+   ((0x0F7B)   tc.bc =)
+   ((0x0F7C)   tc.bc =)
+   ((0x0F7D)   tc.bc =)
+   ((0x0F7E)   tc.bc =)
+   ((0x0F80)   tc.bc =)
+   ((0x0F81)   bc.tc 0x0F71 tc.bc =)
+   ((0x0F82)   tc.bc =)
+   ((0x0F83)   tc.bc =)
+   ((0x0F84)   bc.tc =)
+   ((0x0F86)   tc.bc =)
+   ((0x0F87)   tc.bc =)
+   ((0x0F88)   tc.bc =)
+   ((0x0F89)   tc.bc =)
+   ((0x0F8A)   tc.bc =)
+   ((0x0F8B)   tc.bc =)
+   ((0x0FC6)   bc.tc =))))
+
+(category
+ (0x000 0xFFFF ?G))
+
+(generator
+ (0
+  (cond
+   (" (G*) "
+    (1 precomposed = *))
+   ("[^ ]*"
+    = *))
+  *)
+
+ (precomposed
+  (cond
+   ((0x0F90 0x0FAD)            0xE000)
+   ((0x0F90 0x0FB1)            0xE010)
+   ((0x0F90 0x0FB2)            0xE018)
+   ((0x0F90 0x0FB3)            0xE026)
+   ((0x0F91 0x0FAD)            0xE001)
+   ((0x0F91 0x0FB1)            0xE011)
+   ((0x0F91 0x0FB2)            0xE019)
+   ((0x0F92 0x0FAD)            0xE002)
+   ((0x0F92 0x0FB1)            0xE012)
+   ((0x0F92 0x0FB2 0x0FAD)     0xE025)
+   ((0x0F92 0x0FB2)            0xE01A)
+   ((0x0F92 0x0FB3)            0xE027)
+   ((0x0F95 0x0FAD)            0xE003)
+   ((0x0F97 0x0FB2)            0xE060)
+   ((0x0F99 0x0FAD)            0xE004)
+   ((0x0F9F 0x0FAD)            0xE005)
+   ((0x0F9F 0x0FB2)            0xE01B)
+   ((0x0FA0 0x0FB2)            0xE01C)
+   ((0x0FA1 0x0FAD)            0xE006)
+   ((0x0FA1 0x0FB2)            0xE01D)
+   ((0x0FA4 0x0FB1)            0xE013)
+   ((0x0FA4 0x0FB2)            0xE01E)
+   ((0x0FA5 0x0FB1 0x0FAD)     0xE017)
+   ((0x0FA5 0x0FB1)            0xE014)
+   ((0x0FA5 0x0FB2)            0xE01F)
+   ((0x0FA6 0x0FB1)            0xE015)
+   ((0x0FA6 0x0FB2)            0xE020)
+   ((0x0FA6 0x0FB3)            0xE028)
+   ((0x0FA8 0x0FB1)            0xE016)
+   ((0x0FA8 0x0FB2)            0xE021)
+   ((0x0FA9 0x0FAD)            0xE007)
+   ((0x0FAA 0x0FAD)            0xE008)
+   ((0x0FAB 0x0FB2)            0xE061)
+   ((0x0FAE 0x0FAD)            0xE009)
+   ((0x0FAF 0x0FAD)            0xE00A)
+   ((0x0FAF 0x0FB3)            0xE029)
+   ((0x0FB2 0x0F90 0x0FB1)     0xE03A)
+   ((0x0FB2 0x0F90)            0xE02C)
+   ((0x0FB2 0x0F92 0x0FAD)     0xE038)
+   ((0x0FB2 0x0F92 0x0FB1)     0xE03B)
+   ((0x0FB2 0x0F92)            0xE02D)
+   ((0x0FB2 0x0F94)            0xE02E)
+   ((0x0FB2 0x0F97)            0xE02F)
+   ((0x0FB2 0x0F99)            0xE030)
+   ((0x0FB2 0x0F9F)            0xE031)
+   ((0x0FB2 0x0FA1)            0xE032)
+   ((0x0FB2 0x0FA3)            0xE033)
+   ((0x0FB2 0x0FA6)            0xE034)
+   ((0x0FB2 0x0FA8 0x0FB1)     0xE03C)
+   ((0x0FB2 0x0FA8)            0xE035)
+   ((0x0FB2 0x0FA9 0x0FAD)     0xE039)
+   ((0x0FB2 0x0FA9)            0xE036)
+   ((0x0FB2 0x0FAB)            0xE037)
+   ((0x0FB2 0x0FAD)            0xE00B)
+   ((0x0FB2 0x0FB3)            0xE02A)
+   ((0x0FB3 0x0F90)            0xE03D)
+   ((0x0FB3 0x0F92)            0xE03E)
+   ((0x0FB3 0x0F94)            0xE03F)
+   ((0x0FB3 0x0F95)            0xE040)
+   ((0x0FB3 0x0F97)            0xE041)
+   ((0x0FB3 0x0F9F)            0xE042)
+   ((0x0FB3 0x0FA1)            0xE043)
+   ((0x0FB3 0x0FA4)            0xE044)
+   ((0x0FB3 0x0FA6)            0xE045)
+   ((0x0FB3 0x0FAD)            0xE00C)
+   ((0x0FB3 0x0FB7)            0xE046)
+   ((0x0FB4 0x0FAD)            0xE00D)
+   ((0x0FB4 0x0FB2)            0xE022)
+   ((0x0FB6 0x0F90 0x0FB1)     0xE052)
+   ((0x0FB6 0x0F90 0x0FB2)     0xE057)
+   ((0x0FB6 0x0F90)            0xE047)
+   ((0x0FB6 0x0F92 0x0FB1)     0xE053)
+   ((0x0FB6 0x0F92 0x0FB2)     0xE058)
+   ((0x0FB6 0x0F92)            0xE048)
+   ((0x0FB6 0x0F94)            0xE049)
+   ((0x0FB6 0x0F99)            0xE04A)
+   ((0x0FB6 0x0F9F)            0xE04B)
+   ((0x0FB6 0x0FA1)            0xE04C)
+   ((0x0FB6 0x0FA3 0x0FB2)     0xE059)
+   ((0x0FB6 0x0FA3)            0xE04D)
+   ((0x0FB6 0x0FA4 0x0FB1)     0xE054)
+   ((0x0FB6 0x0FA4 0x0FB2)     0xE05A)
+   ((0x0FB6 0x0FA4)            0xE04E)
+   ((0x0FB6 0x0FA6 0x0FB1)     0xE055)
+   ((0x0FB6 0x0FA6 0x0FB2)     0xE05B)
+   ((0x0FB6 0x0FA6)            0xE04F)
+   ((0x0FB6 0x0FA8 0x0FB1)     0xE055)
+   ((0x0FB6 0x0FA8 0x0FB2)     0xE05C)
+   ((0x0FB6 0x0FA8)            0xE050)
+   ((0x0FB6 0x0FA9)            0xE051)
+   ((0x0FB6 0x0FAD)            0xE00E)
+   ((0x0FB6 0x0FB2)            0xE023)
+   ((0x0FB6 0x0FB3)            0xE02B)
+   ((0x0FB7 0x0FAD)            0xE00F)
+   ((0x0FB7 0x0FB2)            0xE024))))
+
+;; Local Variables:
+;; mode: lisp
+;; coding: utf-8
+;; End:
diff --git a/FLT/TIBT-MULE.flt b/FLT/TIBT-MULE.flt
new file mode 100644 (file)
index 0000000..edf6f94
--- /dev/null
@@ -0,0 +1,264 @@
+;; TIBT-MULE.flt -- Font Layout Table for Tibetan (muletibetan font)
+;; Copyright (C) 2003, 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.
+
+;; 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.
+
+;;; <li> TIBT-MULE.flt
+;;;
+;;; For the muletibetan font developped by Dr. Tomabechi to draw Tibetan
+;;; script.  The font is available at:
+;;; <ul>
+;;; <li> infopage: http://www.gnu.org/directory/Localization/intlfonts.html
+;;; <li> download: ftp://ftp.gnu.org/pub/gnu/intlfonts/intlfonts-1.2.1.tar.gz
+;;; </ul>
+
+(font layouter tibt-mule nil
+      (font (muletibetan-2)))
+
+(category
+ ;; Tibetan character category for rendering
+ ;;   C: CONSONANTS (except R)
+ ;;   R: LETTER RA (RA-MGO)
+ ;;   S: SUBJOINED CONSONANTS (except s)
+ ;;   s: SUBJOINED CONSONANTS (don't modify RA-MGO)
+ ;;   V: VOWEL (except a and A)
+ ;;   a: VOWEL SIGN A (invisible when composed)
+ ;;   A: VOWEL SIGN AA (don't make preceding C shorter)
+ ;;   M: MODIFIER
+ ;;   E: ELSE
+ ;;
+ (0x0F00 0x0FCF                ?E)             ; default
+ (0x0F19               ?M)             ; ASTROLOGICAL SIGN SDONG TSHUGS
+ (0x0F35               ?M)             ; MARK NGAS BZUNG NYI ZLA
+ (0x0F37               ?M)             ; MARK NGAS BZUNG SGOR RTAGS
+ (0x0F39               ?M)             ; MARK TSA -PHRU
+ (0x0F40 0x0F6A                ?C)             ; LETTER KA .. LETTER FIXED-FORM RA
+ (0x0F62               ?R)             ; LETTER RA
+ (0x0F70               ?a)             ; VOWEL SIGN A
+ (0x0F71               ?A)             ; VOWEL SIGN AA
+ (0x0F72 0x0F7D                ?V)             ; VOWEL SIGN I .. VOWEL SIGN OO
+ (0x0F7E               ?M)             ; SIGN RJES SU NGA RO
+ (0x0F80               ?V)             ; VOWEL SIGN REVERSED I
+ (0x0F81               ?V)             ; VOWEL SIGN REVERSED II
+ (0x0F82               ?M)             ; SIGN NYI ZLA NAA DA
+ (0x0F83               ?M)             ; SIGN SNA LDAN
+ (0x0F84               ?V)             ; MARK HALANTA
+ ;; SIGN LCI RTAGS .. SIGN GRU MED RGYINGS
+ (0x0F86 0x0F8B                ?M)
+ ;; SUBJOINED LETTER KA .. SUBJOINED LETTER FIXED-FORM RA
+ (0x0F90 0x0FBC                ?s)
+ (0x0FAD               ?S)
+ (0x0FB1 0x0FB2                ?S))
+
+(generator
+ (0
+  (cond
+   ("[CR][Ss]*[VaA]*M*"
+    <
+    (cond
+     ("R[SA].*"                                ; ར[ྭྱྲཱ]
+      ((0x0F62) 0x2122)                        ; convert ར to upper form
+      subjoined *
+      dependent-vowel-modifier *)
+     (".A.*"                           ; Cཱ
+      consonant
+      dependent-vowel-modifier *)
+     (".[Ss].*"
+      |
+      short-consonant
+      subjoined *
+      dependent-vowel-modifier *
+      |)
+     (".*"
+      consonant
+      dependent-vowel-modifier * )
+     )
+    >)
+   ("."
+    independent
+    subjoined))
+  *)
+
+ (consonant
+  ((range 0x0F40 0x0F6A)       0x2221))
+
+ (short-consonant
+  (cond
+   ((range 0x0F40 0x0F69)      0x2321)
+   ((0x0F6A)                   0x234D)))
+
+ (subjoined
+  ((range 0x0F90 0x0FBC)       bc+tc 0x2321))
+
+ (dependent-vowel-modifier
+  (cond
+   ((0x0F19)   bc-tc 0x2149)
+   ((0x0F35)   bc-tc 0x2165)
+   ((0x0F37)   bc-tc 0x2167)
+   ((0x0F39)   tc-bc 0x2169)
+   ((0x0F70)   )                       ; invisible
+   ((0x0F71)   bc-tc 0x2252)
+   ((0x0F72)   tc-bc 0x2253)
+   ((0x0F73)   bc-tc 0x2252 tc-bc 0x2253)
+   ((0x0F74)   bc-tc 0x2255)
+   ((0x0F75)   bc-tc 0x2256)
+   ((0x0F76)   bc-tc 0x2343 tc-bc 0x2261)
+   ((0x0F77)   bc-tc 0x2343 bc-tc 0x2252 tc-bc 0x2261)
+   ((0x0F78)   bc-tc 0x2344 tc-bc 0x2261)
+   ((0x0F79)   bc-tc 0x2344 bc-tc 0x2262 tc-bc 0x2261)
+   ((0x0F7A)   tc-bc 0x225B)
+   ((0x0F7B)   tc-bc 0x225C)
+   ((0x0F7C)   tc-bc 0x225D)
+   ((0x0F7D)   tc-bc 0x225E)
+   ((0x0F7E)   tc-bc 0x225F)
+   ((0x0F80)   tc-bc 0x2261)
+   ((0x0F81)   bc-tc 0x2252 0x2261)
+   ((0x0F82)   tc-bc 0x2263)
+   ((0x0F83)   tc-bc 0x2264)
+   ((0x0F84)   bc-tc 0x2265)
+   ((0x0F86)   tc-bc 0x2267)
+   ((0x0F87)   tc-bc 0x2268)
+   ((0x0F88)   tc-bc 0x2269)
+   ((0x0F89)   tc-bc 0x226A)
+   ((0x0F8A)   tc-bc 0x226B)
+   ((0x0F8B)   tc-bc 0x226C)))
+
+ (independent
+  (cond
+   ((range 0x0F00 0x0F3F)      0x2130)
+   ((range 0x0F6B 0x0F8B)      0x224C)
+   ((range 0x0FBD 0x0FCF)      0x234E))))
+
+(category
+ (0x2121 0x24FF ?G))
+
+(generator
+ (0
+  (cond
+   (" (G*) "
+    (1 precomposed = * ))
+   ("[^ ]*"
+    = * ))
+  *)
+
+ (precomposed
+  (cond
+   ((0x2321 0x233E)            0x2421)
+   ((0x2321 0x2342)            0x2440)
+   ((0x2321 0x2343)            0x2450)
+   ((0x2321 0x2344)            0x2460)
+   ((0x2322 0x233E)            0x2422)
+   ((0x2322 0x2342)            0x2441)
+   ((0x2322 0x2343)            0x2451)
+   ((0x2323 0x233E)            0x2423)
+   ((0x2323 0x2342)            0x2442)
+   ((0x2323 0x2343 0x233E)     0x245F)
+   ((0x2323 0x2343)            0x2452)
+   ((0x2323 0x2344)            0x2461)
+   ((0x2326 0x233E)            0x2424)
+   ((0x2328 0x2343)            0x245D)
+   ((0x232A 0x233E)            0x2425)
+   ((0x2330 0x233E)            0x2426)
+   ((0x2330 0x2343)            0x2453)
+   ((0x2331 0x2343)            0x2454)
+   ((0x2332 0x233E)            0x2427)
+   ((0x2332 0x2343)            0x2455)
+   ((0x2335 0x2342)            0x2443)
+   ((0x2335 0x2343)            0x2456)
+   ((0x2336 0x2342 0x233E)     0x2447)
+   ((0x2336 0x2342)            0x2444)
+   ((0x2336 0x2343)            0x2457)
+   ((0x2337 0x2342)            0x2445)
+   ((0x2337 0x2343)            0x2458)
+   ((0x2337 0x2344)            0x2462)
+   ((0x2339 0x2342)            0x2446)
+   ((0x2339 0x2343)            0x2459)
+   ((0x233A 0x233E)            0x2428)
+   ((0x233B 0x233E)            0x2429)
+   ((0x233C 0x2343)            0x245E)
+   ((0x233F 0x233E)            0x242A)
+   ((0x2340 0x233E)            0x242B)
+   ((0x2340 0x2344)            0x2463)
+   ((0x2343 0x2321 0x2342)     0x2530)
+   ((0x2343 0x2321)            0x2521)
+   ((0x2343 0x2323 0x233E)     0x252D)
+   ((0x2343 0x2323 0x2342)     0x2531)
+   ((0x2343 0x2323)            0x2522)
+   ((0x2343 0x2325)            0x2523)
+   ((0x2343 0x2328)            0x2524)
+   ((0x2343 0x232A)            0x2525)
+   ((0x2343 0x2330)            0x2526)
+   ((0x2343 0x2332)            0x2527)
+   ((0x2343 0x2334)            0x2528)
+   ((0x2343 0x2337)            0x2529)
+   ((0x2343 0x2339 0x2342)     0x2532)
+   ((0x2343 0x2339)            0x252A)
+   ((0x2343 0x233A 0x233E)     0x252E)
+   ((0x2343 0x233A)            0x252B)
+   ((0x2343 0x233C)            0x252C)
+   ((0x2343 0x233E)            0x242C)
+   ((0x2343 0x2344)            0x2464)
+   ((0x2344 0x2321)            0x2540)
+   ((0x2344 0x2323)            0x2541)
+   ((0x2344 0x2325)            0x2542)
+   ((0x2344 0x2326)            0x2543)
+   ((0x2344 0x2328)            0x2544)
+   ((0x2344 0x2330)            0x2545)
+   ((0x2344 0x2332)            0x2546)
+   ((0x2344 0x2334)            0x2121)
+   ((0x2344 0x2335)            0x2547)
+   ((0x2344 0x2337)            0x2548)
+   ((0x2344 0x233E)            0x242D)
+   ((0x2344 0x2348)            0x2549)
+   ((0x2345 0x233E)            0x242E)
+   ((0x2345 0x2343)            0x245A)
+   ((0x2347 0x2321 0x2342)     0x2560)
+   ((0x2347 0x2321 0x2343)     0x2570)
+   ((0x2347 0x2321)            0x2550)
+   ((0x2347 0x2323 0x2342)     0x2561)
+   ((0x2347 0x2323 0x2343)     0x2571)
+   ((0x2347 0x2323)            0x2551)
+   ((0x2347 0x2325)            0x2552)
+   ((0x2347 0x232A)            0x2553)
+   ((0x2347 0x2330)            0x2554)
+   ((0x2347 0x2332)            0x2555)
+   ((0x2347 0x2334 0x2343)     0x2572)
+   ((0x2347 0x2334)            0x2556)
+   ((0x2347 0x2335 0x2342)     0x2562)
+   ((0x2347 0x2335 0x2343)     0x2573)
+   ((0x2347 0x2335)            0x2557)
+   ((0x2347 0x2337 0x2342)     0x2563)
+   ((0x2347 0x2337 0x2343)     0x2574)
+   ((0x2347 0x2337)            0x2558)
+   ((0x2347 0x2339 0x2342)     0x2564)
+   ((0x2347 0x2339 0x2343)     0x2575)
+   ((0x2347 0x2339)            0x2559)
+   ((0x2347 0x233A)            0x255A)
+   ((0x2347 0x233E)            0x242F)
+   ((0x2347 0x2343)            0x245B)
+   ((0x2347 0x2344)            0x2465)
+   ((0x2348 0x233E)            0x2430)
+   ((0x2348 0x2343)            0x245C))))
+
+;; Local Variables:
+;; mode: lisp
+;; coding: utf-8
+;; End:
diff --git a/FLT/TIBT-OTF.flt b/FLT/TIBT-OTF.flt
new file mode 100644 (file)
index 0000000..3676d26
--- /dev/null
@@ -0,0 +1,115 @@
+;; TIBT-OTF.flt -- Font Layout Table for Tibetan (OpenType font)
+;; Copyright (C) 2005, 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.
+
+;; 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.
+
+;;; <li> TIBT-OTF.flt
+;;;
+;;; For TibetanMachineUniAlpha.ttf to draw Tibetan script.
+;;; The font is available at:
+;;; <ul>
+;;; <li> infopage: http://www.thdl.org/
+;;; <li> download: http://ftp.debian.org/debian/pool/main/t/ttf-tmuni/ttf-tmuni_0.0.20040806.orig.tar.gz
+;;; </ul>
+
+(font layouter tibt-otf nil
+      (font (nil nil unicode-bmp :otf=tibt=ccmp,blws,abvs)))
+
+;; Step 0: Reordering Characters
+;;
+;; According to the Unicode canonical combining class value (CCCV),
+;; Tibetan combining characters must be orderd in the following way:
+;;
+;; MARK HALANTA (CCCV=9)
+;; VOWEL SIGN AA (129)
+;; Above base vowel signs (130)
+;; VOWEL SIGN U (132)
+;; MARK TSA -PHRU (216)
+;;
+;; However, the current font expects the following order:
+;;
+;; MARK TSA -PHRU
+;; VOWEL SIGN AA
+;; VOWEL SIGN U
+;; MARK HALANTA
+;; Above base vowel signs
+
+(category
+ (0x0F00 0x0FCF                ?x)             ; default
+ (0x0F39               ?T)             ; MARK TSA -PHRU
+ (0x0F71               ?A)             ; VOWEL SIGN AA
+ (0x0F72               ?V)             ; VOWEL SIGN I
+ (0x0F74               ?U)             ; VOWEL SIGN U
+ (0x0F7A 0x0F7D                ?V)             ; VOWEL SIGN E .. VOWEL SIGN OO
+ (0x0F80               ?V)             ; VOWEL SIGN REVERSED I
+ (0x0F84               ?H))            ; MARK HALANTA
+
+(generator
+ (0
+  (cond
+   ("x+"
+    = *)
+   ("(H?)(A*)(V?)(U*)(T?)"
+    (5 =) (2 = *) (4 = *) (1 =) (3 =)))
+  *))
+
+;; Step 1: Syllable identification
+
+;; C: Consonants
+;; T: MARK TSA -PHRU
+;; c: Subjoind consonants
+;; A: VOWEL SIGN AA
+;; U: VOWEL SIGN U
+;; H: MARK HALANTA
+;; V: Above or two-part vowel signs
+;; S: Above base signs
+;; s: Other above base signs
+;; x: Others
+
+(category
+ (0x0F00 0x0FCF                ?x)             ; default
+ (0x0F39               ?T)             ; MARK TSA -PHRU
+ (0x0F40 0x0F6A                ?C)             ; LETTER KA .. LETTER FIXED-FORM RA
+ (0x0F71               ?A)             ; VOWEL SIGN AA
+ (0x0F72 0x0F7E                ?V)             ; VOWEL SIGN I .. SIGN RJES SU NGA RO
+ (0x0F74               ?U)             ; VOWEL SIGN U
+ (0x0F80 0x0F81                ?V)             ; VOWEL SIGN REVERSED I, REVERSED II
+ (0x0F82 0x0F83                ?S)             ; SIGN NYI ZLA NAADA, SIGN SNA LDAN
+ (0x0F84               ?H)             ; MARK HALANTA
+ (0x0F86 0x0F87                ?s)             ; SIGN LCI RTAGS, SIGN YANG RTAGS
+ (0x0F88 0x0F89                ?C)             ; SIGN LCE TSA CAN, SIGN MCHU CAN
+ (0x0F90 0x0FBC                ?c))            ; SUBJOIND LETTER KA .. FIXED-FORM RA
+
+(generator
+ (0
+  (cond
+   ;; For some reason, it is better not to apply the abvs feature when
+   ;; both A and U exist.
+   ("(C)(T?)(c*)(A*)(U*)(H?)(V*)(S*)(s*)"
+    otf:tibt=ccmp,blws,abvs)
+   ("."
+    =))
+  *))
+
+;; Local Variables:
+;; mode: lisp
+;; coding: utf-8
+;; End: