FRIBIDI_ENTRY void fribidi_shape_mirroring ( /* input */ const FriBidiLevel *embedding_levels, const FriBidiStrIndex len, /* input and output */ FriBidiChar *str ) { register FriBidiStrIndex i; DBG ("in fribidi_shape_mirroring"); if UNLIKELY (len == 0 || !str) return; fribidi_assert (embedding_levels); /* L4. Mirror all characters that are in odd levels and have mirrors. */ for (i = len - 1; i >= 0; i--) if (FRIBIDI_LEVEL_IS_RTL (embedding_levels[i])) { FriBidiChar mirrored_ch; if (fribidi_get_mirror_char (str[i], &mirrored_ch)) str[i] = mirrored_ch; } }
static void fribidi_shape_arabic_ligature ( /* input */ const PairMap *table, int size, const FriBidiLevel *embedding_levels, const FriBidiStrIndex len, /* input and output */ FriBidiArabicProp *ar_props, FriBidiChar *str ) { /* TODO: This doesn't form ligatures for even-level Arabic text. * no big problem though. */ register FriBidiStrIndex i; for (i = 0; i < len - 1; i++) { register FriBidiChar c; if (FRIBIDI_LEVEL_IS_RTL(embedding_levels[i]) && embedding_levels[i] == embedding_levels[i+1] && (c = PAIR_MATCH(table, size, str[i], str[i+1]))) { str[i] = FRIBIDI_CHAR_FILL; FRIBIDI_SET_BITS(ar_props[i], FRIBIDI_MASK_LIGATURED); str[i+1] = c; } } }
static hb_direction_t _raqm_hb_dir (raqm_t *rq, FriBidiLevel level) { hb_direction_t dir = HB_DIRECTION_LTR; if (rq->base_dir == RAQM_DIRECTION_TTB) dir = HB_DIRECTION_TTB; else if (FRIBIDI_LEVEL_IS_RTL (level)) dir = HB_DIRECTION_RTL; return dir; }
static void print_joining_types ( /* input */ const FriBidiLevel *embedding_levels, const FriBidiStrIndex len, const FriBidiJoiningType *jtypes ) { register FriBidiStrIndex i; fribidi_assert (jtypes); MSG (" Join. types: "); for (i = 0; i < len; i++) MSG2 ("%c", fribidi_char_from_joining_type (jtypes[i], !FRIBIDI_LEVEL_IS_RTL (embedding_levels[i]))); MSG ("\n"); }