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

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

1.1     ! maekawa     1: /*
        !             2:  * $Id: hp500c.trm,v 1.17 1998/04/14 00:17:48 drd Exp $
        !             3:  *
        !             4:  */
        !             5:
        !             6: /* GNUPLOT - hp500c.trm */
        !             7:
        !             8: /*[
        !             9:  * Copyright 1990 - 1993, 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:  *  hpdj 500c
        !            43:  *
        !            44:  * AUTHORS
        !            45:  *  John Engels      -- \
        !            46:  *  Russell Lang     ----> HPLJII.trm
        !            47:  *  Maurice Castro   -- /
        !            48:  *  UdoHessenauer    ----> derived this version from the above one
        !            49:  *
        !            50:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            51:  *
        !            52:  */
        !            53:
        !            54: /* The following HP Deskjet500c  driver uses generic bit mapped graphics
        !            55:    routines from bitmap.c to build up a bit map in memory.  The driver
        !            56:    interchanges colomns and lines in order to access entire lines
        !            57:    easily and returns the lines to get bits in the right order :
        !            58:    (x,y) -> (y,XMAX-1-x). */
        !            59: /* This interchange is done by calling b_makebitmap() with reversed
        !            60:    xmax and ymax, and then setting b_rastermode to TRUE.  b_setpixel()
        !            61:    will then perform the interchange before each pixel is plotted */
        !            62: /* by John Engels JENGELS@BNANDP51.BITNET, inspired by the hpljet driver
        !            63:    of Jyrki Yli-Nokari */
        !            64:
        !            65: /*
        !            66:  * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
        !            67:  */
        !            68:
        !            69: #include "driver.h"
        !            70:
        !            71: #ifdef TERM_REGISTER
        !            72: register_term(hp500c)
        !            73: #endif
        !            74:
        !            75: #ifdef TERM_PROTO
        !            76: TERM_PUBLIC void HP500Coptions __PROTO((void));
        !            77: TERM_PUBLIC void HP500Cinit __PROTO((void));
        !            78: TERM_PUBLIC void HP500Creset __PROTO((void));
        !            79: TERM_PUBLIC void HP500Clinetype __PROTO((int linetype));
        !            80: TERM_PUBLIC void HP500Cgraphics __PROTO((void));
        !            81: TERM_PUBLIC void HP500Ctext __PROTO((void));
        !            82: #define HP500Ctext_angle b_text_angle
        !            83: #define HP500Cput_text b_put_text
        !            84: #define HP500Cmove b_move
        !            85: #define HP500Cvector b_vector
        !            86: /* default values for term_tbl */
        !            87: #define HP500C_75PPI_XMAX (1920/4)
        !            88: #define HP500C_75PPI_YMAX (1920/4)
        !            89: #define HP500C_75PPI_HCHAR (1920/4/6)
        !            90: #define HP500C_75PPI_VCHAR (1920/4/10)
        !            91: #define HP500C_75PPI_VTIC 5
        !            92: #define HP500C_75PPI_HTIC 5
        !            93:
        !            94: #define GOT_HP500C_PROTO
        !            95: #endif
        !            96:
        !            97: #ifndef TERM_PROTO_ONLY
        !            98: #ifdef TERM_BODY
        !            99:
        !           100:
        !           101: /* We define 4 different print qualities : 300ppi, 150ppi, 100ppi and
        !           102:    75ppi.  (Pixel size = 1, 2, 3, 4 dots) */
        !           103:
        !           104: #define HP500C_DPP (hpdj_dpp)  /* dots per pixel */
        !           105: #define HP500C_PPI (300/HP500C_DPP)    /* pixel per inch */
        !           106: /* make XMAX and YMAX a multiple of 8 */
        !           107: #define HP500C_XMAX (8*(unsigned int)(xsize*1920/HP500C_DPP/8.0+0.9))
        !           108: #define HP500C_YMAX (8*(unsigned int)(ysize*1920/HP500C_DPP/8.0+0.9))
        !           109:
        !           110: /* Courier font with 6 lines per inch */
        !           111: #define HP500C_VCHAR (HP500C_PPI/6)
        !           112: /* Courier font with 10 caracters per inch */
        !           113: #define HP500C_HCHAR (HP500C_PPI/10)
        !           114:
        !           115:
        !           116: /* Save current cursor position */
        !           117: #define HP500C_PUSH_CURSOR fputs("\033&f0S",gpoutfile)
        !           118: /* Restore cursor position */
        !           119: #define HP500C_POP_CURSOR fputs("\033&f1S",gpoutfile)
        !           120:
        !           121: /* be sure to use courier font with 6lpi and 10cpi */
        !           122: #define HP500C_COURIER fputs("\033(0N\033(s0p10.0h12.0v0s0b3T\033&l6D",gpoutfile)
        !           123:
        !           124:
        !           125: static int HPcompress __PROTO((unsigned char *op, unsigned char *oe,
        !           126:                               unsigned char *cp));
        !           127: static unsigned char HPcomplement __PROTO((int c));
        !           128: static int HPcompress_to_TIFF __PROTO((unsigned char *op, unsigned char *oe,
        !           129:                                       unsigned char *cp));
        !           130: static int HPnocompress __PROTO((unsigned char *op, unsigned char *oe,
        !           131:                                 unsigned char *cp));
        !           132:
        !           133: static int hpdj_dpp = 4;
        !           134: static int HP_COMP_MODE = 0;
        !           135:
        !           136: /* bm_pattern not appropriate for 300ppi graphics */
        !           137: #ifndef GOT_300_PATTERN
        !           138: #define GOT_300_PATTERN
        !           139: static unsigned int b_300ppi_pattern[] =
        !           140: {
        !           141:     0xffff, 0x1111,
        !           142:     0xffff, 0x3333, 0x0f0f, 0x3f3f, 0x0fff, 0x00ff, 0x33ff
        !           143: };
        !           144: #endif
        !           145:
        !           146:
        !           147: TERM_PUBLIC void HP500Coptions()
        !           148: {
        !           149:     char opt[6];
        !           150:
        !           151: #define HPDJCERROR "expecting dots per inch size 75, 100, 150 or 300 and/or compression method"
        !           152:     while (!END_OF_COMMAND) {
        !           153:        if (token[c_token].length > 4)
        !           154:            int_error(HPDJCERROR, c_token);
        !           155:
        !           156:        /* almost_equals() won't accept numbers - use strcmp() instead */
        !           157:        capture(opt, c_token, c_token, 6);
        !           158:        if (!strcmp(opt, "75")) {
        !           159:            hpdj_dpp = 4;
        !           160:            HP_COMP_MODE = 0;
        !           161:
        !           162:        } else if (!strcmp(opt, "100")) {
        !           163:            hpdj_dpp = 3;
        !           164:            HP_COMP_MODE = 0;
        !           165:        } else if (!strcmp(opt, "150")) {
        !           166:            hpdj_dpp = 2;
        !           167:            HP_COMP_MODE = 0;
        !           168:        } else if (!strcmp(opt, "300")) {
        !           169:            hpdj_dpp = 1;
        !           170:            HP_COMP_MODE = 0;
        !           171:        } else if (!strcmp(opt, "rle")) {
        !           172:            HP_COMP_MODE = 1;
        !           173:        } else if (!strcmp(opt, "tiff")) {
        !           174:            HP_COMP_MODE = 2;
        !           175:        }
        !           176:        c_token++;
        !           177:     }
        !           178:
        !           179:     term->xmax = HP500C_XMAX;
        !           180:     term->ymax = HP500C_YMAX;
        !           181:     switch (hpdj_dpp) {
        !           182:     case 1:
        !           183:        strcpy(term_options, "300");
        !           184:        term->v_tic = 15;
        !           185:        term->h_tic = 15;
        !           186:        break;
        !           187:     case 2:
        !           188:        strcpy(term_options, "150");
        !           189:        term->v_tic = 8;
        !           190:        term->h_tic = 8;
        !           191:        break;
        !           192:     case 3:
        !           193:        strcpy(term_options, "100");
        !           194:        term->v_tic = 6;
        !           195:        term->h_tic = 6;
        !           196:        break;
        !           197:     case 4:
        !           198:        strcpy(term_options, "75");
        !           199:        term->v_tic = 5;
        !           200:        term->h_tic = 5;
        !           201:        break;
        !           202:     }
        !           203:     switch (HP_COMP_MODE) {
        !           204:     case 0:
        !           205:        strcat(term_options, " no comp");
        !           206:        break;
        !           207:     case 1:
        !           208:        strcat(term_options, " RLE");
        !           209:        break;
        !           210:     case 2:
        !           211:        strcat(term_options, " TIFF");
        !           212:        break;
        !           213:     case 3:                    /* not implemented yet */
        !           214:        strcat(term_options, " Delta Row");
        !           215:        break;
        !           216:     }
        !           217: }
        !           218:
        !           219: TERM_PUBLIC void HP500Cinit()
        !           220: {
        !           221:     /* HBB 980226: all changes to term-> fields *must* happen here, not
        !           222:      * in graphics() !*/
        !           223:     switch (hpdj_dpp) {
        !           224:     case 1:
        !           225:        b_charsize(FNT13X25);
        !           226:        term->v_char = FNT13X25_VCHAR;
        !           227:        term->h_char = FNT13X25_HCHAR;
        !           228:        break;
        !           229:     case 2:
        !           230:        b_charsize(FNT13X25);
        !           231:        term->v_char = FNT13X25_VCHAR;
        !           232:        term->h_char = FNT13X25_HCHAR;
        !           233:        break;
        !           234:     case 3:
        !           235:        b_charsize(FNT9X17);
        !           236:        term->v_char = FNT9X17_VCHAR;
        !           237:        term->h_char = FNT9X17_HCHAR;
        !           238:        break;
        !           239:     case 4:
        !           240:        b_charsize(FNT5X9);
        !           241:        term->v_char = FNT5X9_VCHAR;
        !           242:        term->h_char = FNT5X9_HCHAR;
        !           243:        break;
        !           244:     }
        !           245: }
        !           246:
        !           247: TERM_PUBLIC void HP500Creset()
        !           248: {
        !           249: #ifdef VMS
        !           250:     fflush_binary();
        !           251: #endif
        !           252: }
        !           253:
        !           254:
        !           255:
        !           256: /* HP DeskJet 500c routines */
        !           257:
        !           258: TERM_PUBLIC void HP500Clinetype(linetype)
        !           259: int linetype;
        !           260: {
        !           261:     if (linetype < 0)
        !           262:        linetype = 7;
        !           263:     else if (linetype >= 8) {
        !           264:        linetype %= 8;
        !           265:     }
        !           266:     switch (linetype) {
        !           267:     case 0:
        !           268:        linetype = 6;
        !           269:        break;
        !           270:     case 1:
        !           271:        linetype = 5;
        !           272:        break;
        !           273:     case 2:
        !           274:        linetype = 3;
        !           275:        break;
        !           276:     case 3:
        !           277:        linetype = 2;
        !           278:        break;
        !           279:     case 4:
        !           280:        linetype = 1;
        !           281:        break;
        !           282:     case 5:
        !           283:        linetype = 4;
        !           284:        break;
        !           285:     case 6:
        !           286:        linetype = 7;
        !           287:     }
        !           288:     b_setvalue(linetype);
        !           289:
        !           290: }
        !           291:
        !           292: /*
        !           293: void HP500Cpoint(x,y,value)
        !           294: int x;
        !           295: int y;
        !           296: int value;
        !           297: {
        !           298:         HP500Clinetype(value);
        !           299:         do_point(x,y,value);
        !           300: }
        !           301: */
        !           302:
        !           303: TERM_PUBLIC void HP500Cgraphics()
        !           304: {
        !           305:     /* HBB 980226: moved block of code from here to init() */
        !           306:     /* rotate plot -90 degrees by reversing XMAX and YMAX and by
        !           307:        setting b_rastermode to TRUE */
        !           308:     b_makebitmap(HP500C_YMAX, HP500C_XMAX, 3);
        !           309:     b_rastermode = TRUE;
        !           310: }
        !           311:
        !           312: /*
        !           313:  * Run-length encoding for the DeskJet. We have pairs of <count>
        !           314:  * <what>, where count goes from 0 (meaning one count) to 255
        !           315:  * this might double the size of the image.
        !           316:  */
        !           317:
        !           318: static int HPcompress(op, oe, cp)
        !           319: unsigned char *op, *oe, *cp;
        !           320: {
        !           321:     unsigned char *ce = cp;
        !           322:     while (op < oe) {
        !           323:        unsigned char prevchar;
        !           324:        unsigned char count;
        !           325:
        !           326:        prevchar = *op;         /* remember char */
        !           327:        count = 1;              /* its read the first time */
        !           328:
        !           329:        while (++op < oe && *op == prevchar && count < 255) {
        !           330:             /* set op to the next char */
        !           331:            count++;            /* and count it  */
        !           332:        }
        !           333:        *ce++ = --count;        /* were ready, so correct the count */
        !           334:        *ce++ = prevchar;       /* and store <what> */
        !           335:     }
        !           336:     *ce = 0;                   /* just to be safe   */
        !           337:     return ce - cp;            /* length of  cbufs */
        !           338: }
        !           339:
        !           340: static unsigned char HPcomplement(c)
        !           341: int c;
        !           342: {
        !           343:     return (unsigned char) (256 - c);
        !           344: }
        !           345:
        !           346:
        !           347: static int HPcompress_to_TIFF(op, oe, cp)
        !           348: unsigned char *op;             /* original pointer */
        !           349: unsigned char *oe;             /* end of orig string */
        !           350: unsigned char *cp;             /* pointer for compressed data */
        !           351: {
        !           352:     unsigned char *countposition;
        !           353:     unsigned char *ce = cp;
        !           354:     while (op < oe) {
        !           355:        unsigned char prevchar;
        !           356:        unsigned char count;
        !           357:
        !           358:        prevchar = *op;         /* gelesenes Zeichen aufbewaren */
        !           359:        count = 1;              /* bisher wurde es einmal gelesen */
        !           360:
        !           361:        while (++op < oe && *op == prevchar && count < 128) {
        !           362:            count++;
        !           363:        }
        !           364:        *ce = HPcomplement(count - 1);
        !           365:         /* remember count for building blocks of literal bytes */
        !           366:        countposition = ce++;
        !           367:        *ce++ = prevchar;
        !           368:
        !           369:        if (count < 2) {
        !           370:            while (op < oe && (prevchar != *op || *op != *(op + 1))) {
        !           371:                 /* only use rle for at leat 3 equal bytes */
        !           372:                *ce++ = *op;
        !           373:                count++;
        !           374:                prevchar = *op++;
        !           375:                if (op > oe)
        !           376:                    puts("FATAL op> oe!!\n");
        !           377:            }
        !           378:            if (op < oe && prevchar == *op) {
        !           379:                op--;
        !           380:                count--;
        !           381:                ce--;
        !           382:            }
        !           383:            *countposition = count - 1;
        !           384:        }
        !           385:     }
        !           386:     return ce - cp;
        !           387:
        !           388: }
        !           389:
        !           390: static int HPnocompress(op, oe, cp)
        !           391: unsigned char *op;
        !           392: unsigned char *oe;
        !           393: unsigned char *cp;
        !           394: {
        !           395:     unsigned char *ce = cp;
        !           396:     while (op < oe)
        !           397:        *ce++ = *op++;
        !           398:     return ce - cp;
        !           399: }
        !           400:
        !           401: /* 0 compression raster bitmap dump. Compatible with HP DeskJet 500
        !           402:    hopefully compatible with other HP Deskjet printers */
        !           403:
        !           404: TERM_PUBLIC void HP500Ctext()
        !           405: {
        !           406:     register int x, j, row, count = 0;
        !           407:     unsigned char *obuf, *oe, *cbuf, *ce;
        !           408:
        !           409:     if ((obuf = (unsigned char *) malloc(100 * b_psize)) == 0)
        !           410:        puts("FATAL!-- couldn't get enough memory for obuf");
        !           411:     if ((cbuf = (unsigned char *) malloc(400 * b_psize)) == 0)
        !           412:        puts("FATAL!-- couldn't get enough memory for cbuf");
        !           413:
        !           414:     oe = obuf;
        !           415:
        !           416:     fprintf(gpoutfile, "\
        !           417: \033*t%dR\
        !           418: \033*r1A\
        !           419: \033*b%1dM\
        !           420: \033*r%dS\
        !           421: \033*r-3U",
        !           422:            HP500C_PPI,
        !           423:            HP_COMP_MODE,
        !           424:            b_ysize);
        !           425:
        !           426:     /* dump bitmap in raster mode */
        !           427:     for (x = b_xsize - 1; x >= 0; x--) {
        !           428:        row = (b_ysize / 8) - 1;
        !           429:        for (j = row; j >= 0; j--) {
        !           430:            *oe++ = (char) (*((*b_p)[j] + x));
        !           431:        }
        !           432:        switch (HP_COMP_MODE) {
        !           433:        case 2:
        !           434:            count = HPcompress_to_TIFF(obuf, oe, cbuf);
        !           435:            break;
        !           436:        case 1:
        !           437:            count = HPcompress(obuf, oe, cbuf);
        !           438:            break;
        !           439:        case 0:
        !           440:            count = HPnocompress(obuf, oe, cbuf);
        !           441:            break;
        !           442:        }
        !           443:        fprintf(gpoutfile, "\033*b%dV", count);
        !           444:        ce = cbuf;
        !           445:        while (count--)
        !           446:            fputc(*ce++, gpoutfile);
        !           447:        oe = obuf;
        !           448:
        !           449:        for (j = row; j >= 0; j--) {
        !           450:            *oe++ = (char) (*((*b_p)[j + b_psize] + x));
        !           451:        }
        !           452:        switch (HP_COMP_MODE) {
        !           453:        case 2:
        !           454:            count = HPcompress_to_TIFF(obuf, oe, cbuf);
        !           455:            break;
        !           456:        case 1:
        !           457:            count = HPcompress(obuf, oe, cbuf);
        !           458:            break;
        !           459:        case 0:
        !           460:            count = HPnocompress(obuf, oe, cbuf);
        !           461:            break;
        !           462:
        !           463:        }
        !           464:
        !           465:        fprintf(gpoutfile, "\033*b%dV", count);
        !           466:        ce = cbuf;
        !           467:        while (count--)
        !           468:            fputc(*ce++, gpoutfile);
        !           469:        oe = obuf;
        !           470:
        !           471:        for (j = row; j >= 0; j--) {
        !           472:            *oe++ = (char) (*((*b_p)[j + (2 * b_psize)] + x));
        !           473:        }
        !           474:        switch (HP_COMP_MODE) {
        !           475:        case 2:
        !           476:            count = HPcompress_to_TIFF(obuf, oe, cbuf);
        !           477:            break;
        !           478:        case 1:
        !           479:            count = HPcompress(obuf, oe, cbuf);
        !           480:            break;
        !           481:        case 0:
        !           482:            count = HPnocompress(obuf, oe, cbuf);
        !           483:            break;
        !           484:        }
        !           485:        fprintf(gpoutfile, "\033*b%dW", count);
        !           486:        ce = cbuf;
        !           487:        while (count--)
        !           488:            fputc(*ce++, gpoutfile);
        !           489:        oe = obuf;
        !           490:
        !           491:     }
        !           492:     fputs("\033*rbC", gpoutfile);
        !           493:     free(cbuf);
        !           494:     free(obuf);
        !           495:     b_freebitmap();
        !           496:
        !           497: #ifndef VMS
        !           498:     /* most vms spoolers add a formfeed character */
        !           499:     putc('\f', gpoutfile);
        !           500: #endif /* !VMS */
        !           501: }
        !           502:
        !           503: #endif /* TERM_BODY */
        !           504:
        !           505: #ifdef TERM_TABLE
        !           506:
        !           507: TERM_TABLE_START(hp500c_driver)
        !           508:     "hp500c", "HP DeskJet 500c, [75 100 150 300] [rle tiff]",
        !           509:     HP500C_75PPI_XMAX, HP500C_75PPI_YMAX, HP500C_75PPI_VCHAR,
        !           510:     HP500C_75PPI_HCHAR, HP500C_75PPI_VTIC, HP500C_75PPI_HTIC, HP500Coptions,
        !           511:     HP500Cinit, HP500Creset, HP500Ctext, null_scale,
        !           512:     HP500Cgraphics, HP500Cmove, HP500Cvector, HP500Clinetype,
        !           513:     HP500Cput_text, HP500Ctext_angle, null_justify_text, do_point,
        !           514:     do_arrow, set_font_null, 0, TERM_BINARY
        !           515: TERM_TABLE_END(hp500c_driver)
        !           516:
        !           517: #undef LAST_TERM
        !           518: #define LAST_TERM hp500c_driver
        !           519:
        !           520: #endif /* TERM_TABLE */
        !           521: #endif /* TERM_PROTO_ONLY */
        !           522:
        !           523: #ifdef TERM_HELP
        !           524: START_HELP(hp500c)
        !           525: "1 hp500c",
        !           526: "?commands set terminal hp500c",
        !           527: "?set terminal hp500c",
        !           528: "?set term hp500c",
        !           529: "?terminal hp500c",
        !           530: "?term hp500c",
        !           531: "?hp500c",
        !           532: " The `hp500c` terminal driver supports the Hewlett Packard HP DeskJet 500c.",
        !           533: " It has options for resolution and compression.",
        !           534: "",
        !           535: " Syntax:",
        !           536: "       set terminal hp500c {<res>} {<comp>}",
        !           537: "",
        !           538: " where `res` can be 75, 100, 150 or 300 dots per inch and `comp` can be \"rle\",",
        !           539: " or \"tiff\".  Any other inputs are replaced by the defaults, which are 75 dpi",
        !           540: " and no compression.  Rasterization at the higher resolutions may require a",
        !           541: " large amount of memory."
        !           542: END_HELP(hp500c)
        !           543: #endif /* TERM_HELP */

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