From 7507a19bf65a18511ffa3cbe89a73876afcef6b5 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Tue, 11 Jul 2000 13:25:15 +0000 Subject: [PATCH] Patch for arabic from Dekel git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/lyx-1_1_5@875 a592a061-630c-0410-9148-cb99ea01b6c8 --- ChangeLog | 8 ++ src/lyxtext.h | 4 +- src/text.C | 204 +++++++++++++++++++++++++++++++------------------- 3 files changed, 137 insertions(+), 79 deletions(-) diff --git a/ChangeLog b/ChangeLog index c6aaca8d25..e20b2c36de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2000-07-01 Dekel Tsur + + * src/text.C (TransformChar): Changed to work correctly with + Arabic points. + (draw): Added support for drawing Arabic points. + (draw): Removed code for drawing underbars (this is done by + the Painter!) + 2000-07-10 Jean-Marc Lasgouttes * configure.in: use -isystem instead of -I for X headers. This diff --git a/src/lyxtext.h b/src/lyxtext.h index 21b2adab07..f8512dfd22 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -45,9 +45,9 @@ public: enum Letter_Form { FORM_ISOLATED, + FORM_FINAL, FORM_INITIAL, - FORM_MEDIAL, - FORM_FINAL + FORM_MEDIAL }; /// Constructor diff --git a/src/text.C b/src/text.C index ecc2b9b15e..32bad706af 100644 --- a/src/text.C +++ b/src/text.C @@ -45,83 +45,105 @@ static const int LYX_PAPER_MARGIN = 20; // ale070405 extern int bibitemMaxWidth(Painter &, LyXFont const &); -static int iso885968x[] = { - 0xbc, // 0xa8 = fathatan - 0xbd, // 0xa9 = dammatan - 0xbe, // 0xaa = kasratan - 0xdb, // 0xab = fatha - 0xdc, // 0xac = damma - 0xdd, // 0xad = kasra - 0xde, // 0xae = shadda - 0xdf, // 0xaf = sukun +unsigned char const arabic_start = 0xc1; - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xb0-0xbf +unsigned char arabic_table[63][2] = { + {0xc1, 0xc1}, // 0xc1 = hamza + {0xc2, 0xc2}, // 0xc2 = ligature madda on alef + {0xc3, 0xc3}, // 0xc3 = ligature hamza on alef + {0xc4, 0xc4}, // 0xc4 = ligature hamza on waw + {0xc5, 0xc5}, // 0xc5 = ligature hamza under alef + {0xc6, 0xc0}, // 0xc6 = ligature hamza on ya + {0xc7, 0xc7}, // 0xc7 = alef + {0xc8, 0xeb}, // 0xc8 = baa + {0xc9, 0xc9}, // 0xc9 = taa marbuta + {0xca, 0xec}, // 0xca = taa + {0xcb, 0xed}, // 0xcb = thaa + {0xcc, 0xee}, // 0xcc = jeem + {0xcd, 0xef}, // 0xcd = haa + {0xce, 0xf0}, // 0xce = khaa + {0xcf, 0xcf}, // 0xcf = dal - 0, // 0xc0 - 0xc1, // 0xc1 = hamza - 0xc2, // 0xc2 = ligature madda - 0xc3, // 0xc3 = ligature hamza on alef - 0xc4, // 0xc4 = ligature hamza on waw - 0xc5, // 0xc5 = ligature hamza under alef - 0xc0, // 0xc6 = ligature hamza on ya - 0xc7, // 0xc7 = alef - 0xeb, // 0xc8 = baa - 0xc9, // 0xc9 = taa marbuta - 0xec, // 0xca = taa - 0xed, // 0xcb = thaa - 0xee, // 0xcc = jeem - 0xef, // 0xcd = haa - 0xf0, // 0xce = khaa - 0xcf, // 0xcf = dal + {0xd0, 0xd0}, // 0xd0 = thal + {0xd1, 0xd1}, // 0xd1 = ra + {0xd2, 0xd2}, // 0xd2 = zain + {0xd3, 0xf1}, // 0xd3 = seen + {0xd4, 0xf2}, // 0xd4 = sheen + {0xd5, 0xf3}, // 0xd5 = sad + {0xd6, 0xf4}, // 0xd6 = dad + {0xd7, 0xd7}, // 0xd7 = tah + {0xd8, 0xd8}, // 0xd8 = zah + {0xd9, 0xf5}, // 0xd9 = ain + {0xda, 0xf6}, // 0xda = ghain + {0,0}, // 0xdb + {0,0}, // 0xdc + {0,0}, // 0xdd + {0,0}, // 0xde + {0,0}, // 0xdf - 0xd0, // 0xd0 = thal - 0xd1, // 0xd1 = ra - 0xd2, // 0xd2 = zain - 0xf1, // 0xd3 = seen - 0xf2, // 0xd4 = sheen - 0xf3, // 0xd5 = sad - 0xf4, // 0xd6 = dad - 0xd7, // 0xd7 = tah - 0xd8, // 0xd8 = zah - 0xf5, // 0xd9 = ain - 0xf6, // 0xda = ghain - 0,0,0,0,0, // 0xdb- 0xdf + {0,0}, // 0xe0 + {0xe1, 0xf7}, // 0xe1 = fa + {0xe2, 0xf8}, // 0xe2 = qaf + {0xe3, 0xf9}, // 0xe3 = kaf + {0xe4, 0xfa}, // 0xe4 = lam + {0xe5, 0xfb}, // 0xe5 = meem + {0xe6, 0xfc}, // 0xe6 = noon + {0xe7, 0xfd}, // 0xe7 = ha + {0xe8, 0xe8}, // 0xe8 = waw + {0xe9, 0xe9}, // 0xe9 = alef maksura + {0xea, 0xfe}, // 0xea = ya + {0xa8, 0xa8}, // 0xeb = fathatan + {0xa9, 0xa9}, // 0xec = dammatan + {0xaa, 0xaa}, // 0xed = kasratan + {0xab, 0xab}, // 0xee = fatha + {0xac, 0xac}, // 0xef = damma - 0, // 0xe0 - 0xf7, // 0xe1 = fa - 0xf8, // 0xe2 = qaf - 0xf9, // 0xe3 = kaf - 0xfa, // 0xe4 = lam - 0xfb, // 0xe5 = meem - 0xfc, // 0xe6 = noon - 0xfd, // 0xe7 = ha - 0xe8, // 0xe8 = waw - 0xe9, // 0xe9 = alef maksura - 0xfe // 0xea = ya + {0xad, 0xad}, // 0xf0 = kasra + {0xae, 0xae}, // 0xf1 = shadda + {0xaf, 0xaf}, // 0xf2 = sukun + {0,0}, // 0xf3 + {0,0}, // 0xf4 + {0,0}, // 0xf5 + {0,0}, // 0xf6 + {0,0}, // 0xf7 + {0,0}, // 0xf8 + {0,0}, // 0xf9 + {0,0}, // 0xfa + {0,0}, // 0xfb + {0,0}, // 0xfc + {0,0}, // 0xfd + {0,0}, // 0xfe + {0,0} // 0xff }; - inline bool is_arabic(unsigned char c) { - return 0xa8 <= c && c <= 0xea && iso885968x[c-0xa8]; + return c >= arabic_start && arabic_table[c-arabic_start][0]; } inline bool is_nikud(unsigned char c) { - return 192 <= c && c <= 210; + return 192 <= c && c <= 210 && + c != 0xce && c != 0xd0; +} + + +inline +bool IsComposeChar_arabic(unsigned char c) +{ + return c >= 0xeb && c <= 0xf2; } unsigned char LyXText::TransformChar(unsigned char c, Letter_Form form) const { - if (is_arabic(c) && - (form == FORM_INITIAL || form == FORM_MEDIAL) ) - return iso885968x[c-0xa8]; - else + if (!is_arabic(c)) return c; + else + return arabic_table[c-arabic_start][form >> 1]; } @@ -134,14 +156,22 @@ unsigned char LyXText::TransformChar(unsigned char c, LyXParagraph * par, else return c; - bool not_first = (pos > 0 && is_arabic(par->GetChar(pos-1))); - if (pos < par->Last()-1 && is_arabic(par->GetChar(pos+1))) - if (not_first) + + unsigned char prev_char = pos > 0 ? par->GetChar(pos-1) : ' '; + unsigned char next_char = ' '; + for (LyXParagraph::size_type i = pos+1; i < par->Last(); ++i) + if (!IsComposeChar_arabic(par->GetChar(i))) { + next_char = par->GetChar(i); + break; + } + + if (is_arabic(next_char)) + if (is_arabic(prev_char)) return TransformChar(c,FORM_MEDIAL); else return TransformChar(c,FORM_INITIAL); else - if (not_first) + if (is_arabic(prev_char)) return TransformChar(c,FORM_FINAL); else return TransformChar(c,FORM_ISOLATED); @@ -190,7 +220,10 @@ int LyXText::SingleWidth(LyXParagraph * par, if (font.language()->RightToLeft) { if (font.language()->lang == "arabic" && lyxrc.font_norm == "iso8859-6.8x") - c = TransformChar(c, par, pos); + if (IsComposeChar_arabic(c)) + return 0; + else + c = TransformChar(c, par, pos); else if (font.language()->lang == "hebrew" && is_nikud(c)) return 0; @@ -611,18 +644,40 @@ void LyXText::draw(Row const * row, } } else if (font.language()->lang == "arabic" && lyxrc.font_norm == "iso8859-6.8x") { - textstring = TransformChar(c, row->par, pos); - while (vpos <= last && - (pos = vis2log(vpos)) >= 0 - && static_cast(c = row->par->GetChar(pos)) > ' ' - && font2 == GetFont(row->par, pos)) { + if (IsComposeChar_arabic(c)) { c = TransformChar(c, row->par, pos); - textstring += c; - ++vpos; + textstring = c; + int width = lyxfont::width(c, font2); + int dx = 0; + for (LyXParagraph::size_type i = pos-1; i >= 0; --i) { + c = row->par->GetChar(i); + if (!IsComposeChar_arabic(c)) { + if (static_cast(c) > ' ') { + int width2 = SingleWidth(row->par, i, c); + dx = (width2 - width) / 2; + } + break; + } + } + // Draw nikud + pain.text(int(x) + dx, offset + row->baseline, + textstring, font); + } else { + textstring = TransformChar(c, row->par, pos); + while (vpos <= last && + (pos = vis2log(vpos)) >= 0 + && static_cast(c = row->par->GetChar(pos)) > ' ' + && !IsComposeChar_arabic(c) + && font2 == GetFont(row->par, pos)) { + c = TransformChar(c, row->par, pos); + textstring += c; + ++vpos; + } + // Draw text and set the new x position + pain.text(int(x), offset + row->baseline, + textstring, font); + x += lyxfont::width(textstring, font); } - // Draw text and set the new x position - pain.text(int(x), offset + row->baseline, textstring, font); - x += lyxfont::width(textstring, font); } else { while (vpos <= last && (pos = vis2log(vpos)) >= 0 @@ -636,12 +691,7 @@ void LyXText::draw(Row const * row, x += lyxfont::width(textstring, font); } - // what about underbars? - if (font.underbar() == LyXFont::ON && font.latex() != LyXFont::ON) { - pain.line(int(tmpx), offset + row->baseline + 2, - int(x), offset + row->baseline + 2); - - } else if (lyxrc.mark_foreign_language && + if (lyxrc.mark_foreign_language && font.language() != buffer->params.language_info) { int y = offset + row->height - 1; pain.line(int(tmpx), y, int(x), y,