#include #include #include "gd.h" #include "crox4hb.h" #include "fnt8x14d.h" #include "gdmfont.h" /***************************************************************************/ /* */ /* Example image */ /* */ /***************************************************************************/ /* #define ALTCHARSET */ #define EXAMPLE_SIZE 300 #define EXAMPLE_MARGIN 10 #define IMAGE_BORDER 5 #ifdef ALTCHARSET static unsigned char alt2koiTable[128] = { 0xe1u, 0xe2u, 0xf7u, 0xe7u, 0xe4u, 0xe5u, 0xf6u, 0xfau, 0xe9u, 0xeau, 0xebu, 0xecu, 0xedu, 0xeeu, 0xefu, 0xf0u, 0xf2u, 0xf3u, 0xf4u, 0xf5u, 0xe6u, 0xe8u, 0xe3u, 0xfeu, 0xfbu, 0xfdu, 0xffu, 0xf9u, 0xf8u, 0xfcu, 0xe0u, 0xf1u, 0xc1u, 0xc2u, 0xd7u, 0xc7u, 0xc4u, 0xc5u, 0xd6u, 0xdau, 0xc9u, 0xcau, 0xcbu, 0xccu, 0xcdu, 0xceu, 0xcfu, 0xd0u, 0x90u, 0x91u, 0x92u, 0x81u, 0x87u, 0xb2u, 0xb4u, 0xa7u, 0xa6u, 0xb5u, 0xa1u, 0xa8u, 0xaeu, 0xadu, 0xacu, 0x83u, 0x84u, 0x89u, 0x88u, 0x86u, 0x80u, 0x8au, 0xafu, 0xb0u, 0xabu, 0xa5u, 0xbbu, 0xb8u, 0xb1u, 0xa0u, 0xbeu, 0xb9u, 0xbau, 0xb6u, 0xb7u, 0xaau, 0xa9u, 0xa2u, 0xa4u, 0xbdu, 0xbcu, 0x85u, 0x82u, 0x8du, 0x8cu, 0x8eu, 0x8fu, 0x8bu, 0xd2u, 0xd3u, 0xd4u, 0xd5u, 0xc6u, 0xc8u, 0xc3u, 0xdeu, 0xdbu, 0xddu, 0xdfu, 0xd9u, 0xd8u, 0xdcu, 0xc0u, 0xd1u, 0xb3u, 0xa3u, 0x99u, 0x98u, 0x93u, 0x9bu, 0x9fu, 0x97u, 0x9cu, 0x95u, 0x9eu, 0x96u, 0xbfu, 0x9du, 0x94u, 0x9au }; #define CONV_TABLE alt2koiTable #else #define CONV_TABLE NULL #endif void makeExample( struct gdImageStruct *im, int xDelta, int yDelta, const char *caption, unsigned int flags) { int mColor = gdImageColorResolve( im, 0, 0, 0); int cColor = gdImageColorResolve( im, 0x88, 0xcc, 0x88); gdImageLine( im, xDelta, yDelta, xDelta+EXAMPLE_SIZE-1, yDelta, mColor); gdImageLine( im, xDelta, yDelta, xDelta, yDelta+EXAMPLE_SIZE-1, mColor); gdImageLine( im, xDelta, yDelta+EXAMPLE_SIZE-1, xDelta+EXAMPLE_SIZE-1, yDelta+EXAMPLE_SIZE-1, mColor); gdImageLine( im, xDelta+EXAMPLE_SIZE-1, yDelta, xDelta+EXAMPLE_SIZE-1, yDelta+EXAMPLE_SIZE-1, mColor); gdImageArc( im, xDelta+EXAMPLE_SIZE/2, yDelta+EXAMPLE_SIZE/2, 5, 5, 0, 360, cColor); { int len = gdMFontStringSize( mfFnt8x14d, caption, NULL, 0, NULL); gdMFontString( im, mfFnt8x14d, xDelta+(EXAMPLE_SIZE-len)/2, yDelta+EXAMPLE_SIZE, caption, cColor, 0, NULL); } gdMFontString( im, mfCrox4hb, xDelta+EXAMPLE_SIZE/2, yDelta+EXAMPLE_SIZE/2, "Привет\nвсем!", mColor, flags | mffUpperTable, CONV_TABLE); } int makeExamples( const char *fileName, unsigned int flags) { struct gdImageStruct *im; int xPos, yPos; /* Creating image */ flags &= ~(mffRotateLeft | mffRotateRight); xPos = IMAGE_BORDER + EXAMPLE_SIZE + EXAMPLE_MARGIN + EXAMPLE_SIZE + IMAGE_BORDER; yPos = xPos + 2 * mfFnt8x14d->height; if( (im = gdImageCreate( xPos, yPos)) == NULL ) return -1; gdImageColorAllocate( im, 0xff, 0xff, 0xff); /* Рисуем 4 примера со всевозможными поворотами */ xPos = IMAGE_BORDER + EXAMPLE_SIZE + EXAMPLE_MARGIN; yPos = xPos + mfFnt8x14d->height; makeExample( im, IMAGE_BORDER, IMAGE_BORDER, "0", flags); makeExample( im, xPos, IMAGE_BORDER, "Right", flags | mffRotateRight); makeExample( im, IMAGE_BORDER, yPos, "Left", flags | mffRotateLeft); makeExample( im, xPos, yPos, "Left | Right", flags | mffRotateRight | mffRotateLeft); /* Сохраняем изображение */ { FILE *stream; if( (stream = fopen( fileName, "wb")) == NULL ) { gdImageDestroy( im ); return -1; } gdImagePng( im, stream); fclose( stream ); } gdImageDestroy( im ); return 0; } /***************************************************************************/ /* */ /* Main */ /* */ /***************************************************************************/ struct _ex_t { const char *name; unsigned int flags; }; static struct _ex_t exTable[] = { { "exs01.png", mffSaveBlanks }, { "exs02.png", mffSaveBlanks | mffNegativeSpacing | 0x02 }, { "exs03.png", mffNewLine }, { "exs04.png", mffNewLine | 0x08 }, { "exs05.png", mffNewLine | mffNegativeSpacing | 0x02 }, { "exs06.png", mffSaveBlanks | mffRightAlign }, { "exs07.png", mffSaveBlanks | mffRightAlign | mffNegativeSpacing | 0x02 }, { "exs08.png", mffNewLine | mffRightAlign }, { "exs09.png", mffNewLine | mffRightAlign | 0x08 }, { "exs10.png", mffNewLine | mffRightAlign | mffNegativeSpacing | 0x02 }, { "exm01.png", mffMirror | mffSaveBlanks }, { "exm02.png", mffMirror | mffSaveBlanks | mffNegativeSpacing | 0x02 }, { "exm03.png", mffMirror | mffNewLine }, { "exm04.png", mffMirror | mffNewLine | 0x08 }, { "exm05.png", mffMirror | mffNewLine | mffNegativeSpacing | 0x02 }, { "exm06.png", mffMirror | mffSaveBlanks | mffRightAlign }, { "exm07.png", mffMirror | mffSaveBlanks | mffRightAlign | mffNegativeSpacing | 0x02 }, { "exm08.png", mffMirror | mffNewLine | mffRightAlign }, { "exm09.png", mffMirror | mffNewLine | mffRightAlign | 0x08 }, { "exm10.png", mffMirror | mffNewLine | mffRightAlign | mffNegativeSpacing | 0x02 }, { NULL } }; int main( void ) { struct _ex_t *ex; for( ex = exTable; ex->name != NULL; ex++) if( makeExamples( ex->name, ex->flags) != 0 ) return -1; return 0; }