1/* fribidi-mirroring.c - get mirrored character
2 *
3 * Copyright (C) 2004 Sharif FarsiWeb, Inc
4 * Copyright (C) 2001, 2002, 2004 Behdad Esfahbod
5 * Copyright (C) 1999, 2000, 2017 Dov Grobgeld
6 *
7 * This file is part of GNU FriBidi.
8 *
9 * GNU FriBidi is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
13 *
14 * GNU FriBidi is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with GNU FriBidi; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 *
23 * For licensing issues, contact <fribidi.license@gmail.com> or write to
24 * Sharif FarsiWeb, Inc., PO Box 13445-389, Tehran, Iran.
25 *
26 * Author(s):
27 * Behdad Esfahbod, 2001, 2002, 2004
28 * Dov Grobgeld, 1999, 2000
29 */
30
31#include "common.h"
32
33#include <fribidi-mirroring.h>
34
35#include "mirroring.tab.i"
36
37FRIBIDI_ENTRY fribidi_boolean
38fribidi_get_mirror_char (
39 /* input */
40 FriBidiChar ch,
41 /* output */
42 FriBidiChar *mirrored_ch
43)
44{
45 register FriBidiChar result;
46 result = FRIBIDI_GET_MIRRORING (ch);
47 if (mirrored_ch)
48 *mirrored_ch = result;
49 return ch != result ? true : false;
50}
51
52
53FRIBIDI_ENTRY void
54fribidi_shape_mirroring (
55 /* input */
56 const FriBidiLevel *embedding_levels,
57 const FriBidiStrIndex len,
58 /* input and output */
59 FriBidiChar *str
60)
61{
62 register FriBidiStrIndex i;
63
64 DBG ("in fribidi_shape_mirroring");
65
66 if UNLIKELY
67 (len == 0 || !str) return;
68
69 fribidi_assert (embedding_levels);
70
71 /* L4. Mirror all characters that are in odd levels and have mirrors. */
72 for (i = len - 1; i >= 0; i--)
73 if (FRIBIDI_LEVEL_IS_RTL (embedding_levels[i]))
74 {
75 FriBidiChar mirrored_ch;
76
77 if (fribidi_get_mirror_char (ch: str[i], mirrored_ch: &mirrored_ch))
78 str[i] = mirrored_ch;
79 }
80}
81
82/* Editor directions:
83 * Local Variables:
84 * mode: c
85 * c-basic-offset: 2
86 * indent-tabs-mode: t
87 * tab-width: 8
88 * End:
89 * vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8:
90 */
91

source code of gtk/subprojects/fribidi/lib/fribidi-mirroring.c