1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
/* GDCHART 0.10.0dev GDC.C 2 Nov 2000 */
/* Copyright Bruce Verderaime 1998, 1999, 2000 */
#define GDC_INCL
#define GDC_LIB
#include "gdc.h"
struct GDC_FONT_T GDC_fontc[GDC_numfonts] = { (gdFontPtr)NULL, 8, 5,
(gdFontPtr)NULL, 8, 5,
(gdFontPtr)NULL, 12, 6,
(gdFontPtr)NULL, 13, 7,
(gdFontPtr)NULL, 16, 8,
(gdFontPtr)NULL, 15, 9 };
/* ------------------------------------------------------------------- *\
* convert from enum GDC_font_size to gd fonts
* for now load them all
* #defines and #ifdefs might enable loading only needed fonts
\* ------------------------------------------------------------------- */
void
load_font_conversions()
{
GDC_fontc[GDC_pad].f = gdFontTiny;
GDC_fontc[GDC_TINY].f = gdFontTiny;
GDC_fontc[GDC_SMALL].f = gdFontSmall;
GDC_fontc[GDC_MEDBOLD].f = gdFontMediumBold;
GDC_fontc[GDC_LARGE].f = gdFontLarge;
GDC_fontc[GDC_GIANT].f = gdFontGiant;
}
/* ------------------------------------------------------------------ *\
* count (natural) substrings (new line sep)
\* ------------------------------------------------------------------ */
short
cnt_nl( char *nstr,
int *len ) /* strlen - max seg */
{
short c = 1;
short max_seg_len = 0;
short tmplen = 0;
if( !nstr )
{
if( len )
*len = 0;
return 0;
}
while( *nstr )
{
if( *nstr == '\n' )
{
++c;
max_seg_len = MAX( tmplen, max_seg_len );
tmplen = 0;
}
else
++tmplen;
++nstr;
}
if( len )
*len = MAX( tmplen, max_seg_len ); /* don't forget last seg */
return c;
}
/* ------------------------------------------------------------------ *\
* gd out a string with '\n's
\* ------------------------------------------------------------------ */
void
GDCImageStringNL( gdImagePtr im,
struct GDC_FONT_T *f,
int x,
int y,
char *str,
int clr,
GDC_justify_t justify )
{
int i;
int len;
int max_len;
short strs_num = cnt_nl( str, &max_len );
char sub_str[max_len+1];
len = -1;
strs_num = -1;
i = -1;
do
{
++i;
++len;
sub_str[len] = *(str+i);
if( *(str+i) == '\n' ||
*(str+i) == '\0' )
{
int xpos;
sub_str[len] = '\0';
++strs_num;
switch( justify )
{
case GDC_JUSTIFY_LEFT: xpos = x; break;
case GDC_JUSTIFY_RIGHT: xpos = x+f->w*(max_len-len); break;
case GDC_JUSTIFY_CENTER:
default: xpos = x+f->w*(max_len-len)/2;
}
gdImageString( im,
f->f,
xpos,
y + (f->h-1)*strs_num,
sub_str,
clr );
len = -1;
}
}
while( *(str+i) );
}
/* ------------------------------------------------------------------------ *\
* todo: *
* really get a unique color from the color map *
\* ------------------------------------------------------------------------ */
long
get_uniq_color( gdImagePtr im )
{
return 0x123454;
}
/* ------------------------------------------------------------------------ */
void
GDC_destroy_image(void *im)
{
if( im )
gdImageDestroy( (gdImagePtr)im );
}
/* ------------------------------------------------------------------------ */
void
out_err( int IMGWIDTH,
int IMGHEIGHT,
FILE *fptr,
unsigned long BGColor,
unsigned long LineColor,
char *err_str )
{
gdImagePtr im;
int lineclr;
int bgclr;
if( (GDC_hold_img & GDC_REUSE_IMAGE) &&
GDC_image != (void*)NULL )
im = GDC_image;
else
im = gdImageCreate( IMGWIDTH, IMGHEIGHT );
bgclr = gdImageColorAllocate( im, l2gdcal(BGColor) );
lineclr = gdImageColorAllocate( im, l2gdcal(LineColor) );
gdImageString( im,
gdFontMediumBold,
IMGWIDTH/2 - GDC_fontc[GDC_MEDBOLD].w*strlen(err_str)/2,
IMGHEIGHT/3,
err_str,
lineclr );
/* usually GDC_generate_img is used in conjunction with hard or hold options */
if( GDC_generate_img )
{
fflush(fptr); // clear anything buffered
switch( GDC_image_type )
{
case GDC_PNG: gdImagePng( im, fptr ); break;
#ifdef HAVE_JPEG
case GDC_JPEG: gdImageJpeg( im, fptr, GDC_jpeg_quality ); break;
#endif
case GDC_WBMP: gdImageWBMP( im, lineclr, fptr ); break;
case GDC_GIF:
default: /* gdImageGif( im, fptr); */ gdImagePng( im, fptr );
}
}
if( GDC_hold_img & GDC_EXPOSE_IMAGE )
GDC_image = (void*)im;
else
gdImageDestroy(im);
return;
}
|