diff options
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/text.c | 35 |
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 }); |