From ddbfffb2173630b16b5ddafaa6449cad8709bf83 Mon Sep 17 00:00:00 2001 From: Teruaki Kawashima Date: Mon, 12 Jul 2010 14:59:16 +0000 Subject: improve displaying of string containing diacritic characters. add some characters to determine the position to break line. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27401 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/lib/simple_viewer.c | 25 ++++++++++++++++++++++--- apps/plugins/lrcplayer.c | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 6 deletions(-) (limited to 'apps') diff --git a/apps/plugins/lib/simple_viewer.c b/apps/plugins/lib/simple_viewer.c index 13fdc32c2f..09144b645b 100644 --- a/apps/plugins/lib/simple_viewer.c +++ b/apps/plugins/lib/simple_viewer.c @@ -39,6 +39,22 @@ struct view_info { int start; /* possition of first line in text */ }; +static bool isbrchr(const unsigned char *str, int len) +{ + const unsigned char *p = "!,-.:;? 、。!,.:;?―"; + if (isspace(*str)) + return true; + + while(*p) + { + int n = rb->utf8seek(p, 1); + if (len == n && !rb->strncmp(p, str, len)) + return true; + p += n; + } + return false; +} + static const char* get_next_line(const char *text, struct view_info *info) { const char *ptr = text; @@ -53,10 +69,13 @@ static const char* get_next_line(const char *text, struct view_info *info) #else unsigned short ch; n = ((long)rb->utf8decode(ptr, &ch) - (long)ptr); - w = rb->font_get_width(info->pf, ch); + if (rb->is_diacritic(ch, NULL)) + w = 0; + else + w = rb->font_get_width(info->pf, ch); #endif - if (isspace(*ptr)) - space = ptr+n; + if (isbrchr(ptr, n)) + space = ptr+(isspace(*ptr) || total + w <= info->vp.width? n: 0); if (*ptr == '\n') { ptr += n; diff --git a/apps/plugins/lrcplayer.c b/apps/plugins/lrcplayer.c index 7cc9f92b52..cf5c07bfc6 100644 --- a/apps/plugins/lrcplayer.c +++ b/apps/plugins/lrcplayer.c @@ -415,6 +415,24 @@ static const char *lrc_skip_space(const char *str) return str; } +#ifdef HAVE_LCD_BITMAP +static bool isbrchr(const unsigned char *str, int len) +{ + const unsigned char *p = "!,-.:;? 、。!,.:;?―"; + if (isspace(*str)) + return true; + + while(*p) + { + int n = rb->utf8seek(p, 1); + if (len == n && !rb->strncmp(p, str, len)) + return true; + p += n; + } + return false; +} +#endif + /* calculate how many lines is needed to display and store it. * create cache if there is enough space in lrc_buffer. */ static struct lrc_brpos *calc_brpos(struct lrc_line *lrc_line, int i) @@ -518,17 +536,28 @@ static struct lrc_brpos *calc_brpos(struct lrc_line *lrc_line, int i) w = 1; #else c = ((long)rb->utf8decode(cr.str, &ch) - (long)cr.str); - w = rb->font_get_width(pf, ch); - if (cr.count && isspace(*cr.str)) + if (rb->is_diacritic(ch, NULL)) + w = 0; + else + w = rb->font_get_width(pf, ch); + if (cr.count && prefs.wrap && isbrchr(cr.str, c)) { /* remember position of last space */ rb->memcpy(&sp, &cr, sizeof(struct snap)); sp.word_count = lrc_word->count; sp.word_width = lrc_word->width; + if (!isspace(*cr.str) && cr.width+w <= vp_lyrics[i].width) + { + sp.count += c; + sp.width += w; + sp.word_count += c; + sp.word_width += w; + sp.str += c; + } } if (cr.count && cr.width+w > vp_lyrics[i].width) { - if (prefs.wrap && sp.str != NULL) /* wrap */ + if (sp.str != NULL) /* wrap */ { rb->memcpy(&cr, &sp, sizeof(struct snap)); lrc_word = lrc_line->words+cr.nword; -- cgit v1.2.3