summaryrefslogtreecommitdiff
path: root/apps/plugins/lrcplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lrcplayer.c')
-rw-r--r--apps/plugins/lrcplayer.c35
1 files changed, 32 insertions, 3 deletions
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)
415 return str; 415 return str;
416} 416}
417 417
418#ifdef HAVE_LCD_BITMAP
419static bool isbrchr(const unsigned char *str, int len)
420{
421 const unsigned char *p = "!,-.:;? 、。!,.:;?―";
422 if (isspace(*str))
423 return true;
424
425 while(*p)
426 {
427 int n = rb->utf8seek(p, 1);
428 if (len == n && !rb->strncmp(p, str, len))
429 return true;
430 p += n;
431 }
432 return false;
433}
434#endif
435
418/* calculate how many lines is needed to display and store it. 436/* calculate how many lines is needed to display and store it.
419 * create cache if there is enough space in lrc_buffer. */ 437 * create cache if there is enough space in lrc_buffer. */
420static struct lrc_brpos *calc_brpos(struct lrc_line *lrc_line, int i) 438static 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)
518 w = 1; 536 w = 1;
519#else 537#else
520 c = ((long)rb->utf8decode(cr.str, &ch) - (long)cr.str); 538 c = ((long)rb->utf8decode(cr.str, &ch) - (long)cr.str);
521 w = rb->font_get_width(pf, ch); 539 if (rb->is_diacritic(ch, NULL))
522 if (cr.count && isspace(*cr.str)) 540 w = 0;
541 else
542 w = rb->font_get_width(pf, ch);
543 if (cr.count && prefs.wrap && isbrchr(cr.str, c))
523 { 544 {
524 /* remember position of last space */ 545 /* remember position of last space */
525 rb->memcpy(&sp, &cr, sizeof(struct snap)); 546 rb->memcpy(&sp, &cr, sizeof(struct snap));
526 sp.word_count = lrc_word->count; 547 sp.word_count = lrc_word->count;
527 sp.word_width = lrc_word->width; 548 sp.word_width = lrc_word->width;
549 if (!isspace(*cr.str) && cr.width+w <= vp_lyrics[i].width)
550 {
551 sp.count += c;
552 sp.width += w;
553 sp.word_count += c;
554 sp.word_width += w;
555 sp.str += c;
556 }
528 } 557 }
529 if (cr.count && cr.width+w > vp_lyrics[i].width) 558 if (cr.count && cr.width+w > vp_lyrics[i].width)
530 { 559 {
531 if (prefs.wrap && sp.str != NULL) /* wrap */ 560 if (sp.str != NULL) /* wrap */
532 { 561 {
533 rb->memcpy(&cr, &sp, sizeof(struct snap)); 562 rb->memcpy(&cr, &sp, sizeof(struct snap));
534 lrc_word = lrc_line->words+cr.nword; 563 lrc_word = lrc_line->words+cr.nword;