]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* util/grub-mkfont.c (write_font_ascii_bitmap): Fix handling of glyphs
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 11 Jul 2013 11:50:18 +0000 (13:50 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 11 Jul 2013 11:50:18 +0000 (13:50 +0200)
not filling whole 8x16 space.

ChangeLog
util/grub-mkfont.c

index 66eb729ee6e774477c88e0f9eca8594d162a93b2..f404fd7d553893581d1dd0e90a0dfa9f9e6fb865 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-11  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * util/grub-mkfont.c (write_font_ascii_bitmap): Fix handling of glyphs
+       not filling whole 8x16 space.
+
 2013-07-11  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/normal/charset.c (bidi_line_wrap): Fix spurios warning.
index 0343fd29305fc4e6d86407666bd67e610f491b03..985e09897060b6a899d292c0fe00f4885e32635b 100644 (file)
@@ -784,24 +784,38 @@ write_font_ascii_bitmap (struct grub_font_info *font_info, char *output_file)
     grub_util_error (_("cannot write to `%s': %s"), output_file,
                     strerror (errno));
 
-  int correct_size;
   for (glyph = font_info->glyphs_sorted, num = 0; num < font_info->num_glyphs;
        glyph++, num++)
     {
-      correct_size = 1;
-      if (glyph->width != 8 || glyph->height != 16)
-      {
-        /* printf ("Width or height from glyph U+%04x not supported, skipping.\n", glyph->char_code);  */
-       correct_size = 0;
-      }
-      int row;
-      for (row = 0; row < glyph->height; row++)
-        {
-         if (correct_size)
-           fwrite (&glyph->bitmap[row], sizeof(glyph->bitmap[row]), 1, file);
-         else
-           fwrite (&correct_size, 1, 1, file);
-        }
+      if (glyph->width == 8 && glyph->height == 16
+         && glyph->x_ofs == 0 && glyph->y_ofs == 0)
+       fwrite (glyph->bitmap, 16, 1, file);
+      else
+       {
+         grub_uint8_t glph[16];
+         int p = 0, mask = 0x80;
+         int row, col;
+         int dy = 12 - glyph->height - glyph->y_ofs;
+         for (row = 0; row < 16; row++)
+           glph[row] = 0;
+         for (row = 0; row < glyph->height; row++)
+           for (col = 0; col < glyph->width; col++)
+             {
+               int val = glyph->bitmap[p] & mask;
+               mask >>= 1;
+               if (mask == 0)
+                 {
+                   mask = 0x80;
+                   p++;
+                 }
+               if (val && dy + row >= 0
+                   && dy + row < 16
+                   && glyph->x_ofs + col >= 0
+                   && glyph->x_ofs + col < 8)
+                 glph[dy + row] |= 1 << (7 - (glyph->x_ofs + col));
+             }
+         fwrite (glph, 16, 1, file);
+       }
     }
     fclose (file);
 }