1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Teruaki Kawashima 2010-07-12 14:59:16 +00:00
parent 8e68e223a4
commit ddbfffb217
2 changed files with 54 additions and 6 deletions

View file

@ -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;

View file

@ -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;