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

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

1.1     ! maekawa     1: /*
        !             2:  * $Id: imagen.trm,v 1.24 1998/04/14 00:17:51 drd Exp $
        !             3:  */
        !             4:
        !             5: /* GNUPLOT - imagen.trm */
        !             6:
        !             7: /*[
        !             8:  * Copyright 1990 - 1993, 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:  *   Imagen laser printers
        !            42:  *
        !            43:  * AUTHORS
        !            44:  *   Paul E. McKenney, David Kotz
        !            45:  *   Rewritten/extended by:
        !            46:  *     Hans Olav Eggestad
        !            47:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            48:  *
        !            49:  */
        !            50:
        !            51: /*
        !            52:  * Original for direct Imagen output (but retaining many of the
        !            53:  * LaTeX extensions) by Paul E. McKenney, 1989.
        !            54:  * Further modified by David Kotz to fit into gnuplot 2.0.
        !            55:  * Information Science and Technology Division, SRI International,
        !            56:  * 333 Ravenswood Ave, Menlo Park, CA 94025.
        !            57:  * Mail to mckenney@sri.com.
        !            58:  */
        !            59: /*
        !            60:  * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
        !            61:  */
        !            62:
        !            63: #include "driver.h"
        !            64:
        !            65: #ifdef TERM_REGISTER
        !            66: register_term(imagen)
        !            67: #endif
        !            68:
        !            69: #ifdef TERM_PROTO
        !            70: TERM_PUBLIC void IMAGEN_init __PROTO((void));
        !            71: TERM_PUBLIC void IMAGEN_graphics __PROTO((void));
        !            72: TERM_PUBLIC void IMAGEN_options __PROTO((void));
        !            73: TERM_PUBLIC void IMAGEN_text __PROTO((void));
        !            74: TERM_PUBLIC void IMAGEN_linetype __PROTO((int lt));
        !            75: TERM_PUBLIC void IMAGEN_move __PROTO((unsigned int x, unsigned int y));
        !            76: TERM_PUBLIC void IMAGEN_vector __PROTO((unsigned int ux, unsigned int uy));
        !            77: TERM_PUBLIC int IMAGEN_text_angle __PROTO((int ang));
        !            78: TERM_PUBLIC int IMAGEN_justify_text __PROTO((enum JUSTIFY mode));
        !            79: TERM_PUBLIC void IMAGEN_put_text __PROTO((unsigned int x, unsigned int y, char str[]));
        !            80: TERM_PUBLIC void IMAGEN_reset __PROTO((void));
        !            81: #define IMAGEN_PTS_PER_INCH (300)
        !            82: #define IMAGEN_XMAX (IMAGEN_PTS_PER_INCH * 11) /* 10.0 inches */
        !            83: #define IMAGEN_YMAX (IMAGEN_PTS_PER_INCH * 78 / 10)    /* 7.5 inches */
        !            84: #define IMAGEN_HTIC (20)
        !            85: #define IMAGEN_VTIC (20)
        !            86: #define IMAGEN_VCHAR (IMAGEN_FONTSIZE*5)
        !            87: #define IMAGEN_HCHAR (IMAGEN_VCHAR/2)
        !            88: #endif /* TERM_PROTO */
        !            89:
        !            90: #ifndef TERM_PROTO_ONLY
        !            91: #ifdef TERM_BODY
        !            92:
        !            93: static void IM_page __PROTO((void));
        !            94: static void IMAGEN_draw_path __PROTO((void));
        !            95: static void IMAGEN_setpos __PROTO((int ux, int uy));
        !            96: static unsigned char *IMAGEN_cvts __PROTO((unsigned char *str, int *width, int *height));
        !            97: static void IMAGEN_putwd __PROTO((unsigned int w));
        !            98: static void IMAGEN_createfamily __PROTO((char *c, int sz));
        !            99: static void IMAGEN_setfont __PROTO((int sz));
        !           100: void IMP_set_draw_pattern __PROTO((int pattern, int sz));
        !           101: void IMAGEN_mapsinit __PROTO((void));
        !           102: void IMAGEN_createmap __PROTO((int name, unsigned short *map));
        !           103:
        !           104:
        !           105: /*
        !           106: #ifndef __malloc_h
        !           107: #include <malloc.h>
        !           108: #endif
        !           109: */
        !           110: #include "impcodes.h"
        !           111:
        !           112: /* default is landscape */
        !           113: #define IMAGEN_A4_H  (IMAGEN_PTS_PER_INCH * 83 / 10)
        !           114: #define IMAGEN_A4_W  (IMAGEN_PTS_PER_INCH * 116 / 10)
        !           115:
        !           116: /* width in current orientation */
        !           117: static int IMAGEN_Xmax = IMAGEN_XMAX;
        !           118: static int IMAGEN_Ymax = IMAGEN_YMAX;
        !           119:
        !           120: #define IMAGEN_FONTSIZE 12
        !           121: #define IMAGEN_FONT "cour"
        !           122:
        !           123:
        !           124: unsigned short IMP_gmap[128];
        !           125: unsigned char IMP_chmap[256];
        !           126:
        !           127: static int IMAGEN_page_h = IMAGEN_A4_H;
        !           128: static int IMAGEN_page_w = IMAGEN_A4_W;
        !           129: static int IM_win_horiz = 1;
        !           130: static int IM_win_verti = 1;
        !           131: static int IM_plot_nr = 0;
        !           132:
        !           133: static int IMAGEN_fontsize = IMAGEN_FONTSIZE;
        !           134: static int IMAGEN_familytable[36];
        !           135: static int IMAGEN_orgX;                /* absolute-pixel-ORIgin of graph page. */
        !           136: static int IMAGEN_orgY;
        !           137: static int IMAGEN_orgx;                /* absolute-pixel-ORIgin of current graph. */
        !           138: static int IMAGEN_orgy;
        !           139: static int IMAGEN_posx;                /* current drawing position (lines).    */
        !           140: static int IMAGEN_posy;
        !           141: /* static int IMAGEN_inplot; */
        !           142: static int IMAGEN_xmax = IMAGEN_XMAX;  /* width of graph in pixels.    */
        !           143: static int IMAGEN_ymax = IMAGEN_YMAX;  /* height of graph in pixels.   */
        !           144: static int IMAGEN_winx = IMAGEN_XMAX;  /* width of window in pixels.   */
        !           145: static int IMAGEN_winy = IMAGEN_YMAX;  /* height of window in pixels.  */
        !           146: static int IMAGEN_hchar;       /* Height of CHAR in current font.      */
        !           147: static int IMAGEN_wchar;       /* Width of CHAR in current font.       */
        !           148: static int IMAGEN_blofs;       /* BaseLine OFfSet from bounding box.   */
        !           149: static int IMAGEN_angle = -1;  /* 0 for horizontal text, 1 for vertical */
        !           150: static int IMAGEN_portrait;    /* 0 for landscape */
        !           151: static enum JUSTIFY IMAGEN_justify = LEFT;     /* left/center/right */
        !           152:
        !           153: #define STOREPATH 100
        !           154: unsigned int IM_xvector[STOREPATH];    /* draw path vector of x values */
        !           155: unsigned int IM_yvector[STOREPATH];    /* draw path vector of y values */
        !           156: unsigned int IM_veclen;                /* length of allocated path vector */
        !           157: unsigned int IM_vecpos = 0;    /* current pos in vector */
        !           158:
        !           159: /* char IMPdrpattern[10][10] = { {0}, {30,10,0}, {0}, {10,30,0}, {2,20,0},
        !           160:        {20,10,0}, {30,20,10,20,0}, {30,20,4,10,10,10,4,20,0}, {40,20,0}, {30,15,4,15,0}
        !           161: };
        !           162: */
        !           163:
        !           164: char IMPdrpattern[10][10] =
        !           165: {
        !           166: /* -2 */ {0},
        !           167: /* -1 */ {1, 8, 0},
        !           168: /*  0 */ {0},
        !           169: /*  1 */ {16, 4, 0},
        !           170: /*  2 */ {3, 8, 0},
        !           171: /*  3 */ {8, 8, 0},
        !           172: /*  4 */ {16, 6, 3, 6, 0},
        !           173: /*  5 */ {16, 6, 8, 6, 0},
        !           174: /*  6 */ {16, 4, 1, 4, 8, 4, 1, 4, 0},
        !           175: /*  7 */ {16, 4, 1, 8, 1, 4, 0}
        !           176: };
        !           177:
        !           178: TERM_PUBLIC void IMAGEN_init()
        !           179: {
        !           180:     register struct termentry *t = term;
        !           181:
        !           182: /* char font[10];   *//* font name */
        !           183:
        !           184:     IMAGEN_posx = IMAGEN_posy = 0;
        !           185:
        !           186:     IMAGEN_orgX = (IMAGEN_page_w - IMAGEN_Xmax) / 2;
        !           187:     IMAGEN_orgY = (IMAGEN_page_h - IMAGEN_Ymax) / 2;
        !           188:
        !           189:     IMAGEN_xmax = IMAGEN_winx = (int) (IMAGEN_Xmax / IM_win_horiz);
        !           190:     IMAGEN_ymax = IMAGEN_winy = (int) (IMAGEN_Ymax / IM_win_verti);
        !           191:
        !           192:     t->xmax = (unsigned int) (IMAGEN_xmax);
        !           193:     t->ymax = (unsigned int) (IMAGEN_ymax);
        !           194:
        !           195:     fputs("@document(language impress, paper a4)", gpoutfile);
        !           196:
        !           197:     if (IMAGEN_portrait) {
        !           198:        putc(imP_SET_ABS_V, gpoutfile);
        !           199:        IMAGEN_putwd(3520);
        !           200:     }
        !           201:     putc(imP_SET_HV_SYSTEM, gpoutfile);
        !           202:     putc(((IMAGEN_portrait ? 3 : 0) << 5) | (3 << 3) | (IMAGEN_portrait ? 0 : 5), gpoutfile);
        !           203:
        !           204:     /* sprintf(font, "cour%02d", IMAGEN_FONTSIZE); */
        !           205:     IMAGEN_mapsinit();
        !           206:     IMAGEN_createmap(1, IMP_gmap);
        !           207:     /* IMAGEN_createfamily(font, IMAGEN_FONTSIZE); */
        !           208:     IMAGEN_setfont(IMAGEN_fontsize);
        !           209:
        !           210:     IMAGEN_text_angle(0);
        !           211:
        !           212:     putc(imP_SET_ABS_H, gpoutfile);
        !           213:     IMAGEN_putwd(0);
        !           214:     putc(imP_SET_ABS_V, gpoutfile);
        !           215:     IMAGEN_putwd(0);
        !           216:
        !           217:     IMAGEN_linetype(-1);
        !           218:     /*
        !           219:        if ((IM_xvector = (unsigned int *) malloc(STOREPATH*sizeof(int))) == NULL) {
        !           220:        fputs("Imagendriver: Unable to allocate memory for draw path\n", stderr);
        !           221:        exit(1);
        !           222:        }
        !           223:        if ((IM_yvector = (unsigned int *) malloc(STOREPATH*sizeof(int))) == NULL) {
        !           224:        fputs("Imagendriver: Unable to allocate memory for draw path\n", stderr);
        !           225:        exit(1);
        !           226:        }
        !           227:      */
        !           228:     IM_veclen = STOREPATH;
        !           229:     IM_vecpos = 0;
        !           230: }
        !           231:
        !           232: static void IM_page()
        !           233: {
        !           234:     if (IM_vecpos) {
        !           235:        /* fprintf(stderr,"graphics, draw path\n"); */
        !           236:        IMAGEN_draw_path();
        !           237:     }
        !           238:     putc(imP_ENDPAGE, gpoutfile);
        !           239: }
        !           240:
        !           241: TERM_PUBLIC void IMAGEN_graphics()
        !           242: {
        !           243:     int tmpx, tmpy;
        !           244: /*    int xoff, yoff; */
        !           245:
        !           246:     if (IM_vecpos) {
        !           247:        /* fprintf(stderr,"graphics, draw path\n"); */
        !           248:        IMAGEN_draw_path();
        !           249:     }
        !           250:     if (IM_plot_nr >= (IM_win_horiz * IM_win_verti)) {
        !           251:        IM_page();
        !           252:        IM_plot_nr = 0;
        !           253:     }
        !           254:     IM_plot_nr++;
        !           255:     tmpx = IMAGEN_orgX + ((IM_plot_nr - 1) % IM_win_horiz) * IMAGEN_winx;
        !           256:     tmpy = IMAGEN_orgY + ((IM_win_verti - 1) - (int) ((IM_plot_nr - 1) / IM_win_horiz)) * IMAGEN_winy;
        !           257:     IMAGEN_orgx = tmpx + (int) ((IMAGEN_winx - IMAGEN_xmax) / 2);
        !           258:     IMAGEN_orgy = tmpy + (int) ((IMAGEN_winy - IMAGEN_ymax) / 2);
        !           259: }
        !           260:
        !           261: TERM_PUBLIC void IMAGEN_options()
        !           262: {
        !           263:     struct value a;
        !           264:
        !           265:     while (!END_OF_COMMAND) {
        !           266:        if (almost_equals(c_token, "p$ortrait")) {
        !           267:            IMAGEN_portrait = TRUE;
        !           268:            IMAGEN_page_h = IMAGEN_A4_W;
        !           269:            IMAGEN_page_w = IMAGEN_A4_H;
        !           270:            IMAGEN_Xmax = IMAGEN_YMAX;
        !           271:            IMAGEN_Ymax = IMAGEN_XMAX;
        !           272:            c_token++;
        !           273:        } else if (almost_equals(c_token, "l$andscape")) {
        !           274:            IMAGEN_portrait = FALSE;
        !           275:            c_token++;
        !           276:        } else if (equals(c_token, "[")) {      /* windows spesified */
        !           277:            c_token++;
        !           278:            /* if (IM_plot_nr>1) */
        !           279:            if (equals(c_token, "]")) {
        !           280:                IM_page();
        !           281:                c_token++;
        !           282:                continue;
        !           283:            }
        !           284:            if (END_OF_COMMAND) {
        !           285:                int_error("no. windows: [horizontal,vertical] expected", c_token);
        !           286:            } else if (!equals(c_token, ",")) {
        !           287:                IM_win_horiz = (int) real(const_express(&a));
        !           288:            }
        !           289:            if (!equals(c_token, ","))
        !           290:                int_error("',' expected", c_token);
        !           291:            c_token++;
        !           292:            if (!equals(c_token, "]")) {
        !           293:                IM_win_verti = (int) real(const_express(&a));
        !           294:            }
        !           295:            if (!equals(c_token, "]"))
        !           296:                int_error("expecting ']'", c_token);
        !           297:            c_token++;
        !           298:        } else {
        !           299:            /* We have font size specified */
        !           300:            IMAGEN_fontsize = (int) real(const_express(&a));
        !           301:            if (IMAGEN_fontsize < 8)
        !           302:                IMAGEN_fontsize = 8;
        !           303:            if (IMAGEN_fontsize > 15)
        !           304:                IMAGEN_fontsize = 15;
        !           305:        }
        !           306:     }
        !           307:     sprintf(term_options, "%d %s [%1d,%1d]", IMAGEN_fontsize, (IMAGEN_portrait) ? "portrait" :
        !           308:            "landscape", IM_win_horiz, IM_win_verti);
        !           309: }
        !           310:
        !           311:
        !           312: TERM_PUBLIC void IMAGEN_text()
        !           313: {
        !           314: }
        !           315:
        !           316:
        !           317: #define DRAW_PATTERNS 6
        !           318:
        !           319:
        !           320: TERM_PUBLIC void IMAGEN_linetype(lt)
        !           321: int lt;
        !           322: {
        !           323:     static int lastlinetype = -10;
        !           324:     int pen /*, pattern */ ;
        !           325:
        !           326:     if (IM_vecpos) {
        !           327:        /* fprintf(stderr,"move, draw path\n"); */
        !           328:        IMAGEN_draw_path();
        !           329:     }
        !           330: /* -2: axis
        !           331:    -1: border
        !           332:     0: arrow
        !           333:     1-7: graph
        !           334: */
        !           335:     if (lt == -2) {
        !           336:        pen = 4;
        !           337:     } else {
        !           338:        pen = (int) (lt / 8) * 2;
        !           339:        if (pen <= 0)
        !           340:            pen = 1;
        !           341:     }
        !           342:     lt = (lt % 8) + 2;
        !           343:
        !           344:     if (lastlinetype == lt)
        !           345:        return;
        !           346:
        !           347:     lastlinetype = lt;
        !           348:
        !           349:     putc(imP_SET_PEN, gpoutfile);
        !           350:     putc(pen, gpoutfile);
        !           351:     IMP_set_draw_pattern(lt, pen);
        !           352: }
        !           353:
        !           354:
        !           355: TERM_PUBLIC void IMAGEN_move(x, y)
        !           356: unsigned int x, y;
        !           357: {
        !           358:     if (IM_vecpos) {
        !           359:        /* fprintf(stderr,"move, draw path\n"); */
        !           360:        IMAGEN_draw_path();
        !           361:     }
        !           362:     IM_xvector[0] = x + IMAGEN_orgx;
        !           363:     IM_yvector[0] = y + IMAGEN_orgy;
        !           364:     /* fprintf(stderr,"Ny vector: startpos: %1d %1d\n",IM_xvector[0],IM_yvector[0]); */
        !           365:     IM_vecpos = 1;
        !           366:     /*
        !           367:        IMAGEN_posx = x;
        !           368:        IMAGEN_posy = y;
        !           369:      */
        !           370: }
        !           371:
        !           372: TERM_PUBLIC void IMAGEN_vector(ux, uy)
        !           373: unsigned int ux, uy;
        !           374: {
        !           375:     /* void IMAGEN_draw_path(); */
        !           376:
        !           377:     /* Store path. */
        !           378:     IM_xvector[IM_vecpos] = ux + IMAGEN_orgx;
        !           379:     IM_yvector[IM_vecpos] = uy + IMAGEN_orgy;
        !           380:     /* fprintf(stderr,"Ny node: nr: %1d; %1d %1d\n",IM_vecpos,IM_xvector[IM_vecpos],IM_yvector[IM_vecpos]);  */
        !           381:     IM_vecpos++;
        !           382:     if (IM_vecpos >= IM_veclen) {
        !           383:        IMAGEN_draw_path();
        !           384:        IM_xvector[0] = ux + IMAGEN_orgx;
        !           385:        IM_yvector[0] = uy + IMAGEN_orgy;
        !           386:        IM_vecpos = 1;
        !           387:     }
        !           388: }
        !           389:
        !           390: static void IMAGEN_draw_path()
        !           391: {
        !           392: /*    unsigned int pos; */
        !           393:     register int i;
        !           394:
        !           395:     putc(imP_CREATE_PATH, gpoutfile);
        !           396:     IMAGEN_putwd(IM_vecpos);
        !           397:     for (i = 0; i < IM_vecpos; i++) {
        !           398:        /*
        !           399:           IMAGEN_putwd(IM_xvector[i] + IMAGEN_orgx);
        !           400:           IMAGEN_putwd(IM_yvector[i] + IMAGEN_orgy);
        !           401:         */
        !           402:        IMAGEN_putwd(IM_xvector[i]);
        !           403:        IMAGEN_putwd(IM_yvector[i]);
        !           404:     }
        !           405:     IM_vecpos = 0;
        !           406:     /* Draw path with black pen. */
        !           407:
        !           408:     putc(imP_DRAW_PATH, gpoutfile);
        !           409:     putc(15, gpoutfile);
        !           410:
        !           411:     /* Set current position to end of line. */
        !           412:
        !           413:     /* IMAGEN_move(ux, uy); */
        !           414: }
        !           415:
        !           416: static void IMAGEN_setpos(ux, uy)
        !           417: int ux, uy;
        !           418: {
        !           419:     /* Set x and y position (for text), also set beginning-of-line. */
        !           420:
        !           421:     putc(imP_SET_ABS_H, gpoutfile);
        !           422:     IMAGEN_putwd(ux + IMAGEN_orgx);
        !           423:     putc(imP_SET_ABS_V, gpoutfile);
        !           424:     IMAGEN_putwd(uy + IMAGEN_orgy);
        !           425:     putc(imP_SET_BOL, gpoutfile);
        !           426:     if (IMAGEN_angle == 1)
        !           427:        IMAGEN_putwd(uy + IMAGEN_orgx);         /* vertical */
        !           428:     else
        !           429:        IMAGEN_putwd(ux + IMAGEN_orgx);         /* horizontal */
        !           430: }
        !           431:
        !           432: TERM_PUBLIC int IMAGEN_text_angle(ang)
        !           433: int ang;
        !           434: {
        !           435:
        !           436:     if (IM_vecpos) {
        !           437:        /* fprintf(stderr,"text_angle, draw path\n"); */
        !           438:        IMAGEN_draw_path();
        !           439:     }
        !           440:     if (IMAGEN_angle != ang) {
        !           441:        IMAGEN_angle = ang;     /* record for later use */
        !           442:        putc(imP_SET_ADV_DIRS, gpoutfile);
        !           443:        putc(ang == 0 ? 0 : 7, gpoutfile);      /* 0=>horiz : 7=>vert */
        !           444:     }
        !           445:     return (TRUE);
        !           446: }
        !           447:
        !           448: TERM_PUBLIC int IMAGEN_justify_text(mode)
        !           449: enum JUSTIFY mode;
        !           450: {
        !           451:     if (IM_vecpos) {
        !           452:        /* fprintf(stderr,"justify_text, draw path\n"); */
        !           453:        IMAGEN_draw_path();
        !           454:     }
        !           455:     IMAGEN_justify = mode;
        !           456:     return (TRUE);
        !           457: }
        !           458:
        !           459: static unsigned char *IMAGEN_cvts(str, width, height)
        !           460: unsigned char *str;
        !           461: int *width;
        !           462: int *height;
        !           463: {
        !           464:     unsigned char *cp1;
        !           465:     unsigned char *cp2;
        !           466:     static unsigned char *buf = NULL;
        !           467:     int h;
        !           468:     int maxw;
        !           469:     int w;
        !           470:
        !           471:     /* Free up old buffer, if there is one, get a new one.  Since       */
        !           472:     /* all transformations shorten the string, get a buffer that is     */
        !           473:     /* the same size as the input string.                               */
        !           474:
        !           475:     if (buf != NULL)
        !           476:        (void) free(buf);
        !           477:     buf = (unsigned char *) gp_alloc(strlen((char *) str), "converted label string");
        !           478:
        !           479:     /* Do the transformations. */
        !           480:
        !           481:     cp1 = str;
        !           482:     cp2 = buf;
        !           483:     h = 1;
        !           484:     maxw = 0;
        !           485:     w = 0;
        !           486:     while (strlen((char *) cp1) > 0) {
        !           487:        switch (*cp1) {
        !           488:        case ' ':               /* Space character. */
        !           489:            *cp2++ = imP_SP;
        !           490:            w++;
        !           491:            break;
        !           492:
        !           493:        case '\\':              /* Escape sequence. */
        !           494:            if (*++cp1 == '\\') {
        !           495:                /* Begin new line. */
        !           496:                h++;
        !           497:                if (w > maxw)
        !           498:                    maxw = w;
        !           499:                w = 0;
        !           500:                *cp2++ = '\n';
        !           501:                /* *cp2++ = imP_CRLF; */
        !           502:                break;
        !           503:            }
        !           504:            /* Fall through to just copy next char out. */
        !           505:
        !           506:        default:
        !           507:            /* *cp2++ = *cp1; */
        !           508:            *cp2++ = IMP_chmap[*cp1];
        !           509:            w++;
        !           510:            break;
        !           511:        }
        !           512:        cp1++;
        !           513:     }
        !           514:
        !           515:     *cp2++ = '\n';
        !           516:     *cp2 = '\0';
        !           517:     if (w > maxw)
        !           518:        maxw = w;
        !           519:
        !           520:     if (height != NULL)
        !           521:        *height = IMAGEN_angle ?
        !           522:            IMAGEN_wchar * maxw :
        !           523:            IMAGEN_hchar * h;
        !           524:     if (width != NULL)
        !           525:        *width = IMAGEN_angle ?
        !           526:            IMAGEN_hchar * h :
        !           527:            IMAGEN_wchar * maxw;
        !           528:     return (buf);
        !           529: }
        !           530:
        !           531: TERM_PUBLIC void IMAGEN_put_text(x, y, str)
        !           532: unsigned int x, y;             /* reference point of string */
        !           533: char str[];                    /* the text */
        !           534: {
        !           535:     unsigned char *cvstr, *p;
        !           536:     int height;
        !           537:     int width;
        !           538:     int sx, sy;
        !           539:
        !           540:     if (IM_vecpos) {
        !           541:        /* fprintf(stderr,"put_text, draw path\n"); */
        !           542:        IMAGEN_draw_path();
        !           543:     }
        !           544:     cvstr = IMAGEN_cvts((unsigned char *) str, &width, &height);
        !           545:
        !           546:     if (IMAGEN_angle) {                /* vertical */
        !           547:        /* x += IMAGEN_hchar; */
        !           548:        x -= width / 2 - IMAGEN_hchar;
        !           549:        /* y -= height/2; */
        !           550:     } else                     /* horizontal */
        !           551:        y += height / 2 - IMAGEN_hchar;
        !           552:
        !           553:     while ((p = (unsigned char *) strchr((char *) cvstr, '\n'))) {
        !           554:        *p = '\0';
        !           555:        sx = x;
        !           556:        sy = y;
        !           557:        if (IMAGEN_angle)
        !           558:            sx = x - IMAGEN_blofs;
        !           559:        else
        !           560:            sy = y + IMAGEN_blofs;
        !           561:
        !           562:        width = strlen((char *) cvstr) * IMAGEN_wchar;
        !           563:
        !           564:        switch (IMAGEN_justify) {
        !           565:        case LEFT:
        !           566:            break;
        !           567:        case CENTRE:
        !           568:            if (IMAGEN_angle) {
        !           569:                sy = y - width / 2;
        !           570:            } else {
        !           571:                sx = x - width / 2;
        !           572:            }
        !           573:            break;
        !           574:            /*x -= width/2; break; */
        !           575:        case RIGHT:
        !           576:            if (IMAGEN_angle) {
        !           577:                sy = y - width;
        !           578:            } else {
        !           579:                sx = x - width;
        !           580:            }
        !           581:            break;
        !           582:            /* x -= width; break; */
        !           583:        }
        !           584:
        !           585:        IMAGEN_setpos(sx, sy);
        !           586:        fputs((char *) cvstr, gpoutfile);
        !           587:        cvstr = ++p;
        !           588:        if (IMAGEN_angle) {     /* vertical */
        !           589:            x += IMAGEN_hchar;
        !           590:        } else {
        !           591:            y -= IMAGEN_hchar;
        !           592:        }
        !           593:
        !           594:     }
        !           595: }
        !           596:
        !           597: TERM_PUBLIC void IMAGEN_reset()
        !           598: {
        !           599:     if (IM_vecpos) {
        !           600:        /* fprintf(stderr,"reset, draw path\n"); */
        !           601:        IMAGEN_draw_path();
        !           602:     }
        !           603:     putc(imP_EOF, gpoutfile);
        !           604: }
        !           605:
        !           606: static void IMAGEN_putwd(w)
        !           607: unsigned int w;
        !           608: {
        !           609:     /* fprintf(stderr,"%1u\n",w); */
        !           610:     putc(w >> 8, gpoutfile);
        !           611:     putc(w, gpoutfile);
        !           612: }
        !           613:
        !           614: static void IMAGEN_createfamily(c, sz)
        !           615: char *c;
        !           616: int sz;
        !           617: {
        !           618:
        !           619:     putc(imP_CREATE_FAMILY_TABLE, gpoutfile);
        !           620:     putc(sz, gpoutfile);
        !           621:     putc(1, gpoutfile);
        !           622:     putc(1, gpoutfile);
        !           623:     /* putc(0, gpoutfile); */
        !           624:     fputs(c, gpoutfile);
        !           625:     putc(0, gpoutfile);
        !           626: }
        !           627:
        !           628: static void IMAGEN_setfont(sz)
        !           629: int sz;
        !           630: {
        !           631:     char font[20];
        !           632:
        !           633:     if (!IMAGEN_familytable[sz]) {
        !           634:        sprintf(font, "%s%02d", IMAGEN_FONT, sz);
        !           635:        IMAGEN_createfamily(font, sz);
        !           636:        IMAGEN_familytable[sz] = sz;
        !           637:     }
        !           638:     IMAGEN_hchar = sz * 5;
        !           639:     IMAGEN_wchar = IMAGEN_hchar / 2;
        !           640:     IMAGEN_blofs = IMAGEN_hchar / 3;
        !           641:     term->v_char = IMAGEN_hchar;
        !           642:     term->h_char = IMAGEN_wchar;
        !           643:     putc(imP_SET_FAMILY, gpoutfile);
        !           644:     putc(sz, gpoutfile);
        !           645:     putc(imP_SET_SP, gpoutfile);
        !           646:     IMAGEN_putwd(IMAGEN_wchar);
        !           647:     putc(imP_SET_IL, gpoutfile);
        !           648:     IMAGEN_putwd(IMAGEN_hchar);
        !           649: }
        !           650:
        !           651: void IMP_set_draw_pattern(pattern, sz)
        !           652: int pattern, sz;
        !           653: {
        !           654:     int i /*,j */ ;
        !           655:     putc(imP_SET_DRAW_PATTERN, gpoutfile);
        !           656:     putc(0, gpoutfile);
        !           657:     putc(imP_SET_DRAW_PATTERN, gpoutfile);
        !           658:     /* if ( strlen(IMPdrpattern[pattern]) == 1 ) {
        !           659:        putc(type,gpoutfile);
        !           660:        return;
        !           661:        } */
        !           662:     putc(strlen(IMPdrpattern[pattern]), gpoutfile);
        !           663:     for (i = 0; i < strlen(IMPdrpattern[pattern]); i++) {
        !           664:        IMAGEN_putwd(IMPdrpattern[pattern][i] * sz);
        !           665:     }
        !           666: }
        !           667:
        !           668:
        !           669: void IMAGEN_mapsinit()
        !           670: {
        !           671:
        !           672:     register int i /*, j */ ;
        !           673:
        !           674:     for (i = 32; i < 127; i++) {
        !           675:        IMP_gmap[i] = i;
        !           676:     }
        !           677:     IMP_gmap[1] = 225;
        !           678:     IMP_gmap[2] = 233;
        !           679:     IMP_gmap[3] = 61736;
        !           680:     IMP_gmap[4] = 241;
        !           681:     IMP_gmap[5] = 249;
        !           682:     IMP_gmap[6] = 61864;
        !           683:     IMP_gmap[7] = 162;
        !           684:     IMP_gmap[8] = 163;
        !           685:     IMP_gmap[9] = 164;
        !           686:     IMP_gmap[10] = 165;
        !           687:     IMP_gmap[11] = 167;
        !           688:     IMP_gmap[12] = 171;
        !           689:     IMP_gmap[13] = 182;
        !           690:     IMP_gmap[14] = 61346;
        !           691:     IMP_gmap[15] = 191;
        !           692:     IMP_gmap[16] = 187;
        !           693:     IMP_gmap[17] = 188;
        !           694:     IMP_gmap[18] = 189;
        !           695:     IMP_gmap[19] = 190;
        !           696:     IMP_gmap[20] = 210;
        !           697:     IMP_gmap[21] = 211;
        !           698:     IMP_gmap[22] = 251;
        !           699:     IMP_gmap[23] = 61232;
        !           700:     IMP_gmap[24] = 212;
        !           701:     IMP_gmap[25] = 137;
        !           702:     IMP_gmap[26] = 176;
        !           703:     IMP_gmap[27] = 161;
        !           704:     IMP_gmap[28] = 139;
        !           705:     IMP_gmap[29] = 133;
        !           706:     IMP_gmap[30] = 140;
        !           707:     IMP_gmap[31] = 61249;
        !           708:     IMP_gmap[32] = 8738;
        !           709:     IMP_gmap[34] = 186;
        !           710:     IMP_gmap[36] = 164;
        !           711:     IMP_gmap[39] = 185;
        !           712:     IMP_gmap[127] = 61286;
        !           713:
        !           714:     /* for (i=1;i<127;i++) fprintf(stderr,"%d -> %d\n",i,IMP_gmap[i]); */
        !           715:
        !           716:     for (i = 32; i <= 127; i++) {
        !           717:        IMP_chmap[i] = i;
        !           718:     }
        !           719:     for (i = 128; i <= 255; i++) {
        !           720:        IMP_chmap[i] = 128;     /* first map all non printable chars to SPACE */
        !           721:     }
        !           722:
        !           723:     IMP_chmap[161] = 27;
        !           724:     IMP_chmap[162] = 7;
        !           725:     IMP_chmap[163] = 8;
        !           726:     IMP_chmap[164] = 120;
        !           727:     IMP_chmap[165] = 10;
        !           728:     IMP_chmap[166] = 124;
        !           729:     IMP_chmap[167] = 11;
        !           730:     IMP_chmap[168] = 25;
        !           731:     IMP_chmap[169] = 21;
        !           732:     IMP_chmap[170] = 45;
        !           733:     IMP_chmap[171] = 12;
        !           734:     IMP_chmap[172] = 83;
        !           735:     IMP_chmap[173] = 45;
        !           736:     IMP_chmap[174] = 20;
        !           737:     IMP_chmap[175] = 126;
        !           738:     IMP_chmap[176] = 26;
        !           739:     IMP_chmap[177] = 12;
        !           740:     IMP_chmap[178] = 1;
        !           741:     IMP_chmap[179] = 2;
        !           742:     IMP_chmap[180] = 29;
        !           743:     IMP_chmap[181] = 52;
        !           744:     IMP_chmap[182] = 13;
        !           745:     IMP_chmap[183] = 5;
        !           746:     IMP_chmap[184] = 28;
        !           747:     IMP_chmap[185] = 3;
        !           748:     IMP_chmap[186] = 45;
        !           749:     IMP_chmap[187] = 16;
        !           750:     IMP_chmap[188] = 17;
        !           751:     IMP_chmap[189] = 18;
        !           752:     IMP_chmap[190] = 19;
        !           753:     IMP_chmap[191] = 15;
        !           754:     IMP_chmap[192] = 65;
        !           755:     IMP_chmap[193] = 65;
        !           756:     IMP_chmap[194] = 65;
        !           757:     IMP_chmap[195] = 65;
        !           758:     IMP_chmap[196] = 65;
        !           759:     IMP_chmap[197] = 3;
        !           760:     IMP_chmap[198] = 1;
        !           761:     IMP_chmap[199] = 67;
        !           762:     IMP_chmap[200] = 69;
        !           763:     IMP_chmap[201] = 69;
        !           764:     IMP_chmap[202] = 69;
        !           765:     IMP_chmap[203] = 69;
        !           766:     IMP_chmap[204] = 73;
        !           767:     IMP_chmap[205] = 73;
        !           768:     IMP_chmap[206] = 73;
        !           769:     IMP_chmap[207] = 73;
        !           770:     IMP_chmap[208] = 68;
        !           771:     IMP_chmap[209] = 78;
        !           772:     IMP_chmap[210] = 79;
        !           773:     IMP_chmap[211] = 79;
        !           774:     IMP_chmap[212] = 79;
        !           775:     IMP_chmap[213] = 79;
        !           776:     IMP_chmap[214] = 79;
        !           777:     IMP_chmap[215] = 13;
        !           778:     IMP_chmap[216] = 2;
        !           779:     IMP_chmap[217] = 85;
        !           780:     IMP_chmap[218] = 85;
        !           781:     IMP_chmap[219] = 85;
        !           782:     IMP_chmap[220] = 85;
        !           783:     IMP_chmap[221] = 89;
        !           784:     IMP_chmap[222] = 32;
        !           785:     IMP_chmap[223] = 22;
        !           786:     IMP_chmap[224] = 97;
        !           787:     IMP_chmap[225] = 97;
        !           788:     IMP_chmap[226] = 97;
        !           789:     IMP_chmap[227] = 97;
        !           790:     IMP_chmap[228] = 97;
        !           791:     IMP_chmap[229] = 6;
        !           792:     IMP_chmap[230] = 4;
        !           793:     IMP_chmap[231] = 99;
        !           794:     IMP_chmap[232] = 101;
        !           795:     IMP_chmap[233] = 101;
        !           796:     IMP_chmap[234] = 101;
        !           797:     IMP_chmap[235] = 101;
        !           798:     IMP_chmap[236] = 105;
        !           799:     IMP_chmap[237] = 105;
        !           800:     IMP_chmap[238] = 105;
        !           801:     IMP_chmap[239] = 105;
        !           802:     IMP_chmap[240] = 100;
        !           803:     IMP_chmap[241] = 110;
        !           804:     IMP_chmap[242] = 111;
        !           805:     IMP_chmap[243] = 111;
        !           806:     IMP_chmap[244] = 111;
        !           807:     IMP_chmap[245] = 111;
        !           808:     IMP_chmap[246] = 111;
        !           809:     IMP_chmap[247] = 10;
        !           810:     IMP_chmap[248] = 5;
        !           811:     IMP_chmap[249] = 117;
        !           812:     IMP_chmap[250] = 117;
        !           813:     IMP_chmap[251] = 117;
        !           814:     IMP_chmap[252] = 117;
        !           815:     IMP_chmap[253] = 121;
        !           816:     IMP_chmap[254] = 32;
        !           817:     IMP_chmap[255] = 121;
        !           818: }
        !           819:
        !           820: void IMAGEN_createmap(name, map)
        !           821: unsigned short *map;
        !           822: int name;
        !           823: {
        !           824:     register int i, j;
        !           825:     unsigned char s[4], *p;
        !           826:
        !           827:     p = s;
        !           828:     *p++ = imP_CREATE_MAP;
        !           829:     *p++ = name;
        !           830:     j = 0;
        !           831:     for (i = 0; i < 127; i++) {
        !           832:        if (map[i])
        !           833:            j++;
        !           834:     }
        !           835:     *p = j;
        !           836:     for (i = 0; i < 3; i++)
        !           837:        putc(s[i], gpoutfile);
        !           838:
        !           839:     s[3] = 1;
        !           840:     for (j = 0; j < 127; j++) {
        !           841:        if (map[j]) {
        !           842:            p = s;
        !           843:            *p++ = j;
        !           844:            *p++ = map[j] >> 8;
        !           845:            *p = map[j] & 255;
        !           846:            for (i = 0; i < 4; i++)
        !           847:                putc(s[i], gpoutfile);
        !           848:        }
        !           849:     }
        !           850: }
        !           851:
        !           852: #endif /* TERM_BODY */
        !           853:
        !           854: #ifdef TERM_TABLE
        !           855:
        !           856: TERM_TABLE_START(imagen_driver)
        !           857:     "imagen", "Imagen laser printer",
        !           858:     IMAGEN_XMAX, IMAGEN_YMAX, IMAGEN_VCHAR, IMAGEN_HCHAR,
        !           859:     IMAGEN_VTIC, IMAGEN_HTIC, IMAGEN_options, IMAGEN_init, IMAGEN_reset,
        !           860:     IMAGEN_text, null_scale, IMAGEN_graphics, IMAGEN_move,
        !           861:     IMAGEN_vector, IMAGEN_linetype, IMAGEN_put_text, IMAGEN_text_angle,
        !           862:     IMAGEN_justify_text, line_and_point, do_arrow, set_font_null
        !           863: TERM_TABLE_END(imagen_driver)
        !           864:
        !           865: #undef LAST_TERM
        !           866: #define LAST_TERM imagen_driver
        !           867:
        !           868: #endif /* TERM_TABLE */
        !           869: #endif /* TERM_PROTO_ONLY */
        !           870:
        !           871: #ifdef TERM_HELP
        !           872: START_HELP(imagen)
        !           873: "1 imagen",
        !           874: "?commands set terminal imagen",
        !           875: "?set terminal imagen",
        !           876: "?set term imagen",
        !           877: "?terminal imagen",
        !           878: "?term imagen",
        !           879: "?imagen",
        !           880: " The `imagen` terminal driver supports Imagen laser printers.  It is capable",
        !           881: " of placing multiple graphs on a single page.",
        !           882: "",
        !           883: " Syntax:",
        !           884: "       set terminal imagen {<fontsize>} {portrait | landscape}",
        !           885: "                           {[<horiz>,<vert>]}",
        !           886: "",
        !           887: " where `fontsize` defaults to 12 points and the layout defaults to `landscape`.",
        !           888: " `<horiz>` and `<vert>` are the number of graphs in the horizontal and",
        !           889: " vertical directions; these default to unity.",
        !           890: "",
        !           891: " Example:",
        !           892: "       set terminal imagen portrait [2,3]",
        !           893: "",
        !           894: " puts six graphs on the page in three rows of two in portrait orientation."
        !           895: END_HELP(imagen)
        !           896: #endif

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