summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/text.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/ui/text.c b/src/ui/text.c
index 94569a6a..7367e6c0 100644
--- a/src/ui/text.c
+++ b/src/ui/text.c
@@ -790,6 +790,7 @@ static void prepare_AttributedText_(iAttributedText *d, int overrideBaseDir, iCh
790 pushBack_Array(&d->logicalToSourceOffset, &(int){ ch - d->source.start }); 790 pushBack_Array(&d->logicalToSourceOffset, &(int){ ch - d->source.start });
791 ch += len; 791 ch += len;
792 } 792 }
793 iBool bidiOk = iFalse;
793#if defined (LAGRANGE_ENABLE_FRIBIDI) 794#if defined (LAGRANGE_ENABLE_FRIBIDI)
794 /* Use FriBidi to reorder the codepoints. */ 795 /* Use FriBidi to reorder the codepoints. */
795 resize_Array(&d->visual, length); 796 resize_Array(&d->visual, length);
@@ -797,25 +798,25 @@ static void prepare_AttributedText_(iAttributedText *d, int overrideBaseDir, iCh
797 resize_Array(&d->visualToLogical, length); 798 resize_Array(&d->visualToLogical, length);
798 d->bidiLevels = length ? malloc(length) : NULL; 799 d->bidiLevels = length ? malloc(length) : NULL;
799 FriBidiParType baseDir = (FriBidiParType) FRIBIDI_TYPE_ON; 800 FriBidiParType baseDir = (FriBidiParType) FRIBIDI_TYPE_ON;
800 /* TODO: If this returns zero (error occurred), act like everything is LTR. */ 801 bidiOk = fribidi_log2vis(constData_Array(&d->logical),
801 fribidi_log2vis(constData_Array(&d->logical), 802 (FriBidiStrIndex) length,
802 length, 803 &baseDir,
803 &baseDir, 804 data_Array(&d->visual),
804 data_Array(&d->visual), 805 data_Array(&d->logicalToVisual),
805 data_Array(&d->logicalToVisual), 806 data_Array(&d->visualToLogical),
806 data_Array(&d->visualToLogical), 807 (FriBidiLevel *) d->bidiLevels) > 0;
807 (FriBidiLevel *) d->bidiLevels);
808 d->isBaseRTL = (overrideBaseDir == 0 ? FRIBIDI_IS_RTL(baseDir) : (overrideBaseDir < 0)); 808 d->isBaseRTL = (overrideBaseDir == 0 ? FRIBIDI_IS_RTL(baseDir) : (overrideBaseDir < 0));
809#else
810 /* 1:1 mapping. */
811 setCopy_Array(&d->visual, &d->logical);
812 resize_Array(&d->logicalToVisual, length);
813 for (size_t i = 0; i < length; i++) {
814 set_Array(&d->logicalToVisual, i, &(int){ i });
815 }
816 setCopy_Array(&d->visualToLogical, &d->logicalToVisual);
817 d->isBaseRTL = iFalse;
818#endif 809#endif
810 if (!bidiOk) {
811 /* 1:1 mapping. */
812 setCopy_Array(&d->visual, &d->logical);
813 resize_Array(&d->logicalToVisual, length);
814 for (size_t i = 0; i < length; i++) {
815 set_Array(&d->logicalToVisual, i, &(int){ i });
816 }
817 setCopy_Array(&d->visualToLogical, &d->logicalToVisual);
818 d->isBaseRTL = iFalse;
819 }
819 } 820 }
820 /* The mapping needs to include the terminating NULL position. */ { 821 /* The mapping needs to include the terminating NULL position. */ {
821 pushBack_Array(&d->logicalToSourceOffset, &(int){ d->source.end - d->source.start }); 822 pushBack_Array(&d->logicalToSourceOffset, &(int){ d->source.end - d->source.start });