Merge kernel-font branch

This commit is contained in:
Robert Millan 2010-01-20 00:42:55 +00:00
commit 25c2b5b317
6 changed files with 315 additions and 15 deletions

View file

@ -1,3 +1,52 @@
2010-01-18 Robert Millan <rmh.grub@aybabtu.com>
Fix parallel builds.
* conf/common.rmk (font/font.c_DEPENDENCIES): New variable (makes
font.c depend on ascii.h).
2010-01-12 Carles Pina i Estany <carles@pina.cat>
* Makefile.in (DUSE_ASCII_FAILBACK): New macro.
2010-01-11 Carles Pina i Estany <carles@pina.cat>
* font/font.c (GENERATE_ASCII): Change the name to USE_ASCII_FAILBACK.
By default: disabled.
* Makefile.in (ascii.h): Remove the non-needed grub/bin2h size
parameter.
2010-01-10 Carles Pina i Estany <carles@pina.cat>
* font/font.c: Update copyright years.
* util/grub-mkfont.c (write_font_ascii_bitmap): Change comment format.
2010-01-10 Carles Pina i Estany <carles@pina.cat>
* font/font.c: Include `ascii.h'.
(ASCII_BITMAP_SIZE): New macro.
(ascii_font_glyph): Define.
(ascii_glyph_lookup): New function.
(grub_font_get_string_width): Change comment. If glyph not found, use
ascii_glyph_lookup.
(grub_font_get_glyph_with_fallback): If glyph not available returns
ascii_glyph_lookup.
* util/grub-mkfont.c (file_formats): New enum.
(options): Add `ascii-bitmaps' new option.
(usage): Add `asii-bitmaps' new option.
(write_font_ascii_bitmap): New function.
(write_font): Rename to ...
(write_font_p2): ... this. Remove print_glyphs call.
(main): Use file_format. Implement code for ranges if ascii-bitmaps is
used. Call print_glyphs.
* Makefile.in (pkgdata_DATA): Add `ascii.h'.
2010-01-14 Robert Millan <rmh.grub@aybabtu.com>
* conf/common.rmk (bin_UTILITIES): Add `grub-bin2h'.
(grub_bin2h_SOURCES): New variable.
* util/bin2h.c: New file.
2010-01-20 Vladimir Serbinenko <phcoder@gmail.com> 2010-01-20 Vladimir Serbinenko <phcoder@gmail.com>
* include/multiboot.h: Resynced with spec. * include/multiboot.h: Resynced with spec.

View file

@ -236,7 +236,7 @@ else
ifeq ($(enable_grub_mkfont),yes) ifeq ($(enable_grub_mkfont),yes)
pkgdata_DATA += unicode.pf2 ascii.pf2 pkgdata_DATA += unicode.pf2 ascii.pf2 ascii.h
# Arrows and lines are needed to draw the menu, so we always include them # Arrows and lines are needed to draw the menu, so we always include them
UNICODE_ARROWS=0x2190-0x2193 UNICODE_ARROWS=0x2190-0x2193
@ -247,6 +247,14 @@ unicode.pf2: $(FONT_SOURCE) grub-mkfont
ascii.pf2: $(FONT_SOURCE) grub-mkfont ascii.pf2: $(FONT_SOURCE) grub-mkfont
$(builddir)/grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES) $(builddir)/grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES)
ascii.bitmaps: $(FONT_SOURCE) grub-mkfont
$(builddir)/grub-mkfont --ascii-bitmaps -o $@ $(FONT_SOURCE)
ascii.h: ascii.bitmaps grub-bin2h
$(builddir)/grub-bin2h ascii_bitmaps < $< > $@
TARGET_CFLAGS += -DUSE_ASCII_FAILBACK=1
endif endif
endif endif

View file

@ -88,6 +88,9 @@ endif
bin_UTILITIES += grub-mkrelpath bin_UTILITIES += grub-mkrelpath
grub_mkrelpath_SOURCES = gnulib/progname.c util/grub-mkrelpath.c util/misc.c grub_mkrelpath_SOURCES = gnulib/progname.c util/grub-mkrelpath.c util/misc.c
bin_UTILITIES += grub-bin2h
grub_bin2h_SOURCES = gnulib/progname.c util/bin2h.c
# For grub-script-check. # For grub-script-check.
bin_UTILITIES += grub-script-check bin_UTILITIES += grub-script-check
util/grub-script-check.c_DEPENDENCIES = grub_script_check_init.h util/grub-script-check.c_DEPENDENCIES = grub_script_check_init.h
@ -597,7 +600,7 @@ sh_mod_LDFLAGS = $(COMMON_LDFLAGS)
# Common Video Subsystem specific modules. # Common Video Subsystem specific modules.
pkglib_MODULES += video.mod videotest.mod bitmap.mod tga.mod jpeg.mod \ pkglib_MODULES += video.mod videotest.mod bitmap.mod tga.mod jpeg.mod \
png.mod font.mod gfxterm.mod video_fb.mod png.mod gfxterm.mod video_fb.mod
# For video.mod. # For video.mod.
video_mod_SOURCES = video/video.c video_mod_SOURCES = video/video.c
@ -634,7 +637,8 @@ png_mod_SOURCES = video/readers/png.c
png_mod_CFLAGS = $(COMMON_CFLAGS) png_mod_CFLAGS = $(COMMON_CFLAGS)
png_mod_LDFLAGS = $(COMMON_LDFLAGS) png_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For font.mod. pkglib_MODULES += font.mod
font/font.c_DEPENDENCIES = ascii.h
font_mod_SOURCES = font/font_cmd.c font/font.c font_mod_SOURCES = font/font_cmd.c font/font.c
font_mod_CFLAGS = $(COMMON_CFLAGS) font_mod_CFLAGS = $(COMMON_CFLAGS)
font_mod_LDFLAGS = $(COMMON_LDFLAGS) font_mod_LDFLAGS = $(COMMON_LDFLAGS)

View file

@ -1,7 +1,7 @@
/* font.c - Font API and font file loader. */ /* font.c - Font API and font file loader. */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 2003,2005,2006,2007,2008,2009 Free Software Foundation, Inc. * Copyright (C) 2003,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
* *
* GRUB is free software: you can redistribute it and/or modify * GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -27,6 +27,10 @@
#include <grub/video.h> #include <grub/video.h>
#include <grub/bitmap.h> #include <grub/bitmap.h>
#ifdef USE_ASCII_FAILBACK
#include "ascii.h"
#endif
#ifndef FONT_DEBUG #ifndef FONT_DEBUG
#define FONT_DEBUG 0 #define FONT_DEBUG 0
#endif #endif
@ -43,6 +47,7 @@ struct char_index_entry
#define FONT_WEIGHT_NORMAL 100 #define FONT_WEIGHT_NORMAL 100
#define FONT_WEIGHT_BOLD 200 #define FONT_WEIGHT_BOLD 200
#define ASCII_BITMAP_SIZE 16
struct grub_font struct grub_font
{ {
@ -129,6 +134,48 @@ static struct grub_font null_font;
/* Flag to ensure module is initialized only once. */ /* Flag to ensure module is initialized only once. */
static grub_uint8_t font_loader_initialized; static grub_uint8_t font_loader_initialized;
#ifdef USE_ASCII_FAILBACK
static struct grub_font_glyph *ascii_font_glyph[0x80];
#endif
static struct grub_font_glyph *
ascii_glyph_lookup (grub_uint32_t code)
{
#ifdef USE_ASCII_FAILBACK
static int ascii_failback_initialized = 0;
if (code >= 0x80)
return unknown_glyph;
if (ascii_failback_initialized == 0)
{
int current;
for (current = 0; current < 0x80; current++)
{
ascii_font_glyph[current] = grub_malloc(sizeof(struct grub_font_glyph)
+ ASCII_BITMAP_SIZE);
ascii_font_glyph[current]->width = 8;
ascii_font_glyph[current]->height = 16;
ascii_font_glyph[current]->offset_x = 0;
ascii_font_glyph[current]->offset_y = -2;
ascii_font_glyph[current]->device_width = 8;
grub_memcpy (ascii_font_glyph[current]->bitmap,
&ascii_bitmaps[(0x7f - current) * ASCII_BITMAP_SIZE],
ASCII_BITMAP_SIZE);
}
ascii_failback_initialized = 1;
}
return ascii_font_glyph[code];
#else
(void) code;
return unknown_glyph;
#endif
}
void void
grub_font_loader_init (void) grub_font_loader_init (void)
{ {
@ -865,15 +912,17 @@ grub_font_get_string_width (grub_font_t font, const char *str)
} }
/* Get the glyph for FONT corresponding to the Unicode code point CODE. /* Get the glyph for FONT corresponding to the Unicode code point CODE.
Returns a pointer to an glyph indicating there is no glyph available Returns the ASCII glyph for the code if no other fonts are available.
if CODE does not exist in the font. The glyphs are cached once loaded. */ The glyphs are cached once loaded. */
struct grub_font_glyph * struct grub_font_glyph *
grub_font_get_glyph (grub_font_t font, grub_uint32_t code) grub_font_get_glyph (grub_font_t font, grub_uint32_t code)
{ {
struct grub_font_glyph *glyph; struct grub_font_glyph *glyph;
glyph = grub_font_get_glyph_internal (font, code); glyph = grub_font_get_glyph_internal (font, code);
if (glyph == 0) if (glyph == 0)
glyph = unknown_glyph; {
glyph = ascii_glyph_lookup (code);
}
return glyph; return glyph;
} }
@ -968,8 +1017,8 @@ grub_font_get_glyph_with_fallback (grub_font_t font, grub_uint32_t code)
if (best_glyph) if (best_glyph)
return best_glyph; return best_glyph;
else else
/* Glyph not available in any font. Return unknown glyph. */ /* Glyph not available in any font. Return ASCII failback. */
return unknown_glyph; return ascii_glyph_lookup (code);
} }

125
util/bin2h.c Normal file
View file

@ -0,0 +1,125 @@
/*
* Copyright (C) 2008,2010 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#define _GNU_SOURCE 1
#include <getopt.h>
#include "progname.h"
static struct option options[] =
{
{"help", no_argument, 0, 'h' },
{"version", no_argument, 0, 'V' },
{0, 0, 0, 0 }
};
static void
usage (int status)
{
if (status)
fprintf (stderr,
"Try ``%s --help'' for more information.\n", program_name);
else
printf ("\
Usage: %s [OPTIONS] SYMBOL-NAME\n\
\n\
-h, --help display this message and exit\n\
-V, --version print version information and exit\n\
\n\
Report bugs to <%s>.\n\
", program_name, PACKAGE_BUGREPORT);
exit (status);
}
int
main (int argc, char *argv[])
{
int b, i;
char *sym;
set_program_name (argv[0]);
/* Check for options. */
while (1)
{
int c = getopt_long (argc, argv, "snm:r:hVv", options, 0);
if (c == -1)
break;
else
switch (c)
{
case 'h':
usage (0);
break;
case 'V':
printf ("%s (%s) %s\n", program_name, PACKAGE_NAME, PACKAGE_VERSION);
return 0;
default:
usage (1);
break;
}
}
if (optind >= argc)
usage (1);
if (optind + 1 != argc)
usage (1);
sym = argv[optind];
b = getchar ();
if (b == EOF)
goto abort;
printf ("/* THIS CHUNK OF BYTES IS AUTOMATICALY GENERATED */\n"
"unsigned char %s[] =\n{\n", sym);
while (1)
{
printf ("0x%02x", b);
b = getchar ();
if (b == EOF)
goto end;
for (i = 0; i < 16 - 1; i++)
{
printf (", 0x%02x", b);
b = getchar ();
if (b == EOF)
goto end;
}
printf (",\n");
}
end:
printf ("\n};\n");
abort:
exit (0);
}

View file

@ -49,6 +49,12 @@ struct grub_glyph_info
grub_uint8_t bitmap[0]; grub_uint8_t bitmap[0];
}; };
enum file_formats
{
PF2,
ASCII_BITMAPS
};
#define GRUB_FONT_FLAG_BOLD 1 #define GRUB_FONT_FLAG_BOLD 1
#define GRUB_FONT_FLAG_NOBITMAP 2 #define GRUB_FONT_FLAG_NOBITMAP 2
#define GRUB_FONT_FLAG_NOHINTING 4 #define GRUB_FONT_FLAG_NOHINTING 4
@ -87,6 +93,7 @@ static struct option options[] =
{"help", no_argument, 0, 'h'}, {"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'}, {"version", no_argument, 0, 'V'},
{"verbose", no_argument, 0, 'v'}, {"verbose", no_argument, 0, 'v'},
{"ascii-bitmaps", no_argument, 0, 0x102},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
@ -102,6 +109,7 @@ usage (int status)
Usage: %s [OPTIONS] FONT_FILES\n\ Usage: %s [OPTIONS] FONT_FILES\n\
\nOptions:\n\ \nOptions:\n\
-o, --output=FILE_NAME set output file name\n\ -o, --output=FILE_NAME set output file name\n\
--ascii-bitmaps save only the ASCII bitmaps\n\
-i, --index=N set face index\n\ -i, --index=N set face index\n\
-r, --range=A-B[,C-D] set font range\n\ -r, --range=A-B[,C-D] set font range\n\
-n, --name=S set font family name\n\ -n, --name=S set font family name\n\
@ -337,7 +345,39 @@ print_glyphs (struct grub_font_info *font_info)
} }
void void
write_font (struct grub_font_info *font_info, char *output_file) write_font_ascii_bitmap (struct grub_font_info *font_info, char *output_file)
{
FILE *file;
struct grub_glyph_info *glyph;
int num;
file = fopen (output_file, "wb");
if (! file)
grub_util_error ("Can\'t write to file %s.", output_file);
int correct_size;
for (glyph = font_info->glyph, num = 0; glyph; glyph = glyph->next, 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);
}
}
fclose (file);
}
void
write_font_pf2 (struct grub_font_info *font_info, char *output_file)
{ {
FILE *file; FILE *file;
grub_uint32_t leng, data; grub_uint32_t leng, data;
@ -473,9 +513,6 @@ write_font (struct grub_font_info *font_info, char *output_file)
grub_util_write_image ((char *) &cur->bitmap[0], cur->bitmap_size, file); grub_util_write_image ((char *) &cur->bitmap[0], cur->bitmap_size, file);
} }
if (font_verbosity > 1)
print_glyphs (font_info);
fclose (file); fclose (file);
} }
@ -487,6 +524,7 @@ main (int argc, char *argv[])
int font_index = 0; int font_index = 0;
int font_size = 0; int font_size = 0;
char *output_file = NULL; char *output_file = NULL;
enum file_formats file_format = PF2;
memset (&font_info, 0, sizeof (font_info)); memset (&font_info, 0, sizeof (font_info));
@ -552,7 +590,7 @@ main (int argc, char *argv[])
font_info.ranges = xrealloc (font_info.ranges, font_info.ranges = xrealloc (font_info.ranges,
(font_info.num_range + (font_info.num_range +
GRUB_FONT_RANGE_BLOCK) * GRUB_FONT_RANGE_BLOCK) *
sizeof (int) * 2); sizeof (grub_uint32_t) * 2);
font_info.ranges[font_info.num_range * 2] = a; font_info.ranges[font_info.num_range * 2] = a;
font_info.ranges[font_info.num_range * 2 + 1] = b; font_info.ranges[font_info.num_range * 2 + 1] = b;
@ -591,12 +629,33 @@ main (int argc, char *argv[])
font_verbosity++; font_verbosity++;
break; break;
case 0x102:
file_format = ASCII_BITMAPS;
break;
default: default:
usage (1); usage (1);
break; break;
} }
} }
if (file_format == ASCII_BITMAPS && font_info.num_range > 0)
{
grub_util_error ("Option --ascii-bitmaps doesn't accept ranges (use ASCII).");
return 1;
}
else if (file_format == ASCII_BITMAPS)
{
font_info.ranges = xrealloc (font_info.ranges,
GRUB_FONT_RANGE_BLOCK *
sizeof (grub_uint32_t) * 2);
font_info.ranges[0] = (grub_uint32_t) 0x00;
font_info.ranges[1] = (grub_uint32_t) 0x7f;
font_info.num_range = 1;
}
if (! output_file) if (! output_file)
grub_util_error ("no output file is specified"); grub_util_error ("no output file is specified");
@ -638,7 +697,13 @@ main (int argc, char *argv[])
FT_Done_FreeType (ft_lib); FT_Done_FreeType (ft_lib);
write_font (&font_info, output_file); if (file_format == PF2)
write_font_pf2 (&font_info, output_file);
else if (file_format == ASCII_BITMAPS)
write_font_ascii_bitmap (&font_info, output_file);
if (font_verbosity > 1)
print_glyphs (&font_info);
return 0; return 0;
} }