diff options
Diffstat (limited to 'modules/tibetan/tibetan-fc.c')
-rw-r--r-- | modules/tibetan/tibetan-fc.c | 574 |
1 files changed, 0 insertions, 574 deletions
diff --git a/modules/tibetan/tibetan-fc.c b/modules/tibetan/tibetan-fc.c deleted file mode 100644 index 4e894165..00000000 --- a/modules/tibetan/tibetan-fc.c +++ /dev/null @@ -1,574 +0,0 @@ -/* Pango - * tibetan-fc.c: Shaper for Tibetan script - * - * Copyright (C) 2005 DIT, Government of Bhutan <http://www.dit.gov.bt> - * Contact person : Pema Geyleg <pema_geyleg@druknet.bt> - * - * Based on code from khmer shapers developed by Jens Herden - * <jens@tibetanos.inf > and Javier Sola <javier@tibetanos.info> - * - * Based on code from other shapers - * Copyright (C) 1999-2004 Red Hat Software - * Author: Owen Taylor <otaylor@redhat.com> - - * Partially based on Indic shaper - * Copyright (C) 2001, 2002 IBM Corporation - * Author: Eric Mader <mader@jtcsv.com> - * - * The first module for Tibetan shaper was developed by Mr. Karunakar under - * PanLocalization project. - * Mr. Chris Fynn, Mr.Javier Sola, Mr. Namgay Thinley were involved - * while developing this shaper. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * The license on the original Indic shaper code is as follows: - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, and/or sell copies of the - * Software, and to permit persons to whom the Software is furnished - * to do so, provided that the above copyright notice(s) and this - * permission notice appear in all copies of the Software and that - * both the above copyright notice(s) and this permission notice - * appear in supporting documentation. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR - * ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY - * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - * - * Except as contained in this notice, the name of a copyright holder - * shall not be used in advertising or otherwise to promote the sale, - * use or other dealings in this Software without prior written - * authorization of the copyright holder. - */ -#include "config.h" -#include <string.h> - -#include "pango-engine.h" -#include "pango-ot.h" -#include "pango-utils.h" -#include "pangofc-font.h" - - -#define SCRIPT_ENGINE_NAME "TibetanScriptEngineFc" -#define RENDER_TYPE PANGO_RENDER_TYPE_FC - - -typedef PangoEngineShape TibetanEngineFc; -typedef PangoEngineShapeClass TibetanEngineFcClass ; - - -static PangoEngineScriptInfo tibetan_scripts[] = -{ - { PANGO_SCRIPT_TIBETAN, "*" } -}; - -static PangoEngineInfo script_engines[] = -{ - { - SCRIPT_ENGINE_NAME, - PANGO_ENGINE_TYPE_SHAPE, - RENDER_TYPE, - tibetan_scripts, G_N_ELEMENTS (tibetan_scripts) - } -}; - - -/* - * Vocabulary - * Base -> A consonant in its full (not subscript) form. It is the - * center of the syllable, it can be souranded by subjoined consonants, vowels, - * signs... but there is only one base in a stack, it has to be coded as - * the first character of the syllable.Included here are also groups of base + subjoined - * which are represented by one single code point in unicode (e.g. 0F43) Also other characters - * that might take subjoined consonants or other combining characters. - * Subjoined -> Subjoined consonants and groups of subjoined consonants which have a single code-point - * to repersent the group (even if each subjoined consonant is represented independently - * by anothe code-point - * Tsa Phru --> Tsa Phru character, Bhutanese people will always place it right after the base, but sometimes, due to - * "normalization" is placed after all the subjoined consonants, and it is also permitted there. - * A Chung Vowel lengthening mark --> . 0F71 It is placed after the base and any subjoined consonants but before any vowels - * Precomposed Sanskrit vowels --> The are combinations of subjoined consonants + vowels that have been assigned - * a given code-point (in spite of each single part of them having also a code-point - * They are avoided, and users are encouraged to use the combination of code-points that - * represents the same sound instead of using this combined characters. This is included here - * for compatibility with possible texts that use them (they are not in the Dzongkha keyboard). - * Halanta -> The Halanta or Virama character 0F84 indicates that a consonant should not use its inheernt vowel, - * in spite of not having other vowels present. It is usually placed immediatly after a base consonant, - * but in some special cases it can also be placed after a subjoined consonant, so this is also - * permitted in this algorithm. (Halanta is always displayed in Tibetan not used as a connecting char) - * - * Subjoined vowels -> Dependent vowels (matras) placed below the base and below all subjoined consonants. There - * might be as much as three subjoined vowels in a given stack (only one in general text, but up - * to three for abreviations, they have to be permitted). - * Superscript vowels -> There are three superscript vowels, and they can be repeated or combined (up to three - * times. They can combine with subjoined vowels, and are always coded after these. - * Anusvara --> Nasalisation sign. Traditioinally placed in absence of vowels, but also after vowels. In some - * special cases it can be placed before a vowel, so this is also permitted - * Candrabindu -> Forms of the Anusvara with different glyphs (and different in identity) which can be placed - * without vowel or after the vowel, but never before. Cannot combine with Anusvara. - * Stress marks -> Marks placed above or below a syllable, affecting the whole syllable. They are combining - * marks, so they have to be attached to a specific stack. The are using to emphasise a syllable. - * - * Digits -> Digits are not considered as non-combining characters because there are a few characters which - * combine with them, so they have to be considered independently. - * Digit combining marks -> dependent marks that combine with digits. - * - * TODO - * There are a number of characters in the CJK block that are used in Tibetan script, two of these are symbols - * are used as bases for combining glyphs, and have not been encoded in Tibetan. As these characters are outside - * of the tibetan block, they have not been treated in this program. -*/ - - -enum TibetanCharClassValues -{ - CC_RESERVED = 0, /* Non Combining Characters*/ - CC_BASE = 1, /* Base Consonants, Base Consonants with Subjoined attached in code point, Sanskrit base marks*/ - CC_SUBJOINED = 2, /* Subjoined Consonats, combination of more than Subjoined Consonants in the code point*/ - CC_TSA_PHRU = 3, /* Tsa-Phru character 0F39*/ - CC_A_CHUNG = 4, /* Vowel Lenthening a-chung mark 0F71*/ - CC_COMP_SANSKRIT = 5, /* Precomposed Sanskrit vowels including Subjoined characters and vowels*/ - CC_HALANTA = 6, /* Halanta Character 0F84*/ - CC_BELOW_VOWEL = 7, /* Subjoined vowels*/ - CC_ABOVE_VOWEL = 8, /* Superscript vowels*/ - CC_ANUSVARA = 9, /* Tibetan sign Rjes Su Nga Ro 0F7E*/ - CC_CANDRABINDU = 10, /* Tibetan sign Sna Ldan and Nyi Zla Naa Da 0F82, 0F83*/ - CC_VISARGA = 11, /* Tibetan sign Rnam Bcad (0F7F)*/ - CC_ABOVE_S_MARK = 12, /* Stress Marks placed above the text*/ - CC_BELOW_S_MARK = 13, /* Stress Marks placed below the text*/ - CC_DIGIT = 14, /* Dzongkha Digits*/ - CC_PRE_DIGIT_MARK = 15, /* Mark placed before the digit*/ - CC_POST_BELOW_DIGIT_M = 16, /* Mark placed below or after the digit*/ - CC_COUNT = 17 /* This is the number of character classes*/ -}; - - -enum TibetanCharClassFlags -{ - CF_CLASS_MASK = 0x0000FFFF, - - CF_DOTTED_CIRCLE = 0x04000000, /* add a dotted circle if a character with this flag is the first in a syllable*/ - CF_DIGIT = 0x01000000, /* flag to speed up comparaisson*/ - CF_PREDIGIT = 0x02000000, /* flag to detect pre-digit marks for reordering*/ - - /* position flags*/ - CF_POS_BEFORE = 0x00080000, - CF_POS_BELOW = 0x00040000, - CF_POS_ABOVE = 0x00020000, - CF_POS_AFTER = 0x00010000, - CF_POS_MASK = 0x000f0000 -}; - - -/* Characters that get refrered to by name */ -enum TibetanChar -{ - C_DOTTED_CIRCLE = 0x25CC, - C_PRE_NUMBER_MARK = 0x0F3F -}; - - -enum -{ - /* simple classes, they are used in the statetable (in this file) to control the length of a syllable - * they are also used to know where a character should be placed (location in reference to the base character) - * and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to - * indicate error in syllable construction - */ - _xx = CC_RESERVED, - _ba = CC_BASE, - _sj = CC_SUBJOINED | CF_DOTTED_CIRCLE | CF_POS_BELOW, - _tp = CC_TSA_PHRU | CF_DOTTED_CIRCLE | CF_POS_ABOVE, - _ac = CC_A_CHUNG | CF_DOTTED_CIRCLE | CF_POS_BELOW, - _cs = CC_COMP_SANSKRIT | CF_DOTTED_CIRCLE | CF_POS_BELOW, - _ha = CC_HALANTA | CF_DOTTED_CIRCLE | CF_POS_BELOW, - _bv = CC_BELOW_VOWEL | CF_DOTTED_CIRCLE | CF_POS_BELOW, - _av = CC_ABOVE_VOWEL | CF_DOTTED_CIRCLE | CF_POS_ABOVE, - _an = CC_ANUSVARA | CF_DOTTED_CIRCLE | CF_POS_ABOVE, - _cb = CC_CANDRABINDU | CF_DOTTED_CIRCLE | CF_POS_ABOVE, - _vs = CC_VISARGA | CF_DOTTED_CIRCLE| CF_POS_AFTER, - _as = CC_ABOVE_S_MARK | CF_DOTTED_CIRCLE | CF_POS_ABOVE, - _bs = CC_BELOW_S_MARK | CF_DOTTED_CIRCLE | CF_POS_BELOW, - _di = CC_DIGIT | CF_DIGIT, - _pd = CC_PRE_DIGIT_MARK | CF_DOTTED_CIRCLE | CF_PREDIGIT | CF_POS_BEFORE , - _bd = CC_POST_BELOW_DIGIT_M | CF_DOTTED_CIRCLE | CF_POS_AFTER -}; - - -/* Character class: a character class value - * ORed with character class flags. - */ -typedef glong TibetanCharClass; -/*_xx Non Combining characters*/ -/*_ba Base Consonants*/ -/*_sj Subjoined consonants*/ -/*_tp Tsa - phru*/ -/*_ac A-chung, Vowel Lengthening mark*/ -/*_cs Precomposed Sanskrit vowel + subjoined consonants*/ -/*_ha Halanta/Virama*/ -/*_bv Below vowel*/ -/*_av above vowel*/ -/*_an Anusvara*/ -/*_cb Candrabindu*/ -/*_vs Visaraga/Post mark*/ -/*_as Upper Stress marks*/ -/*_bs Lower Stress marks*/ -/*_di Digit*/ -/*_pd Number pre combining, Needs reordering*/ -/*_bd Other number combining marks*/ - - -static const TibetanCharClass tibetanCharClasses[] = -{ - /* 0 1 2 3 4 5 6 7 8 9 a b c d e f*/ - _xx, _ba, _xx, _xx, _ba, _ba, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0F00 - 0F0F 0*/ - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _bd, _bd, _xx, _xx, _xx, _xx, _xx, _xx, /* 0F10 - 0F1F 1*/ - _di, _di, _di, _di, _di, _di, _di, _di, _di, _di, _xx, _xx, _xx, _xx, _xx, _xx, /* 0F20 - 0F2F 2*/ - _xx, _xx, _xx, _xx, _xx, _bs, _xx, _bs, _xx, _tp, _xx, _xx, _xx, _xx, _bd, _pd, /* 0F30 - 0F3F 3*/ - _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _ba, _ba, _ba, _ba, _ba, _ba, _ba, /* 0F40 - 0F4F 4*/ - _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, /* 0F50 - 0F5F 5*/ - _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, _xx, /* 0F60 - 0F6F 6*/ - _xx, _ac, _av, _cs, _bv, _bv, _cs, _cs, _cs, _cs, _av, _av, _av, _av, _an, _vs, /* 0F70 - 0F7F 7*/ - _av, _cs, _cb, _cb, _ha, _xx, _as, _as, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, /* 0F80 - 0F8F 8*/ - _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, _sj, _sj, _sj, _sj, _sj, /* 0F90 - 0F9F 9*/ - _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, /* 0FA0 - 0FAF a*/ - _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, /* 0FB0 - 0FBF b*/ - _xx, _xx, _xx, _xx, _xx, _xx, _bs, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0FC0 - 0FCF c*/ - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0FD0 - 0FDF d*/ - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0FE0 - 0FEF e*/ - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0FF0 - 0FFF f*/ -}; - -/* this define must reflect the range of tibetanCharClasses */ -/*First Tibetan Character*/ -#define firstChar 0x0F00 -/*Last Tibetan Character*/ -#define lastChar 0x0FFF - -/* The stateTable is used to calculate the end (the length) of a well - * formed Tibetan Stack - * - * Each horizontal line is ordered exactly the same way as the values in TibetanClassTable - * CharClassValues.This coincidence of values allows the follow up of the table. - * - * Each line corresponds to a state, which does not necessarily need to be a type - * of component... for example, state 2 is a base, with is always a first character - * in the Stack but the state could be produced a consonant of any type when - * it is the first character that is analysed (in ground state). - */ - -static const gint8 tibetanStateTable[][CC_COUNT] = -{ - /*Dzongkha state table*/ - /*xx ba sj tp ac cs ha bv av an cb vs as bs di pd bd*/ - { 1, 2, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, 20, 21, 21,}, /* 0 - ground state*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, /* 1 - exit state (or sign to the right of the syllable)*/ - {-1, -1, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 2 - Base consonant*/ - {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 3 - Tsa phru after base*/ - {-1, -1, 4, 6, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 4 - Subjoined consonant after base*/ - {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 5 - Subjoined consonant after tsa phru*/ - {-1, -1, -1, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 6 - Tsa phru after subjoined consonant*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, /* 7 - Pre Composed Sanskrit*/ - {-1, -1, -1, -1, -1, -1, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 8 - A-chung*/ - {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, -1, 19, 19, -1, -1, -1,}, /* 9 - Halanta*/ - {-1, -1, -1, -1, -1, -1, -1, 11, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 10 - below vowel 1*/ - {-1, -1, -1, -1, -1, -1, -1, 12, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 11 - below vowel 2*/ - {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, /* 12 - below vowel 3*/ - {-1, -1, -1, -1, -1, -1, -1, -1, 14, 17, 17, 18, 19, 19, -1, -1, -1,}, /* 13 - Anusvara before vowel*/ - {-1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 17, 18, 19, 19, -1, -1, -1,}, /* 14 - above vowel 1*/ - {-1, -1, -1, -1, -1, -1, -1, -1, 16, 17, 17, 18, 19, 19, -1, -1, -1,}, /* 15 - above vowel 2*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 17, 18, 19, 19, -1, -1, -1,}, /* 16 - above vowel 3*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 19, -1, -1, -1,}, /* 17 - Anusvara or Candrabindu after vowel*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, /* 18 - Visarga*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, /* 19 - strss mark*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, 21,}, /* 20 - digit*/ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, /* 21 - digit mark*/ -}; - - -enum property_flags -{ - abvf = 0x0001, - pref = 0x0002, - pstf = 0x0004, - blwf = 0x0008, - - pres = 0x0010, - blws = 0x0020, - abvs = 0x0040, - psts = 0x0080, - clig = 0x0100, - - dist = 0x0200, - blwm = 0x0400, - abvm = 0x0800, -}; - - -enum properties -{ - blwf_p = /*(blwf | blws | clig | dist | blwm)*/ (abvf | pref | pstf | pres | abvs | psts | abvm), - pstf_p = /*(blwf | blws | pref | pres | pstf | psts | clig | dist | blwm)*/ (abvf | abvs | abvm), - abvf_p = /*(abvf | abvs | clig | dist | abvm)*/ (pref | pstf | blwf | pres | blws | psts | blwm), - pref_p = /*(pref | pres | clig | dist)*/ (abvf | pstf | blwf | blws | abvs | psts | blwm | abvm), - default_p = /*(pres | blws | clig | dist | abvm | blwm)*/ (pref | blwf |abvf | pstf | abvs | psts) -}; - - -/* Below we define how a character in the input string is either in the tibetanCharClasses table - * (in which case we get its type back), or an unknown object in which case we get _xx (CC_RESERVED) back - */ -static TibetanCharClass -get_char_class (gunichar ch) -{ - - if (ch < firstChar || ch > lastChar) - return CC_RESERVED; - - return tibetanCharClasses[ch - firstChar]; -} - - -/* Given an input string of characters and a location in which to start looking - * calculate, using the state table, which one is the last character of the syllable - * that starts in the starting position. - */ -static glong -find_syllable (const gunichar *chars, - glong start, - glong char_count) -{ - glong cursor = start; - gint8 state = 0; - TibetanCharClass charClass; - - while (cursor < char_count) - { - charClass = get_char_class (chars[cursor]) & CF_CLASS_MASK; - state = tibetanStateTable[state][charClass]; - - if (state < 0) - break; - - cursor += 1; - } - - return cursor; -} - -static const PangoOTFeatureMap gsub_features[] = -{ - {"ccmp", PANGO_OT_ALL_GLYPHS}, - {"locl", PANGO_OT_ALL_GLYPHS}, - {"blws", blws}, - {"abvs", abvs}, - {"psts", psts}, - {"clig", clig}, - {"calt", PANGO_OT_ALL_GLYPHS} -}; - -static const PangoOTFeatureMap gpos_features[] = -{ - {"dist", dist}, - {"blwm", blwm}, - {"abvm", abvm}, - {"kern", PANGO_OT_ALL_GLYPHS}, - {"mark", PANGO_OT_ALL_GLYPHS}, - {"mkmk", PANGO_OT_ALL_GLYPHS} -}; - -static PangoGlyph -get_index (PangoFcFont *fc_font, gunichar wc) -{ - PangoGlyph index = pango_fc_font_get_glyph (fc_font, wc); - if (!index) - index = PANGO_GET_UNKNOWN_GLYPH ( wc); - return index; -} - - -static void -tibetan_engine_shape (PangoEngineShape *engine G_GNUC_UNUSED, - PangoFont *font, - const char *text, - int length, - const PangoAnalysis *analysis, - PangoGlyphString *glyphs) -{ - PangoFcFont *fc_font; - FT_Face face; - PangoOTRulesetDescription desc; - const PangoOTRuleset *ruleset; - PangoOTBuffer *buffer; - glong n_chars; - gunichar *wcs; - const char *p; - int i; - glong syllable; - TibetanCharClass charClass; - glong cursor = 0; - - g_return_if_fail (font != NULL); - g_return_if_fail (text != NULL); - g_return_if_fail (length >= 0); - g_return_if_fail (analysis != NULL); - - fc_font = PANGO_FC_FONT (font); - face = pango_fc_font_lock_face (fc_font); - if (!face) - return; - - buffer = pango_ot_buffer_new (fc_font); - pango_ot_buffer_set_rtl (buffer, analysis->level % 2 != 0); - - wcs = g_utf8_to_ucs4_fast (text, length, &n_chars); - - p = text; - /* This loop only exits when we reach the end of a run, which may contain - * several syllables. - */ - while (cursor < n_chars) - { - syllable = find_syllable (wcs, cursor, n_chars); - - /* shall we add a dotted circle? - * If in the position in which the base should be (first char in the string) there is - * a character that has the Dotted circle flag (a character that cannot be a base) - * then write a dotted circle - */ - if (get_char_class (wcs[cursor]) & CF_DOTTED_CIRCLE) - { - pango_ot_buffer_add_glyph (buffer, get_index (fc_font, C_DOTTED_CIRCLE), default_p, p - text); - } - - /* If it encounters a digit followed by number pre combining mark, then reorder the two characters - * coeng Ro if they are present - */ - for (i = cursor; i < syllable; i += 1) - { - charClass = get_char_class (wcs[i]); - - if ((charClass & CF_DIGIT ) - && ( get_char_class (wcs[i+1]) & CF_PREDIGIT)) - { - pango_ot_buffer_add_glyph (buffer, get_index (fc_font, C_PRE_NUMBER_MARK), pref_p, p - text); - p = g_utf8_next_char (p); - pango_ot_buffer_add_glyph (buffer, get_index (fc_font, wcs[i]), pref_p, p - text); - i += 1; - } else { - switch (charClass & CF_POS_MASK) - { - case CF_POS_ABOVE : - pango_ot_buffer_add_glyph (buffer, get_index (fc_font, wcs[i]), abvf_p, p - text); - break; - - case CF_POS_AFTER : - pango_ot_buffer_add_glyph (buffer, get_index (fc_font, wcs[i]), pstf_p, p - text); - break; - - case CF_POS_BELOW : - pango_ot_buffer_add_glyph (buffer, get_index (fc_font, wcs[i]), blwf_p, p - text); - break; - - default: - /* default - any other characters */ - pango_ot_buffer_add_glyph (buffer, get_index (fc_font, wcs[i]), default_p, p - text); - break; - } /* switch */ - } - - p = g_utf8_next_char (p); - } /* for */ - - cursor = syllable; /* move the pointer to the start of next syllable */ - } /* while */ - - desc.script = analysis->script; - desc.language = analysis->language; - - desc.n_static_gsub_features = G_N_ELEMENTS (gsub_features); - desc.static_gsub_features = gsub_features; - desc.n_static_gpos_features = G_N_ELEMENTS (gpos_features); - desc.static_gpos_features = gpos_features; - - /* TODO populate other_features from analysis->extra_attrs */ - desc.n_other_features = 0; - desc.other_features = NULL; - - ruleset = pango_ot_ruleset_get_for_description (pango_ot_info_get (face), &desc); - - pango_ot_ruleset_substitute (ruleset, buffer); - pango_ot_ruleset_position (ruleset, buffer); - pango_ot_buffer_output (buffer, glyphs); - - g_free (wcs); - pango_ot_buffer_destroy (buffer); - - pango_fc_font_unlock_face (fc_font); -} - - -static void -tibetan_engine_fc_class_init (PangoEngineShapeClass *class) -{ - class->script_shape = tibetan_engine_shape; -} - -PANGO_ENGINE_SHAPE_DEFINE_TYPE (TibetanEngineFc, tibetan_engine_fc, - tibetan_engine_fc_class_init, NULL) - - -void -PANGO_MODULE_ENTRY(init) (GTypeModule *module) -{ - tibetan_engine_fc_register_type (module); -} - - -void -PANGO_MODULE_ENTRY(exit) (void) -{ -} - - -void -PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines, - int *n_engines) -{ - *engines = script_engines; - *n_engines = G_N_ELEMENTS (script_engines); -} - - -PangoEngine * -PANGO_MODULE_ENTRY(create) (const char *id) -{ - if (!strcmp (id, SCRIPT_ENGINE_NAME)) - return g_object_new (tibetan_engine_fc_type, NULL); - else - return NULL; -} |