From ab0beb2ddbc30ac46290f4ecd63e78e9a26f3593 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 19 Sep 2010 12:36:07 +0200 Subject: Added support for languages that are written right-to-left --- CONTRIBUTORS | 4 ++++ HISTORY | 8 +++++--- INSTALL | 11 +++++++++++ Makefile | 7 ++++++- config.h | 10 +++++----- font.c | 41 ++++++++++++++++++++++++++++++++++++++++- font.h | 7 ++++++- i18n.c | 5 ++--- 8 files changed, 79 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 0189b4f4..0d9a1618 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2621,3 +2621,7 @@ Stefan Huskamp Cristiano A. Silva for updating the Portuguese language texts + +Osama Alrawab + for adding support for languages that are written right-to-left + for translating OSD texts to the Arabian language diff --git a/HISTORY b/HISTORY index f81b4849..d170de5e 100644 --- a/HISTORY +++ b/HISTORY @@ -6465,12 +6465,11 @@ Video Disk Recorder Revision History the number keys can be used to enter characters in a text input field (suggested by Stefan Huskamp). -2010-08-29: Version 1.7.16 +2010-09-19: Version 1.7.16 - Updated the Italian OSD texts (thanks to Diego Pierotto). - Added missing Dtypes for ATSC (thanks to Alex Lasnier). -- Updated the Portuguese language texts (thanks to Cristiano A. - Silva). +- Updated the Portuguese language texts (thanks to Cristiano A. Silva). - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). - Fixed the array size of Atypes in cPatFilter::Process() (thanks to Rolf Ahrenberg). @@ -6478,3 +6477,6 @@ Video Disk Recorder Revision History is called from a plugin (reported by Andreas Mair). - Fixed DDS detection for HD resolution subtitles (thanks to Reinhard Nissl). - Fixed following symbolic links in RemoveFileOrDir(). +- Added support for languages that are written right-to-left (based on a patch + from Osama Alrawab). See INSTALL for information on how to turn this on. +- Added Arabian language texts (thanks to Osama Alrawab). diff --git a/INSTALL b/INSTALL index ee4f64a4..e69768a7 100644 --- a/INSTALL +++ b/INSTALL @@ -23,6 +23,7 @@ You will also need to install the following libraries, as well as their fontconfig freetype2 + fribidi (see "BiDi support" below) gettext libcap libjpeg @@ -111,6 +112,16 @@ in English. Note that for VDR's internationalized texts to work, the LANG environment variable must be set to a valid locale! +BiDi support +------------ + +Some languages are written right-to-left. In order to display such languages +correctly, you need to build VDR with BIDI=1. This will link to the "fribidi" +library and implement a function that prepares bidirectional texts to be +displayed correctly. Since BiDi support adds some runtime overhead by requiring +additional memory allocation and copying, this feature is not compiled in +by default, so that users that have no need for this don't get any overhead. + Workaround for providers not encoding their EPG data correctly -------------------------------------------------------------- diff --git a/Makefile b/Makefile index d788484d..26f54ea1 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # See the main source file 'vdr.c' for copyright information and # how to reach the author. # -# $Id: Makefile 2.9 2010/04/10 12:40:15 kls Exp $ +# $Id: Makefile 2.10 2010/09/17 13:28:50 kls Exp $ .DELETE_ON_ERROR: @@ -53,6 +53,11 @@ endif ifdef VDR_USER DEFINES += -DVDR_USER=\"$(VDR_USER)\" endif +ifdef BIDI +INCLUDES += -I/usr/include/fribidi +DEFINES += -DBIDI +LIBS += -lfribidi +endif LIRC_DEVICE ?= /dev/lircd RCU_DEVICE ?= /dev/ttyS1 diff --git a/config.h b/config.h index 7041eb7e..7c28d414 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 2.27 2010/06/06 09:53:02 kls Exp $ + * $Id: config.h 2.28 2010/09/12 11:31:21 kls Exp $ */ #ifndef __CONFIG_H @@ -22,13 +22,13 @@ // VDR's own version number: -#define VDRVERSION "1.7.15" -#define VDRVERSNUM 10715 // Version * 10000 + Major * 100 + Minor +#define VDRVERSION "1.7.16" +#define VDRVERSNUM 10716 // Version * 10000 + Major * 100 + Minor // The plugin API's version number: -#define APIVERSION "1.7.15" -#define APIVERSNUM 10715 // Version * 10000 + Major * 100 + Minor +#define APIVERSION "1.7.16" +#define APIVERSNUM 10716 // Version * 10000 + Major * 100 + Minor // When loading plugins, VDR searches them by their APIVERSION, which // may be smaller than VDRVERSION in case there have been no changes to diff --git a/font.c b/font.c index 515017ba..4ff4017d 100644 --- a/font.c +++ b/font.c @@ -4,12 +4,17 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: font.c 2.4 2009/12/31 14:49:59 kls Exp $ + * BiDi support by Osama Alrawab @2008 Tripoli-Libya. + * + * $Id: font.c 2.5 2010/09/19 11:49:19 kls Exp $ */ #include "font.h" #include #include +#ifdef BIDI +#include +#endif #include #include FT_FREETYPE_H #include "config.h" @@ -240,6 +245,10 @@ int cFreetypeFont::Width(const char *s) const { int w = 0; if (s) { +#ifdef BIDI + cString bs = Bidi(s); + s = bs; +#endif uint prevSym = 0; while (*s) { int sl = Utf8CharLen(s); @@ -259,6 +268,10 @@ int cFreetypeFont::Width(const char *s) const void cFreetypeFont::DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const { if (s && height) { // checking height to make sure we actually have a valid font +#ifdef BIDI + cString bs = Bidi(s); + s = bs; +#endif bool AntiAliased = Setup.AntiAlias && Bitmap->Bpp() >= 8; bool TransparentBackground = ColorBg == clrTransparent; int16_t BlendLevelIndex[MAX_BLEND_LEVELS]; // tIndex is 8 bit unsigned, so a negative value can be used to mark unused entries @@ -443,6 +456,32 @@ cString cFont::GetFontFileName(const char *FontName) return FontFileName; } +#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); + fribidi_unicode_to_charset(fribidiCharset, Visual, RtlLen, Rtl); + } + free(Logical); + free(Visual); + if (ok) + return cString(Rtl, true); + return cString(Ltr); +} +#endif + // --- cTextWrapper ---------------------------------------------------------- cTextWrapper::cTextWrapper(void) diff --git a/font.h b/font.h index 449b429f..cb76671a 100644 --- a/font.h +++ b/font.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: font.h 2.3 2009/12/31 14:48:25 kls Exp $ + * $Id: font.h 2.4 2010/09/19 11:48:37 kls Exp $ */ #ifndef __FONT_H @@ -82,6 +82,11 @@ public: ///< Returns true if any font names were found. static cString GetFontFileName(const char *FontName); ///< Retruns the actual font file name for the given FontName. +#ifdef BIDI + static cString Bidi(const char *Ltr); + ///< Converts any "right-to-left" parts in the "left-to-right" string Ltr + ///< to the proper language specific representation and returns the resulting string. +#endif }; class cTextWrapper { diff --git a/i18n.c b/i18n.c index 98544d2a..d6430340 100644 --- a/i18n.c +++ b/i18n.c @@ -4,9 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 2.1 2008/09/06 12:24:43 kls Exp $ - * - * + * $Id: i18n.c 2.2 2010/09/19 11:22:39 kls Exp $ */ /* @@ -60,6 +58,7 @@ const char *LanguageCodeList[] = { "cze,ces", "tur", "ukr", + "ara", NULL }; -- cgit v1.2.3