diff --git a/CONTRIBUTORS b/CONTRIBUTORS index f6cf706a..082723dd 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2812,3 +2812,5 @@ Dominic Evans Torsten Lang for reporting a problem with newline characters in stream component descriptions of EPG data from BSkyB's "MTV MUSIC" + for suggesting to make BIDI support check at runtime whether the system runs with + UTF-8 diff --git a/HISTORY b/HISTORY index c16f761c..95ab357b 100644 --- a/HISTORY +++ b/HISTORY @@ -6781,7 +6781,7 @@ Video Disk Recorder Revision History - Replaced all calls to sleep() with cCondWait::SleepMs() (thanks to Rolf Ahrenberg). - Fixed a crash with malformed SI data (patch from vdr-portal). -2012-01-11: Version 1.7.23 +2012-01-12: Version 1.7.23 - Removed the '.pl' suffix from svdrpsend.pl (sorry, I missed that one). - Fixed bonding more than two devices. @@ -6818,3 +6818,5 @@ Video Disk Recorder Revision History TS packets, e.g. when switching channels. - Fixed the SVDRP command CLRE for a single channel in case there are events that have a timer (thanks to Timo Eskola). +- BIDI support now checks at runtime whether the system runs with UTF-8 (suggested + by Torsten Lang). diff --git a/font.c b/font.c index 16d1013c..b3913451 100644 --- a/font.c +++ b/font.c @@ -6,7 +6,7 @@ * * BiDi support by Osama Alrawab @2008 Tripoli-Libya. * - * $Id: font.c 2.8 2011/03/28 16:29:51 kls Exp $ + * $Id: font.c 2.9 2012/01/13 09:43:22 kls Exp $ */ #include "font.h" @@ -508,25 +508,27 @@ cString cFont::GetFontFileName(const char *FontName) #ifdef BIDI cString cFont::Bidi(const char *Ltr) { - fribidi_set_mirroring(true); - fribidi_set_reorder_nsm(false); - FriBidiCharSet fribidiCharset = FRIBIDI_CHAR_SET_UTF8; - int LtrLen = strlen(Ltr); - FriBidiCharType Base = FRIBIDI_TYPE_L; - FriBidiChar *Logical = MALLOC(FriBidiChar, LtrLen + 1) ; - int RtlLen = fribidi_charset_to_unicode(fribidiCharset, const_cast(Ltr), LtrLen, Logical); - FriBidiChar *Visual = MALLOC(FriBidiChar, LtrLen + 1) ; - char *Rtl = NULL; - bool ok = fribidi_log2vis(Logical, RtlLen, &Base, Visual, NULL, NULL, NULL); - if (ok) { - fribidi_remove_bidi_marks(Visual, RtlLen, NULL, NULL, NULL); - Rtl = MALLOC(char, RtlLen * 4 + 1); - fribidi_unicode_to_charset(fribidiCharset, Visual, RtlLen, Rtl); + if (cCharSetConv::SystemCharacterTable()) { // bidi requires UTF-8 + fribidi_set_mirroring(true); + fribidi_set_reorder_nsm(false); + FriBidiCharSet fribidiCharset = FRIBIDI_CHAR_SET_UTF8; + int LtrLen = strlen(Ltr); + FriBidiCharType Base = FRIBIDI_TYPE_L; + FriBidiChar *Logical = MALLOC(FriBidiChar, LtrLen + 1) ; + int RtlLen = fribidi_charset_to_unicode(fribidiCharset, const_cast(Ltr), LtrLen, Logical); + FriBidiChar *Visual = MALLOC(FriBidiChar, LtrLen + 1) ; + char *Rtl = NULL; + bool ok = fribidi_log2vis(Logical, RtlLen, &Base, Visual, NULL, NULL, NULL); + if (ok) { + fribidi_remove_bidi_marks(Visual, RtlLen, NULL, NULL, NULL); + Rtl = MALLOC(char, RtlLen * 4 + 1); + fribidi_unicode_to_charset(fribidiCharset, Visual, RtlLen, Rtl); + } + free(Logical); + free(Visual); + if (ok) + return cString(Rtl, true); } - free(Logical); - free(Visual); - if (ok) - return cString(Rtl, true); return cString(Ltr); } #endif