mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Added support for languages that are written right-to-left
This commit is contained in:
parent
f1d4e66582
commit
ab0beb2ddb
@ -2621,3 +2621,7 @@ Stefan Huskamp <coca_cola1@gmx.de>
|
|||||||
|
|
||||||
Cristiano A. Silva <arquithek@gmail.com>
|
Cristiano A. Silva <arquithek@gmail.com>
|
||||||
for updating the Portuguese language texts
|
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
|
||||||
|
8
HISTORY
8
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
|
the number keys can be used to enter characters in a text input field (suggested
|
||||||
by Stefan Huskamp).
|
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).
|
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||||
- Added missing Dtypes for ATSC (thanks to Alex Lasnier).
|
- Added missing Dtypes for ATSC (thanks to Alex Lasnier).
|
||||||
- Updated the Portuguese language texts (thanks to Cristiano A.
|
- Updated the Portuguese language texts (thanks to Cristiano A. Silva).
|
||||||
Silva).
|
|
||||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
||||||
- Fixed the array size of Atypes in cPatFilter::Process() (thanks to
|
- Fixed the array size of Atypes in cPatFilter::Process() (thanks to
|
||||||
Rolf Ahrenberg).
|
Rolf Ahrenberg).
|
||||||
@ -6478,3 +6477,6 @@ Video Disk Recorder Revision History
|
|||||||
is called from a plugin (reported by Andreas Mair).
|
is called from a plugin (reported by Andreas Mair).
|
||||||
- Fixed DDS detection for HD resolution subtitles (thanks to Reinhard Nissl).
|
- Fixed DDS detection for HD resolution subtitles (thanks to Reinhard Nissl).
|
||||||
- Fixed following symbolic links in RemoveFileOrDir().
|
- 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).
|
||||||
|
11
INSTALL
11
INSTALL
@ -23,6 +23,7 @@ You will also need to install the following libraries, as well as their
|
|||||||
|
|
||||||
fontconfig
|
fontconfig
|
||||||
freetype2
|
freetype2
|
||||||
|
fribidi (see "BiDi support" below)
|
||||||
gettext
|
gettext
|
||||||
libcap
|
libcap
|
||||||
libjpeg
|
libjpeg
|
||||||
@ -111,6 +112,16 @@ in English.
|
|||||||
Note that for VDR's internationalized texts to work, the LANG environment
|
Note that for VDR's internationalized texts to work, the LANG environment
|
||||||
variable must be set to a valid locale!
|
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
|
Workaround for providers not encoding their EPG data correctly
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
|
|
||||||
|
7
Makefile
7
Makefile
@ -4,7 +4,7 @@
|
|||||||
# See the main source file 'vdr.c' for copyright information and
|
# See the main source file 'vdr.c' for copyright information and
|
||||||
# how to reach the author.
|
# 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:
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
@ -53,6 +53,11 @@ endif
|
|||||||
ifdef VDR_USER
|
ifdef VDR_USER
|
||||||
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
DEFINES += -DVDR_USER=\"$(VDR_USER)\"
|
||||||
endif
|
endif
|
||||||
|
ifdef BIDI
|
||||||
|
INCLUDES += -I/usr/include/fribidi
|
||||||
|
DEFINES += -DBIDI
|
||||||
|
LIBS += -lfribidi
|
||||||
|
endif
|
||||||
|
|
||||||
LIRC_DEVICE ?= /dev/lircd
|
LIRC_DEVICE ?= /dev/lircd
|
||||||
RCU_DEVICE ?= /dev/ttyS1
|
RCU_DEVICE ?= /dev/ttyS1
|
||||||
|
10
config.h
10
config.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __CONFIG_H
|
||||||
@ -22,13 +22,13 @@
|
|||||||
|
|
||||||
// VDR's own version number:
|
// VDR's own version number:
|
||||||
|
|
||||||
#define VDRVERSION "1.7.15"
|
#define VDRVERSION "1.7.16"
|
||||||
#define VDRVERSNUM 10715 // Version * 10000 + Major * 100 + Minor
|
#define VDRVERSNUM 10716 // Version * 10000 + Major * 100 + Minor
|
||||||
|
|
||||||
// The plugin API's version number:
|
// The plugin API's version number:
|
||||||
|
|
||||||
#define APIVERSION "1.7.15"
|
#define APIVERSION "1.7.16"
|
||||||
#define APIVERSNUM 10715 // Version * 10000 + Major * 100 + Minor
|
#define APIVERSNUM 10716 // Version * 10000 + Major * 100 + Minor
|
||||||
|
|
||||||
// When loading plugins, VDR searches them by their APIVERSION, which
|
// When loading plugins, VDR searches them by their APIVERSION, which
|
||||||
// may be smaller than VDRVERSION in case there have been no changes to
|
// may be smaller than VDRVERSION in case there have been no changes to
|
||||||
|
41
font.c
41
font.c
@ -4,12 +4,17 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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 "font.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <fontconfig/fontconfig.h>
|
#include <fontconfig/fontconfig.h>
|
||||||
|
#ifdef BIDI
|
||||||
|
#include <fribidi.h>
|
||||||
|
#endif
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@ -240,6 +245,10 @@ int cFreetypeFont::Width(const char *s) const
|
|||||||
{
|
{
|
||||||
int w = 0;
|
int w = 0;
|
||||||
if (s) {
|
if (s) {
|
||||||
|
#ifdef BIDI
|
||||||
|
cString bs = Bidi(s);
|
||||||
|
s = bs;
|
||||||
|
#endif
|
||||||
uint prevSym = 0;
|
uint prevSym = 0;
|
||||||
while (*s) {
|
while (*s) {
|
||||||
int sl = Utf8CharLen(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
|
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
|
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 AntiAliased = Setup.AntiAlias && Bitmap->Bpp() >= 8;
|
||||||
bool TransparentBackground = ColorBg == clrTransparent;
|
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
|
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;
|
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::cTextWrapper(void)
|
cTextWrapper::cTextWrapper(void)
|
||||||
|
7
font.h
7
font.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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
|
#ifndef __FONT_H
|
||||||
@ -82,6 +82,11 @@ public:
|
|||||||
///< Returns true if any font names were found.
|
///< Returns true if any font names were found.
|
||||||
static cString GetFontFileName(const char *FontName);
|
static cString GetFontFileName(const char *FontName);
|
||||||
///< Retruns the actual font file name for the given 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 {
|
class cTextWrapper {
|
||||||
|
5
i18n.c
5
i18n.c
@ -4,9 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* 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",
|
"cze,ces",
|
||||||
"tur",
|
"tur",
|
||||||
"ukr",
|
"ukr",
|
||||||
|
"ara",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user