Mercurial > mplayer.hg
changeset 18717:0f99a5fe9c7f
Support UTF8 in OSD text
author | reimar |
---|---|
date | Thu, 15 Jun 2006 08:05:51 +0000 |
parents | e75ab7767078 |
children | 7ef29a590f3f |
files | libvo/sub.c |
diffstat | 1 files changed, 31 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/sub.c Thu Jun 15 08:04:40 2006 +0000 +++ b/libvo/sub.c Thu Jun 15 08:05:51 2006 +0000 @@ -140,6 +140,35 @@ } } +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 @@ 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 @@ 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],