mirror of
https://github.com/mpv-player/mpv
synced 2025-04-11 04:01:31 +00:00
support for hebrew through fribidi in libmenu (geexbox patch #580)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23246 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
7796893de0
commit
0e71ae2f5f
@ -72,6 +72,11 @@ extern int WinID;
|
|||||||
extern int menu_startup;
|
extern int menu_startup;
|
||||||
extern int menu_utf8;
|
extern int menu_utf8;
|
||||||
extern int menu_unicode;
|
extern int menu_unicode;
|
||||||
|
#ifdef USE_FRIBIDI
|
||||||
|
extern char *menu_fribidi_charset;
|
||||||
|
extern int menu_flip_hebrew;
|
||||||
|
extern int menu_fribidi_flip_commas;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_ZR
|
#ifdef HAVE_ZR
|
||||||
@ -295,6 +300,13 @@ m_option_t mplayer_opts[]={
|
|||||||
{"menu-startup", &menu_startup, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL},
|
{"menu-startup", &menu_startup, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL},
|
||||||
{"menu-utf8", &menu_utf8, CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
{"menu-utf8", &menu_utf8, CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
||||||
{"menu-unicode", &menu_unicode, CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
{"menu-unicode", &menu_unicode, CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
||||||
|
#ifdef USE_FRIBIDI
|
||||||
|
{"menu-fribidi-charset", &menu_fribidi_charset, CONF_TYPE_STRING, 0, 0, 0, NULL},
|
||||||
|
{"menu-flip-hebrew", &menu_flip_hebrew, CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
||||||
|
{"menu-noflip-hebrew", &menu_flip_hebrew, CONF_TYPE_FLAG, 0, 1, 0, NULL},
|
||||||
|
{"menu-flip-hebrew-commas", &menu_fribidi_flip_commas, CONF_TYPE_FLAG, 0, 1, 0, NULL},
|
||||||
|
{"menu-noflip-hebrew-commas", &menu_fribidi_flip_commas, CONF_TYPE_FLAG, 0, 0, 1, NULL},
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
{"menu", "OSD menu support was not compiled in.\n", CONF_TYPE_PRINT,0, 0, 0, NULL},
|
{"menu", "OSD menu support was not compiled in.\n", CONF_TYPE_PRINT,0, 0, 0, NULL},
|
||||||
#endif
|
#endif
|
||||||
|
@ -326,6 +326,56 @@ static void render_txt(char *txt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_FRIBIDI
|
||||||
|
#include <fribidi/fribidi.h>
|
||||||
|
static char *menu_fribidi_charset = NULL;
|
||||||
|
static int menu_flip_hebrew = 0;
|
||||||
|
static int menu_fribidi_flip_commas = 0;
|
||||||
|
|
||||||
|
static char *menu_fribidi(char *txt)
|
||||||
|
{
|
||||||
|
static int char_set_num = -1;
|
||||||
|
static FriBidiChar *logical, *visual;
|
||||||
|
static size_t buffer_size = 1024;
|
||||||
|
static char *outputstr;
|
||||||
|
|
||||||
|
FriBidiCharType base;
|
||||||
|
fribidi_boolean log2vis;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (menu_flip_hebrew) {
|
||||||
|
len = strlen(txt);
|
||||||
|
if (char_set_num == -1) {
|
||||||
|
fribidi_set_mirroring (1);
|
||||||
|
fribidi_set_reorder_nsm (0);
|
||||||
|
if (menu_utf8 == 0) {
|
||||||
|
char_set_num = fribidi_parse_charset(menu_fribidi_charset ? menu_fribidi_charset : "ISO8859-8");
|
||||||
|
} else {
|
||||||
|
char_set_num = fribidi_parse_charset("UTF-8");
|
||||||
|
}
|
||||||
|
buffer_size = 1024 > (len+1) ? 1024 : (len+1);
|
||||||
|
logical = (FriBidiChar*) malloc(buffer_size);
|
||||||
|
visual = (FriBidiChar*) malloc(buffer_size);
|
||||||
|
outputstr = (char*) malloc(buffer_size);
|
||||||
|
} else if (len+1 > buffer_size) {
|
||||||
|
buffer_size = len+1;
|
||||||
|
logical = (FriBidiChar*) realloc(logical, buffer_size);
|
||||||
|
visual = (FriBidiChar*) realloc(visual, buffer_size);
|
||||||
|
outputstr = (char*) realloc(outputstr, buffer_size);
|
||||||
|
}
|
||||||
|
len = fribidi_charset_to_unicode (char_set_num, txt, len, logical);
|
||||||
|
base = menu_fribidi_flip_commas?FRIBIDI_TYPE_ON:FRIBIDI_TYPE_L;
|
||||||
|
log2vis = fribidi_log2vis (logical, len, &base, visual, NULL, NULL, NULL);
|
||||||
|
if (log2vis) {
|
||||||
|
len = fribidi_remove_bidi_marks (visual, len, NULL, NULL, NULL);
|
||||||
|
fribidi_unicode_to_charset (char_set_num, visual, len, outputstr);
|
||||||
|
return outputstr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return txt;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void menu_draw_text(mp_image_t* mpi,char* txt, int x, int y) {
|
void menu_draw_text(mp_image_t* mpi,char* txt, int x, int y) {
|
||||||
draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt);
|
draw_alpha_f draw_alpha = get_draw_alpha(mpi->imgfmt);
|
||||||
int font;
|
int font;
|
||||||
@ -335,6 +385,9 @@ void menu_draw_text(mp_image_t* mpi,char* txt, int x, int y) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_FRIBIDI
|
||||||
|
txt = menu_fribidi(txt);
|
||||||
|
#endif
|
||||||
render_txt(txt);
|
render_txt(txt);
|
||||||
|
|
||||||
while (*txt) {
|
while (*txt) {
|
||||||
@ -366,6 +419,9 @@ void menu_draw_text_full(mp_image_t* mpi,char* txt,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_FRIBIDI
|
||||||
|
txt = menu_fribidi(txt);
|
||||||
|
#endif
|
||||||
render_txt(txt);
|
render_txt(txt);
|
||||||
|
|
||||||
if(x > mpi->w || y > mpi->h)
|
if(x > mpi->w || y > mpi->h)
|
||||||
|
Loading…
Reference in New Issue
Block a user