diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2012-08-16 20:38:31 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2012-08-16 20:38:31 -0400 |
commit | 1fa812d32651004788aa88bd963e6f182df0fefb (patch) | |
tree | 403b4080ce2b1b77705f288422f69042cf14d74d /modules/thai/thai-shaper.c | |
parent | bbab4c1d5cdcbcd08fa783d5a24f249de6dddba5 (diff) | |
download | pango-1fa812d32651004788aa88bd963e6f182df0fefb.tar.gz |
[HB] Remove Thai shaper
Diffstat (limited to 'modules/thai/thai-shaper.c')
-rw-r--r-- | modules/thai/thai-shaper.c | 548 |
1 files changed, 0 insertions, 548 deletions
diff --git a/modules/thai/thai-shaper.c b/modules/thai/thai-shaper.c deleted file mode 100644 index 4ed173c8..00000000 --- a/modules/thai/thai-shaper.c +++ /dev/null @@ -1,548 +0,0 @@ -/* Pango - * thai-shaper.c: - * - * Copyright (C) 1999 Red Hat Software - * Author: Owen Taylor <otaylor@redhat.com> - * - * Copyright (C) 2005 Theppitak Karoonboonyanan - * Copyright (C) 2002 Software and Language Engineering Laboratory, NECTEC - * Author: Theppitak Karoonboonyanan <thep@links.nectec.or.th> - * - * Copyright (c) 1996-2000 by Sun Microsystems, Inc. - * Author: Chookij Vanatham <Chookij.Vanatham@Eng.Sun.COM> - * - * 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. - */ -#include "config.h" -#include <string.h> - -#include <glib.h> -#include "pango-engine.h" -#include "thai-charprop.h" -#include "thai-shaper.h" - -#define MAX_CLUSTER_CHRS 256 -#define MAX_GLYPHS 256 - - -typedef struct { - guchar Start_TONE_AD, Start_AV, Start_BV_BD, Start_TailCutCons; - - guchar ShiftDown_TONE_AD[8]; - guchar ShiftDownLeft_TONE_AD[8]; - guchar ShiftLeft_TONE_AD[8]; - guchar ShiftLeft_AV[7]; - guchar ShiftDown_BV_BD[3]; - guchar TailCutCons[4]; - - guchar AmComp[2]; /* Sara Am components */ -} ThaiShapeTable; - -#define shiftdown_tone_ad(c,tbl) \ - ((tbl)->ShiftDown_TONE_AD[(c)-(tbl)->Start_TONE_AD]) -#define shiftdownleft_tone_ad(c,tbl) \ - ((tbl)->ShiftDownLeft_TONE_AD[(c)-(tbl)->Start_TONE_AD]) -#define shiftleft_tone_ad(c,tbl) \ - ((tbl)->ShiftLeft_TONE_AD[(c)-(tbl)->Start_TONE_AD]) -#define shiftleft_av(c,tbl) \ - ((tbl)->ShiftLeft_AV[(c)-(tbl)->Start_AV]) -#define shiftdown_bv_bd(c,tbl) \ - ((tbl)->ShiftDown_BV_BD[(c)-(tbl)->Start_BV_BD]) -#define tailcutcons(c,tbl) \ - ((tbl)->TailCutCons[(c)-(tbl)->Start_TailCutCons]) - -/* No adjusted vowel/tonemark glyphs (tis620-0) - */ -static const ThaiShapeTable tis620_0_shape_table = { - 0xE7, 0xD1, 0xD8, 0xAD, - { 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE }, - { 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE }, - { 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE }, - { 0xD1, 0x00, 0x00, 0xD4, 0xD5, 0xD6, 0xD7 }, - { 0xD8, 0xD9, 0xDA }, - { 0xAD, 0x00, 0x00, 0xB0 }, - { 0xED, 0xD2 } -}; - -/* Macintosh - */ -static const ThaiShapeTable Mac_shape_table = { - 0xE7, 0xD1, 0xD8, 0xAD, - { 0xE7, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0xED, 0xEE }, - { 0x93, 0x83, 0x84, 0x85, 0x86, 0x87, 0x8F, 0xEE }, - { 0x93, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x8F, 0xEE }, - { 0x92, 0x00, 0x00, 0x94, 0x95, 0x96, 0x97 }, - { 0xFC, 0xFD, 0xFE }, - { 0x90, 0x00, 0x00, 0x80 }, - { 0xED, 0xD2 } -}; - -/* Microsoft Window - */ -static const ThaiShapeTable Win_shape_table = { - 0xE7, 0xD1, 0xD8, 0xAD, - { 0xE7, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0xED, 0xEE }, - { 0x9A, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x99, 0xEE }, - { 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x99, 0xEE }, - { 0x98, 0x00, 0x00, 0x81, 0x82, 0x83, 0x84 }, - { 0xFC, 0xFD, 0xFE }, - { 0x90, 0x00, 0x00, 0x80 }, - { 0xED, 0xD2 } -}; - -static const ThaiShapeTable Lao_shape_table = { - 0x67, 0x51, 0x58, 0x2D, - { 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E }, - { 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E }, - { 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E }, - { 0x51, 0x00, 0x00, 0x54, 0x55, 0x56, 0x57 }, - { 0x58, 0x59, 0x00 }, - { 0x2D, 0x00, 0x00, 0x30 }, - { 0x6D, 0x52 } -}; - -static void -add_glyph (ThaiFontInfo *font_info, - PangoGlyphString *glyphs, - gint cluster_start, - PangoGlyph glyph, - gboolean combining) -{ - PangoRectangle ink_rect, logical_rect; - gint index = glyphs->num_glyphs; - - pango_glyph_string_set_size (glyphs, index + 1); - - glyphs->glyphs[index].glyph = glyph; - glyphs->glyphs[index].attr.is_cluster_start = combining ? 0 : 1; - - glyphs->log_clusters[index] = cluster_start; - - pango_font_get_glyph_extents (font_info->font, - glyphs->glyphs[index].glyph, &ink_rect, &logical_rect); - - if (combining || logical_rect.width > 0) - { - glyphs->glyphs[index].geometry.x_offset = 0; - glyphs->glyphs[index].geometry.width = logical_rect.width; - } - else - { - glyphs->glyphs[index].geometry.x_offset = ink_rect.width; - glyphs->glyphs[index].geometry.width = ink_rect.width; - } - glyphs->glyphs[index].geometry.y_offset = 0; -} - -static PangoGlyph -get_null_base_glyph (ThaiFontInfo *font_info) -{ - return thai_get_glyph_uni (font_info, 0x25cc); -} - -static gint -get_adjusted_glyphs_list (ThaiFontInfo *font_info, - gunichar *cluster, - gint num_chrs, - PangoGlyph *glyph_lists, - const ThaiShapeTable *shaping_table) -{ - switch (num_chrs) - { - case 1: - if (is_char_type (cluster[0], - BelowVowel|BelowDiac|AboveVowel|AboveDiac|Tone|SaraAm)) - { - gint n; - glyph_lists[0] = get_null_base_glyph (font_info); - n = glyph_lists[0] ? 1 : 0; - glyph_lists[n++] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - return n; - } - else - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - return 1; - } - break; - - case 2: - if (is_char_type (cluster[0], NoTailCons|BotTailCons|SpltTailCons) && - is_char_type (cluster[1], SaraAm)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, shaping_table->AmComp[0]); - glyph_lists[2] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]); - return 3; - } - else if (is_char_type (cluster[0], UpTailCons) && - is_char_type (cluster[1], SaraAm)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, - shiftleft_tone_ad (shaping_table->AmComp[0], shaping_table)); - glyph_lists[2] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]); - return 3; - } - else if (is_char_type (cluster[0], NoTailCons|BotTailCons|SpltTailCons) && - is_char_type (cluster[1], AboveVowel)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - return 2; - } - else if (is_char_type (cluster[0], NoTailCons|BotTailCons|SpltTailCons) && - is_char_type (cluster[1], AboveDiac|Tone)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, - shiftdown_tone_ad (ucs2tis (cluster[1]), shaping_table)); - return 2; - } - else if (is_char_type (cluster[0], UpTailCons) && - is_char_type (cluster[1], AboveVowel)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, - shiftleft_av (ucs2tis (cluster[1]), shaping_table)); - return 2; - } - else if (is_char_type (cluster[0], UpTailCons) && - is_char_type (cluster[1], AboveDiac|Tone)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, - shiftdownleft_tone_ad (ucs2tis (cluster[1]), shaping_table)); - return 2; - } - else if (is_char_type (cluster[0], NoTailCons|UpTailCons) && - is_char_type (cluster[1], BelowVowel|BelowDiac)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - return 2; - } - else if (is_char_type (cluster[0], BotTailCons) && - is_char_type (cluster[1], BelowVowel|BelowDiac)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = - thai_make_glyph_tis (font_info, - shiftdown_bv_bd (ucs2tis (cluster[1]), shaping_table)); - return 2; - } - else if (is_char_type (cluster[0], SpltTailCons) && - is_char_type (cluster[1], BelowVowel|BelowDiac)) - { - glyph_lists[0] = thai_make_glyph_tis (font_info, - tailcutcons (ucs2tis (cluster[0]), shaping_table)); - glyph_lists[1] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - return 2; - } - else - { - gint n; - glyph_lists[0] = get_null_base_glyph (font_info); - n = glyph_lists[0] ? 1 : 0; - glyph_lists[n++] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[n++] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - return n; - } - break; - - case 3: - if (is_char_type (cluster[0], NoTailCons|BotTailCons|SpltTailCons) && - is_char_type (cluster[1], Tone) && - is_char_type (cluster[2], SaraAm)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, shaping_table->AmComp[0]); - glyph_lists[2] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - glyph_lists[3] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]); - return 4; - } - else if (is_char_type (cluster[0], UpTailCons) && - is_char_type (cluster[1], Tone) && - is_char_type (cluster[2], SaraAm)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, - shiftleft_tone_ad (shaping_table->AmComp[0], shaping_table)); - glyph_lists[2] = thai_make_glyph_tis (font_info, - shiftleft_tone_ad (ucs2tis (cluster[1]), shaping_table)); - glyph_lists[3] = thai_make_glyph_tis (font_info, shaping_table->AmComp[1]); - return 4; - } - else if (is_char_type (cluster[0], UpTailCons) && - is_char_type (cluster[1], AboveVowel) && - is_char_type (cluster[2], AboveDiac|Tone)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, - shiftleft_av (ucs2tis (cluster[1]), shaping_table)); - glyph_lists[2] = thai_make_glyph_tis (font_info, - shiftleft_tone_ad (ucs2tis (cluster[2]), shaping_table)); - return 3; - } - else if (is_char_type (cluster[0], UpTailCons) && - is_char_type (cluster[1], BelowVowel) && - is_char_type (cluster[2], AboveDiac|Tone)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - glyph_lists[2] = thai_make_glyph_tis (font_info, - shiftdownleft_tone_ad (ucs2tis (cluster[2]), shaping_table)); - return 3; - } - else if (is_char_type (cluster[0], NoTailCons) && - is_char_type (cluster[1], BelowVowel) && - is_char_type (cluster[2], AboveDiac|Tone)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - glyph_lists[2] = - thai_make_glyph_tis (font_info, - shiftdown_tone_ad (ucs2tis (cluster[2]), shaping_table)); - return 3; - } - else if (is_char_type (cluster[0], SpltTailCons) && - is_char_type (cluster[1], BelowVowel) && - is_char_type (cluster[2], AboveDiac|Tone)) - { - glyph_lists[0] = thai_make_glyph_tis (font_info, - tailcutcons (ucs2tis (cluster[0]), shaping_table)); - glyph_lists[1] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - glyph_lists[2] = thai_make_glyph_tis (font_info, - shiftdown_tone_ad (ucs2tis (cluster[2]), shaping_table)); - return 3; - } - else if (is_char_type (cluster[0], BotTailCons) && - is_char_type (cluster[1], BelowVowel) && - is_char_type (cluster[2], AboveDiac|Tone)) - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = thai_make_glyph_tis (font_info, - shiftdown_bv_bd (ucs2tis (cluster[1]), shaping_table)); - glyph_lists[2] = thai_make_glyph_tis (font_info, - shiftdown_tone_ad (ucs2tis (cluster[2]), shaping_table)); - return 3; - } - else - { - glyph_lists[0] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[0])); - glyph_lists[1] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[1])); - glyph_lists[2] = - thai_make_glyph_tis (font_info, ucs2tis (cluster[2])); - return 3; - } - break; - - default: /* e.g. Lao cluster with below cons + upper/lower vowel + tone */ - { - gint i; - for (i = 0; i < num_chrs; i++) - glyph_lists[i] = thai_make_glyph_tis (font_info, ucs2tis (cluster[i])); - return num_chrs; - } - } - - return 0; -} - -static gint -get_glyphs_list (ThaiFontInfo *font_info, - PangoScript script, - gunichar *cluster, - gint num_chrs, - PangoGlyph *glyph_lists) -{ - gint i; - - switch ((int) script) - { - case PANGO_SCRIPT_THAI: - switch (font_info->font_set) - { - default: - case THAI_FONT_NONE: - for (i=0; i < num_chrs; i++) - glyph_lists[i] = thai_make_unknown_glyph (font_info, cluster[i]); - return num_chrs; - - case THAI_FONT_TIS: - /* TIS620-0 + Wtt2.0 Extension - */ - return get_adjusted_glyphs_list (font_info, cluster, - num_chrs, glyph_lists, &tis620_0_shape_table); - - case THAI_FONT_TIS_MAC: - /* MacIntosh Extension - */ - return get_adjusted_glyphs_list (font_info, cluster, - num_chrs, glyph_lists, &Mac_shape_table); - - case THAI_FONT_TIS_WIN: - /* Microsoft Extension - */ - return get_adjusted_glyphs_list (font_info, cluster, - num_chrs, glyph_lists, &Win_shape_table); - } - break; - - case PANGO_SCRIPT_LAO: - return get_adjusted_glyphs_list (font_info, cluster, - num_chrs, glyph_lists, &Lao_shape_table); - - default: - for (i=0; i < num_chrs; i++) - glyph_lists[i] = thai_make_unknown_glyph (font_info, cluster[i]); - return num_chrs; - } - - return 0; /* Quiet GCC */ -} - -static void -add_cluster (ThaiFontInfo *font_info, - PangoScript script, - PangoGlyphString *glyphs, - gint cluster_start, - gunichar *cluster, - gint num_chrs) -{ - PangoGlyph glyphs_list[MAX_GLYPHS]; - gint num_glyphs; - gint i; - - if (isthai (cluster[0])) - { - num_glyphs = get_glyphs_list(font_info, script, cluster, num_chrs, glyphs_list); - for (i=0; i<num_glyphs; i++) - add_glyph (font_info, glyphs, cluster_start, glyphs_list[i], - i == 0 ? FALSE : TRUE); - } - else if (islao (cluster[0])) - { - num_glyphs = get_glyphs_list(font_info, script, cluster, num_chrs, glyphs_list); - for (i=0; i<num_glyphs; i++) - add_glyph (font_info, glyphs, cluster_start, glyphs_list[i], - i == 0 ? FALSE : TRUE); - } - else - { - g_assert (num_chrs == 1); - add_glyph (font_info, glyphs, cluster_start, - thai_make_glyph_uni (font_info, cluster[0]), - FALSE); - } -} - -static gboolean -is_wtt_composible (gunichar cur_wc, gunichar nxt_wc) -{ - switch (TAC_compose_input(cur_wc, nxt_wc)) - { - case 'A': - case 'S': - case 'R': - case 'X': - return FALSE; - - case 'C': - return TRUE; - } - - g_assert_not_reached (); - return FALSE; -} - -static const char * -get_next_cluster(const char *text, - gint length, - gunichar *cluster, - gint *num_chrs) -{ - PangoScript cluster_script = PANGO_SCRIPT_INVALID_CODE, cur_script; - const char *p; - gint n_chars = 0; - gunichar current; - - for (p = text; p < text + length; p = g_utf8_next_char (p)) - { - current = g_utf8_get_char (p); - cur_script = pango_script_for_unichar (current); - if (cluster_script == PANGO_SCRIPT_INVALID_CODE) - cluster_script = cur_script; - if (cur_script != cluster_script || - (n_chars > 0 && - !is_wtt_composible (cluster[n_chars - 1], current))) - break; - cluster[n_chars++] = current; - } - - *num_chrs = n_chars; - return p; -} - -void -thai_set_glyphs (ThaiFontInfo *font_info, - const char *text, - gint length, - PangoScript script, - PangoGlyphString *glyphs) -{ - gint n_chars; - const char *p; - const char *log_cluster; - gunichar cluster[MAX_CLUSTER_CHRS]; - - pango_glyph_string_set_size (glyphs, 0); - - p = text; - while (p < text + length) - { - log_cluster = p; - p = get_next_cluster (p, text + length - p, cluster, &n_chars); - add_cluster (font_info, script, glyphs, log_cluster - text, cluster, n_chars); - } -} |