Если у Вас должна быть некоторая забава:
file=path; mtime=$(stat -c %y "$file"); vi "$file"; touch -d "$mtime" "$file"
Путь замены с Вашим фактическим путем к файлу
Вы можете использовать convert
, как показано здесь: Заголовочный файл C с растровыми шрифтами
Вероятно, есть много команд для преобразования шрифтов в растровые, но freetype API достаточно прост, чтобы написать свой собственный с небольшим количеством кода.
Используя пример freetype , я написал кое-что, что вы можете использовать в качестве начала, он выводит файл .xbm
(это файл c
, но вы можете использовать графические программы, такие как gimp
, для просмотра / редактирования).
Обратите внимание, что gimp
также поддерживает экспорт в .xbm
с разными байтами на пиксель.
.xbm
, экспортированный в этом примере, имеет формат 1 бит на пиксель (1 черный, 0 белый), вам необходимо отредактировать код, чтобы обрабатывать больше цветов (для freetype обычно используется 8 битовый буфер растрового изображения серой шкалы для рендеринга, если режим рендеринга равен FT_RENDER_MODE_NORMAL
, вам также может потребоваться удалить шаг с временным растровым изображением, используемым для выравнивания буфера FT до 1 байта).
Функция to_bitmap
- это то место, где выполняется преобразование из буфера FT в битовую карту назначения,
Для построения примера необходим пакет разработчика freetype
на ] Debian
(возможно, также Ubuntu
) используйте:
sudo apt-get install libfreetype6-dev
Просто make
, чтобы собрать его.
Используйте команду с путем к шрифту в качестве аргумента, вывод будет на stdout
./ font2c /usr/share/fonts/X11/misc/9x15-ISO8859-1.pcf.gz> c- bmp-font.xbm
Makefile
:
CFLAGS += -O2 -Wall
CFLAGS += $(shell freetype-config --cflags)
LIBS += $(shell freetype-config --libs)
font2c: font2c.c
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
clean:
-rm -f font2c
font2c.c
:
#include <stdio.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include <ftbitmap.h>
#define WIDTH 640
#define BYTEWIDTH (WIDTH)/8
#define HEIGHT 480
static unsigned char image[HEIGHT][BYTEWIDTH];
static FT_Library library;
static FT_Face face;
static FT_Error err;
static FT_Bitmap tempbitmap;
static void to_bitmap( FT_Bitmap* bitmap, FT_Int x, FT_Int y) {
FT_Int i, j, p, q;
FT_Int x_max = x + bitmap->width;
FT_Int y_max = y + bitmap->rows;
for ( i = x, p = 0; i < x_max; i++, p++ ) {
for ( j = y, q = 0; j < y_max; j++, q++ ) {
if ( (i < 0) || (j < 0) || (i >= WIDTH || j >= HEIGHT) )
continue;
image[j][i >> 3] |= (bitmap->buffer[q * bitmap->width + p]) << (i & 7);
}
}
}
static void draw_glyph(unsigned char glyph, int *x, int *y) {
FT_UInt glyph_index;
FT_GlyphSlot slot = face->glyph;
glyph_index = FT_Get_Char_Index( face, glyph );
if ((err = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ))) {
fprintf( stderr, "warning: failed FT_Load_Glyph 0x%x %d\n", glyph, err);
return;
}
if ((err = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_MONO ))) {
fprintf( stderr, "warning: failed FT_Render_Glyph 0x%x %d\n", glyph, err);
return;
}
FT_Bitmap_New(&tempbitmap);
FT_Bitmap_Convert( library, &slot->bitmap, &tempbitmap, 1);
to_bitmap( &tempbitmap, *x, *y );
FT_Bitmap_Done( library, &tempbitmap );
*x += slot->advance.x >> 6;
}
static void out_xbm(int w, int h) {
int x, y;
printf("#define BMP_width %d\n", WIDTH);
printf("#define BMP_height %d\n", h);
printf("static char BMP_bits[] = {\n");
for (y=0; y < h; y++) {
printf("\t");
for (x=0; x < w; x++) {
printf("0x%x, ", image[y][x]);
}
printf("\n");
}
printf("\n}\n");
}
int main(int argc, char **argv) {
char *filename;
int x = 0, y = 0;
int g;
memset (image, 0, BYTEWIDTH*HEIGHT);
if (argc < 2) {
fprintf( stderr, "usage: font2c [font]\n");
exit(1);
}
filename = argv[1];
if ((err = FT_Init_FreeType( &library ))) {
fprintf( stderr, "error: Init_Freetype failed %d\n", err);
exit(1);
}
if ((err = FT_New_Face( library, filename, 0, &face ))) {
fprintf( stderr, "error: FT_New_Face failed %d\n", err);
exit(1);
}
for (g = 0; g < 256; g++) {
if (x+8 >= WIDTH) {
x = 0;
y += 15; // FIXME get ascender
}
draw_glyph(g, &x, &y);
}
out_xbm(BYTEWIDTH, HEIGHT);
FT_Done_Face( face );
FT_Done_FreeType( library );
return 0;
}
Это довольно легко преобразовать PSF (консоль) шрифта C включать скорее PCF (X11). Я думаю, что это сделает трюк для вас, если вы ищете Botmap Bitmap Monospace для простых встроенных приложений.
Все, что вам нужно, это PSF2Inc
из PSFTools
Пакет:
$ psf2inc --psf1 font.psf font.inc
сейчас font.inc
] Удерживая все 256 символов ASCII:
0x36, 0x04, /* Magic */
0x02, /* Type */
0x0e, /* Char size */
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe,
0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, /* 0 */
0x00, 0x00, 0xfc, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, /* 1 */
0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc6,
0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, /* 2 */
и так далее. После некоторого редактирования вы получите хороший заголовок с моноспатиным шрифтом.