From 03cab3cab0ca0a48dc712ffce290a259bc2b49c5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 21 Apr 2008 23:56:37 +0000 Subject: =?UTF-8?q?Bug=20515432=20=E2=80=93=20Add=20function=20to=20get=20?= =?UTF-8?q?bidirectional=20character=20type=20of=20a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-04-21 Behdad Esfahbod Bug 515432 – Add function to get bidirectional character type of a unicode character Patch from Jürg Billeter * docs/pango-sections.txt: * docs/tmpl/layout.sgml: * docs/tmpl/main.sgml: * docs/tmpl/pangocairo.sgml: * pango/Makefile.am: * pango/pango-bidi-type.c (pango_bidi_type_for_unichar): * pango/pango-bidi-type.h: * pango/pango-types.h: * pango/pango-utils.c (pango_log2vis_get_embedding_levels), (pango_unichar_direction): * pango/pango.def: * pango/pango.h: New public API: enum PangoBidiType; pango_bidi_type_get_type() pango_bidi_type_for_unichar() svn path=/trunk/; revision=2607 --- ChangeLog | 24 +++++++++++++ docs/pango-sections.txt | 4 +++ docs/tmpl/layout.sgml | 9 +++++ docs/tmpl/main.sgml | 34 ++++++++++++++++++ docs/tmpl/pangocairo.sgml | 9 +++++ pango/Makefile.am | 2 ++ pango/pango-bidi-type.c | 75 ++++++++++++++++++++++++++++++++++++++++ pango/pango-bidi-type.h | 88 +++++++++++++++++++++++++++++++++++++++++++++++ pango/pango-types.h | 1 + pango/pango-utils.c | 14 ++++---- pango/pango.def | 2 ++ pango/pango.h | 1 + 12 files changed, 257 insertions(+), 6 deletions(-) create mode 100644 pango/pango-bidi-type.c create mode 100644 pango/pango-bidi-type.h diff --git a/ChangeLog b/ChangeLog index fc058ecf..4e89d838 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +2008-04-21 Behdad Esfahbod + + Bug 515432 – Add function to get bidirectional character type of a + unicode character + Patch from Jürg Billeter + + * docs/pango-sections.txt: + * docs/tmpl/layout.sgml: + * docs/tmpl/main.sgml: + * docs/tmpl/pangocairo.sgml: + * pango/Makefile.am: + * pango/pango-bidi-type.c (pango_bidi_type_for_unichar): + * pango/pango-bidi-type.h: + * pango/pango-types.h: + * pango/pango-utils.c (pango_log2vis_get_embedding_levels), + (pango_unichar_direction): + * pango/pango.def: + * pango/pango.h: + New public API: + + enum PangoBidiType; + pango_bidi_type_get_type() + pango_bidi_type_for_unichar() + 2008-04-21 Behdad Esfahbod Bug 517119 – Add pango_cairo_create_context() diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt index 38ee192d..72666c12 100644 --- a/docs/pango-sections.txt +++ b/docs/pango-sections.txt @@ -41,7 +41,10 @@ pango_context_list_families pango_get_mirror_char pango_unichar_direction pango_find_base_dir +PangoBidiType +pango_bidi_type_for_unichar +PANGO_TYPE_BIDI_TYPE PANGO_TYPE_CONTEXT PangoContextClass PANGO_CONTEXT @@ -60,6 +63,7 @@ PangoLogAttr pango_shape +pango_bidi_type_get_type pango_direction_get_type pango_context_get_type pango_item_get_type diff --git a/docs/tmpl/layout.sgml b/docs/tmpl/layout.sgml index afcc6499..c60f9d5a 100644 --- a/docs/tmpl/layout.sgml +++ b/docs/tmpl/layout.sgml @@ -561,6 +561,15 @@ The #GObject type for #PangoAlignment. @height: + + + + + +@layout: +@Returns: + + diff --git a/docs/tmpl/main.sgml b/docs/tmpl/main.sgml index 9ab7f578..221bef43 100644 --- a/docs/tmpl/main.sgml +++ b/docs/tmpl/main.sgml @@ -373,6 +373,40 @@ The #GObject type for #PangoDirection. @Returns: + + + + + +@PANGO_BIDI_TYPE_L: +@PANGO_BIDI_TYPE_LRE: +@PANGO_BIDI_TYPE_LRO: +@PANGO_BIDI_TYPE_R: +@PANGO_BIDI_TYPE_AL: +@PANGO_BIDI_TYPE_RLE: +@PANGO_BIDI_TYPE_RLO: +@PANGO_BIDI_TYPE_PDF: +@PANGO_BIDI_TYPE_EN: +@PANGO_BIDI_TYPE_ES: +@PANGO_BIDI_TYPE_ET: +@PANGO_BIDI_TYPE_AN: +@PANGO_BIDI_TYPE_CS: +@PANGO_BIDI_TYPE_NSM: +@PANGO_BIDI_TYPE_BN: +@PANGO_BIDI_TYPE_B: +@PANGO_BIDI_TYPE_S: +@PANGO_BIDI_TYPE_WS: +@PANGO_BIDI_TYPE_ON: + + + + + + +@ch: +@Returns: + + diff --git a/docs/tmpl/pangocairo.sgml b/docs/tmpl/pangocairo.sgml index 8cfb836b..edc8b526 100644 --- a/docs/tmpl/pangocairo.sgml +++ b/docs/tmpl/pangocairo.sgml @@ -308,6 +308,15 @@ with Pango's Cairo renderer. @Returns: + + + + + +@cr: +@Returns: + + diff --git a/pango/Makefile.am b/pango/Makefile.am index 79b3bae9..e89b1d5b 100644 --- a/pango/Makefile.am +++ b/pango/Makefile.am @@ -66,6 +66,7 @@ libpango_1_0_la_SOURCES = \ glyphstring.c \ modules.c \ pango-attributes.c \ + pango-bidi-type.c \ pango-color.c \ pango-color-table.h \ pango-context.c \ @@ -97,6 +98,7 @@ libpango_1_0_la_SOURCES = \ pango_headers = \ pango.h \ pango-attributes.h \ + pango-bidi-type.h \ pango-break.h \ pango-context.h \ pango-coverage.h \ diff --git a/pango/pango-bidi-type.c b/pango/pango-bidi-type.c new file mode 100644 index 00000000..45d1d936 --- /dev/null +++ b/pango/pango-bidi-type.c @@ -0,0 +1,75 @@ +/* Pango + * pango-bidi-type.c: Bidirectional Character Types + * + * Copyright (C) 2008 Jürg Billeter + * + * 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 + +#include "pango-bidi-type.h" + +#include "mini-fribidi/fribidi.h" + + + +/** + * pango_bidi_type_for_unichar + * @ch: a Unicode character + * + * Determines the normative bidirectional character type of a + * character, as specified in the Unicode Character Database. + * + * A simplified version of this function is available as + * pango_unichar_get_direction(). + * + * Return value: the bidirectional character type, as used in the + * Unicode bidirectional algorithm. + * + * Since: 1.22 + */ +PangoBidiType +pango_bidi_type_for_unichar (gunichar ch) +{ + FriBidiCharType fribidi_ch_type = fribidi_get_type (ch); + + switch (fribidi_ch_type) + { + case FRIBIDI_TYPE_LTR: return PANGO_BIDI_TYPE_L; + case FRIBIDI_TYPE_LRE: return PANGO_BIDI_TYPE_LRE; + case FRIBIDI_TYPE_LRO: return PANGO_BIDI_TYPE_LRO; + case FRIBIDI_TYPE_RTL: return PANGO_BIDI_TYPE_R; + case FRIBIDI_TYPE_AL: return PANGO_BIDI_TYPE_AL; + case FRIBIDI_TYPE_RLE: return PANGO_BIDI_TYPE_RLE; + case FRIBIDI_TYPE_RLO: return PANGO_BIDI_TYPE_RLO; + case FRIBIDI_TYPE_PDF: return PANGO_BIDI_TYPE_PDF; + case FRIBIDI_TYPE_EN: return PANGO_BIDI_TYPE_EN; + case FRIBIDI_TYPE_ES: return PANGO_BIDI_TYPE_ES; + case FRIBIDI_TYPE_ET: return PANGO_BIDI_TYPE_ET; + case FRIBIDI_TYPE_AN: return PANGO_BIDI_TYPE_AN; + case FRIBIDI_TYPE_CS: return PANGO_BIDI_TYPE_CS; + case FRIBIDI_TYPE_NSM: return PANGO_BIDI_TYPE_NSM; + case FRIBIDI_TYPE_BN: return PANGO_BIDI_TYPE_BN; + case FRIBIDI_TYPE_BS: return PANGO_BIDI_TYPE_B; + case FRIBIDI_TYPE_SS: return PANGO_BIDI_TYPE_S; + case FRIBIDI_TYPE_WS: return PANGO_BIDI_TYPE_WS; + case FRIBIDI_TYPE_ON: return PANGO_BIDI_TYPE_ON; + default: + g_assert_not_reached (); + return PANGO_BIDI_TYPE_ON; + } +} diff --git a/pango/pango-bidi-type.h b/pango/pango-bidi-type.h new file mode 100644 index 00000000..a86dd587 --- /dev/null +++ b/pango/pango-bidi-type.h @@ -0,0 +1,88 @@ +/* Pango + * pango-bidi-type.h: Bidirectional Character Types + * + * Copyright (C) 2008 Jürg Billeter + * + * 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. + */ + +#ifndef __PANGO_BIDI_TYPE_H__ +#define __PANGO_BIDI_TYPE_H__ + +#include + +G_BEGIN_DECLS + +/** + * PangoBidiType: + * @PANGO_BIDI_TYPE_L: Left-to-Right + * @PANGO_BIDI_TYPE_LRE: Left-to-Right Embedding + * @PANGO_BIDI_TYPE_LRO: Left-to-Right Override + * @PANGO_BIDI_TYPE_R: Right-to-Left + * @PANGO_BIDI_TYPE_AL: Right-to-Left Arabic + * @PANGO_BIDI_TYPE_RLE: Right-to-Left Embedding + * @PANGO_BIDI_TYPE_RLO: Right-to-Left Override + * @PANGO_BIDI_TYPE_PDF: Pop Directional Format + * @PANGO_BIDI_TYPE_EN: European Number + * @PANGO_BIDI_TYPE_ES: European Number Separator + * @PANGO_BIDI_TYPE_ET: European Number Terminator + * @PANGO_BIDI_TYPE_AN: Arabic Number + * @PANGO_BIDI_TYPE_CS: Common Number Separator + * @PANGO_BIDI_TYPE_NSM: Nonspacing Mark + * @PANGO_BIDI_TYPE_BN: Boundary Neutral + * @PANGO_BIDI_TYPE_B: Paragraph Separator + * @PANGO_BIDI_TYPE_S: Segment Separator + * @PANGO_BIDI_TYPE_WS: Whitespace + * @PANGO_BIDI_TYPE_ON: Other Neutrals + * + * The #PangoBidiType type represents the bidirectional character + * type of a Unicode character as specified by the + * Unicode bidirectional algorithm. + * + * Since: 1.22 + **/ +typedef enum { + /* Strong types */ + PANGO_BIDI_TYPE_L, + PANGO_BIDI_TYPE_LRE, + PANGO_BIDI_TYPE_LRO, + PANGO_BIDI_TYPE_R, + PANGO_BIDI_TYPE_AL, + PANGO_BIDI_TYPE_RLE, + PANGO_BIDI_TYPE_RLO, + + /* Weak types */ + PANGO_BIDI_TYPE_PDF, + PANGO_BIDI_TYPE_EN, + PANGO_BIDI_TYPE_ES, + PANGO_BIDI_TYPE_ET, + PANGO_BIDI_TYPE_AN, + PANGO_BIDI_TYPE_CS, + PANGO_BIDI_TYPE_NSM, + PANGO_BIDI_TYPE_BN, + + /* Neutral types */ + PANGO_BIDI_TYPE_B, + PANGO_BIDI_TYPE_S, + PANGO_BIDI_TYPE_WS, + PANGO_BIDI_TYPE_ON +} PangoBidiType; + +PangoBidiType pango_bidi_type_for_unichar (gunichar ch) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __PANGO_BIDI_TYPE_H__ */ diff --git a/pango/pango-types.h b/pango/pango-types.h index 41d68e98..9b330494 100644 --- a/pango/pango-types.h +++ b/pango/pango-types.h @@ -139,6 +139,7 @@ gboolean pango_get_mirror_char (gunichar ch, #include #include #include +#include G_END_DECLS diff --git a/pango/pango-utils.c b/pango/pango-utils.c index d2e49924..9ade0691 100644 --- a/pango/pango-utils.c +++ b/pango/pango-utils.c @@ -1128,10 +1128,8 @@ pango_log2vis_get_embedding_levels (const gchar *text, case PANGO_DIRECTION_WEAK_RTL: fribidi_base_dir = FRIBIDI_TYPE_WR; break; - /* case PANGO_DIRECTION_WEAK_LTR: case PANGO_DIRECTION_NEUTRAL: - */ default: fribidi_base_dir = FRIBIDI_TYPE_WL; break; @@ -1165,19 +1163,23 @@ pango_log2vis_get_embedding_levels (const gchar *text, * pango_unichar_direction: * @ch: a Unicode character * - * Determines the direction of a character; either + * Determines the inherent direction of a character; either * %PANGO_DIRECTION_LTR, %PANGO_DIRECTION_RTL, or * %PANGO_DIRECTION_NEUTRAL. * - * Return value: the direction of the character, as used in the - * Unicode bidirectional algorithm. + * This function is useful to categorize characters into left-to-right + * letters, right-to-left letters, and everything else. If full + * Unicode bidirectional type of a character is needed, + * pango_bidi_type_for_gunichar() can be used instead. + * + * Return value: the direction of the character. */ PangoDirection pango_unichar_direction (gunichar ch) { FriBidiCharType fribidi_ch_type = fribidi_get_type (ch); - if (!FRIBIDI_IS_LETTER (fribidi_ch_type)) + if (!FRIBIDI_IS_STRONG (fribidi_ch_type)) return PANGO_DIRECTION_NEUTRAL; else if (FRIBIDI_IS_RTL (fribidi_ch_type)) return PANGO_DIRECTION_RTL; diff --git a/pango/pango.def b/pango/pango.def index 0223facf..df844683 100644 --- a/pango/pango.def +++ b/pango/pango.def @@ -48,6 +48,8 @@ EXPORTS pango_attribute_copy pango_attribute_destroy pango_attribute_equal + pango_bidi_type_for_unichar + pango_bidi_type_get_type pango_break pango_color_copy pango_color_free diff --git a/pango/pango.h b/pango/pango.h index 5b5ef1e4..5cc69573 100644 --- a/pango/pango.h +++ b/pango/pango.h @@ -23,6 +23,7 @@ #define __PANGO_H__ #include +#include #include #include #include -- cgit v1.2.1