Follow Unicode 5.0 specification of RA + ZWJ.
[m17n/m17n-db.git] / FLT / KNDA-OTF.flt
1 ;; KNDA-OTF.flt -- Font Layout Table for Kannada OpenType fonts
2 ;; Copyright (C) 2004, 2007
3 ;;   National Institute of Advanced Industrial Science and Technology (AIST)
4 ;;   Registration Number H15PRO112
5
6 ;; This file is part of the m17n database; a sub-part of the m17n
7 ;; library.
8
9 ;; The m17n library is free software; you can redistribute it and/or
10 ;; modify it under the terms of the GNU Lesser General Public License
11 ;; as published by the Free Software Foundation; either version 2.1 of
12 ;; the License, or (at your option) any later version.
13
14 ;; The m17n library is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 ;; Lesser General Public License for more details.
18
19 ;; You should have received a copy of the GNU Lesser General Public
20 ;; License along with the m17n library; if not, write to the Free
21 ;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 ;; Boston, MA 02110-1301, USA.
23
24 ;;; <li> KNDA-OTF.flt
25 ;;;
26 ;;; For Kannada OpenType fonts to draw Kannada.
27 ;;; Designed for Kedage-n.ttf <http://brahmi.sourceforge.net/downloads.html>
28
29 (font layouter knda-otf nil
30       (font (nil nil unicode-bmp :otf=knda=rphf)))
31
32 (category
33  ;; C: general consonant
34  ;; R: RA
35  ;; H: HALANT
36  ;; u: MATRA (above)
37  ;; b: MATRA (below)
38  ;; p: MATRA (post)
39  ;; t: MATRA (two-part)
40  ;; T: MATRA (three-part)
41  ;; a: vowel modifier (post)
42  ;; V: independent vowel
43  ;; N: ZWNJ (ZERO WIDTH NON-JOINER)
44  ;; J: ZWJ (ZERO WIDTH JOINER)
45  ;; E: ELSE
46  ;;
47  (0x200C        ?N)                     ; ZWNJ
48  (0x200D        ?J)                     ; ZWJ
49  (0x0964        ?E)                     ; DANDA
50  (0x0965        ?E)                     ; DOUBLE DANDA
51  (0x0C80 0x0CFF ?E)                     ; ELSE
52  (0x0C82 0x0C83 ?a)                     ; SIGN ANUSVARA, VISARGA
53  (0x0C85 0x0C94 ?V)                     ; LETTER A .. LETTER AU
54  (0x0C95 0x0CB9 ?C)                     ; LETTER KA .. LETTER HA
55  (0x0CB0        ?R)                     ; LETTER RA
56  (0x0CBC        ?n)                     ; SIGN NUKTA
57  (0x0CBE        ?p)                     ; VOWEL SIGN AA (post)
58  (0x0CBF        ?u)                     ; VOWEL SIGN I (above)
59  (0x0CC0        ?t)                     ; VOWEL SIGN II (two-part)
60  (0x0CC1 0x0CC4 ?p)                     ; VOWEL SIGN U, UU, R, RR (post)
61  (0x0CC6        ?u)                     ; VOWEL SIGN E (above)
62  (0x0CC7 0x0CCA ?t)                     ; VOWEL SIGN EE, AI, O (two-part)
63  (0x0CCB        ?T)                     ; VOWEL SIGN OO (three-part)
64  (0x0CCC        ?u)                     ; VOWEL SIGN AU (above)
65  (0x0CCD        ?H)                     ; SIGN VIRAMA (HALANT)
66  (0x0CD5 0x0CD6 ?l)                     ; LENGTH MARK (length post)
67  (0x0CDE        ?C)                     ; LETTER FA (LLLA)
68  (0x0CE0 0x0CE1 ?V)                     ; LETTER VOCALIC RR, LL
69  (0x0CE2 0x0CE3 ?b)                     ; VOWEL SIGN VOCALIC L, LL
70  (0x0CFD        ?Z)                     ; internal use
71  (0x0CFE        ?Y)                     ; internal use
72  (0x0CFF        ?X)                     ; internal use
73  )
74
75 ;; Step 1 : Syllable identification and Halant movement.
76 (generator
77  (0
78   (cond
79    ;; A syllable containing a three-part vowel sign.
80    ("([CR]J?n?(H[CR]n?)*)(T)(a)?"
81     < | (1 move-base-Halant) (3 0x0CC6 0x0CC2 0x0CD5) (4 =) | >)
82
83    ;; A syllable containing a two-part vowel sign.
84    ("([CR]J?n?(H[CR]n?)*)(t)(a)?"
85     < | (1 move-base-Halant) (3 two-part) (4 =) | >)
86
87    ;; A syllable ending with vowel signs and/or a vowel modifier.
88    ("([CR]J?n?(H[CR]n?)*)([ubpl]+a?|a)"
89     < | (1 move-base-Halant) (3 = *) | >)
90
91    ;; Forced Halant form.
92    ("(([CR]n?H)*)([CR]n?H)N"
93     < | (1 move-base-Halant) | >
94     < | (3 move-base-Halant) | >)
95
96    ;; Forced Half form.
97    ("(([CR]n?H)*)([CR]n?H)J"
98     < | (1 move-base-Halant) >
99     < | (3 otf:knda=blwf) | >)
100
101    ;; A syllable without a vowel sign nor a vowel modifier.
102    ("[CR]J?n?(H[CR]n?)*H?"
103     < | move-base-Halant | >)
104
105    ;; A syllable starting with an independent vowel.
106    ("Va?"
107     < | = * | > )
108
109    ("." =))
110   *)
111
112  ;; Move Halant on the base consonant to the tail if the syllable ends
113  ;; with a consonant.
114  ;; A leading 0x0CFF means Halant movement.
115  ;; A leading 0x0CFE means a syllable ending with a Halant.
116  ;; A leading 0x0CFD means Halant & Reph movements.
117  (move-base-Halant
118   (cond
119    (".*H$"
120     0x0CFE = *)
121    ("(RH)([CR]n?)$"
122     0x0CFD (2 = *) (1 = =))
123    ("(RH)([CR]n?)(H)(.*)"
124     0x0CFD (2 = *) (4 = *) (3 =) (1 = =))
125    ("(R)J(H)(.*)"
126     0x0CFF (1 =) (3 = *) (2 =))
127    ("(Cn?)(H)(.*)"
128     0x0CFF (1 = *) (3 = *) (2 =))
129    (".*"
130     = *)))
131
132  ;; Divide a two-part Matra into elements.
133  (two-part
134   (cond
135    ((0x0CC0)    0x0CBF 0x0CD5)
136    ((0x0CC7)    0x0CC6 0x0CD5)
137    ((0x0CC8)    0x0CC6 0x0CD6)
138    ((0x0CCA)    0x0CC6 0x0CC2)))
139  )
140
141 ;; Step 2 : Move Matra if applicable.
142 ;; The base consonant in a Halant-ending syllable is changed into Halant form.
143 (generator
144  (0
145   (cond
146    ;;  1       2        3   4   5   6   7   8
147    (" Z([CR]n?)([CRnH]*)(RH)(u)?(b)?(p)?(l*)(a)? "
148     | (1 = *) (4 =) (5 =) (6 =) (2 = *) (7 = *) (3 otf:knda=rphf) (8 =) |)
149    ;;  1       2        3   4   5   6   7
150    (" X([CR]n?)([CRnH]*)(u)?(b)?(p)?(l*)(a)? "
151     | (1 = *) (3 =) (4 =) (5 =) (2 = *) (6 = *) (7 =) |)
152    (" Y([CR]n?H)([^ ]*) "
153     ;; Kedage-n.ttf lacks the haln feature, so "otf:knda=haln" does not work.
154     | (1 otf:knda=~rphf,~blwf,*) (2 = *) |)
155    ("." =))
156   *))
157
158 ;; Step 3 : Drive OTF tables.
159 (generator
160  (0
161   (cond
162    (" ([^ ]*) "
163     (1 otf:knda=~rphf,*))
164    ("."
165     [ otf:knda=+ ]))
166   *))
167
168 ;; Local Variables:
169 ;; mode: emacs-lisp
170 ;; End: