From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1US1on-0001MP-0J for mharc-grub-devel@gnu.org; Tue, 16 Apr 2013 05:04:49 -0400 Received: from eggs.gnu.org ([208.118.235.92]:38557) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1US1of-0001Lv-Mr for grub-devel@gnu.org; Tue, 16 Apr 2013 05:04:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1US1oa-0002V9-Aw for grub-devel@gnu.org; Tue, 16 Apr 2013 05:04:41 -0400 Received: from collab.rosalab.ru ([217.199.216.181]:56161) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1US1oZ-0002Ur-9h for grub-devel@gnu.org; Tue, 16 Apr 2013 05:04:36 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by collab.rosalab.ru (Postfix) with ESMTP id 5DAF429C332 for ; Tue, 16 Apr 2013 13:04:32 +0400 (MSK) X-Virus-Scanned: amavisd-new at rosalab.ru Received: from collab.rosalab.ru ([127.0.0.1]) by localhost (collab.rosalab.ru [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nXN0B2qLJCYz for ; Tue, 16 Apr 2013 13:04:31 +0400 (MSK) Received: from icedphoenix.localnet (unknown [10.168.1.56]) by collab.rosalab.ru (Postfix) with ESMTPSA id 1E88129C331 for ; Tue, 16 Apr 2013 13:04:31 +0400 (MSK) From: Vladimir Testov To: grub-devel@gnu.org Subject: Re: [PATCH] multistring support in gui_label Date: Tue, 16 Apr 2013 13:04:28 +0400 Message-ID: <1720724.fd4NVO69U8@icedphoenix> User-Agent: KMail/4.9.5 (Linux/3.5.0-26-generic; KDE/4.9.5; x86_64; ; ) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart7591817.fsc5ejFdyj" Content-Transfer-Encoding: 7Bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 217.199.216.181 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Apr 2013 09:04:47 -0000 This is a multi-part message in MIME format. --nextPart7591817.fsc5ejFdyj Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" >Please don't use // comments. O.k. I won't. >This code completely forgets the cases >when even the first word doesn't fit in the available space. Mmm. It can handle this case actually. >The code as whole breaks some unicode concepts like e.g. bidi stack. Didn't get what you mean. >Could you reuse the already available line-vreaking algorithm in >normal/term.c and normal/charset.c ? Since the line-breaking is >artificially disabled for labels it should require only minor >adjustments to be reenabled. Yep! Here it is (patch included)! Nevertheless, two problems appeared and I don't sure how exactly should I fix them. 1) Handling of some long word. If this word is not first in line and it's length is more than label's width then the length of the first fragment of the word will be counted as if it will be drawn on the same line, but actually it will be printed on the next line. 2) There is funny handling of UTF-8 symbols. Each symbol have "device_width" parameter, which is used in calculation of string's length. But, when we are going to actually print a symbol, it's length (with spaces) is calculated in other way. First, all symbols that have special connection with current symbol are looked through. Then device_width is replaced with maximum of printed lengths in all cases. So, for some special symbols (eg "`", used in @KEYMAP_LONG@) actual length will be more than pre-counted. How should I fix these problems? 1st one - for example, I can slightly update line-breaking mechanism. 2nd one - more interesting, harder. I suggest utf-8 printing mechanism (charset.c unicode.c etc) should be remade. So symbol connections will be counted in more intelligent way (e.g. while counting spaces - take into consideration nearby symbols). It is interesting. :) I can do it. Would be happy, if someone could give me some advices. Problem2.png text = "@KEYMAP_LONG@" t is misprinted Problem1.png text = "short short short HereWeHaveSomeVeryLongWordSoItCannotBePrintedEntirelyOnOneLine" See how the line-breaking works. -- With best regards, _______________________________ Vladimir Testov, ROSA Laboratory. www.rosalab.ru --nextPart7591817.fsc5ejFdyj Content-Disposition: attachment; filename="Problem1.png" Content-Transfer-Encoding: base64 Content-Type: image/png; name="Problem1.png" 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 --nextPart7591817.fsc5ejFdyj Content-Disposition: attachment; filename="problem2.png" Content-Transfer-Encoding: base64 Content-Type: image/png; name="problem2.png" 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 --nextPart7591817.fsc5ejFdyj Content-Disposition: attachment; filename="grub-2.00-label-multistring.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="grub-2.00-label-multistring.patch" diff -Naur grub-2.00/grub-core/gfxmenu/font.c grub-new/grub-core/gfxmenu/font.c --- grub-2.00/grub-core/gfxmenu/font.c 2012-03-27 18:29:43.000000000 +0400 +++ grub-new/grub-core/gfxmenu/font.c 2013-04-15 09:55:26.978883414 +0400 @@ -75,6 +75,94 @@ return GRUB_ERR_NONE; } +/* Differs from grub_font_draw_line only in multiline output */ +grub_err_t +grub_font_draw_multiline (const char *str, grub_font_t font, + grub_video_color_t color, + int baseline_y, int font_height, + int max_width, int max_height, + int align) +{ + int x; + struct grub_font_glyph *glyph; + grub_uint32_t *logical; + grub_ssize_t logical_len, visual_len; + struct grub_unicode_glyph *visual, *ptr, *pos; + + grub_err_t print_line () + { + while (pos != ptr) + { + grub_err_t err; + glyph = grub_font_construct_glyph (font, pos); + if (!glyph) + return grub_errno; + err = grub_font_draw_glyph (glyph, color, x, baseline_y); + x += glyph->device_width; + grub_free (glyph); + if (err) + return err; + pos ++; + } + + return GRUB_ERR_NONE; + } + + logical_len = grub_utf8_to_ucs4_alloc (str, &logical, 0); + if (logical_len < 0) + return grub_errno; + + auto grub_ssize_t getcharwidth (const struct grub_unicode_glyph *c); + grub_ssize_t getcharwidth (const struct grub_unicode_glyph *c) + { + return grub_font_get_constructed_device_width (font, c); + } + + visual_len = grub_bidi_logical_to_visual (logical, logical_len, &visual, + getcharwidth, max_width, 0); + grub_free (logical); + if (visual_len < 0) + return grub_errno; + + pos = visual; + for (ptr = visual, x = 0; ptr <= visual + visual_len; ptr++) + { + if (baseline_y > max_height) + break; + if (ptr->base == '\n' || ptr == visual + visual_len) + { + int left_x; + if (align == 1) + left_x = (max_width - x) / 2; + else if (align == 2) + left_x = max_width - x; + else + left_x = 0; + + x = left_x; + + grub_err_t err; + err = print_line(); + if (err != GRUB_ERR_NONE) + return err; + + baseline_y += font_height; + x = 0; + while ((ptr + 1 < visual + visual_len) + && ((ptr + 1)->base == ' ' + || (ptr + 1)->base == '\t')) + ptr ++; + pos = ptr + 1; + } + else + x += grub_font_get_constructed_device_width (font, ptr); + } + + grub_free (visual); + + return GRUB_ERR_NONE; +} + /* Get the width in pixels of the specified UTF-8 string, when rendered in in the specified font (but falling back on other fonts for glyphs that are missing). */ diff -Naur grub-2.00/grub-core/gfxmenu/gui_label.c grub-new/grub-core/gfxmenu/gui_label.c --- grub-2.00/grub-core/gfxmenu/gui_label.c 2012-03-03 16:00:50.000000000 +0400 +++ grub-new/grub-core/gfxmenu/gui_label.c 2013-04-12 16:40:50.151859580 +0400 @@ -46,6 +46,7 @@ grub_video_rect_t bounds; char *id; int visible; + int multiline; char *text; char *template; grub_font_t font; @@ -91,28 +92,46 @@ return; /* Calculate the starting x coordinate. */ - int left_x; - if (self->align == align_left) - left_x = 0; - else if (self->align == align_center) - left_x = (self->bounds.width - - grub_font_get_string_width (self->font, self->text)) / 2; - else if (self->align == align_right) - left_x = (self->bounds.width - - grub_font_get_string_width (self->font, self->text)); - else - return; /* Invalid alignment. */ + int left_x = 0; + if (!self->multiline) + { + if (self->align == align_left) + left_x = 0; + else if (self->align == align_center) + left_x = (self->bounds.width + - grub_font_get_string_width (self->font, self->text)) / 2; + else if (self->align == align_right) + left_x = (self->bounds.width + - grub_font_get_string_width (self->font, self->text)); + else + return; /* Invalid alignment. */ - if (left_x < 0 || left_x > (int) self->bounds.width) - left_x = 0; + if (left_x < 0 || left_x > (int) self->bounds.width) + left_x = 0; + } grub_video_rect_t vpsave; grub_gui_set_viewport (&self->bounds, &vpsave); - grub_font_draw_string (self->text, - self->font, - grub_video_map_rgba_color (self->color), - left_x, - grub_font_get_ascent (self->font)); + if (!self->multiline) + grub_font_draw_string (self->text, + self->font, + grub_video_map_rgba_color (self->color), + left_x, + grub_font_get_ascent (self->font)); + else + { + int font_height = grub_font_get_max_char_height (self->font); + int max_width = self->bounds.width; + int max_height = self->bounds.height; + grub_font_draw_multiline (self->text, + self->font, + grub_video_map_rgba_color (self->color), + grub_font_get_ascent (self->font), + font_height, + max_width, + max_height, + self->align); + } grub_gui_restore_viewport (&vpsave); } @@ -148,9 +167,15 @@ label_get_minimal_size (void *vself, unsigned *width, unsigned *height) { grub_gui_label_t self = vself; - *width = grub_font_get_string_width (self->font, self->text); - *height = (grub_font_get_ascent (self->font) - + grub_font_get_descent (self->font)); + if (self->multiline) + { + *width = grub_font_get_max_char_width (self->font); + *height = grub_font_get_max_char_height (self->font); + } else { + *width = grub_font_get_string_width (self->font, self->text); + *height = (grub_font_get_ascent (self->font) + + grub_font_get_descent (self->font)); + } } static void @@ -218,6 +243,10 @@ { self->visible = grub_strcmp (value, "false") != 0; } + else if (grub_strcmp (name, "multiline") == 0) + { + self->multiline = grub_strcmp (value, "false") != 0; + } else if (grub_strcmp (name, "id") == 0) { grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self); @@ -257,6 +286,7 @@ return 0; label->comp.ops = &label_ops; label->visible = 1; + label->multiline = 0; label->text = grub_strdup (""); label->font = grub_font_get ("Unknown Regular 16"); label->color.red = 0; diff -Naur grub-2.00/include/grub/gfxmenu_view.h grub-new/include/grub/gfxmenu_view.h --- grub-2.00/include/grub/gfxmenu_view.h 2012-02-24 14:19:45.000000000 +0400 +++ grub-new/include/grub/gfxmenu_view.h 2013-04-12 16:26:41.869448464 +0400 @@ -66,6 +66,12 @@ grub_font_t font, grub_video_color_t color, int left_x, int baseline_y); +grub_err_t grub_font_draw_multiline (const char *str, + grub_font_t font, + grub_video_color_t color, + int baseline_y, int font_height, + int max_width, int max_height, + int align); int grub_font_get_string_width (grub_font_t font, const char *str); --nextPart7591817.fsc5ejFdyj--