=================================================================== RCS file: /home/cvs/OpenXM_contrib/gnuplot/term/Attic/gif.trm,v retrieving revision 1.1 retrieving revision 1.1.1.3 diff -u -p -r1.1 -r1.1.1.3 --- OpenXM_contrib/gnuplot/term/Attic/gif.trm 2000/01/09 17:01:14 1.1 +++ OpenXM_contrib/gnuplot/term/Attic/gif.trm 2003/09/15 07:09:36 1.1.1.3 @@ -1,5 +1,5 @@ /* - * $Id: gif.trm,v 1.1 2000/01/09 17:01:14 maekawa Exp $ + * $Id: gif.trm,v 1.1.1.3 2003/09/15 07:09:36 ohara Exp $ */ /* GNUPLOT -- gif.trm */ @@ -53,7 +53,7 @@ * * size (in pixels) * - * font (small,medium,large) + * font (tiny,small,medium,large,giant) * * xrrggbb - sets the next color. x is the literal character 'x', * rrggbb are the red green and blue components in hex. For example @@ -69,7 +69,8 @@ * Alex Woo * * CONTRIBUTORS - * Alfred Reibenschuh or + * Alfred Reibenschuh or + * Ben Laurie * * send your comments or suggestions to: * info-gnuplot@cs.dartmouth.edu @@ -83,9 +84,14 @@ * * find out about gd from http://www.boutell.com/gd/ * - * [Update: as of version 1.3, gd does not use any more UNISYS licensed - * code. The gnuplot team may decide to include this version some day.] + * We recommend to use gd library version 1.3 or 1.4 because it uses + * Run Length Encoding (RLE) instead of LZW compression. LZW compression + * is licensed by UNISYS. * + * Gd library versions before 1.3, and gd library 1.5 are subject to + * the Unisys license. Use at your own risk. From version 1.6 on, gd + * library creates png files instead of gif. + * */ #include "driver.h" @@ -107,17 +113,20 @@ TERM_PUBLIC int GIF_text_angle __PROTO((int ang)); TERM_PUBLIC void GIF_reset __PROTO((void)); #include "gd.h" + extern gdFontPtr gdFontSmall; /* 6x12 */ extern gdFontPtr gdFontLarge; /* 8x16 */ extern gdFontPtr gdFontMediumBold; /* 7x13 */ +extern gdFontPtr gdFontGiant; /* 9x15 */ +extern gdFontPtr gdFontTiny; /* 5x8 */ #define GREG_XMAX 640 #define GREG_YMAX 480 -int GIF_XMAX = GREG_XMAX; -int GIF_YMAX = GREG_YMAX; +static int GIF_XMAX = GREG_XMAX; +static int GIF_YMAX = GREG_YMAX; #define GIF_FONT_SMALL 1 @@ -161,111 +170,6 @@ static struct { #define GIF_USE_TRANSPARENT 1 #define GIF_USE_INTERLACE 2 -static unsigned int gif_color_rgbs[] = -{ - 0xffffff, /* background: white */ - 0x000000, /* borders: black */ - 0x404040, /* x & y axes: grey */ - 0xff0000, /* color 01: red */ - 0x00c000, /* color 02: dark green */ - 0x0080ff, /* color 03: dark blue */ - 0xc000ff, /* color 04: dark magenta */ - 0xc0ff40, /* color 05: yellow */ - 0xc04000, /* color 06: orange */ - 0x40ff80, /* color 07: sea green */ - 0x2020c0, /* color 08: royal blue */ - 0x8000c0, /* color 09: dark violet */ - /* please note: these colors are optimized for web216 compatibility */ - 0x006080, /* DeepSkyBlue4 */ - 0x008000, /* green4 */ - 0x008040, /* SpringGreen4 */ - 0x008080, /* dark cyan, turquoise4 */ - 0x00c060, /* SpringGreen3 */ - 0x00c0c0, /* cyan3, turquoise3 */ - 0x00ff00, /* green */ - 0x208020, /* forest green */ - 0x306080, /* SteelBlue4 */ - 0x404040, /* grey25-31 */ - 0x408000, /* chartreuse4 */ - 0x000080, /* dark blue, navy blue */ - 0x806000, /* DarkGoldenrod4 */ - 0x806010, /* goldenrod4 */ - 0x806060, /* pink4 */ - 0x806080, /* plum4 */ - 0x0000c0, /* medium blue */ - 0x0000ff, /* blue */ - 0x006000, /* dark green */ - 0x40c080, /* SeaGreen3 */ - 0x60a0c0, /* SkyBlue3 */ - 0x60c000, /* chartreuse3 */ - 0x60c0a0, /* medium aquamarine */ - 0x800000, /* dark red */ - 0x800080, /* dark magenta */ - 0x602080, /* DarkOrchid4 */ - 0x606060, /* dim grey */ - 0x00ffff, /* cyan1, turquoise1 */ - 0x202020, /* grey13-18 */ - 0x204040, /* dark slate grey */ - 0x204080, /* RoyalBlue4 */ - 0x608020, /* olive drab */ - 0x608060, /* DarkSeaGreen4 */ - 0x608080, /* LightBlue4, PaleTurquoise4 */ - 0x808040, /* LightGoldenrod4, khaki4 */ - 0x808080, /* grey51-56 */ - 0xa0a0a0, /* dark grey, grey63-68 */ - 0xa0d0e0, /* light blue */ - 0xc02020, /* firebrick3 */ - 0xc06000, /* DarkOrange3 */ - 0x80c0e0, /* sky blue */ - 0xc060c0, /* orchid3 */ - 0xc08000, /* orange3 */ - 0xc08060, /* LightSalmon3 */ - 0xff4000, /* orange red */ - 0xff4040, /* brown1, tomato */ - 0x80c0ff, /* light sky blue */ - 0xff8060, /* salmon */ - 0xff8080, /* light coral */ - 0xc0a000, /* gold3 */ - 0xc0c0c0, /* grey76-81, honeydew3, ivory3, snow3 */ - 0xc0ffc0, /* DarkSeaGreen1 */ - 0xff0000, /* red */ - 0xff00ff, /* magenta */ - 0xff80a0, /* PaleVioletRed1 */ - 0xff80ff, /* orchid1 */ - 0xc0c0a0, /* LemonChiffon3 */ - 0xff6060, /* IndianRed1 */ - 0xff8000, /* dark orange */ - 0xffa000, /* orange */ - 0x80e0e0, /* CadetBlue2, DarkSlateGray2 */ - 0xa0e0e0, /* pale turquoise */ - 0xa0ff20, /* green yellow */ - 0xc00000, /* red3 */ - 0xc000c0, /* magenta3 */ - 0xa02020, /* brown */ - 0xa020ff, /* purple */ - 0x802000, /* OrangeRed4 */ - 0x802020, /* brown4 */ - 0x804000, /* DarkOrange4 */ - 0x804020, /* sienna4 */ - 0x804080, /* orchid4 */ - 0x8060c0, /* MediumPurple3 */ - 0x8060ff, /* SlateBlue1 */ - 0x808000, /* yellow4 */ - 0xa080ff, /* MediumPurple1 */ - 0xc06080, /* PaleVioletRed3 */ - 0xc0c000, /* yellow3 */ - 0xff8040, /* sienna1 */ - 0xffa040, /* tan1 */ - 0xffa060, /* sandy brown */ - 0xffa070, /* light salmon */ - 0xffc020, /* goldenrod1 */ - 0xffc0c0, /* RosyBrown1, pink */ - 0xffff00, /* yellow */ - 0xffff80, /* khaki1 */ - 0xffffc0 /* lemon chiffon */ -}; -#define GIF_N_DEFAULT_COLORS (sizeof(gif_color_rgbs)/sizeof(gif_color_rgbs[0])) - /* * _options() Called when terminal type is selected. * This procedure should parse options on the command line. A list of the @@ -273,9 +177,14 @@ static unsigned int gif_color_rgbs[] = * suitable for use with the set term command. term_options[] is used by * the save command. Use options_null() if no options are available. */ -TERM_PUBLIC void GIF_options() +TERM_PUBLIC void +GIF_options() { + struct value s; int gif_font, i; + char *string; + unsigned long color; + term_options[0] = NUL; gif_state.n_colors = 0; gif_state.flags = 0; @@ -289,6 +198,12 @@ TERM_PUBLIC void GIF_options() } else if (almost_equals(c_token, "i$nterlace")) { gif_state.flags |= GIF_USE_INTERLACE; ++c_token; + } else if (almost_equals(c_token, "ti$ny")) { + GIF_font=gdFontTiny; + gif_font = 0; + term->v_char = (unsigned int)(8); + term->h_char = (unsigned int)(5); + ++c_token; } else if (almost_equals(c_token, "s$mall")) { GIF_font = gdFontSmall; gif_font = 1; @@ -307,8 +222,13 @@ TERM_PUBLIC void GIF_options() term->v_char = (unsigned int) (16); term->h_char = (unsigned int) (8); ++c_token; + } else if (almost_equals(c_token, "g$iant")) { + GIF_font=gdFontGiant; + gif_font = 4; + term->v_char = (unsigned int)(15); + term->h_char = (unsigned int)(9); + ++c_token; } else if (almost_equals(c_token, "si$ze")) { - struct value s; c_token++; if (END_OF_COMMAND) { GIF_XMAX = GREG_XMAX; @@ -326,13 +246,12 @@ TERM_PUBLIC void GIF_options() term->xmax = GIF_XMAX; } } - } else { /* not "size" */ - char *string = input_line + token[c_token].start_index; - unsigned long color; + } else { /* not "size" */ + string = input_line + token[c_token].start_index; if (sscanf(string, "x%lx", &color) != 1) { - int_error("invalid color spec, must be xRRGGBB", c_token); + int_error("invalid color spec, must be xRRGGBB",c_token); } else if (gif_state.n_colors == GIF_MAX_COLORS) { - int_warn("too many colors, ingoring", c_token); + int_warn("too many colors, ignoring", c_token); ++c_token; } else { gif_state.rgb_table[gif_state.n_colors++] = color; @@ -351,6 +270,9 @@ TERM_PUBLIC void GIF_options() strcat(term_options, "interlace "); } switch (gif_font) { + case 0: + strcat(term_options,"tiny "); + break; case 1: strcat(term_options, "small "); break; @@ -360,11 +282,15 @@ TERM_PUBLIC void GIF_options() case 3: strcat(term_options, "large "); break; + case 4: + strcat(term_options,"giant "); + break; } sprintf(term_options + strlen(term_options), "size %d,%d ", GIF_XMAX, GIF_YMAX); - for (i = 0; i < gif_state.n_colors; i++) { + for (i = 0; strlen(term_options) + 9 < MAX_LINE_LEN && + i < gif_state.n_colors; i++) { sprintf(term_options + strlen(term_options), "x%06x ", gif_state.rgb_table[i]); } @@ -376,7 +302,8 @@ TERM_PUBLIC void GIF_options() * should set up things that only need to be set once, like handshaking and * character sets etc... */ -TERM_PUBLIC void GIF_init() +TERM_PUBLIC void +GIF_init() { gif_state.linetype = 0; } @@ -386,7 +313,8 @@ TERM_PUBLIC void GIF_init() * the terminal type changed. This procedure should reset the device, * possibly flushing a buffer somewhere or generating a form feed. */ -TERM_PUBLIC void GIF_reset() +TERM_PUBLIC void +GIF_reset() { } @@ -396,7 +324,8 @@ TERM_PUBLIC void GIF_reset() * be used as terminals (like plotters) will probably be in graphics mode * always and therefore won't need this. */ -TERM_PUBLIC void GIF_graphics() +TERM_PUBLIC void +GIF_graphics() { int i; unsigned int rgb; @@ -404,13 +333,16 @@ TERM_PUBLIC void GIF_graphics() gif_state.color = 0; gif_state.image = gdImageCreate((int) (xsize * GIF_XMAX), (int) (ysize * GIF_YMAX)); - gif_state.height = (int) (ysize * GIF_YMAX); + gif_state.height = (int) (ysize * GIF_YMAX - 1); gif_state.charw = term->h_char; /* gif_state.font->w; */ gif_state.charh = term->v_char; /* gif_state.font->h; */ - for (i = gif_state.n_colors; i < GIF_N_DEFAULT_COLORS; i++) - gif_state.rgb_table[i] = gif_color_rgbs[i]; - if (gif_state.n_colors < GIF_N_DEFAULT_COLORS) - gif_state.n_colors = GIF_N_DEFAULT_COLORS; + for (i = gif_state.n_colors; i < WEB_N_COLORS; i++) + gif_state.rgb_table[i] = + (web_color_rgbs[i].r << 16) | + (web_color_rgbs[i].g << 8) | + web_color_rgbs[i].b; + if (gif_state.n_colors < WEB_N_COLORS) + gif_state.n_colors = WEB_N_COLORS; for (i = 0; i < gif_state.n_colors; i++) { rgb = gif_state.rgb_table[i]; gif_state.color_table[i] = @@ -430,7 +362,8 @@ TERM_PUBLIC void GIF_graphics() * that commands can be seen as they're typed. Again, this will probably * do nothing if the device can't be used as a terminal. */ -TERM_PUBLIC void GIF_text() +TERM_PUBLIC void +GIF_text() { if (gif_state.flags & GIF_USE_INTERLACE) gdImageInterlace(gif_state.image, 1); @@ -441,7 +374,8 @@ TERM_PUBLIC void GIF_text() /* _move(x,y) Called at the start of a line. The cursor should move to the * (x,y) position without drawing. */ -TERM_PUBLIC void GIF_move(unsigned int x, unsigned int y) +TERM_PUBLIC void +GIF_move(unsigned int x, unsigned int y) { gif_state.x = x; gif_state.y = y; @@ -451,7 +385,8 @@ TERM_PUBLIC void GIF_move(unsigned int x, unsigned int * from the last (x,y) position given by _move() or _vector() to this new (x,y) * position. */ -TERM_PUBLIC void GIF_vector(unsigned int x, unsigned int y) +TERM_PUBLIC void +GIF_vector(unsigned int x, unsigned int y) { int gif_linetype_dotted[5]; @@ -484,7 +419,8 @@ TERM_PUBLIC void GIF_vector(unsigned int x, unsigned i * it should map it to one of the available line types. * Most drivers provide 9 different linetypes (lt is 0 to 8). */ -TERM_PUBLIC void GIF_linetype(int type) +TERM_PUBLIC void +GIF_linetype(int type) { if (type >= (gif_state.n_colors - 3)) type %= (gif_state.n_colors - 3); @@ -499,7 +435,8 @@ TERM_PUBLIC void GIF_linetype(int type) * to _text_angle and then horizontally (with respect to the text) * justified according to _justify_text. */ -TERM_PUBLIC void GIF_put_text(unsigned int x, unsigned int y, char *string) +TERM_PUBLIC void +GIF_put_text(unsigned int x, unsigned int y, char *string) { if (gif_state.angle == 1) { x -= gif_state.charh / 2; @@ -518,18 +455,45 @@ TERM_PUBLIC void GIF_put_text(unsigned int x, unsigned * If ang = 0 then text is horizontal. If ang = 1 then text is vertically * upwards. Returns TRUE if text can be rotated, FALSE otherwise. */ -TERM_PUBLIC int GIF_text_angle(int ang) +TERM_PUBLIC int +GIF_text_angle(int ang) { gif_state.angle = ang; return TRUE; } -/* - * Local Variables: - * mode:C - * End: - */ +TERM_PUBLIC int +GIF_set_font(char *fontname) +{ + char name[32]; + int sep; + gdFontPtr font; + sep = strcspn(fontname,","); + strncpy(name,fontname,sep); + name[sep] = NUL; + + if (!strcmp(fontname,"small")) + font = gdFontSmall; + else if (!strcmp(fontname,"medium")) + font = gdFontMediumBold; + else if(!strcmp(fontname,"large")) + font = gdFontLarge; + else if(!strcmp(fontname,"giant")) + font = gdFontGiant; + else if(!strcmp(fontname,"tiny")) + font = gdFontTiny; + else + font = GIF_font; + + gif_state.charw = font->w; + gif_state.charh = font->h; + + gif_state.font = font; + + return TRUE; +} + #endif /* TERM_BODY */ #ifdef TERM_TABLE @@ -539,7 +503,7 @@ TERM_TABLE_START(gif_driver) GIF_VTIC, GIF_HTIC, GIF_options, GIF_init, GIF_reset, GIF_text, null_scale, GIF_graphics, GIF_move, GIF_vector, GIF_linetype, GIF_put_text, GIF_text_angle, - null_justify_text, do_point, do_arrow, set_font_null, + null_justify_text, do_point, do_arrow, GIF_set_font, 0, /* pointsize */ TERM_CAN_MULTIPLOT | TERM_BINARY TERM_TABLE_END(gif_driver) @@ -562,9 +526,11 @@ START_HELP(gif) " The `gif` terminal driver generates output in GIF format. It uses Thomas", " Boutell's gd library, which is available from http://www.boutell.com/gd/", "", +" By default, the `gif` terminal driver uses a shared Web-friendy palette." +"", " Syntax:", " set terminal gif {transparent} {interlace}", -" {small | medium | large}", +" {tiny | small | medium | large | giant}", " {size ,}", " { ...}", "", @@ -573,8 +539,8 @@ START_HELP(gif) "", " `interlace` instructs the driver to generate interlaced GIFs.", "", -" The choice of fonts is `small` (6x12 pixels), `medium` (7x13 Bold) or `large`", -" (8x16).", +" The choice of fonts is `tiny` (5x8 pixels), `small` (6x12 pixels), `medium`", +" (7x13 Bold), `large` (8x16) or `giant` (9x15 pixels)", "", " The size is given in pixels---it defaults to 640x480. The number of", " pixels can be also modified by scaling with the `set size` command.", @@ -597,7 +563,8 @@ START_HELP(gif) "", " set terminal gif transparent xffffff \\", " x000000 x202020 x404040 x606060 \\", -" x808080 xA0A0A0 xC0C0C0 xE0E0E0 \\", +" x808080 xA0A0A0 xC0C0C0 xE0E0E0", +"", " which uses white for the transparent background, black for borders, dark", " gray for axes, and a gray-scale for the six plotting colors.", "", @@ -607,3 +574,9 @@ START_HELP(gif) " The current version of the `gif` driver does not support animated GIFs." END_HELP(gif) #endif /* TERM_HELP */ + +/* + * Local Variables: + * mode:C + * End: + */