GD font center  
Зайти     Узнать     Сделать     Скачать

Модифицированные фонты

Содержание:

  Зачем они нужны  

В самой библиотеке GD определяются свои встроенные фонты, обладающие целым рядом недостатков:

Для ликвидации этих недостатков пришлось разработать иное представление фонтов, которое было названо "модифицированным". Основной принцип хранения и рисования остался прежним - поточечным, но благодаря более рациональной реализации удалось разрешить перечисленные выше проблемы:

Пожалуй, реализация модифицированных фонтов может соперничать с поддержкой в библиотеке GD TTF фонтов. То, что им не под силу, это рисование строк под произвольным углом.

Исходные тексты на языке C, реализующие модифицированные фонты, состоят из следующих файлов:

  • Заголовочный файл gdmfont.h
    содержит описание используемых структур и вызовов API.

  • Файл gdmfont.c
    содержит основные вызовы для рисования символов и строк, а также определения длины выводимых символов и строк в точках.

  • Файл gdmfont2.c
    содержит вызовы для создания карты фонта (именно с помощью этих вызовов созданы все карты фонтов, предлагаемых здесь для загрузки).
  • Наконец, любой модифицированный фонт воплощается в двух файлах, один из которых - заголовочный файл, содержащий декларации о наличии этого фонта, другой - текст на языке C. Последний файл необходимо скомпилировать и слинковать с Вашей программой (вместе с gdmfont.c, конечно).

      Описание структур  

    В заголовочном файле gdmfont.h определяются такие структуры:

    struct gd_mchar

    служит для описания геометрии одного символа фонта:

    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

    Описывает дополнительный межсимвольный промежуток для одной кернинговой пары:

    struct gd_mkern
    {
      unsigned char left;
      unsigned char right;
      short delta;
    };

    Здесь:

    struct gd_mfont

    описывает фонт в целом:

    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.

      Вызовы 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 используются для задания угла вывода строки:

    flags = ...

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

    flags = mffNewLine | ...

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

    flags = mffNewLine | mffRightAlign | ...

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

    flags = mffRightAlign | ...

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

    flags = mffNewLine | 0x08 | ...

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

    flags = mffNewLine | mffNegativeSpacing | 0x02 | ...

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

    flags = mffMirror | mffNewLine | ...

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

    flags = mffMirror | mffNewLine | mffRightAlign | 0x08 | ...

    int gdMFontStringSize( const struct gd_mfont *mf,
                           const char *string,
                           int *pheight,
                           unsigned int flags,
                           const unsigned char *table);

    Вызов служит для определения ширины (и высоты) выводимой строки в точках. Поскольку используются модифицированные фонты, то ширина строки не может быть вычислена простым перемножением ее длины на ширину фонта. Аргументы вызова аналогичны аргументам вызова gdMFontString, за исключением pheight, в который заносится высота выводимой строки (если в строке содержится символ '\n' и указан флаг mffNewLine, то высота выводимой строки будет отличаться от простого mf->height).

    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);

    Вызов полностью аналогичен gdMFontString. Однако вместо нуль-терминированной строки получает в качестве соответствующего параметра указатель на выводимую текстовую строку и число ее символов, предназначенных для вывода. gdMFontText не реагирует на наличие '\0' в значении параметра text, так что если в составе фонта есть нетрадиционное представление этого символа, то вполне возможен его вывод. Вызов особенно полезен, когда необходимо вывести не все строку целиком, а только некоторую ее часть.

    int gdMFontTextSize( const struct gd_mfont *mf,
                         const char *text,
                         int length,
                         int *pheight,
                         unsigned int flags,
                         const unsigned char *table);

    Зеркальное отражение вызова gdMFontStringSize, но служит для подсчета ширины (и высоты) области, занимаемой под вывод указанного числа символов текста.

    void gdMFontChar( struct gdImageStruct *im,
                      const struct gd_mfont *mf,
                      int x, int y,
                      int c,
                      int color,
                      unsigned int flags);

    Вызов осуществляет вывод одного единственного символа, задаваемого параметром c. По сравнению с gdMFontString в нем отсутствует параметр table, задающий таблицу перекодировки. Это вполне естественно, поскольку выводится только один символ, и если для него нужна перекодировка, то ее можно провести самостоятельно. Кроме того, gdMFontChar реагирует только на поворотные флаги mffRotateLeft и mffRotateRight и флаг mffMirror и ни на какие другие.

    int gdMFontCharSize( const struct gd_mfont *mf,
                         int c);

    Соответствующий парный вызов для определения ширины выводимого символа в точках.

       GD font center       valera@sbnet.ru