summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS4
-rw-r--r--HISTORY8
-rw-r--r--INSTALL11
-rw-r--r--Makefile7
-rw-r--r--config.h10
-rw-r--r--font.c41
-rw-r--r--font.h7
-rw-r--r--i18n.c5
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 <coca_cola1@gmx.de>
Cristiano A. Silva <arquithek@gmail.com>
for updating the Portuguese language texts
+
+Osama Alrawab <alrawab@hotmail.com>
+ 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 <alrawab@hotmail.com> @2008 Tripoli-Libya.
+ *
+ * $Id: font.c 2.5 2010/09/19 11:49:19 kls Exp $
*/
#include "font.h"
#include <ctype.h>
#include <fontconfig/fontconfig.h>
+#ifdef BIDI
+#include <fribidi.h>
+#endif
#include <ft2build.h>
#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<char *>(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
};