[BACK]Return to gif.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

Annotation of OpenXM_contrib/gnuplot/term/gif.trm, Revision 1.1

1.1     ! maekawa     1: /*
        !             2:  * $Id: $
        !             3:  */
        !             4:
        !             5: /* GNUPLOT -- gif.trm */
        !             6:
        !             7: /*[
        !             8:  * Copyright 1998
        !             9:  *
        !            10:  * Permission to use, copy, and distribute this software and its
        !            11:  * documentation for any purpose with or without fee is hereby granted,
        !            12:  * provided that the above copyright notice appear in all copies and
        !            13:  * that both that copyright notice and this permission notice appear
        !            14:  * in supporting documentation.
        !            15:  *
        !            16:  * Permission to modify the software is granted, but not the right to
        !            17:  * distribute the complete modified source code.  Modifications are to
        !            18:  * be distributed as patches to the released version.  Permission to
        !            19:  * distribute binaries produced by compiling modified sources is granted,
        !            20:  * provided you
        !            21:  *   1. distribute the corresponding source modifications from the
        !            22:  *    released version in the form of a patch file along with the binaries,
        !            23:  *   2. add special version identification to distinguish your version
        !            24:  *    in addition to the base release version number,
        !            25:  *   3. provide your name and address as the primary contact for the
        !            26:  *    support of your modified version, and
        !            27:  *   4. retain our contact information in regard to use of the base
        !            28:  *    software.
        !            29:  * Permission to distribute the released version of the source code along
        !            30:  * with corresponding source modifications in the form of a patch file is
        !            31:  * granted with same provisions 2 through 4 for binary distributions.
        !            32:  *
        !            33:  * This software is provided "as is" without express or implied warranty
        !            34:  * to the extent permitted by applicable law.
        !            35: ]*/
        !            36:
        !            37: /*
        !            38:  * This file is included by ../term.c.
        !            39:  *
        !            40:  * This terminal driver supports:
        !            41:  *  GD GIF library 1.2 & 1.3
        !            42:  *
        !            43:  * To Use:
        !            44:  *
        !            45:  * set terminal gif ?options ...?
        !            46:  *
        !            47:  * Where an option is:
        !            48:  *
        !            49:  * transparent - generate transparent GIFs.  The first color will
        !            50:  * be the transparent one.
        !            51:  *
        !            52:  * interlace - generate interlaced GIFs.
        !            53:  *
        !            54:  * size (in pixels)
        !            55:  *
        !            56:  * font (small,medium,large)
        !            57:  *
        !            58:  * xrrggbb - sets the next color.  x is the literal character 'x',
        !            59:  * rrggbb are the red green and blue components in hex.  For example
        !            60:  * x00ff00 is green.  The background color is set first, then the
        !            61:  * color borders, then the X & Y axis, then the plotting colors.
        !            62:  * (The wierd color spec is in order to get around limitations
        !            63:  * in gnuplot's scanner.)
        !            64:  *
        !            65:  * This driver is modeled after the PBM driver pbm.trm.
        !            66:  *
        !            67:  * AUTHORS
        !            68:  *  Sam Shen <sls@mh1.lbl.gov>
        !            69:  *  Alex Woo <woo@playfair.stanford.edu>
        !            70:  *
        !            71:  * CONTRIBUTORS
        !            72:  *  Alfred Reibenschuh <alfred.reibenschuh@cait.co.at> or <fredo@blackbox.at>
        !            73:  *
        !            74:  * send your comments or suggestions to:
        !            75:  *  info-gnuplot@cs.dartmouth.edu
        !            76:  *
        !            77:  * This version outputs either color or monochrome GIFs.  The default
        !            78:  * is 640x480 pixels.
        !            79:  *
        !            80:  * link with -Lterm/gd -lgd if your directory structure is gnuplot/term/gd
        !            81:  *
        !            82:  * gd is not distributed with gnuplot, because of the UNISYS license thing.
        !            83:  *
        !            84:  * find out about gd from http://www.boutell.com/gd/
        !            85:  *
        !            86:  * [Update: as of version 1.3, gd does not use any more UNISYS licensed
        !            87:  *  code. The gnuplot team may decide to include this version some day.]
        !            88:  *
        !            89:  */
        !            90:
        !            91: #include "driver.h"
        !            92:
        !            93: #ifdef TERM_REGISTER
        !            94: register_term(gif)
        !            95: #endif
        !            96:
        !            97: #ifdef TERM_PROTO
        !            98: TERM_PUBLIC void GIF_options __PROTO((void));
        !            99: TERM_PUBLIC void GIF_init __PROTO((void));
        !           100: TERM_PUBLIC void GIF_graphics __PROTO((void));
        !           101: TERM_PUBLIC void GIF_text __PROTO((void));
        !           102: TERM_PUBLIC void GIF_linetype __PROTO((int linetype));
        !           103: TERM_PUBLIC void GIF_move __PROTO((unsigned int x, unsigned int y));
        !           104: TERM_PUBLIC void GIF_vector __PROTO((unsigned int x, unsigned int y));
        !           105: TERM_PUBLIC void GIF_put_text __PROTO((unsigned int x, unsigned int y, char str[]));
        !           106: TERM_PUBLIC int GIF_text_angle __PROTO((int ang));
        !           107: TERM_PUBLIC void GIF_reset __PROTO((void));
        !           108:
        !           109: #include "gd.h"
        !           110: extern gdFontPtr gdFontSmall;  /* 6x12 */
        !           111: extern gdFontPtr gdFontLarge;  /* 8x16 */
        !           112: extern gdFontPtr gdFontMediumBold;     /* 7x13 */
        !           113:
        !           114:
        !           115: #define GREG_XMAX 640
        !           116: #define GREG_YMAX 480
        !           117:
        !           118:
        !           119: int GIF_XMAX = GREG_XMAX;
        !           120: int GIF_YMAX = GREG_YMAX;
        !           121:
        !           122:
        !           123: #define GIF_FONT_SMALL 1
        !           124: #ifdef GIF_FONT_SMALL
        !           125: # define gdfont gdFontSmall
        !           126: # define GIF_VCHAR 12
        !           127: # define GIF_HCHAR 6
        !           128: #else
        !           129: # define gdfont gdFontMediumBold
        !           130: # define GIF_VCHAR 13
        !           131: # define GIF_HCHAR 7
        !           132: #endif
        !           133:
        !           134: static gdFontPtr GIF_font;
        !           135:
        !           136: #define GIF_VTIC (GREG_YMAX/100)
        !           137: #define GIF_HTIC (GREG_XMAX/150)
        !           138:
        !           139: #define GIF_MAX_COLORS 256
        !           140: #define GOT_NEXT_PROTO
        !           141: #endif
        !           142:
        !           143: #ifndef TERM_PROTO_ONLY
        !           144: #ifdef TERM_BODY
        !           145:
        !           146: static struct {
        !           147:     gdImagePtr image;
        !           148:     gdFontPtr font;
        !           149:     unsigned int x, y;
        !           150:     int height;
        !           151:     int charh, charw;
        !           152:     int color;
        !           153:     int n_colors;
        !           154:     int color_table[GIF_MAX_COLORS];
        !           155:     int rgb_table[GIF_MAX_COLORS];
        !           156:     int angle;
        !           157:     int flags;
        !           158:     int linetype;
        !           159: } gif_state;
        !           160:
        !           161: #define GIF_USE_TRANSPARENT 1
        !           162: #define GIF_USE_INTERLACE   2
        !           163:
        !           164: static unsigned int gif_color_rgbs[] =
        !           165: {
        !           166:     0xffffff,                  /* background: white         */
        !           167:     0x000000,                  /*    borders: black         */
        !           168:     0x404040,                  /* x & y axes: grey          */
        !           169:     0xff0000,                  /*   color 01: red           */
        !           170:     0x00c000,                  /*   color 02: dark green    */
        !           171:     0x0080ff,                  /*   color 03: dark blue     */
        !           172:     0xc000ff,                  /*   color 04: dark magenta  */
        !           173:     0xc0ff40,                  /*   color 05: yellow        */
        !           174:     0xc04000,                  /*   color 06: orange        */
        !           175:     0x40ff80,                  /*   color 07: sea green     */
        !           176:     0x2020c0,                  /*   color 08: royal blue    */
        !           177:     0x8000c0,                  /*   color 09: dark violet   */
        !           178:     /* please note: these colors are optimized for web216 compatibility */
        !           179:     0x006080,                  /* DeepSkyBlue4 */
        !           180:     0x008000,                  /* green4 */
        !           181:     0x008040,                  /* SpringGreen4 */
        !           182:     0x008080,                  /* dark cyan, turquoise4 */
        !           183:     0x00c060,                  /* SpringGreen3 */
        !           184:     0x00c0c0,                  /* cyan3, turquoise3 */
        !           185:     0x00ff00,                  /* green */
        !           186:     0x208020,                  /* forest green */
        !           187:     0x306080,                  /* SteelBlue4 */
        !           188:     0x404040,                  /* grey25-31 */
        !           189:     0x408000,                  /* chartreuse4 */
        !           190:     0x000080,                  /* dark blue, navy blue */
        !           191:     0x806000,                  /* DarkGoldenrod4 */
        !           192:     0x806010,                  /* goldenrod4 */
        !           193:     0x806060,                  /* pink4 */
        !           194:     0x806080,                  /* plum4 */
        !           195:     0x0000c0,                  /* medium blue */
        !           196:     0x0000ff,                  /* blue */
        !           197:     0x006000,                  /* dark green */
        !           198:     0x40c080,                  /* SeaGreen3 */
        !           199:     0x60a0c0,                  /* SkyBlue3 */
        !           200:     0x60c000,                  /* chartreuse3 */
        !           201:     0x60c0a0,                  /* medium aquamarine */
        !           202:     0x800000,                  /* dark red */
        !           203:     0x800080,                  /* dark magenta */
        !           204:     0x602080,                  /* DarkOrchid4 */
        !           205:     0x606060,                  /* dim grey */
        !           206:     0x00ffff,                  /* cyan1, turquoise1 */
        !           207:     0x202020,                  /* grey13-18 */
        !           208:     0x204040,                  /* dark slate grey */
        !           209:     0x204080,                  /* RoyalBlue4 */
        !           210:     0x608020,                  /* olive drab */
        !           211:     0x608060,                  /* DarkSeaGreen4 */
        !           212:     0x608080,                  /* LightBlue4, PaleTurquoise4 */
        !           213:     0x808040,                  /* LightGoldenrod4, khaki4 */
        !           214:     0x808080,                  /* grey51-56 */
        !           215:     0xa0a0a0,                  /* dark grey, grey63-68 */
        !           216:     0xa0d0e0,                  /* light blue */
        !           217:     0xc02020,                  /* firebrick3 */
        !           218:     0xc06000,                  /* DarkOrange3 */
        !           219:     0x80c0e0,                  /* sky blue */
        !           220:     0xc060c0,                  /* orchid3 */
        !           221:     0xc08000,                  /* orange3 */
        !           222:     0xc08060,                  /* LightSalmon3 */
        !           223:     0xff4000,                  /* orange red */
        !           224:     0xff4040,                  /* brown1, tomato */
        !           225:     0x80c0ff,                  /* light sky blue */
        !           226:     0xff8060,                  /* salmon */
        !           227:     0xff8080,                  /* light coral */
        !           228:     0xc0a000,                  /* gold3 */
        !           229:     0xc0c0c0,                  /* grey76-81, honeydew3, ivory3, snow3 */
        !           230:     0xc0ffc0,                  /* DarkSeaGreen1 */
        !           231:     0xff0000,                  /* red */
        !           232:     0xff00ff,                  /* magenta */
        !           233:     0xff80a0,                  /* PaleVioletRed1 */
        !           234:     0xff80ff,                  /* orchid1 */
        !           235:     0xc0c0a0,                  /* LemonChiffon3 */
        !           236:     0xff6060,                  /* IndianRed1 */
        !           237:     0xff8000,                  /* dark orange */
        !           238:     0xffa000,                  /* orange */
        !           239:     0x80e0e0,                  /* CadetBlue2, DarkSlateGray2 */
        !           240:     0xa0e0e0,                  /* pale turquoise */
        !           241:     0xa0ff20,                  /* green yellow */
        !           242:     0xc00000,                  /* red3 */
        !           243:     0xc000c0,                  /* magenta3 */
        !           244:     0xa02020,                  /* brown */
        !           245:     0xa020ff,                  /* purple */
        !           246:     0x802000,                  /* OrangeRed4 */
        !           247:     0x802020,                  /* brown4 */
        !           248:     0x804000,                  /* DarkOrange4 */
        !           249:     0x804020,                  /* sienna4 */
        !           250:     0x804080,                  /* orchid4 */
        !           251:     0x8060c0,                  /* MediumPurple3 */
        !           252:     0x8060ff,                  /* SlateBlue1 */
        !           253:     0x808000,                  /* yellow4 */
        !           254:     0xa080ff,                  /* MediumPurple1 */
        !           255:     0xc06080,                  /* PaleVioletRed3 */
        !           256:     0xc0c000,                  /* yellow3 */
        !           257:     0xff8040,                  /* sienna1 */
        !           258:     0xffa040,                  /* tan1 */
        !           259:     0xffa060,                  /* sandy brown */
        !           260:     0xffa070,                  /* light salmon */
        !           261:     0xffc020,                  /* goldenrod1 */
        !           262:     0xffc0c0,                  /* RosyBrown1, pink */
        !           263:     0xffff00,                  /* yellow */
        !           264:     0xffff80,                  /* khaki1 */
        !           265:     0xffffc0                   /* lemon chiffon */
        !           266: };
        !           267: #define GIF_N_DEFAULT_COLORS (sizeof(gif_color_rgbs)/sizeof(gif_color_rgbs[0]))
        !           268:
        !           269: /*
        !           270:  * _options()  Called when terminal type is selected.
        !           271:  * This procedure should parse options on the command line.  A list of the
        !           272:  * currently selected options should be stored in term_options[] in a form
        !           273:  * suitable for use with the set term command.  term_options[] is used by
        !           274:  * the save command.  Use options_null() if no options are available.
        !           275:  */
        !           276: TERM_PUBLIC void GIF_options()
        !           277: {
        !           278:     int gif_font, i;
        !           279:     term_options[0] = NUL;
        !           280:     gif_state.n_colors = 0;
        !           281:     gif_state.flags = 0;
        !           282:     gif_font = 1;
        !           283:     GIF_font = gdfont;
        !           284:
        !           285:     while (!END_OF_COMMAND) {
        !           286:        if (almost_equals(c_token, "t$ransparent")) {
        !           287:            gif_state.flags |= GIF_USE_TRANSPARENT;
        !           288:            ++c_token;
        !           289:        } else if (almost_equals(c_token, "i$nterlace")) {
        !           290:            gif_state.flags |= GIF_USE_INTERLACE;
        !           291:            ++c_token;
        !           292:        } else if (almost_equals(c_token, "s$mall")) {
        !           293:            GIF_font = gdFontSmall;
        !           294:            gif_font = 1;
        !           295:            term->v_char = (unsigned int) (12);
        !           296:            term->h_char = (unsigned int) (6);
        !           297:            ++c_token;
        !           298:        } else if (almost_equals(c_token, "m$edium")) {
        !           299:            GIF_font = gdFontMediumBold;
        !           300:            gif_font = 2;
        !           301:            term->v_char = (unsigned int) (13);
        !           302:            term->h_char = (unsigned int) (7);
        !           303:            ++c_token;
        !           304:        } else if (almost_equals(c_token, "l$arge")) {
        !           305:            GIF_font = gdFontLarge;
        !           306:            gif_font = 3;
        !           307:            term->v_char = (unsigned int) (16);
        !           308:            term->h_char = (unsigned int) (8);
        !           309:            ++c_token;
        !           310:        } else if (almost_equals(c_token, "si$ze")) {
        !           311:            struct value s;
        !           312:            c_token++;
        !           313:            if (END_OF_COMMAND) {
        !           314:                GIF_XMAX = GREG_XMAX;
        !           315:                GIF_YMAX = GREG_YMAX;
        !           316:                term->v_tic = GIF_YMAX / 80;
        !           317:                term->h_tic = GIF_XMAX / 80;
        !           318:            } else {
        !           319:                GIF_XMAX = real(const_express(&s));
        !           320:                if (equals(c_token, ",")) {
        !           321:                    c_token++;
        !           322:                    GIF_YMAX = real(const_express(&s));
        !           323:                    term->v_tic = GIF_YMAX / 80;
        !           324:                    term->h_tic = GIF_XMAX / 80;
        !           325:                    term->ymax = GIF_YMAX;
        !           326:                    term->xmax = GIF_XMAX;
        !           327:                }
        !           328:            }
        !           329:        } else {                /* not "size" */
        !           330:            char *string = input_line + token[c_token].start_index;
        !           331:            unsigned long color;
        !           332:            if (sscanf(string, "x%lx", &color) != 1) {
        !           333:                int_error("invalid color spec, must be xRRGGBB", c_token);
        !           334:            } else if (gif_state.n_colors == GIF_MAX_COLORS) {
        !           335:                int_warn("too many colors, ingoring", c_token);
        !           336:                ++c_token;
        !           337:            } else {
        !           338:                gif_state.rgb_table[gif_state.n_colors++] = color;
        !           339:                ++c_token;
        !           340:            }
        !           341:        }
        !           342:     }
        !           343:
        !           344:
        !           345:     /* now generate options string */
        !           346:
        !           347:     if (gif_state.flags & GIF_USE_TRANSPARENT) {
        !           348:        strcat(term_options, "transparent ");
        !           349:     }
        !           350:     if (gif_state.flags & GIF_USE_INTERLACE) {
        !           351:        strcat(term_options, "interlace ");
        !           352:     }
        !           353:     switch (gif_font) {
        !           354:     case 1:
        !           355:        strcat(term_options, "small ");
        !           356:        break;
        !           357:     case 2:
        !           358:        strcat(term_options, "medium ");
        !           359:        break;
        !           360:     case 3:
        !           361:        strcat(term_options, "large ");
        !           362:        break;
        !           363:     }
        !           364:     sprintf(term_options + strlen(term_options),
        !           365:            "size %d,%d ", GIF_XMAX, GIF_YMAX);
        !           366:
        !           367:     for (i = 0; i < gif_state.n_colors; i++) {
        !           368:        sprintf(term_options + strlen(term_options),
        !           369:                "x%06x ", gif_state.rgb_table[i]);
        !           370:     }
        !           371: }
        !           372:
        !           373:
        !           374: /*
        !           375:  * _init()  Called once, when the device is first selected.  This procedure
        !           376:  * should set up things that only need to be set once, like handshaking and
        !           377:  * character sets etc...
        !           378:  */
        !           379: TERM_PUBLIC void GIF_init()
        !           380: {
        !           381:     gif_state.linetype = 0;
        !           382: }
        !           383:
        !           384: /*
        !           385:  * _reset()  Called when gnuplot is exited, the output device changed or
        !           386:  * the terminal type changed.  This procedure should reset the device,
        !           387:  * possibly flushing a buffer somewhere or generating a form feed.
        !           388:  */
        !           389: TERM_PUBLIC void GIF_reset()
        !           390: {
        !           391: }
        !           392:
        !           393: /*
        !           394:  * _graphics()  Called just before a plot is going to be displayed.  This
        !           395:  * procedure should set the device into graphics mode.  Devices which can't
        !           396:  * be used as terminals (like plotters) will probably be in graphics mode
        !           397:  * always and therefore won't need this.
        !           398:  */
        !           399: TERM_PUBLIC void GIF_graphics()
        !           400: {
        !           401:     int i;
        !           402:     unsigned int rgb;
        !           403:     gif_state.font = GIF_font;
        !           404:     gif_state.color = 0;
        !           405:     gif_state.image = gdImageCreate((int) (xsize * GIF_XMAX),
        !           406:                                    (int) (ysize * GIF_YMAX));
        !           407:     gif_state.height = (int) (ysize * GIF_YMAX);
        !           408:     gif_state.charw = term->h_char;    /* gif_state.font->w; */
        !           409:     gif_state.charh = term->v_char;    /* gif_state.font->h; */
        !           410:     for (i = gif_state.n_colors; i < GIF_N_DEFAULT_COLORS; i++)
        !           411:        gif_state.rgb_table[i] = gif_color_rgbs[i];
        !           412:     if (gif_state.n_colors < GIF_N_DEFAULT_COLORS)
        !           413:        gif_state.n_colors = GIF_N_DEFAULT_COLORS;
        !           414:     for (i = 0; i < gif_state.n_colors; i++) {
        !           415:        rgb = gif_state.rgb_table[i];
        !           416:        gif_state.color_table[i] =
        !           417:            gdImageColorAllocate(gif_state.image, (rgb >> 16) & 0xff,
        !           418:                                 (rgb >> 8) & 0xff, rgb & 0xff);
        !           419:     }
        !           420:     if (gif_state.flags & GIF_USE_TRANSPARENT)
        !           421:        gdImageColorTransparent(gif_state.image,
        !           422:                                gif_state.color_table[0]);
        !           423:     else
        !           424:        gdImageColorTransparent(gif_state.image, -1);
        !           425: }
        !           426:
        !           427: /*
        !           428:  * _text()  Called immediately after a plot is displayed.  This procedure
        !           429:  * should set the device back into text mode if it is also a terminal, so
        !           430:  * that commands can be seen as they're typed.  Again, this will probably
        !           431:  * do nothing if the device can't be used as a terminal.
        !           432:  */
        !           433: TERM_PUBLIC void GIF_text()
        !           434: {
        !           435:     if (gif_state.flags & GIF_USE_INTERLACE)
        !           436:        gdImageInterlace(gif_state.image, 1);
        !           437:     gdImageGif(gif_state.image, gpoutfile);
        !           438:     gdImageDestroy(gif_state.image);
        !           439: }
        !           440:
        !           441: /* _move(x,y)  Called at the start of a line.  The cursor should move to the
        !           442:  * (x,y) position without drawing.
        !           443:  */
        !           444: TERM_PUBLIC void GIF_move(unsigned int x, unsigned int y)
        !           445: {
        !           446:     gif_state.x = x;
        !           447:     gif_state.y = y;
        !           448: }
        !           449:
        !           450: /* _vector(x,y)  Called when a line is to be drawn.  This should display a line
        !           451:  * from the last (x,y) position given by _move() or _vector() to this new (x,y)
        !           452:  * position.
        !           453:  */
        !           454: TERM_PUBLIC void GIF_vector(unsigned int x, unsigned int y)
        !           455: {
        !           456:     int gif_linetype_dotted[5];
        !           457:
        !           458:     if (gif_state.linetype == -1) {
        !           459:        gif_linetype_dotted[0] = gif_state.color_table[2];
        !           460:        gif_linetype_dotted[1] = gif_state.color_table[2];
        !           461:        gif_linetype_dotted[2] = gif_state.color_table[0];
        !           462:        gif_linetype_dotted[3] = gif_state.color_table[0];
        !           463:        gif_linetype_dotted[4] = gif_state.color_table[0];
        !           464:
        !           465:        gdImageSetStyle(gif_state.image, gif_linetype_dotted, 5);
        !           466:        gdImageLine(gif_state.image, gif_state.x, gif_state.height - gif_state.y,
        !           467:                    x, gif_state.height - y, gdStyled);
        !           468:     } else {
        !           469:        gdImageLine(gif_state.image, gif_state.x, gif_state.height - gif_state.y,
        !           470:                    x, gif_state.height - y, gif_state.color);
        !           471:     }
        !           472:     gif_state.x = x;
        !           473:     gif_state.y = y;
        !           474: }
        !           475:
        !           476: /* _linetype(lt)  Called to set the line type before text is displayed or
        !           477:  * line(s) plotted.  This procedure should select a pen color or line
        !           478:  * style if the device has these capabilities.
        !           479:  * lt is an integer from -2 to 0 or greater.
        !           480:  * An lt of -2 is used for the border of the plot.
        !           481:  * An lt of -1 is used for the X and Y axes.
        !           482:  * lt 0 and upwards are used for plots 0 and upwards.
        !           483:  * If _linetype() is called with lt greater than the available line types,
        !           484:  * it should map it to one of the available line types.
        !           485:  * Most drivers provide 9 different linetypes (lt is 0 to 8).
        !           486:  */
        !           487: TERM_PUBLIC void GIF_linetype(int type)
        !           488: {
        !           489:     if (type >= (gif_state.n_colors - 3))
        !           490:        type %= (gif_state.n_colors - 3);
        !           491:
        !           492:     gif_state.color = gif_state.color_table[type + 3];
        !           493:     gif_state.linetype = type;
        !           494: }
        !           495:
        !           496: /* _put_text(x,y,str)  Called to display text at the (x,y) position,
        !           497:  * while in graphics mode.   The text should be vertically (with respect
        !           498:  * to the text) justified about (x,y).  The text is rotated according
        !           499:  * to _text_angle and then horizontally (with respect to the text)
        !           500:  * justified according to _justify_text.
        !           501:  */
        !           502: TERM_PUBLIC void GIF_put_text(unsigned int x, unsigned int y, char *string)
        !           503: {
        !           504:     if (gif_state.angle == 1) {
        !           505:        x -= gif_state.charh / 2;
        !           506:        gdImageStringUp(gif_state.image, gif_state.font,
        !           507:                        x, gif_state.height - y,
        !           508:                        string, gif_state.color);
        !           509:     } else {
        !           510:        y += gif_state.charh / 2;
        !           511:        gdImageString(gif_state.image, gif_state.font,
        !           512:                      x, gif_state.height - y,
        !           513:                      string, gif_state.color);
        !           514:     }
        !           515: }
        !           516:
        !           517: /* _text_angle(ang)  Called to rotate the text angle when placing the y label.
        !           518:  * If ang = 0 then text is horizontal.  If ang = 1 then text is vertically
        !           519:  * upwards.  Returns TRUE if text can be rotated, FALSE otherwise.
        !           520:  */
        !           521: TERM_PUBLIC int GIF_text_angle(int ang)
        !           522: {
        !           523:     gif_state.angle = ang;
        !           524:     return TRUE;
        !           525: }
        !           526:
        !           527: /*
        !           528:  * Local Variables:
        !           529:  * mode:C
        !           530:  * End:
        !           531:  */
        !           532:
        !           533: #endif /* TERM_BODY */
        !           534: #ifdef TERM_TABLE
        !           535:
        !           536: TERM_TABLE_START(gif_driver)
        !           537:     "gif", "GIF format [mode] [fontsize] [size] [colors]",
        !           538:     GREG_XMAX, GREG_YMAX, GIF_VCHAR, GIF_HCHAR,
        !           539:     GIF_VTIC, GIF_HTIC, GIF_options, GIF_init, GIF_reset,
        !           540:     GIF_text, null_scale, GIF_graphics, GIF_move, GIF_vector,
        !           541:     GIF_linetype, GIF_put_text, GIF_text_angle,
        !           542:     null_justify_text, do_point, do_arrow, set_font_null,
        !           543:     0,                         /* pointsize */
        !           544:     TERM_CAN_MULTIPLOT | TERM_BINARY
        !           545: TERM_TABLE_END(gif_driver)
        !           546:
        !           547: #undef LAST_TERM
        !           548: #define LAST_TERM gif_driver
        !           549:
        !           550: #endif /* TERM_TABLE */
        !           551: #endif /* TERM_PROTO_ONLY */
        !           552:
        !           553: #ifdef TERM_HELP
        !           554: START_HELP(gif)
        !           555: "1 gif",
        !           556: "?commands set terminal gif",
        !           557: "?set terminal gif",
        !           558: "?set term gif",
        !           559: "?terminal gif",
        !           560: "?term gif",
        !           561: "?gif",
        !           562: " The `gif` terminal driver generates output in GIF format.  It uses Thomas",
        !           563: " Boutell's gd library, which is available from http://www.boutell.com/gd/",
        !           564: "",
        !           565: " Syntax:",
        !           566: "       set terminal gif {transparent} {interlace}",
        !           567: "                        {small | medium | large}",
        !           568: "                        {size <x>,<y>}",
        !           569: "                        {<color0> <color1> <color2> ...}",
        !           570: "",
        !           571: " `transparent` instructs the driver to generate transparent GIFs.  The first",
        !           572: " color will be the transparent one.",
        !           573: "",
        !           574: " `interlace` instructs the driver to generate interlaced GIFs.",
        !           575: "",
        !           576: " The choice of fonts is `small` (6x12 pixels), `medium` (7x13 Bold) or `large`",
        !           577: " (8x16).",
        !           578: "",
        !           579: " The size <x,y> is given in pixels---it defaults to 640x480.  The number of",
        !           580: " pixels can be also modified by scaling with the `set size` command.",
        !           581: "",
        !           582: " Each color must be of the form 'xrrggbb', where x is the literal character",
        !           583: " 'x' and 'rrggbb' are the red, green and blue components in hex.  For example,",
        !           584: " 'x00ff00' is green.  The background color is set first, then the border",
        !           585: " colors, then the X & Y axis colors, then the plotting colors.  The maximum",
        !           586: " number of colors that can be set is 256.",
        !           587: "",
        !           588: " Examples:",
        !           589: "       set terminal gif small size 640,480 \\",
        !           590: "                        xffffff x000000 x404040 \\",
        !           591: "                        xff0000 xffa500 x66cdaa xcdb5cd \\",
        !           592: "                        xadd8e6 x0000ff xdda0dd x9500d3    # defaults",
        !           593: "",
        !           594: " which uses white for the non-transparent background, black for borders, gray",
        !           595: " for the axes, and red, orange, medium aquamarine, thistle 3, light blue, blue,",
        !           596: " plum and dark violet for eight plotting colors.",
        !           597: "",
        !           598: "       set terminal gif transparent xffffff \\",
        !           599: "                        x000000 x202020 x404040 x606060 \\",
        !           600: "                        x808080 xA0A0A0 xC0C0C0 xE0E0E0 \\",
        !           601: " which uses white for the transparent background, black for borders, dark",
        !           602: " gray for axes, and a gray-scale for the six plotting colors.",
        !           603: "",
        !           604: " The page size is 640x480 pixels.  The `gif` driver can create either color",
        !           605: " or monochromatic output, but you have no control over which is produced.",
        !           606: "",
        !           607: " The current version of the `gif` driver does not support animated GIFs."
        !           608: END_HELP(gif)
        !           609: #endif /* TERM_HELP */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>