| GD font center |
|
|
В самой библиотеке GD определяются свои встроенные фонты, обладающие целым рядом недостатков:
Для ликвидации этих недостатков пришлось разработать иное представление фонтов, которое было названо "модифицированным". Основной принцип хранения и рисования остался прежним - поточечным, но благодаря более рациональной реализации удалось разрешить перечисленные выше проблемы:
Пожалуй, реализация модифицированных фонтов может соперничать с поддержкой в библиотеке GD TTF фонтов. То, что им не под силу, это рисование строк под произвольным углом.
Исходные тексты на языке C, реализующие модифицированные фонты, состоят из следующих файлов:
Наконец, любой модифицированный фонт воплощается в двух файлах, один из которых - заголовочный файл, содержащий декларации о наличии этого фонта, другой - текст на языке C. Последний файл необходимо скомпилировать и слинковать с Вашей программой (вместе с gdmfont.c, конечно).
В заголовочном файле gdmfont.h определяются такие структуры:
struct gd_mchar
{
unsigned short width, height;
unsigned short xadvance, yadvance;
short dx, dy;
unsigned int pointer;
};
Структура выполнена в как можно более компактном варианте (16 байт для 32-битной системы). Элементы структуры означают следующее:
Поле chars структуры gd_mfont как раз указывает на последовательный набор экземпляров структуры gd_mchar.
struct gd_mkern
{
unsigned char left;
unsigned char right;
short delta;
};
Здесь:
struct gd_mfont
{
int type;
int nColor;
const unsigned char *data;
const struct gd_mchar *chars;
int startChar, endChar;
int width, height;
int xorigin, yorigin;
unsigned int dataSize;
unsigned int flags;
const struct gd_mkern *kerns;
};
Элементы структуры означают следующее:
Именно экземпляры структуры gd_mfont принимают в качестве первого аргумента вызовы нижеописываемого API.
В файле gdmfont.c определяются следующие вызовы API:
void gdMFontString( struct gdImageStruct *im,
const struct gd_mfont *mf,
int x,
int y,
const char *string,
int color,
unsigned int flags,
const unsigned char *table);
Аргумент flags задается сочетанием нескольких флагов, объединенных операцией OR. Ниже для создания изображений использовался подобный код, менялось только значение flags:
#include "gd.h"
#include "crox4hb.h"
#include "gdmfont.h"
#define IMAGE_SIZE 300
int main( void )
{
gdImageStruct *im;
FILE *stream;
int mColor, cColor;
unsigned int flags;
if( (stream = fopen( "exN.png", "wb")) == NULL ) return -1;
if( (im = gdImageCreate( IMAGE_SIZE, IMAGE_SIZE)) == NULL ) return -1;
gdImageColorAllocate( im, 0xff, 0xff, 0xff);
mColor = gdImageColorAllocate( im, 0, 0, 0);
cColor = gdImageColorAllocate( im, 0x88, 0xcc, 0x88);
gdImageLine( im, 0, 0, IMAGE_SIZE-1, 0, mColor);
gdImageLine( im, 0, 0, 0, IMAGE_SIZE-1, mColor);
gdImageLine( im, 0, IMAGE_SIZE-1, IMAGE_SIZE-1, IMAGE_SIZE-1, mColor);
gdImageLine( im, IMAGE_SIZE-1, 0, IMAGE_SIZE-1, IMAGE_SIZE-1, mColor);
gdImageArc( im, IMAGE_SIZE/2, IMAGE_SIZE/2, 5, 5, 0, 360, cColor);
flags = ...;
gdMFontString( im, mfCrox4hb, IMAGE_SIZE/2, IMAGE_SIZE/2, "Привет всем!", mColor, flags, NULL);
gdImagePng( im, stream);
gdImageDestroy( im );
fclose( stream );
return 0;
}
(Реальный код можно посмотреть здесь).
Зеленый кружок на изображениях (в центре квадратов) обозначает точку вывода строки.
Два флага mffRotateLeft и mffRotateRight используются для задания угла вывода строки:

Флаг mffNewLine позволяет вывод реагировать на символ '\n', заставляя печататься остаток с новой строки. Так, разные комбинации поворотных флагов с mffNewLine для строки "Привет\nвсем" дают следующий результат:

Флаг mffRightAlign служит для выравнивания многострочного текста по его правой границе. Точка вывода при этом смещается от верхнего левого угла первой буквы строки на верхний правый угол последнего символа первой строчки выводимого текста:

Этот флаг может быть полезен и при выводе однострочного текста, когда точка вывода должна находиться в верхнем правом углу прямоугольника текста, а не в верхнем левом:

Другой флаг mffSaveBlanks служит для замены на пробел символов выводимой строки, отсутсвующих в текущем фонте. Флаг mffUpperTable говорит о том, что таблица перекодировки table задается только для верхней половины таблицы символов (с кодами >= 128, где обычно и располагаются русские буквы). Помимо этого, возможно задание дополнительных промежутков между выводимыми символами для создания эффекта разряженного фонта. Это делается путем указания в аргументе flags числа, меньшего 256 и означающего ширину дополнительного промежутка в точках. Так, дополнительный промежуток в 8 точек даст такой результат:

С помощью флага mffNegativeSpacing возможно задание отрицательной разряженности текста:

Еще один флаг mffMirror служит для вывода текста в зеркальном виде (то есть как бы отраженным в зеркале):

Запрещенных сочетаний флагов нет, работают все комбинации, напимер такая:

int gdMFontStringSize( const struct gd_mfont *mf,
const char *string,
int *pheight,
unsigned int flags,
const unsigned char *table);
void gdMFontText( struct gdImageStruct *im,
const struct gd_mfont *mf,
int x,
int y,
const char *text,
int length,
int color,
unsigned int flags,
const unsigned char *table);
int gdMFontTextSize( const struct gd_mfont *mf,
const char *text,
int length,
int *pheight,
unsigned int flags,
const unsigned char *table);
void gdMFontChar( struct gdImageStruct *im,
const struct gd_mfont *mf,
int x, int y,
int c,
int color,
unsigned int flags);
int gdMFontCharSize( const struct gd_mfont *mf,
int c);
|
|
|