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

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

1.1     ! maekawa     1: /*
        !             2:  * $Id: png.trm,v 1.13 1998/06/18 14:59:23 ddenholm Exp $
        !             3:  *
        !             4:  */
        !             5:
        !             6: /* GNUPLOT - png.trm */
        !             7:
        !             8: /*[
        !             9:  * Copyright 1995, 1998
        !            10:  *
        !            11:  * Permission to use, copy, and distribute this software and its
        !            12:  * documentation for any purpose with or without fee is hereby granted,
        !            13:  * provided that the above copyright notice appear in all copies and
        !            14:  * that both that copyright notice and this permission notice appear
        !            15:  * in supporting documentation.
        !            16:  *
        !            17:  * Permission to modify the software is granted, but not the right to
        !            18:  * distribute the complete modified source code.  Modifications are to
        !            19:  * be distributed as patches to the released version.  Permission to
        !            20:  * distribute binaries produced by compiling modified sources is granted,
        !            21:  * provided you
        !            22:  *   1. distribute the corresponding source modifications from the
        !            23:  *    released version in the form of a patch file along with the binaries,
        !            24:  *   2. add special version identification to distinguish your version
        !            25:  *    in addition to the base release version number,
        !            26:  *   3. provide your name and address as the primary contact for the
        !            27:  *    support of your modified version, and
        !            28:  *   4. retain our contact information in regard to use of the base
        !            29:  *    software.
        !            30:  * Permission to distribute the released version of the source code along
        !            31:  * with corresponding source modifications in the form of a patch file is
        !            32:  * granted with same provisions 2 through 4 for binary distributions.
        !            33:  *
        !            34:  * This software is provided "as is" without express or implied warranty
        !            35:  * to the extent permitted by applicable law.
        !            36: ]*/
        !            37:
        !            38: /*
        !            39:  * This file is included by ../term.c.
        !            40:  *
        !            41:  * This terminal driver supports:
        !            42:  *  png
        !            43:  *
        !            44:  * AUTHORS
        !            45:  *  Alexander Lehmann
        !            46:  *                      derived from pbm.trm by Russell Lang
        !            47:  *
        !            48:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            49:  *
        !            50:  */
        !            51:
        !            52: /* To compile this terminal driver, you need libpng and zlib, both are
        !            53:    available at ftp://ftp.uu.net/graphics/png. Remember to add the
        !            54:    include dirs and libraries to TERMFLAGS and TERMLIBS. */
        !            55:
        !            56: /* The following png drivers use the generic bit mapped graphics
        !            57:    routines from bitmap.c to build up a bit map in memory.  The driver
        !            58:    interchanges colomns and lines in order to access entire lines
        !            59:    easily and returns the lines to get bits in the right order :
        !            60:    (x,y) -> (y,XMAX-1-x). */
        !            61: /* This interchange is done by calling b_makebitmap() with reversed
        !            62:    xmax and ymax, and then setting b_rastermode to TRUE.  b_setpixel()
        !            63:    will then perform the interchange before each pixel is plotted */
        !            64:
        !            65: #include "driver.h"
        !            66:
        !            67: #ifdef TERM_REGISTER
        !            68: register_term(png_driver)
        !            69: #endif
        !            70:
        !            71: #ifdef TERM_PROTO
        !            72: TERM_PUBLIC void PNGoptions __PROTO((void));
        !            73: TERM_PUBLIC void PNGinit __PROTO((void));
        !            74: TERM_PUBLIC void PNGreset __PROTO((void));
        !            75: TERM_PUBLIC void PNGsetfont __PROTO((void));
        !            76: TERM_PUBLIC void PNGgraphics __PROTO((void));
        !            77: TERM_PUBLIC void PNGtext __PROTO((void));
        !            78: TERM_PUBLIC void PNGlinetype __PROTO((int linetype));
        !            79: TERM_PUBLIC void PNGpoint __PROTO((unsigned int x, unsigned int y, int point));
        !            80: #endif /* TERM_PROTO */
        !            81:
        !            82: #ifdef TERM_BODY
        !            83:
        !            84: #include "png.h"
        !            85:
        !            86: /* I'm not sure exactly which is the first version we work with,
        !            87:  * but I know that some older ones don't define all the symbols
        !            88:  * we use
        !            89:  */
        !            90:
        !            91: /* png version test now in configure */
        !            92:
        !            93: /* From version.c */
        !            94: extern char version[];
        !            95: extern char patchlevel[];
        !            96:
        !            97: /* make XMAX and YMAX a multiple of 8 */
        !            98: #define PNG_XMAX (640)
        !            99: #define PNG_YMAX (480)
        !           100: #define PNG_VCHAR (FNT5X9_VCHAR)
        !           101: #define PNG_HCHAR (FNT5X9_VCHAR)
        !           102: #define PNG_VTIC FNT5X9_HBITS
        !           103: #define PNG_HTIC FNT5X9_HBITS
        !           104:
        !           105: static int png_font = 1;       /* small font */
        !           106: static int png_mode = 0;       /* 0:monochrome 1:gray 2:color */
        !           107:
        !           108: /* 7=black, 0=white */
        !           109: static int png_gray[] = { 7, 1, 6, 5, 4, 3, 2, 1, 7 }; /* grays  */
        !           110: /* bit3=!intensify, bit2=!red, bit1=!green, bit0=!blue */
        !           111: static int png_color_table[] ={ 15, 8, 3, 5, 6, 4, 2, 1, 11, 13, 14 }; /* colors */
        !           112: static png_color png_palette[16];
        !           113:
        !           114: void PNGoptions()
        !           115: {
        !           116:     png_font = 1;
        !           117:     png_mode = 0;
        !           118:
        !           119:     term_options[0] = NUL;
        !           120:
        !           121:     while (!END_OF_COMMAND) {
        !           122:        if (almost_equals(c_token, "s$mall"))
        !           123:            png_font = 1;
        !           124:        else if (almost_equals(c_token, "me$dium"))
        !           125:            png_font = 2;
        !           126:        else if (almost_equals(c_token, "l$arge"))
        !           127:            png_font = 3;
        !           128:        else if (almost_equals(c_token, "mo$nochrome"))
        !           129:            png_mode = 0;
        !           130:        else if (almost_equals(c_token, "g$ray"))
        !           131:            png_mode = 1;
        !           132:        else if (almost_equals(c_token, "c$olor")
        !           133:                 || almost_equals(c_token, "c$olour"))
        !           134:            png_mode = 2;
        !           135:        else {
        !           136:            /* reset to default, since term is already set */
        !           137:            png_font = 1;
        !           138:            png_mode = 0;
        !           139:            int_error("expecting: {small, medium, large} and {monochrome, gray, color}", c_token);
        !           140:        }
        !           141:        c_token++;
        !           142:     }
        !           143:
        !           144:     /* setup options string */
        !           145:
        !           146:     switch (png_font) {
        !           147:     case 1:
        !           148:        strcat(term_options, "small");
        !           149:        break;
        !           150:     case 2:
        !           151:        strcat(term_options, "medium");
        !           152:        break;
        !           153:     case 3:
        !           154:        strcat(term_options, "large");
        !           155:        break;
        !           156:     }
        !           157:
        !           158:     switch (png_mode) {
        !           159:     case 0:
        !           160:        strcat(term_options, " monochrome");
        !           161:        break;
        !           162:     case 1:
        !           163:        strcat(term_options, " gray");
        !           164:        break;
        !           165:     case 2:
        !           166:        strcat(term_options, " color");
        !           167:        break;
        !           168:     }
        !           169: }
        !           170:
        !           171:
        !           172: void PNGinit()
        !           173: {
        !           174:     PNGsetfont();              /* HBB 980226: do this here! */
        !           175: }
        !           176:
        !           177:
        !           178: void PNGreset()
        !           179: {
        !           180: #ifdef VMS
        !           181:     fflush_binary();
        !           182: #endif /* VMS */
        !           183: }
        !           184:
        !           185:
        !           186: void PNGsetfont()
        !           187: {
        !           188:     switch (png_font) {
        !           189:     case 1:
        !           190:        b_charsize(FNT5X9);
        !           191:        term->v_char = FNT5X9_VCHAR;
        !           192:        term->h_char = FNT5X9_HCHAR;
        !           193:        term->v_tic = FNT5X9_HBITS;
        !           194:        term->h_tic = FNT5X9_HBITS;
        !           195:        break;
        !           196:     case 2:
        !           197:        b_charsize(FNT9X17);
        !           198:        term->v_char = FNT9X17_VCHAR;
        !           199:        term->h_char = FNT9X17_HCHAR;
        !           200:        term->v_tic = FNT9X17_HBITS;
        !           201:        term->h_tic = FNT9X17_HBITS;
        !           202:        break;
        !           203:     case 3:
        !           204:        b_charsize(FNT13X25);
        !           205:        term->v_char = FNT13X25_VCHAR;
        !           206:        term->h_char = FNT13X25_HCHAR;
        !           207:        term->v_tic = FNT13X25_HBITS;
        !           208:        term->h_tic = FNT13X25_HBITS;
        !           209:        break;
        !           210:     }
        !           211: }
        !           212:
        !           213:
        !           214: void PNGgraphics()
        !           215: {
        !           216:     int numplanes;
        !           217:
        !           218:     switch (png_mode) {
        !           219:     case 0:
        !           220:        numplanes = 1;
        !           221:        break;
        !           222:     case 1:
        !           223:        numplanes = 3;
        !           224:        break;
        !           225:     case 2:
        !           226:        numplanes = 4;
        !           227:        break;
        !           228:     }
        !           229:
        !           230:     /* PNGsetfont(); *//* HBB 980226: do this in init() ! */
        !           231:
        !           232:     /* rotate plot -90 degrees by reversing XMAX and YMAX and by
        !           233:        setting b_rastermode to TRUE */
        !           234:     b_makebitmap((unsigned int) (PNG_YMAX * ysize),
        !           235:                 (unsigned int) (PNG_XMAX * xsize), numplanes);
        !           236:     b_rastermode = TRUE;
        !           237:
        !           238:     if (png_mode != 0)
        !           239:        b_setlinetype(0);       /* solid lines */
        !           240: }
        !           241:
        !           242: void PNGtext()
        !           243: {
        !           244:     register int x, j, row;
        !           245:     png_structp png_ptr;
        !           246:     png_infop info_ptr;
        !           247:     register int i, value;
        !           248:     png_bytep prow;
        !           249:     int mask, plane1, plane2, plane3, plane4;
        !           250:     int red, green, blue;
        !           251:     png_text pngtext, *pngtext_copy;
        !           252:     char text[100];
        !           253:
        !           254:     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
        !           255:     if (!png_ptr) {
        !           256:        b_freebitmap();
        !           257:        return;
        !           258:     }
        !           259:     info_ptr = png_create_info_struct(png_ptr);
        !           260:     if (!info_ptr) {
        !           261:        png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
        !           262:        b_freebitmap();
        !           263:        return;
        !           264:     }
        !           265:     prow = malloc(b_ysize);
        !           266:     if (!prow) {
        !           267:        png_destroy_write_struct(&png_ptr, &info_ptr);
        !           268:        b_freebitmap();
        !           269:        return;
        !           270:     }
        !           271:     if (setjmp(png_ptr->jmpbuf)) {
        !           272:        png_destroy_write_struct(&png_ptr, &info_ptr);
        !           273:        free(prow);
        !           274:        b_freebitmap();
        !           275:        return;
        !           276:     }
        !           277:     png_info_init(info_ptr);
        !           278:     png_write_init(png_ptr);
        !           279:
        !           280:     png_init_io(png_ptr, gpoutfile);
        !           281:
        !           282:     info_ptr->width = b_ysize;
        !           283:     info_ptr->height = b_xsize;
        !           284:
        !           285:     info_ptr->bit_depth = png_mode == 0 ? 1 : 4;
        !           286:     info_ptr->color_type = png_mode == 2 ? PNG_COLOR_TYPE_PALETTE :
        !           287:        PNG_COLOR_TYPE_GRAY;
        !           288:     if (png_mode == 2) {
        !           289:        info_ptr->valid |= PNG_INFO_PLTE;
        !           290:        info_ptr->palette = png_palette;
        !           291:        info_ptr->num_palette = 16;
        !           292:     }
        !           293:     if (png_mode != 0) {
        !           294:        info_ptr->valid |= PNG_INFO_sBIT;
        !           295:        if (png_mode == 1) {
        !           296:            info_ptr->sig_bit.gray = 3;
        !           297:            png_set_shift(png_ptr, &(info_ptr->sig_bit));
        !           298:        } else {
        !           299:            info_ptr->sig_bit.red = 2;
        !           300:            info_ptr->sig_bit.green = 2;
        !           301:            info_ptr->sig_bit.blue = 2;
        !           302:        }
        !           303:     }
        !           304:     info_ptr->interlace_type = 0;
        !           305:     if (png_mode == 0)
        !           306:        png_set_invert_mono(png_ptr);
        !           307:
        !           308:     if (png_mode == 2)
        !           309:        for (i = 0; i < 16; i++) {
        !           310:            red = (i & 4) ? 1 : 3;
        !           311:            green = (i & 2) ? 1 : 3;
        !           312:            blue = (i & 1) ? 1 : 3;
        !           313:            if (i & 8) {
        !           314:                red--;
        !           315:                green--;
        !           316:                blue--;
        !           317:            }
        !           318:            png_palette[i].red = red * 85;
        !           319:            png_palette[i].green = green * 85;
        !           320:            png_palette[i].blue = blue * 85;
        !           321:        }
        !           322:     sprintf(text, "gnuplot %sversion %s patchlevel %s", OS, version, patchlevel);
        !           323:
        !           324:     pngtext.compression = -1;
        !           325:     pngtext.key = "Software";
        !           326:     pngtext.text = text;
        !           327:     pngtext.text_length = strlen(text);
        !           328:
        !           329:     pngtext_copy = malloc(sizeof(*pngtext_copy));
        !           330:     *pngtext_copy = pngtext;
        !           331:     info_ptr->num_text = 1;
        !           332:     info_ptr->text = pngtext_copy;
        !           333:
        !           334:     png_write_info(png_ptr, info_ptr);
        !           335:
        !           336:     info_ptr->num_text = 0;
        !           337:     if (info_ptr->text) free(info_ptr->text);
        !           338:     info_ptr->text = NULL;
        !           339:
        !           340:     png_set_packing(png_ptr);
        !           341:
        !           342:     /* dump bitmap in raster mode */
        !           343:     for (x = b_xsize - 1; x >= 0; x--) {
        !           344:        row = (b_ysize / 8) - 1;
        !           345:        for (j = row; j >= 0; j--) {
        !           346:            mask = 0x80;
        !           347:            plane1 = (*((*b_p)[j] + x));
        !           348:            if (png_mode != 0) {
        !           349:                plane2 = (*((*b_p)[j + b_psize] + x));
        !           350:                plane3 = (*((*b_p)[j + b_psize + b_psize] + x));
        !           351:            } else {
        !           352:                plane2 = 0;
        !           353:                plane3 = 0;
        !           354:            }
        !           355:            if (png_mode == 2)
        !           356:                plane4 = (*((*b_p)[j + b_psize + b_psize + b_psize] + x));
        !           357:            else
        !           358:                plane4 = 0;
        !           359:
        !           360:            for (i = 0; i < 8; i++) {
        !           361:                value = 0;
        !           362:                if (plane1 & mask)
        !           363:                    value += 1;
        !           364:                if (plane2 & mask)
        !           365:                    value += 2;
        !           366:                if (plane3 & mask)
        !           367:                    value += 4;
        !           368:                if (plane4 & mask)
        !           369:                    value += 8;
        !           370:                if (png_mode == 1)
        !           371:                    value = 7 - value;
        !           372:
        !           373:                prow[(row - j) * 8 + i] = (png_byte) value;
        !           374:                mask >>= 1;
        !           375:            }
        !           376:        }
        !           377:        png_write_rows(png_ptr, &prow, 1);
        !           378:     }
        !           379:
        !           380:     png_write_end(png_ptr, info_ptr);
        !           381:     png_destroy_write_struct(&png_ptr, &info_ptr);
        !           382:     free(prow);
        !           383:     b_freebitmap();
        !           384: }
        !           385:
        !           386: void PNGlinetype(linetype)
        !           387: int linetype;
        !           388: {
        !           389:     switch (png_mode) {
        !           390:     case 0:
        !           391:        b_setlinetype(linetype);
        !           392:        break;
        !           393:     case 1:
        !           394:        if (linetype >= 7)
        !           395:            linetype %= 7;
        !           396:        b_setvalue(png_gray[linetype + 2]);
        !           397:        break;
        !           398:     case 2:
        !           399:        if (linetype >= 9)
        !           400:            linetype %= 9;
        !           401:        b_setvalue(png_color_table[linetype + 2]);
        !           402:        break;
        !           403:     }
        !           404: }
        !           405:
        !           406: void PNGpoint(x, y, point)
        !           407: unsigned int x, y;
        !           408: int point;
        !           409: {
        !           410:     if (png_mode == 0)
        !           411:        line_and_point(x, y, point);
        !           412:     else
        !           413:        do_point(x, y, point);
        !           414: }
        !           415:
        !           416: #endif /* TERM_BODY */
        !           417:
        !           418: #ifdef TERM_TABLE
        !           419:
        !           420: TERM_TABLE_START(png_driver)
        !           421:     "png",
        !           422:     "Portable Network Graphics [small medium large] [monochrome gray color]",
        !           423:     PNG_XMAX, PNG_YMAX, PNG_VCHAR,
        !           424:     PNG_HCHAR, PNG_VTIC, PNG_HTIC, PNGoptions,
        !           425:     PNGinit, PNGreset, PNGtext, null_scale,
        !           426:     PNGgraphics, b_move, b_vector, PNGlinetype,
        !           427:     b_put_text, b_text_angle, null_justify_text, PNGpoint,
        !           428:     do_arrow, set_font_null,
        !           429:     0,                         /* pointsize */
        !           430:     TERM_CAN_MULTIPLOT | TERM_BINARY
        !           431: TERM_TABLE_END(png_driver)
        !           432:
        !           433: #undef LAST_TERM
        !           434: #define LAST_TERM png_driver
        !           435:
        !           436: #endif /* TERM_TABLE */
        !           437:
        !           438: #ifdef TERM_HELP
        !           439: START_HELP(png)
        !           440: "1 png",
        !           441: "?commands set terminal png",
        !           442: "?set terminal png",
        !           443: "?set term png",
        !           444: "?terminal png",
        !           445: "?term png",
        !           446: "?png",
        !           447: " The `png` terminal driver supports Portable Network Graphics.  To compile it,",
        !           448: " you will need  the third-party libraries \"libpng\" and \"zlib\"; both are",
        !           449: " available at ftp://ftp.uu.net/graphics/png.  `png` has two options.",
        !           450: "",
        !           451: " Syntax:",
        !           452: "       set terminal png {small | medium | large}",
        !           453: "                        {monochrome | gray | color}",
        !           454: "",
        !           455: " The defaults are small (fontsize) and monochrome."
        !           456: END_HELP(png)
        !           457: #endif /* TERM_HELP */

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