diff options
Diffstat (limited to 'pango/mini-fribidi/fribidi_get_type.c')
-rw-r--r-- | pango/mini-fribidi/fribidi_get_type.c | 114 |
1 files changed, 80 insertions, 34 deletions
diff --git a/pango/mini-fribidi/fribidi_get_type.c b/pango/mini-fribidi/fribidi_get_type.c index 3daad57b..e93643fd 100644 --- a/pango/mini-fribidi/fribidi_get_type.c +++ b/pango/mini-fribidi/fribidi_get_type.c @@ -1,66 +1,113 @@ /* FriBidi - Library of BiDi algorithm - * Copyright (C) 1999 Dov Grobgeld - * - * 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. + * Copyright (C) 1999,2000 Dov Grobgeld, and + * Copyright (C) 2001 Behdad Esfahbod. + * + * This 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. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library, in a file named COPYING.LIB; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact <dov@imagic.weizmann.ac.il> and + * <fwpg@sharif.edu>. */ + #include <stdio.h> #include <stdlib.h> +#include <glib.h> #include "pango/pango-utils.h" #include "fribidi_types.h" #include "fribidi_tables.i" +#ifdef MEM_OPTIMIZED +extern FriBidiCharType prop_to_type[]; +#endif + /*====================================================================== // fribidi_get_type() returns the bidi type of a character. //----------------------------------------------------------------------*/ -FriBidiCharType _pango_fribidi_get_type(FriBidiChar uch) +FriBidiCharType +_pango_fribidi_get_type(FriBidiChar uch) { - guchar *block = FriBidiPropertyBlocks[uch / 256]; + int i = uch % 256, j = uch / 256; + FriBidiPropCharType *block = FriBidiPropertyBlocks[j]; if (block) - return block[uch % 256]; +#ifdef MEM_OPTIMIZED + return prop_to_type[block[i]]; +#else + return block[i]; +#endif else - return 0; + { + switch (j) + { + case 0x05: + if (i >= 0x90) + return FRIBIDI_TYPE_RTL; + else + break; + + case 0xFB: + if (i >= 0x50) + return FRIBIDI_TYPE_AL; + else if (i >= 0x1D) + return FRIBIDI_TYPE_RTL; + else + break; + case 0x06: + case 0xFC: + case 0xFD: + return FRIBIDI_TYPE_AL; + case 0x07: + if (i <= 0xBF) + return FRIBIDI_TYPE_AL; + else + break; + case 0xFE: + if (i >= 0x70) + return FRIBIDI_TYPE_AL; + else + break; + } + return FRIBIDI_TYPE_LTR; + } } -gboolean -pango_get_mirror_char(/* Input */ - gunichar ch, - /* Output */ - gunichar *mirrored_ch) +gboolean pango_get_mirror_char ( /* Input */ + FriBidiChar ch, + /* Output */ + FriBidiChar * mirrored_ch) { int pos, step; gboolean found = FALSE; - pos = step = (nFriBidiMirroredChars/2)+1; + pos = step = (nFriBidiMirroredChars / 2) + 1; - while(step > 1) + while (step > 1) { FriBidiChar cmp_ch = FriBidiMirroredChars[pos].ch; - step = (step+1)/2; - + step = (step + 1) / 2; + if (cmp_ch < ch) { pos += step; - if (pos>nFriBidiMirroredChars-1) - pos = nFriBidiMirroredChars-1; + if (pos > nFriBidiMirroredChars - 1) + pos = nFriBidiMirroredChars - 1; } else if (cmp_ch > ch) { pos -= step; - if (pos<0) - pos=0; + if (pos < 0) + pos = 0; } else break; @@ -72,4 +119,3 @@ pango_get_mirror_char(/* Input */ } return found; } - |