X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=FLT%2FDEVA-OTF.flt;h=5328c9b625ed7e0dea204b84da1b1a4e400fde44;hb=2f0004ec7627a7c9fc59941fd4856e1b463a442a;hp=54536108d2e55a0a637961a3412955d3e97b7d45;hpb=3f81c964506351e630b5ca6f4e891a7aba0edbe0;p=m17n%2Fm17n-db.git diff --git a/FLT/DEVA-OTF.flt b/FLT/DEVA-OTF.flt index 5453610..5328c9b 100644 --- a/FLT/DEVA-OTF.flt +++ b/FLT/DEVA-OTF.flt @@ -1,35 +1,35 @@ -;; 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. +;; DEVA-OTF.flt -- Font Layout Table for Devanagari OpenType fonts +;; Copyright (C) 2003, 2004, 2007, 2008, 2010 AIST (H15PRO112) +;; See the end for copying conditions. -;; 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 deva-otf nil + (version "1.6.0") + (font (nil nil unicode-bmp :otf=deva))) ;;;
  • 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))) +;; Accepted modifier sequence: +;; 1. matra (pre, below, above, post) +;; 2. candrabindu (0901) or anusvara (0902) +;; 3. udatta (0951) or anudatta (0952) +;; 4. grave (0953) or acute (0954) +;; 5. visarga (0903) + +;; Rendering glyph order: +;; 1. below matra +;; 2. anudatta (0952) +;; 3. above- or post matra +;; 4. reph +;; 5. candrabindu (0901) or anusvara (0902) +;; 6. udatta (0951) +;; 7. visarga (0903) (category - ;; C: consonant (except for R) + ;; X: generic + ;; V: independent vowel + ;; C: consonant (except for RA) ;; R: consonant RA ;; n: NUKTA ;; H: HALANT @@ -37,20 +37,16 @@ ;; u: vowel sign (above) ;; b: vowel sign (below) ;; p: vowel sign (post) - ;; A: vowel modifier (above) - ;; a: vowel modifier (post) - ;; S: stress sign / accent (above) - ;; s: stress sign / accent (below) - ;; V: independent vowel + ;; a: vowel modifier (above) + ;; A: vowel modifier (post) + ;; s: stress sign / accent (above) + ;; S: stress sign (below) + ;; Z: internal use ;; N: ZWNJ ;; J: ZWJ - ;; X: generic - ;; Z: internal use - (0x0900 ?Z) ; internal use - (0x0901 0x097F ?X) ; generic - (0x0901 ?A) ; SIGN CANDRABINDU - (0x0902 ?A) ; SIGN ANUSVARA - (0x0903 ?a) ; SIGN VISARGA + (0x0900 0x097F ?X) ; generic + (0x0900 0x0902 ?a) ; SIGN INVERTED CANDRABINDU .. ANUSVARA + (0x0903 ?A) ; SIGN VISARGA (0x0904 0x0914 ?V) ; LETTER SHORT A .. AU (0x0915 0x0939 ?C) ; LETTER KA .. HA (0x0930 ?R) ; LETTER RA @@ -62,127 +58,223 @@ (0x0945 0x0948 ?u) ; VOWEL SIGN CANDRA E .. AI (0x0949 0x094C ?p) ; VOWEL SIGN CANDRA O .. AU (0x094D ?H) ; SIGN VIRAMA - (0x0951 ?S) ; STRESS SIGN UDATTA - (0x0952 ?s) ; STRESS SIGN ANUDATTA - (0x0953 0x0954 ?S) ; GRAVE ACCENT .. ACUTE ACCENT + (0x094E ?m) ; VOWEL SIGN PRISHTHAMATRA E + (0x0951 ?s) ; STRESS SIGN UDATTA + (0x0952 ?S) ; STRESS SIGN ANUDATTA + (0x0953 0x0954 ?t) ; GRAVE ACCENT .. ACUTE ACCENT + (0x0955 ?u) ; VOWEL SIGN CHANDRA LONG E (0x0958 0x095F ?C) ; LETTER QA .. YYA (0x0960 0x0961 ?V) ; LETTER VOCALIC RR .. VOCALIC LL (0x0962 0x0963 ?b) ; VOWEL SIGN VOCALIC L .. VOCALIC LL - (0x097B 0x097C ?C) ; LETTER GGA .. JJA - (0x097E 0x097F ?C) ; LETTER DDDA .. BBA + (0x0972 ?V) ; LETTER CANDRA A + (0x0979 0x097F ?C) ; LETTER ZHA .. BBA + (0x200C ?N) ; ZWNJ (0x200D ?J) ; ZWJ + (0x25CC ?X) ; DOTTED CIRCLE + + (rphf ?r) ) -;; Reordering +;; Stage 0 +;; Preprocessing (generator (0 (cond - ;; A syllable containing a vowel sign. - ;;1 23 45 6 7 89 A BC D - ("(RH)?(([CR]n?H)*[CR]n?)((m)|(b)|([up]))((A)|(a))?((S)|(s))?" - < | - (5 =) (2 move-h) (6 =) (13 =) (7 =) (1 otf:deva=rphf+) (9 =) (12 =) (10 =) - | >) - - ;; A syllable without vowel signs but with a vowel modifier. - ;;1 23 45 6 78 9 - ("(RH)?(([CR]n?H)*[CR]n?)((A)|(a))((S)|(s))?" - < | (2 move-h) (9 =) (1 otf:deva=rphf+) (5 =) (8 =) (6 =) | >) - - ;; No vowel signs, No vowel modifiers, but with a stress sign or an accent. - ;;1 23 45 6 - ("(RH)?(([CR]n?H)*[CR]n?)((S)|(s))" - < | (2 move-h) (6 =)(1 otf:deva=rphf+) (5 =) | >) - - ;; A special case: eyelash RA - ("(RH)J" - < (1 otf:deva=half+) >) - - ;; Forced half form. Do not move halant. - ;;1 23 - ("(RH)?(([CR]n?H)+)J" - < | (2 = *) (1 otf:deva=rphf+) | >) - - ;; When a syllable ends with a halant, add a ZWNJ explicitly. - ;;1 23 4 5 - ("(RH)?(([CR]n?H)*[CR]n?)(H)?(N)?" - < | (2 move-h) (1 otf:deva=rphf+) (4 = 0x200C) | >) - - ;; A syllable starting with an independent vowel. - ;;1 23 4 56 7 - ("(V)((A)|(a))?((S)|(s))?" - < | (1 =) (7 =) (3 =) (6 =) (4 =) | >) + ;; Compose a consonant and a nukta + ((0x0928 0x093C) 0x0929) + ((0x0930 0x093C) 0x0931) + ((0x0933 0x093C) 0x0934) + ((0x0915 0x093C) 0x0958) + ((0x0916 0x093C) 0x0959) + ((0x0917 0x093C) 0x095A) + ((0x091C 0x093C) 0x095B) + ((0x0921 0x093C) 0x095C) + ((0x0922 0x093C) 0x095D) + ((0x092B 0x093C) 0x095E) + ((0x092F 0x093C) 0x095F) ("." =)) - *) + *)) - ;; Move the halant that follows the base consonant to the end. - ;; Put a mark after the base consonant. - (move-h +;; Stage 1 +;; Syllable identification +(generator + (0 (cond - ;;12 3 4 56 - ("(([CR]n?H)*(Cn?))(H)((RH)*R)$" - (1 = *) 0x0900 (5 = *) (4 =)) - ;;1 2 34 - ("(R)(H)((RH)*R)$" - (1 =) 0x0900 (3 = *) (2 =)) - (".+" = * 0x0900)))) - -;; If a syllable ends with a halant and a ZWNJ, render the final -;; halant explicitly. Do not apply 'blwf' nor 'half' to the initial -;; RA. + ;; Syllables with an independent vowel + ;; + ("(RH)?(Vn?)((J?HR)?m?u?b?p?n?a?[sS]?t?A?)" + < | (1 = =) (2 :otf=deva=nukt+) (3 = *) | >) + + ;; Consonant-based syllables + ;;1 23 4 + ("([CR]n?((J?H|HJ?)[CR]n?)*)(H[NJ]?|m?u?b?p?n?a?[sS]?t?A?)" + < | (1 :otf=deva=nukt,akhn+) + (4 (cond ("HJ" = =) + ("(H)N?" (1 =) 0x200C) + (".+" = *))) | >) + + ;; Combining marks are displayed with a DOTTED CIRCLE. + ("m" + (cond + ((font-facility 0x25CC) < = 0x25CC >) + ("." [ = ]))) + ("[nHubpaSsA]" + (cond + ((font-facility 0x25CC) < 0x25CC = >) + ("." [ = ]))) + + ;; Isolated blwf is displayed with a DOTTED CIRCLE in the next stage. + ("(J)(H)(R)" + < | (1 =) (3 =) (2 =) | >) + + ("." =)) + *)) + +;; Stage 2 +;; Reorder halant for blwf (generator (0 (cond - (" (R)([^ ]*)(H)N " - | (1 =) (2 gsub1) (3 =) |) - (" (m?R)([^ ]*) " - | (1 = *) (2 gsub1) |) - (" ([^ ]+)(H)N " - | (1 gsub1) (2 =) |) - (" ([^ ]+) " - | (1 gsub1) |) + ;; Isolated blwf + (" J(RH) " + (cond + ((font-facility 0x25CC) < 0x25CC :otf=deva=blwf+ >) + (" J(RH) " [ (1 :otf=deva=blwf+) ]))) + + ;; Syllables with an overt halant + (" (RHJ?)?([^ ]+)(HN) " + | (1 = *) (2 reorder *) (3 = =) |) + + ;; Ordinary syllables + (" (RHJ?)?([^mubpasStA ]+)(m?u?b?p?n?a?[sS]?t?A?) " + | (1 = *) (2 reorder *) (3 = *) |) + ("." =)) *) - (gsub1 - otf:deva=nukt,akhn,blwf,half,vatu+)) + ;; In Devanagari and Gujarati, vattu has a half form. Thus we handle + ;; the sequence CHRHC as (CH)half + (RH)blwf + C instead of + ;; reordering and interpreting it as C + (RH)blwf + H + C. + (reorder + (cond + ("J?(H)(R)$" (2 =) (1 =)) + ("J?(HR)" (1 = =)) + ("." =))) + ) + +;; Stage 3 +;; Language forms and matra reordering +(generator + (0 + (cond + ;; Overt halant forms + (" (RHJ?)?([^ ]+)(HN) " + | + (1 (cond ("RHJ" :otf=deva=half+) + ("RH" :otf=deva=rphf+))) + (2 (cond ("(.H)(.+)" (1 :otf=deva=half+) (2 :otf=deva=blwf,half+)) + (".+" :otf=deva=blwf,half+))) + (3 = =) |) + + ;; Other syllables + ;; 1 2 3 4 5 6 7 8 + (" (RHJ?)?([^mubpasStA ]*)(mn?)?(un?)?(bn?)?(p?n?a?)(S)?(s?t?A?) " + | (3 = *) + (1 (cond ("RHJ" :otf=deva=half+) + ("RH" :otf=deva=rphf+))) + (2 (cond ("(.H)(.+)" (1 :otf=deva=half+) (2 :otf=deva=blwf,half+)) + (".+" :otf=deva=blwf,half+))) + (5 = *) (7 =) (4 = *) (6 = *) (8 = *) |) + + ("." =)) + *)) + +;; Stage 4 +;; Final reordering #1 (Move pre-base matra after the last halant) +(generator + (0 + (cond + ;; 1 2 3 + (" (mn?)([^ ]+HJ?)([^H ]+) " + | (2 = *) (1 = *) (3 = *) |) + + ("." =)) + *)) + +;; Stage 5 +;; Final reordering #2 (Move reph after the first halant) +(generator + (0 + (cond + ;; Syllables with a reph and an explicit halant + ;; 1 2 3 4 + (" (mn?)?(r)([^H ]+HJ?)([^ ]*) " + | (1 = *) (3 = *) (2 =) (4 = *) |) -;; Apply 'pres' to get pre-base conjuncts. + ;; A reph without explicit halant + ;; 1 2 3 4 + (" (mn?)?(r)([^astA ]+)(a?s?t?A?) " + | (1 = *) (3 = *) (2 =) (4 = *) |) + + ("." =)) + *)) + +;; Stage 6 +;; Nukta for matra, vattu and presentation forms (generator (0 (cond - (" (m)?([^ ]+) " - | (1 =) (2 otf:deva=pres+) |) + (" ([^ ]+) " + | (1 :otf=deva=nukt,vatu,pres,abvs,blws,psts,haln+) |) + ("." =)) *)) -;; When the number of glyphs between a pre-base vowel modifier and the -;; post-base mark is more than one, move the pre-base vowel before the -;; final glyph. +;; Stage 7 +;; Remove ZWNJ/ZWJ (generator (0 (cond - (" (m)([^Z ]+)([^Z ])Z([^ ]*) " - | (2 = *) (1 =) (3 =) (4 = *) |) - (" ([^Z ]+)Z([^ ]*) " - | (1 = *) (2 = *) |) + ("[NJ]") + ("." =)) *)) -;; Apply other features. The 'vatu' feature is applied again to get -;; the conjunct of base and post-base. The 'pres' feature is also -;; applied again for pre-base vowel modifier. +;; Stage 8 +;; GPOS processing (generator (0 (cond (" ([^ ]+) " - (1 otf:deva=vatu,pres,abvs,blws,psts,haln)) - ("." - [ otf:deva=+ ])) + (1 :otf=deva=+abvm,blwm,dist)) + + ("." =)) *)) +;; Copyright (C) 2003, 2004, 2007, 2008, 2010 +;; National Institute of Advanced Industrial Science and Technology (AIST) +;; Registration Number H15PRO112 + +;; This file is part of the m17n database; a sub-part of the m17n +;; library. + +;; The m17n library is free software; you can redistribute it and/or +;; modify it under the terms of the GNU Lesser General Public License +;; as published by the Free Software Foundation; either version 2.1 of +;; the License, or (at your option) any later version. + +;; The m17n library is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; Lesser General Public License for more details. + +;; You should have received a copy of the GNU Lesser General Public +;; License along with the m17n library; if not, write to the Free +;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + ;; Local Variables: ;; mode: emacs-lisp ;; End: