From 49192fddd6271a5d7bbbf20b1b2a3bef42f4e8bc Mon Sep 17 00:00:00 2001 From: reimar Date: Thu, 15 Jun 2006 08:05:51 +0000 Subject: [PATCH] Support UTF8 in OSD text git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18720 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libvo/sub.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/libvo/sub.c b/libvo/sub.c index 05b0901516..580bb5831b 100644 --- a/libvo/sub.c +++ b/libvo/sub.c @@ -140,6 +140,35 @@ inline static void vo_draw_text_from_buffer(mp_osd_obj_t* obj,void (*draw_alpha) } } +static unsigned utf8_get_char(char **str) { + uint8_t *strp = (uint8_t *)*str; + unsigned c = *strp++; + unsigned mask = 0x80; + int len = -1; + while (c & mask) { + mask >>= 1; + len++; + } + if (len <= 0 || len > 4) + goto no_utf8; + c &= mask - 1; + while ((*strp & 0xc0) == 0x80) { + if (len-- <= 0) + goto no_utf8; + c = (c << 6) | (*strp++ & 0x3f); + } + if (len) + goto no_utf8; + *str = (char *)strp; + return c; + +no_utf8: + strp = (uint8_t *)*str; + c = *strp++; + *str = (char *)strp; + return c; +} + inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){ unsigned char *cp=vo_osd_text; int x=20; @@ -150,7 +179,7 @@ inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){ obj->bbox.y1=obj->y=10; while (*cp){ - int c=*cp++; + uint16_t c=utf8_get_char(&cp); render_one_glyph(vo_font, c); x+=vo_font->width[c]+vo_font->charspace; h=get_height(c,h); @@ -165,7 +194,7 @@ inline static void vo_update_text_osd(mp_osd_obj_t* obj,int dxs,int dys){ cp=vo_osd_text; x = obj->x; while (*cp){ - int c=*cp++; + uint16_t c=utf8_get_char(&cp); if ((font=vo_font->font[c])>=0) draw_alpha_buf(obj,x,obj->y, vo_font->width[c],