From 97b3fbb87209e9f7fe1cd2f65ae42747f0b33678 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Tue, 16 Mar 2010 10:55:06 +0100 Subject: [PATCH] Handle initial position in bidi --- gfxmenu/font.c | 3 ++- include/grub/unicode.h | 3 ++- normal/charset.c | 14 +++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/gfxmenu/font.c b/gfxmenu/font.c index 9209cbaa5..0c973620a 100644 --- a/gfxmenu/font.c +++ b/gfxmenu/font.c @@ -50,7 +50,8 @@ grub_font_draw_string (const char *str, grub_font_t font, if (logical_len < 0) return grub_errno; - visual_len = grub_bidi_logical_to_visual (logical, logical_len, &visual, 0, 0); + visual_len = grub_bidi_logical_to_visual (logical, logical_len, &visual, + 0, 0, 0); grub_free (logical); if (visual_len < 0) return grub_errno; diff --git a/include/grub/unicode.h b/include/grub/unicode.h index 733bb0279..e7f176d0f 100644 --- a/include/grub/unicode.h +++ b/include/grub/unicode.h @@ -104,7 +104,8 @@ grub_bidi_logical_to_visual (const grub_uint32_t *logical, grub_size_t logical_len, struct grub_unicode_glyph **visual_out, grub_ssize_t (*getcharwidth) (const struct grub_unicode_glyph *visual), - grub_size_t max_length); + grub_size_t max_width, + grub_size_t start_width); enum grub_comb_type grub_unicode_get_comb_type (grub_uint32_t c); diff --git a/normal/charset.c b/normal/charset.c index ddedeaa61..98d89ff4e 100644 --- a/normal/charset.c +++ b/normal/charset.c @@ -548,7 +548,7 @@ grub_bidi_line_logical_to_visual (const grub_uint32_t *logical, grub_size_t logical_len, struct grub_unicode_glyph *visual_out, grub_ssize_t (*getcharwidth) (const struct grub_unicode_glyph *visual), - grub_size_t maxwidth) + grub_size_t maxwidth, grub_size_t startwidth) { enum grub_bidi_type type = GRUB_BIDI_TYPE_L; enum override_status {OVERRIDE_NEUTRAL = 0, OVERRIDE_R, OVERRIDE_L}; @@ -861,7 +861,7 @@ grub_bidi_line_logical_to_visual (const grub_uint32_t *logical, { struct grub_unicode_glyph *outptr = visual_out; unsigned line_start = 0; - grub_ssize_t line_width = 0; + grub_ssize_t line_width = startwidth; unsigned k; for (k = 0; k <= visual_len; k++) @@ -925,7 +925,7 @@ grub_bidi_logical_to_visual (const grub_uint32_t *logical, grub_size_t logical_len, struct grub_unicode_glyph **visual_out, grub_ssize_t (*getcharwidth) (const struct grub_unicode_glyph *visual), - grub_size_t max_length) + grub_size_t max_length, grub_size_t startwidth) { const grub_uint32_t *line_start = logical, *ptr; struct grub_unicode_glyph *visual_ptr; @@ -940,7 +940,10 @@ grub_bidi_logical_to_visual (const grub_uint32_t *logical, ptr - line_start, visual_ptr, getcharwidth, - max_length); + max_length, + startwidth); + startwidth = 0; + if (ret < 0) { grub_free (*visual_out); @@ -1095,7 +1098,8 @@ grub_print_ucs4 (const grub_uint32_t * str, last_position - str, &visual, term->getcharwidth, - grub_term_width (term)); + grub_term_width (term), + (term->getxy () >> 8) & 0xff); if (visual_len < 0) { grub_print_error ();