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

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

1.1     ! maekawa     1: /*
        !             2:  * $Id: amiga.trm,v 1.18 1998/04/14 00:17:29 drd Exp $
        !             3:  *
        !             4:  */
        !             5:
        !             6: /* GNUPLOT - amiga.trm */
        !             7:
        !             8: /*[
        !             9:  * Copyright 1991, 1992, 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:  *   Amiga Custom Screen
        !            43:  *
        !            44:  * AUTHORS
        !            45:  *   Carsten Steger
        !            46:  *
        !            47:  *   Pat R. Empleo      Slightly modified for Aztec C v5.2a (beta); sort of
        !            48:  *   08/27/91           supports overscan; for large WB 2.0 virtual screens,
        !            49:  *                      we limit the plot size so we don't have to scroll
        !            50:  *                      around (not fun).
        !            51:  *
        !            52:  *   Carsten Steger     Modified to support Kickstart 2.0.
        !            53:  *   09/11/91           Opens a text overscan screen when used with WB 2.0.
        !            54:  *                      Discerns between NTSC and PAL Amigas when used with
        !            55:  *                      WB 1.3 and lower.
        !            56:  *
        !            57:  *   Pat R. Empleo      Defined some 2.0 stuff in order to get Aztec C to
        !            58:  *   09/20/91           work with Carsten's new code (see above).  When
        !            59:  *                      KS/WB 2.0 support gets implemented in Aztec C, this
        !            60:  *                      kludge will get deleted!
        !            61:  *                      (Aztec C release 5.2 beta)
        !            62:  *
        !            63:  *   Carsten Steger     Converted to new terminal layout.
        !            64:  *   10/01/95
        !            65:  *
        !            66:  *   Lars Hecking      Add code from George Coulouris <glc5@cornell.edu> to
        !            67:  *   06/20/97          implement window option, requires AmigaOS 3.0+.
        !            68:  *                     General cleanup, better readability.
        !            69:  *
        !            70:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            71:  *
        !            72:  */
        !            73:
        !            74: #include "driver.h"
        !            75:
        !            76: #ifdef TERM_REGISTER
        !            77: register_term(amiga)
        !            78: #endif
        !            79:
        !            80: #ifdef TERM_PROTO
        !            81:
        !            82: #define AMIGA_XMAX 640
        !            83: #define AMIGA_YMAX 512
        !            84:
        !            85: #define AMIGA_VCHAR 12
        !            86: #define AMIGA_HCHAR 8
        !            87: #define AMIGA_VTIC  5
        !            88: #define AMIGA_HTIC  5
        !            89:
        !            90: TERM_PUBLIC void AMIGA_reset __PROTO((void));
        !            91: TERM_PUBLIC void AMIGA_init __PROTO((void));
        !            92: TERM_PUBLIC void AMIGA_options __PROTO((void));
        !            93: TERM_PUBLIC void AMIGA_text __PROTO((void));
        !            94: TERM_PUBLIC void AMIGA_graphics __PROTO((void));
        !            95: TERM_PUBLIC void AMIGA_move __PROTO((unsigned int x, unsigned int y));
        !            96: TERM_PUBLIC void AMIGA_vector __PROTO((unsigned int x, unsigned int y));
        !            97: TERM_PUBLIC void AMIGA_linetype __PROTO((int linetype));
        !            98: TERM_PUBLIC void AMIGA_put_text __PROTO((unsigned int x, unsigned int y, char *str));
        !            99: TERM_PUBLIC int AMIGA_justify_text __PROTO((enum JUSTIFY mode));
        !           100: TERM_PUBLIC int AMIGA_set_font __PROTO((char *font));
        !           101: TERM_PUBLIC void AMIGA_suspend __PROTO((void));
        !           102: TERM_PUBLIC void AMIGA_resume __PROTO((void));
        !           103:
        !           104: #define GOT_AMIGA_PROTO
        !           105:
        !           106: #endif /* TERM_PROTO */
        !           107:
        !           108:
        !           109: #ifndef TERM_PROTO_ONLY
        !           110:
        !           111: #ifdef TERM_BODY
        !           112:
        !           113: #ifdef AMIGA_AC_5
        !           114: #include <intuition/intuitionbase.h>
        !           115: #include <intuition/screens.h>
        !           116: #include <graphics/text.h>
        !           117: #include <graphics/gfxbase.h>
        !           118: #else
        !           119: /* You will have to use the Kickstart 2.0 header files for this to compile */
        !           120: #include <exec/types.h>
        !           121: #include <dos/dos.h>
        !           122: #include <intuition/intuitionbase.h>
        !           123: #include <graphics/gfxbase.h>
        !           124: #include <proto/intuition.h>
        !           125: #include <proto/graphics.h>
        !           126: #include <proto/exec.h>
        !           127: #include <proto/diskfont.h>
        !           128: #endif /* !AMIGA_AC_5 */
        !           129:
        !           130: #ifndef NO_ATEXIT
        !           131: void AMIGA_exit(void);
        !           132: # define ATEXIT(x) (atexit(x) != 0)
        !           133: # ifdef AMIGA_SC_6_1
        !           134: /* #  define ATEXIT(x) (onexit(x) == 0) */
        !           135: #  define RAWCON(x) rawcon(x)
        !           136: # else
        !           137: #  define RAWCON(x)            /* nought */
        !           138: # endif                                /* SAS */
        !           139: #else
        !           140: # define ATEXIT(x) 0
        !           141: #endif /* NO_ATEXIT */
        !           142:
        !           143: #ifndef RETURN_FAIL
        !           144: # define RETURN_FAIL 20
        !           145: #endif
        !           146:
        !           147: #define LIB_VERSION(LibBase)    ((LibBase)->LibNode.lib_Version)
        !           148:
        !           149: #define AMIGA_ERROR(string,rc)  {fprintf (stderr,"%s\n",string);\
        !           150:                                 AMIGA_reset (); exit (rc);}
        !           151:
        !           152: /* from plot.c */
        !           153: extern TBOOLEAN interactive;
        !           154:
        !           155: /* The origin is in the upper left hand corner, so we have to translate */
        !           156: /* and flip the coordinates: */
        !           157: #define AMIGA_VTF(y) (AMIGA_ymax-1-(y))
        !           158:
        !           159:
        !           160: /* Libraries */
        !           161: struct IntuitionBase *IntuitionBase;
        !           162: struct GfxBase *GfxBase;
        !           163: struct Library *DiskfontBase;
        !           164:
        !           165:
        !           166: /* Name of font, size in pts */
        !           167: static char AMIGA_FontName[MAX_ID_LEN+1] = "";
        !           168: static int AMIGA_FontSize;
        !           169:
        !           170:
        !           171: /* Font stuff */
        !           172: static struct TextAttr AMIGA_Font =
        !           173: {
        !           174:     "topaz.font", TOPAZ_EIGHTY, FS_NORMAL, FPF_ROMFONT
        !           175: };
        !           176: static struct TextFont *AMIGA_TextFont;
        !           177:
        !           178:
        !           179: /* Screen stuff */
        !           180: static struct NewScreen AMIGA_NewScreen =
        !           181: {
        !           182:     0, 0, AMIGA_XMAX, AMIGA_YMAX, 4, 15, 0, HIRES | LACE,
        !           183:     CUSTOMSCREEN | SCREENBEHIND | SCREENQUIET, NULL, NULL, NULL, NULL
        !           184: };
        !           185: static struct Screen *AMIGA_Screen;
        !           186: static struct TagItem AMIGA_ScrTagList[] =
        !           187: {
        !           188:     { SA_Overscan, OSCAN_TEXT },
        !           189:     { TAG_DONE, 0 }
        !           190: };
        !           191:
        !           192:
        !           193: /* Window stuff */
        !           194: /* FALSE: plot to screen; TRUE: plot to window */
        !           195: static TBOOLEAN AMIGA_window_mode = FALSE;
        !           196:
        !           197: #define AMIGA_WIN_XMAX 512
        !           198: #define AMIGA_WIN_YMAX 320
        !           199:
        !           200: static struct Window *AMIGA_Window;
        !           201: static struct TagItem AMIGA_WinTagList[] =
        !           202: {
        !           203:     { WA_InnerWidth, AMIGA_WIN_XMAX },
        !           204:     { WA_InnerHeight, AMIGA_WIN_YMAX },
        !           205:     { WA_Title, (ULONG) "gnuplot" },
        !           206:     { WA_DragBar, TRUE },
        !           207:     { WA_DepthGadget, TRUE },
        !           208:     { WA_WBenchWindow, TRUE },
        !           209:     { WA_SmartRefresh, TRUE },
        !           210:     { WA_GimmeZeroZero, TRUE },
        !           211:     { WA_AutoAdjust, TRUE },
        !           212:     { TAG_DONE, 0 }
        !           213: };
        !           214:
        !           215: /*
        !           216:  * This  is the palette.  Values are stored as 0xrrggbb, where rr, gg, and, bb
        !           217:  * are big-endian 8-bit intensities for red, green, and blue, respectively.
        !           218:  */
        !           219: static unsigned int palette[] =
        !           220: {
        !           221:     0xffffff,                  /* white */
        !           222:     0x000000,                  /* black */
        !           223:     0xff0000,                  /* red */
        !           224:     0x00ff00,                  /* green */
        !           225:     0x0000ff,                  /* blue */
        !           226:     0x00ffff,                  /* cyan */
        !           227:     0xff00ff,                  /* magenta */
        !           228:     0xffff00,                  /* yellow */
        !           229:     0x7f007f,                  /* purple */
        !           230:     0xff7f00,                  /* orange */
        !           231: };
        !           232:
        !           233: #define PALETTE_SIZE (sizeof (palette) / sizeof (unsigned int))
        !           234:
        !           235: /* This is the color look-up table, indexed in the same order as
        !           236:  * the above palette. The values stored in this table are pen numbers;
        !           237:  * e.g clut[2] is the pen which represents the color "red".
        !           238:  */
        !           239: static unsigned int clut[PALETTE_SIZE];
        !           240:
        !           241:
        !           242: /* Colors */
        !           243: static UWORD AMIGA_Colors[] =
        !           244: {
        !           245:     0x000, 0xfff, 0xbbb, 0x0f0, 0xf00, 0x00f, 0x3ca, 0xf0f,
        !           246:     0x94d, 0x0ff, 0x82f, 0xff0, 0x0af, 0xc5e, 0xfa2, 0xf44
        !           247: };
        !           248:
        !           249:
        !           250: /* Misc */
        !           251: static int AMIGA_slinetype;
        !           252: static enum JUSTIFY AMIGA_justify = LEFT;
        !           253: static unsigned int AMIGA_ymax, AMIGA_xmax;
        !           254: static WORD AMIGA_cwd, AMIGA_cht, AMIGA_bsl, AMIGA_vadj;
        !           255: /* Common RastPort */
        !           256: static struct RastPort *AMIGA_RastPort;
        !           257:
        !           258: /*
        !           259:  * Close open font, screen and libraries.
        !           260:  */
        !           261: TERM_PUBLIC void AMIGA_reset()
        !           262: {
        !           263:     if (AMIGA_window_mode == TRUE) {
        !           264:        int i = 0;
        !           265:
        !           266:        /* Free the pens */
        !           267:        while (i < PALETTE_SIZE) {
        !           268:            if (clut[i] != -1)
        !           269:                ReleasePen(AMIGA_Window->WScreen->ViewPort.ColorMap, clut[i]);
        !           270:
        !           271:            i++;
        !           272:        }
        !           273:
        !           274:        /* Close the window */
        !           275:        if (AMIGA_Window != NULL)
        !           276:            CloseWindow(AMIGA_Window);
        !           277:
        !           278:        AMIGA_Window = NULL;
        !           279:        AMIGA_window_mode = FALSE;
        !           280:     }
        !           281:     if (AMIGA_TextFont != NULL)
        !           282:        CloseFont(AMIGA_TextFont);
        !           283:
        !           284:     if (DiskfontBase != NULL)
        !           285:        CloseLibrary(DiskfontBase);
        !           286:
        !           287:     if (AMIGA_Screen != NULL)
        !           288:        CloseScreen(AMIGA_Screen);
        !           289:
        !           290:     if (IntuitionBase != NULL)
        !           291:        CloseLibrary((struct Library *) IntuitionBase);
        !           292:
        !           293:     if (GfxBase != NULL)
        !           294:        CloseLibrary((struct Library *) GfxBase);
        !           295:
        !           296:     AMIGA_TextFont = NULL;
        !           297:     DiskfontBase = NULL;
        !           298:     AMIGA_Screen = NULL;
        !           299:     IntuitionBase = NULL;
        !           300:     GfxBase = NULL;
        !           301:
        !           302:     AMIGA_RastPort = NULL;
        !           303: }
        !           304:
        !           305:
        !           306: /*
        !           307:  * Init terminal.
        !           308:  */
        !           309: TERM_PUBLIC void AMIGA_init()
        !           310: {
        !           311:     char name[MAX_ID_LEN + 1];
        !           312:
        !           313:     /* Install exit trap in case of abnormal termination (see below). */
        !           314:     if (ATEXIT(AMIGA_exit))
        !           315:        AMIGA_ERROR("Couldn't set exit trap", RETURN_FAIL);
        !           316:
        !           317:     /* Open needed libraries */
        !           318:     GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0);
        !           319:     if (GfxBase == NULL)
        !           320:        AMIGA_ERROR("No Graphics-Library", RETURN_FAIL);
        !           321:
        !           322:     IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0);
        !           323:     if (IntuitionBase == NULL)
        !           324:        AMIGA_ERROR("No Intuition-Library", RETURN_FAIL);
        !           325:
        !           326:     if (AMIGA_window_mode == TRUE) {
        !           327:        int i = 0;
        !           328:
        !           329:        /* Initialize the clut */
        !           330:        while (i < PALETTE_SIZE)
        !           331:            clut[i++] = -1;
        !           332:     }
        !           333:     if (LIB_VERSION(IntuitionBase) <= 34) {
        !           334:        /* We compute the vertical resolution for those poor NTSC-souls   :-)   */
        !           335:        if (GfxBase->DisplayFlags & PAL)
        !           336:            AMIGA_ymax = 512;
        !           337:        else
        !           338:            AMIGA_ymax = 400;
        !           339:
        !           340:        AMIGA_xmax = 640;
        !           341:        AMIGA_NewScreen.Width = AMIGA_xmax;
        !           342:        AMIGA_NewScreen.Height = AMIGA_ymax;
        !           343:
        !           344:        AMIGA_Screen = OpenScreen(&AMIGA_NewScreen);
        !           345:
        !           346:        if (AMIGA_Screen == NULL)
        !           347:            AMIGA_ERROR("No Screen", RETURN_FAIL);
        !           348:
        !           349:        AMIGA_RastPort = &AMIGA_Screen->RastPort;
        !           350:
        !           351:     } else {                   /* Intuition version > 34 */
        !           352:        /* Kickstart 2.0 support */
        !           353:        AMIGA_NewScreen.Width = STDSCREENWIDTH;
        !           354:        AMIGA_NewScreen.Height = STDSCREENHEIGHT;
        !           355:
        !           356:        if (AMIGA_window_mode != TRUE) {
        !           357:
        !           358:            AMIGA_Screen = OpenScreenTagList(&AMIGA_NewScreen, AMIGA_ScrTagList);
        !           359:
        !           360:            if (AMIGA_Screen == NULL)
        !           361:                AMIGA_ERROR("No Screen", RETURN_FAIL);
        !           362:
        !           363:            AMIGA_RastPort = &AMIGA_Screen->RastPort;
        !           364:
        !           365:            AMIGA_xmax = AMIGA_Screen->Width;
        !           366:            AMIGA_ymax = AMIGA_Screen->Height;
        !           367:        } else if (LIB_VERSION(GfxBase) >= 39) { /* AMIGA_window_mode == TRUE */
        !           368:            /* Open the plot window */
        !           369:
        !           370:            AMIGA_Window = (struct Window *)OpenWindowTagList(NULL, AMIGA_WinTagList);
        !           371:
        !           372:            /* Don't do this: fall back to screen */
        !           373:            if (AMIGA_Window == NULL)
        !           374:                AMIGA_ERROR("Could not open plot window", RETURN_FAIL);
        !           375:
        !           376:            AMIGA_RastPort = AMIGA_Window->RPort;
        !           377:
        !           378:            AMIGA_xmax = AMIGA_WIN_XMAX;
        !           379:            AMIGA_ymax = AMIGA_WIN_YMAX;
        !           380:
        !           381:        }                       /* Gfx version >= 39 */
        !           382:     }                          /* Intuition version <= 34 */
        !           383:
        !           384:     term->xmax = AMIGA_xmax;
        !           385:     term->ymax = AMIGA_ymax;
        !           386:
        !           387:     if (AMIGA_window_mode != TRUE) {
        !           388:        sprintf(name, "%s,%d", AMIGA_FontName, AMIGA_FontSize);
        !           389:        AMIGA_set_font(name);
        !           390:
        !           391:        LoadRGB4(&AMIGA_Screen->ViewPort, AMIGA_Colors, 16);
        !           392:        RemakeDisplay();
        !           393:        AMIGA_slinetype = 1;
        !           394:        SetAPen(&AMIGA_Screen->RastPort, AMIGA_slinetype);
        !           395:     } else {
        !           396:        int i, r, g, b;
        !           397:
        !           398:        AMIGA_bsl = AMIGA_Window->RPort->TxBaseline;    /* Reference line */
        !           399:        AMIGA_cht = AMIGA_Window->RPort->TxHeight;      /* Height of characters */
        !           400:
        !           401:        /* Allocate pens */
        !           402:        for (i = 0; i < PALETTE_SIZE; i++) {
        !           403:            r = (palette[i] << 8) & 0xFF000000;
        !           404:            g = (palette[i] << 16) & 0xFF000000;
        !           405:            b = (palette[i] << 24) & 0xFF000000;
        !           406:            clut[i] = ObtainBestPenA(AMIGA_Window->WScreen->ViewPort.ColorMap, r, g, b, NULL);
        !           407:        }
        !           408:
        !           409:     }
        !           410:
        !           411:     SetDrMd(AMIGA_RastPort, JAM1);
        !           412:
        !           413: }
        !           414:
        !           415:
        !           416: /*
        !           417:  * Scan terminal options
        !           418:  */
        !           419: TERM_PUBLIC void AMIGA_options()
        !           420: {
        !           421:
        !           422:     /* Screen/Window mode */
        !           423:     if (!END_OF_COMMAND) {
        !           424:        if (almost_equals(c_token, "scr$een")) {
        !           425:            AMIGA_window_mode = FALSE;
        !           426:            c_token++;
        !           427:        } else if (almost_equals(c_token, "win$dow")) {
        !           428:            AMIGA_window_mode = TRUE;
        !           429:            c_token++;
        !           430:        }
        !           431:     }
        !           432:     /* Font name */
        !           433:     if (!END_OF_COMMAND && isstring(c_token)) {
        !           434:        quote_str(AMIGA_FontName, c_token, MAX_ID_LEN);
        !           435:        c_token++;
        !           436:     }
        !           437:     /* Font size */
        !           438:     if (!END_OF_COMMAND) {
        !           439:        /* We have font size specified */
        !           440:        struct value a;
        !           441:        AMIGA_FontSize = (int) real(const_express(&a));
        !           442:     }
        !           443:     if (strcmp(AMIGA_FontName, "") == 0 && AMIGA_FontSize != 0)
        !           444:        strcpy(AMIGA_FontName, "topaz");
        !           445:
        !           446:     if (strcmp(AMIGA_FontName, "") != 0 && AMIGA_FontSize == 0)
        !           447:        AMIGA_FontSize = 8;
        !           448:
        !           449:     if (strcmp(AMIGA_FontName, "") != 0 && AMIGA_FontSize != 0) {
        !           450:        sprintf(default_font, "%s,%d", AMIGA_FontName, AMIGA_FontSize);
        !           451:        sprintf(term_options, "%s \"%s\" %d", \
        !           452:                (AMIGA_window_mode != TRUE ? "screen" : "window"), \
        !           453:                AMIGA_FontName, AMIGA_FontSize);
        !           454:     } else
        !           455:        sprintf(term_options, "%s", (AMIGA_window_mode != TRUE ? "screen" : "window"));
        !           456: }
        !           457:
        !           458:
        !           459: /*
        !           460:  *
        !           461:  */
        !           462: TERM_PUBLIC void AMIGA_text()
        !           463: {
        !           464:     if (AMIGA_window_mode != TRUE) {
        !           465:        if (interactive == TRUE) {
        !           466:            FILE *fp;
        !           467:
        !           468:            if ((fp = fopen("*", "r")) != NULL) {
        !           469:                int c = getc(fp);
        !           470:
        !           471:                ungetc(c, stdin);
        !           472:                fclose(fp);
        !           473:            }
        !           474:            ScreenToBack(AMIGA_Screen);
        !           475:        }
        !           476:     }
        !           477: }
        !           478:
        !           479:
        !           480: /*
        !           481:  *
        !           482:  */
        !           483: TERM_PUBLIC void AMIGA_graphics()
        !           484: {
        !           485:
        !           486:     SetRast(AMIGA_RastPort, 0);
        !           487:
        !           488:     if (AMIGA_window_mode == TRUE) {
        !           489:        /* clear the window */
        !           490:        SetAPen(AMIGA_Window->RPort, clut[0]);
        !           491:        RectFill(AMIGA_Window->RPort, 0, 0, 640, 400);
        !           492:        AMIGA_slinetype = clut[1];
        !           493:     }
        !           494:     SetAPen(AMIGA_RastPort, AMIGA_slinetype);
        !           495:     AMIGA_resume();
        !           496: }
        !           497:
        !           498:
        !           499: /*
        !           500:  *
        !           501:  */
        !           502: TERM_PUBLIC void AMIGA_move(x, y)
        !           503: unsigned int x, y;
        !           504: {
        !           505:     if ((x >= AMIGA_xmax) || (y >= AMIGA_ymax))
        !           506:        return;
        !           507:
        !           508:     Move(AMIGA_RastPort, x, AMIGA_VTF(y));
        !           509: }
        !           510:
        !           511:
        !           512: /*
        !           513:  *
        !           514:  */
        !           515: TERM_PUBLIC void AMIGA_vector(x, y)
        !           516: unsigned int x, y;
        !           517: {
        !           518:     if ((x >= AMIGA_xmax) || (y >= AMIGA_ymax))
        !           519:        return;
        !           520:
        !           521:     Draw(AMIGA_RastPort, x, AMIGA_VTF(y));
        !           522: }
        !           523:
        !           524:
        !           525: /*
        !           526:  *
        !           527:  */
        !           528: TERM_PUBLIC void AMIGA_linetype(linetype)
        !           529: int linetype;
        !           530: {
        !           531:     if (AMIGA_window_mode != TRUE) {
        !           532:        if (linetype >= 13)
        !           533:            linetype %= 13;
        !           534:
        !           535:        if (linetype < -2)
        !           536:            linetype = -2;
        !           537:
        !           538:        AMIGA_slinetype = linetype + 3;
        !           539:     } else {
        !           540:        if (linetype >= 0)
        !           541:            linetype = (linetype % 9) + 1;
        !           542:
        !           543:        if (linetype < 0)
        !           544:            linetype = 1;
        !           545:
        !           546:        AMIGA_slinetype = clut[linetype];
        !           547:     }
        !           548:     SetAPen(AMIGA_RastPort, AMIGA_slinetype);
        !           549: }
        !           550:
        !           551:
        !           552: /*
        !           553:  *
        !           554:  */
        !           555: TERM_PUBLIC void AMIGA_put_text(x, y, str)
        !           556: unsigned int x, y;
        !           557: char *str;
        !           558: {
        !           559:     LONG len, tx_len;
        !           560:     WORD x_min, x_max, y_min, y_max;
        !           561:
        !           562:     len = strlen(str);
        !           563:
        !           564:     tx_len = TextLength(AMIGA_RastPort, str, len);
        !           565:
        !           566:     switch (AMIGA_justify) {
        !           567:     case LEFT:
        !           568:        x_min = x;
        !           569:        x_max = x + tx_len;
        !           570:        break;
        !           571:     case CENTRE:
        !           572:        x_min = x - tx_len / 2;
        !           573:        x_max = x + tx_len - tx_len / 2;        /* avoid roundoff errors ! */
        !           574:        break;
        !           575:     default:                   /* does this make sense ?? */
        !           576:     case RIGHT:
        !           577:        x_min = x - tx_len;
        !           578:        x_max = x;
        !           579:        break;
        !           580:     }
        !           581:
        !           582:     y_min = AMIGA_VTF(y) - AMIGA_vadj;
        !           583:     y_max = y_min + AMIGA_cht;
        !           584:
        !           585:     /* Check if character-string lies completely within the screen: */
        !           586:     /* What about clipping? */
        !           587:     if ((x_max >= AMIGA_xmax) || (y_min < 0) || (y_max >= AMIGA_ymax))
        !           588:        return;
        !           589:
        !           590:     Move(AMIGA_RastPort, x_min, y_min + AMIGA_bsl);
        !           591:     Text(AMIGA_RastPort, str, len);
        !           592: }
        !           593:
        !           594:
        !           595: /*
        !           596:  *
        !           597:  */
        !           598: TERM_PUBLIC int AMIGA_justify_text(mode)
        !           599: enum JUSTIFY mode;
        !           600: {
        !           601:     AMIGA_justify = mode;
        !           602:     return TRUE;
        !           603: }
        !           604:
        !           605:
        !           606: /*
        !           607:  *
        !           608:  */
        !           609: TERM_PUBLIC int AMIGA_set_font(font)
        !           610: char *font;
        !           611: {
        !           612:     static char test_str[] =
        !           613:     " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
        !           614:     static WORD test_len, test_pxl;
        !           615:     char name[MAX_ID_LEN+1];
        !           616:     int size, sep;
        !           617:
        !           618:     /* Disable for window mode */
        !           619:     if (AMIGA_window_mode != TRUE) {
        !           620:        sep = strcspn(font, ",");
        !           621:        strncpy(name, font, sep);
        !           622:        name[sep] = NUL;
        !           623:        size = AMIGA_FontSize;
        !           624:        sscanf(&(font[sep + 1]), "%d", &size);
        !           625:
        !           626:        if (strcmp(name, "") != 0) {
        !           627:            strncat(name, ".font", MAX_ID_LEN+1);
        !           628:
        !           629:            /* Avoid opening "diskfont.library" if a built-in font is desired */
        !           630:            if ((strcmp("topaz.font", name) == 0) &&
        !           631:                ((size == TOPAZ_EIGHTY) || (size == TOPAZ_SIXTY))) {
        !           632:                AMIGA_Font.ta_Name = name;
        !           633:                AMIGA_Font.ta_YSize = size;
        !           634:                AMIGA_Font.ta_Style = FS_NORMAL;
        !           635:                AMIGA_Font.ta_Flags = FPF_ROMFONT;
        !           636:                AMIGA_TextFont = OpenFont(&AMIGA_Font);
        !           637:
        !           638:                if (AMIGA_TextFont != NULL)
        !           639:                    SetFont(&AMIGA_Screen->RastPort, AMIGA_TextFont);
        !           640:
        !           641:            } else {
        !           642:                DiskfontBase = OpenLibrary("diskfont.library", 0);
        !           643:
        !           644:                if (DiskfontBase != NULL) {
        !           645:                    AMIGA_Font.ta_Name = name;
        !           646:                    AMIGA_Font.ta_YSize = size;
        !           647:                    AMIGA_Font.ta_Style = FS_NORMAL;
        !           648:                    AMIGA_Font.ta_Flags = FPF_ROMFONT | FPF_DISKFONT;
        !           649:                    AMIGA_TextFont = OpenDiskFont(&AMIGA_Font);
        !           650:
        !           651:                    if (AMIGA_TextFont != NULL)
        !           652:                        SetFont(&AMIGA_Screen->RastPort, AMIGA_TextFont);
        !           653:                }
        !           654:            }
        !           655:        }
        !           656:        /* Width of characters: This works better for proportional fonts than */
        !           657:        /* AMIGA_Screen->RastPort.TxWidth + AMIGA_Screen->RastPort.TxSpacing */
        !           658:        test_len = strlen(test_str);
        !           659:        test_pxl = TextLength(&AMIGA_Screen->RastPort, test_str, test_len);
        !           660:
        !           661:        AMIGA_cwd = test_pxl / test_len;
        !           662:        AMIGA_cht = AMIGA_Screen->RastPort.TxHeight;    /* Height of characters */
        !           663:        AMIGA_bsl = AMIGA_Screen->RastPort.TxBaseline;  /* Reference line */
        !           664:
        !           665:        /* Amount by which characters have to be shifted upwards to be */
        !           666:        /* vertically justified: */
        !           667:        AMIGA_vadj = AMIGA_bsl / 2;
        !           668:        term->v_char = AMIGA_cht + 4;   /* So lines won't be too close */
        !           669:        term->h_char = AMIGA_cwd;
        !           670:
        !           671:     }                          /* !window_mode */
        !           672:     return TRUE;
        !           673: }
        !           674:
        !           675:
        !           676: /*
        !           677:  *
        !           678:  */
        !           679: TERM_PUBLIC void AMIGA_suspend()
        !           680: {
        !           681:     if (AMIGA_window_mode != TRUE) {
        !           682:        if (interactive == TRUE) {
        !           683:            FILE *fp;
        !           684:
        !           685:            if ((fp = fopen("*", "r")) != NULL) {
        !           686:                int c = getc(fp);
        !           687:
        !           688:                ungetc(c, stdin);
        !           689:                fclose(fp);
        !           690:            }
        !           691:            ScreenToBack(AMIGA_Screen);
        !           692:        }
        !           693:     }
        !           694: }
        !           695:
        !           696:
        !           697: /*
        !           698:  *
        !           699:  */
        !           700: TERM_PUBLIC void AMIGA_resume()
        !           701: {
        !           702:     if (AMIGA_window_mode != TRUE)
        !           703:        ScreenToFront(AMIGA_Screen);
        !           704:     else
        !           705:        WindowToFront(AMIGA_Window);
        !           706: }
        !           707:
        !           708:
        !           709: #ifndef NO_ATEXIT
        !           710: /* This function is mainly included if the program terminates abnormally
        !           711:  * and the screen and libraries are still open. It closes down all opened
        !           712:  * libraries and screens. This happens e.g. when loading "bivariat.demo"
        !           713:  * and the stack is smaller than 120000 bytes.
        !           714:  */
        !           715: void AMIGA_exit(void)
        !           716: {
        !           717:     AMIGA_reset();
        !           718:     RAWCON(0);
        !           719: }
        !           720:
        !           721: #endif /* NO_ATEXIT */
        !           722:
        !           723:
        !           724: #endif /* TERM_BODY */
        !           725:
        !           726: #ifdef TERM_TABLE
        !           727:
        !           728: TERM_TABLE_START(amiga_driver)
        !           729:     "amiga", "Amiga Custom Screen/Window [screen window]",
        !           730:     AMIGA_XMAX, AMIGA_YMAX, AMIGA_VCHAR, AMIGA_HCHAR,
        !           731:     AMIGA_VTIC, AMIGA_HTIC, AMIGA_options, AMIGA_init, AMIGA_reset,
        !           732:     AMIGA_text, null_scale, AMIGA_graphics, AMIGA_move, AMIGA_vector,
        !           733:     AMIGA_linetype, AMIGA_put_text, null_text_angle,
        !           734:     AMIGA_justify_text, do_point, do_arrow, AMIGA_set_font,
        !           735:     0,                         /* pointsize */
        !           736:     TERM_CAN_MULTIPLOT, AMIGA_suspend, AMIGA_resume
        !           737: TERM_TABLE_END(amiga_driver)
        !           738:
        !           739: #undef LAST_TERM
        !           740: #define LAST_TERM amiga_driver
        !           741:
        !           742: #endif /* TERM_TABLE */
        !           743: #endif /* TERM_PROTO_ONLY */
        !           744:
        !           745:
        !           746: #ifdef TERM_HELP
        !           747: START_HELP(amiga)
        !           748: "1 amiga",
        !           749: "?commands set terminal amiga",
        !           750: "?set terminal amiga",
        !           751: "?set term amiga",
        !           752: "?terminal amiga",
        !           753: "?term amiga",
        !           754: "?amiga",
        !           755: " The `amiga` terminal, for Commodore Amiga computers, allows the user to",
        !           756: " plot either to a screen (default), or, if Kickstart 3.0 or higher is",
        !           757: " installed, to a window on the current public screen. The font and its size",
        !           758: " can also be selected.",
        !           759: "",
        !           760: " Syntax:",
        !           761: "       set terminal amiga {screen | window} {\"<fontname>\"} {<fontsize>}",
        !           762: "",
        !           763: " The default font is 8-point \"topaz\".",
        !           764: "",
        !           765: " The screen option uses a virtual screen, so it is possible that the graph",
        !           766: " will be larger than the screen."
        !           767: END_HELP(amiga)
        !           768: #endif /* TERM_HELP */

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