/** ** demogrx.c ---- GRX Test programs launcher ** ** Copyright (C) 2000,2001 Mariano Alvarez Fernandez ** [e-mail: malfer@teleline.es] ** ** This is a test/demo file of the GRX graphics library. ** You can use GRX test/demo files as you want. ** ** The GRX graphics library is free software; you can redistribute it ** and/or modify it under some conditions; see the "copying.grx" file ** for details. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** **/ #include #include #include #include "grx20.h" #include "grxkeys.h" #include "gfaz.h" #include "drawing.h" /* default mode */ static int gwidth = 640; static int gheight = 480; static int gbpp = 16; char *wintitle = "GRX 2.4.9, the graphics library"; char *animatedtext = "GRX 2.4.9, the graphics library for DJGPPv2, Linux, X11 and Win32"; #define NDEMOS 33 #define ID_ARCTEST 1 #define ID_BB1TEST 2 #define ID_BLITTEST 3 #define ID_CIRCTEST 4 #define ID_CLIPTEST 5 #define ID_COLOROPS 6 #define ID_CURSTEST 7 #define ID_FONTTEST 8 #define ID_IMGTEST 9 #define ID_JPGTEST 10 #define ID_KEYS 11 #define ID_LIFE 12 #define ID_LINETEST 13 #define ID_MOUSETST 14 #define ID_PCIRCTST 15 #define ID_PNMTEST 16 #define ID_PNGTEST 17 #define ID_POLYTEST 18 #define ID_RGBTEST 19 #define ID_SCROLTST 20 #define ID_SBCTEST 21 #define ID_SPEEDTST 22 #define ID_TEXTPATT 23 #define ID_WINCLIP 24 #define ID_WINTEST 25 #define ID_FNTDEMO1 26 #define ID_FNTDEMO2 27 #define ID_FNTDEMO3 28 #define ID_FNTDEMO4 29 #define ID_MODETEST 50 #define ID_PAGE1 81 #define ID_PAGE2 82 #define ID_EXIT 99 typedef struct { int cid; char *prog; char *text; } ProgTable; static ProgTable ptable[NDEMOS] = { {ID_ARCTEST, "arctest", "arctest.c -> test arc outline and filled arc drawing"}, {ID_BB1TEST, "bb1test", "bb1test.c -> test GrBitBlt1bpp routine"}, {ID_BLITTEST, "blittest", "blittest.c -> test various bitblt-s"}, {ID_CIRCTEST, "circtest", "circtest.c -> test circle and ellipse rendering"}, {ID_CLIPTEST, "cliptest", "cliptest.c -> test clipping"}, {ID_COLOROPS, "colorops", "colorops.c -> test WRITE, XOR, OR, and AND draw modes"}, {ID_CURSTEST, "curstest", "curstest.c -> test cursors"}, {ID_FONTTEST, "fonttest", "fonttest.c -> test text drawing"}, {ID_IMGTEST, "imgtest", "imgtest.c -> test image functions mapping"}, {ID_JPGTEST, "jpgtest", "jpgtext.c -> text context to jpeg functions"}, {ID_KEYS, "keys", "keys.c -> test keyboard input"}, {ID_LIFE, "life", "life.c -> Conway's life program"}, {ID_LINETEST, "linetest", "linetest.c -> test wide and patterned lines"}, {ID_MOUSETST, "mousetst", "mousetst.c -> test mouse cursor and mouse/keyboard input"}, {ID_PCIRCTST, "pcirctst", "pcirctst.c -> test custom circle and ellipse rendering"}, {ID_PNMTEST, "pnmtest", "pnmtext.c -> text context to pnm functions"}, {ID_PNGTEST, "pngtest", "pngtext.c -> text context to png functions"}, {ID_POLYTEST, "polytest", "polytest.c -> test polygon rendering"}, {ID_RGBTEST, "rgbtest", "rgbtest.c -> show 256 color RGB palette"}, {ID_SBCTEST, "sbctest", "sbctest.c -> test subcontext operations"}, {ID_SCROLTST, "scroltst", "scroltst.c -> test virtual screen set/scroll"}, {ID_SPEEDTST, "speedtst", "speedtst.c -> check all available frame drivers speed"}, {ID_TEXTPATT, "textpatt", "textpatt.c -> test patterned text"}, {ID_WINCLIP, "winclip", "winclip.c -> clip a drawing to various windows (contexts)"}, {ID_WINTEST, "wintest", "wintest.c -> test window (context) mapping"}, {ID_FNTDEMO1, "fontdemo ncen22b.fnt", "fontdemo ncen22b.fnt -> test a GRX font"}, {ID_FNTDEMO2, "fontdemo ter-114b.res", "fontdemo ter-114b.res -> test a RES font"}, {ID_FNTDEMO3, "fontdemo ter-114n.fna", "fontdemo ter-114n.fna -> test a FNA font"}, {ID_FNTDEMO4, "fontdemo ter-114v.psf", "fontdemo ter-114v.psf -> test a PSF font"}, {ID_MODETEST, "modetest", "modetest.c -> test all available graphics modes"}, {ID_PAGE1, "", "Change to page 1"}, {ID_PAGE2, "", "Change to page 2"}, {ID_EXIT, "", "Exit GRX test programs launcher"} }; #define PX0 10 #define PX1 115 #define PX2 220 #define PY0 10 #define PY1 54 #define PY2 98 #define PY3 142 #define PY4 186 #define PY5 230 #define PY6 274 #define PY7 318 #define PY8 362 #define NBUTTONSP1 26 static Button bp1[NBUTTONSP1] = { {PX0, PY0, 100, 40, IND_BLUE, IND_YELLOW, "ArcTest", BSTATUS_SELECTED, ID_ARCTEST}, {PX0, PY1, 100, 40, IND_BLUE, IND_YELLOW, "Bb1Test", 0, ID_BB1TEST}, {PX0, PY2, 100, 40, IND_BLUE, IND_YELLOW, "BlitTest", 0, ID_BLITTEST}, {PX0, PY3, 100, 40, IND_BLUE, IND_YELLOW, "CircTest", 0, ID_CIRCTEST}, {PX0, PY4, 100, 40, IND_BLUE, IND_YELLOW, "ClipTest", 0, ID_CLIPTEST}, {PX0, PY5, 100, 40, IND_BLUE, IND_YELLOW, "Colorops", 0, ID_COLOROPS}, {PX0, PY6, 100, 40, IND_BLUE, IND_YELLOW, "CursTest", 0, ID_CURSTEST}, {PX0, PY7, 100, 40, IND_BLUE, IND_YELLOW, "ImgTest", 0, ID_IMGTEST}, {PX0, PY8, 100, 40, IND_BLUE, IND_YELLOW, "JpgTest", 0, ID_JPGTEST}, {PX1, PY0, 100, 40, IND_BLUE, IND_YELLOW, "Keys", 0, ID_KEYS}, {PX1, PY1, 100, 40, IND_BLUE, IND_YELLOW, "Life", 0, ID_LIFE}, {PX1, PY2, 100, 40, IND_BLUE, IND_YELLOW, "LineTest", 0, ID_LINETEST}, {PX1, PY3, 100, 40, IND_BLUE, IND_YELLOW, "MouseTst", 0, ID_MOUSETST}, {PX1, PY4, 100, 40, IND_BLUE, IND_YELLOW, "PcircTst", 0, ID_PCIRCTST}, {PX1, PY5, 100, 40, IND_BLUE, IND_YELLOW, "PnmTest", 0, ID_PNMTEST}, {PX1, PY6, 100, 40, IND_BLUE, IND_YELLOW, "PngTest", 0, ID_PNGTEST}, {PX1, PY7, 100, 40, IND_BLUE, IND_YELLOW, "PolyTest", 0, ID_POLYTEST}, {PX1, PY8, 100, 40, IND_BLUE, IND_YELLOW, "RgbTest", 0, ID_RGBTEST}, {PX2, PY0, 100, 40, IND_BLUE, IND_YELLOW, "SbcTest", 0, ID_SBCTEST}, {PX2, PY1, 100, 40, IND_BLUE, IND_YELLOW, "ScrolTst", 0, ID_SCROLTST}, {PX2, PY2, 100, 40, IND_BLUE, IND_YELLOW, "SpeedTst", 0, ID_SPEEDTST}, {PX2, PY3, 100, 40, IND_BLUE, IND_YELLOW, "WinClip", 0, ID_WINCLIP}, {PX2, PY4, 100, 40, IND_BLUE, IND_YELLOW, "WinTest", 0, ID_WINTEST}, {PX2, PY6, 100, 40, IND_GREEN, IND_WHITE, "Page 2", 0, ID_PAGE2}, {PX2, PY7, 100, 40, IND_BROWN, IND_WHITE, "ModeTest", 0, ID_MODETEST}, {PX2, PY8, 100, 40, IND_RED, IND_WHITE, "Exit", 0, ID_EXIT} }; #define NBUTTONSP2 9 static Button bp2[NBUTTONSP2] = { {PX0, PY0, 100, 40, IND_BLUE, IND_YELLOW, "FontTest", BSTATUS_SELECTED, ID_FONTTEST}, {PX0, PY1, 100, 40, IND_BLUE, IND_YELLOW, "TextPatt", 0, ID_TEXTPATT}, {PX0, PY2, 100, 40, IND_BLUE, IND_YELLOW, "FontDemo1", 0, ID_FNTDEMO1}, {PX0, PY3, 100, 40, IND_BLUE, IND_YELLOW, "FontDemo2", 0, ID_FNTDEMO2}, {PX0, PY4, 100, 40, IND_BLUE, IND_YELLOW, "FontDemo3", 0, ID_FNTDEMO3}, {PX0, PY5, 100, 40, IND_BLUE, IND_YELLOW, "FontDemo4", 0, ID_FNTDEMO4}, {PX2, PY6, 100, 40, IND_GREEN, IND_WHITE, "Page 1", 0, ID_PAGE1}, {PX2, PY7, 100, 40, IND_BROWN, IND_WHITE, "ModeTest", 0, ID_MODETEST}, {PX2, PY8, 100, 40, IND_RED, IND_WHITE, "Exit", 0, ID_EXIT} }; static Button_Group bgp1 = { 20, 30, bp1, NBUTTONSP1, 0, 0 }; static Button_Group bgp2 = { 20, 30, bp2, NBUTTONSP2, 0, 0 }; static Button_Group *bgact = &bgp1; static Board brd = { 0, 0, 640, 480, IND_BLACK, IND_CYAN, IND_DARKGRAY, 1 }; static Board brdimg = { 384, 46, 235, 157, IND_BLACK, IND_CYAN, IND_DARKGRAY, 1 }; static GrFont *grf_std; static GrFont *grf_big; GrTextOption grt_centered; GrTextOption grt_left; static GrContext *grcglob = NULL; static int worg = 0, horg = 0; /* Internal routines */ static void ini_graphics(void); static void ini_objects(void); static void paint_screen(void); static void the_title(int x, int y); static void the_info(int x, int y); static int pev_command(Event * ev); static int pev_select(Event * ev); static void paint_foot(char *s); static void paint_animation(void); static void disaster(char *s); /************************************************************************/ int main(int argc, char **argv) { Event ev; char buffer[100]; if (argc >= 4) { gwidth = atoi(argv[1]); gheight = atoi(argv[2]); gbpp = atoi(argv[3]); } ini_graphics(); GrSetWindowTitle(wintitle); ini_objects(); paint_screen(); while (1) { event_read(&ev); if (ev.type == EV_MOUSE) { ev.p2 -= worg; ev.p3 -= horg; } if (ev.type == EV_END) break; if ((ev.type == EV_KEY) && (ev.p1 == GrKey_Escape)) break; if ((ev.type == EV_KEY) && (ev.p1 == 's')) { GrSaveContextToPpm(NULL, "demogrx.ppm", "DemoGRX"); continue; } if (pev_button_group(&ev, bgact)) continue; if (pev_command(&ev)) continue; if (pev_select(&ev)) continue; if (ev.type == EV_MOUSE) { if (ev.p1 == MOUSE_LB_PRESSED) { sprintf(buffer, "%ld %ld over a button, please",ev.p2,ev.p3); paint_foot(buffer); } else if (ev.p1 == MOUSE_LB_RELEASED) paint_foot("Hold down left mouse buttom to see a comment"); } if (ev.type == EV_NULL) paint_animation(); } gfaz_fin(); return 0; } /************************************************************************/ static void ini_graphics(void) { gfaz_ini(gwidth, gheight, gbpp); gwidth = GrScreenX(); gheight = GrScreenY(); grcglob = NULL; if (gwidth > 640 || gheight > 480) { GrClearScreen(GrAllocColor(120, 90, 60)); worg = (gwidth - 640) / 2; horg = (gheight - 480) / 2; grcglob = GrCreateSubContext(worg, horg, worg + 639, horg + 479, NULL, NULL); GrSetContext(grcglob); } } /************************************************************************/ static void ini_objects(void) { grf_std = GrLoadFont("lucb21.fnt"); if (grf_std == NULL) { #if defined(__MSDOS__) || defined(__WIN32__) grf_std = GrLoadFont("..\\fonts\\lucb21.fnt"); #else grf_std = GrLoadFont("../fonts/lucb21.fnt"); #endif if (grf_std == NULL) disaster("lucb21.fnt not found"); } grf_big = GrLoadFont("lucb40b.fnt"); if (grf_big == NULL) { #if defined(__MSDOS__) || defined(__WIN32__) grf_big = GrLoadFont("..\\fonts\\lucb40b.fnt"); #else grf_big = GrLoadFont("../fonts/lucb40b.fnt"); #endif if (grf_big == NULL) disaster("lucb40b.fnt not found"); } grt_centered.txo_bgcolor.v = GrNOCOLOR; grt_centered.txo_direct = GR_TEXT_RIGHT; grt_centered.txo_xalign = GR_ALIGN_CENTER; grt_centered.txo_yalign = GR_ALIGN_CENTER; grt_centered.txo_chrtype = GR_BYTE_TEXT; grt_left.txo_bgcolor.v = GrNOCOLOR; grt_left.txo_direct = GR_TEXT_RIGHT; grt_left.txo_xalign = GR_ALIGN_LEFT; grt_left.txo_yalign = GR_ALIGN_CENTER; grt_left.txo_chrtype = GR_BYTE_TEXT; } /************************************************************************/ static void paint_screen(void) { GrContext *grc; paint_board(&brd); paint_button_group(bgact); paint_board(&brdimg); grc = GrCreateSubContext(brdimg.x + 4, brdimg.y + 4, brdimg.x + brdimg.wide - 5, brdimg.y + brdimg.high - 5, grcglob, NULL); if (bgact == &bgp1) GrLoadContextFromPnm(grc, "pnmtest.ppm"); else GrLoadContextFromPnm(grc, "pnmtest2.ppm"); GrDestroyContext(grc); the_info(500, 215); drawing(400, 280, 200, 150, BROWN, DARKGRAY); the_title(500, 330); paint_foot("Hold down left mouse buttom to see a comment"); } /************************************************************************/ static void the_title(int x, int y) { char *t1 = "GRX 2.4.9"; char *t2 = "test programs launcher"; grt_centered.txo_fgcolor.v = LIGHTGREEN; grt_centered.txo_font = grf_big; GrDrawString(t1, strlen(t1), 0 + x, 0 + y, &grt_centered); grt_centered.txo_font = grf_std; GrDrawString(t2, strlen(t2), 0 + x, 40 + y, &grt_centered); } /************************************************************************/ static void the_info(int x, int y) { char aux[81], sys[4] = "?"; int nsys; grt_centered.txo_fgcolor.v = CYAN; grt_centered.txo_font = grf_std; nsys = GrGetLibrarySystem(); if (nsys == GRX_VERSION_TCC_8086_DOS) strcpy(sys, "TCC"); if (nsys == GRX_VERSION_GCC_386_DJGPP) strcpy(sys, "DJ2"); if (nsys == GRX_VERSION_GCC_386_LINUX) strcpy(sys, "LNX"); if (nsys == GRX_VERSION_GCC_386_X11) strcpy(sys, "X11"); if (nsys == GRX_VERSION_GCC_X86_64_LINUX) strcpy(sys, "L64"); if (nsys == GRX_VERSION_GCC_X86_64_X11) strcpy(sys, "X64"); if (nsys == GRX_VERSION_GENERIC_X11) strcpy(sys, "X11"); if (nsys == GRX_VERSION_WATCOM_DOS4GW) strcpy(sys, "WAT"); if (nsys == GRX_VERSION_GCC_386_WIN32) strcpy(sys, "W32"); sprintf(aux, "Version:%x System:%s", GrGetLibraryVersion(), sys); GrDrawString(aux, strlen(aux), 0 + x, 0 + y, &grt_centered); sprintf(aux, "VideoDriver: %s", GrCurrentVideoDriver()->name); GrDrawString(aux, strlen(aux), 0 + x, 25 + y, &grt_centered); sprintf(aux, "Mode: %dx%d %d bpp", GrCurrentVideoMode()->width, GrCurrentVideoMode()->height, GrCurrentVideoMode()->bpp); GrDrawString(aux, strlen(aux), 0 + x, 50 + y, &grt_centered); } /************************************************************************/ static int pev_command(Event * ev) { int i; char nprog[81]; if (ev->type == EV_COMMAND) { if (ev->p1 == ID_EXIT) { par_event_queue(EV_END, 0, 0, 0); return 1; } if (ev->p1 == ID_PAGE1) { bgact = &bgp1; paint_screen(); return 1; } if (ev->p1 == ID_PAGE2) { bgact = &bgp2; paint_screen(); return 1; } for (i = 0; i < NDEMOS; i++) { if (ev->p1 == ptable[i].cid) { gfaz_fin(); #if defined(__MSDOS__) || defined(__WIN32__) if (ev->p1 == ID_MODETEST) strcpy(nprog, "..\\bin\\"); else strcpy(nprog, ".\\"); #else if (ev->p1 == ID_MODETEST) strcpy(nprog, "../bin/"); else strcpy(nprog, "./"); #endif #if defined(__XWIN__) strcat(nprog, "x"); #endif strcat(nprog, ptable[i].prog); system(nprog); ini_graphics(); GrSetWindowTitle(wintitle); paint_screen(); return 1; } } } return 0; } /************************************************************************/ static int pev_select(Event * ev) { int i; if (ev->type == EV_SELECT) { for (i = 0; i < NDEMOS; i++) { if (ev->p1 == ptable[i].cid) { paint_foot(ptable[i].text); return 1; } } } return 0; } /************************************************************************/ static void paint_foot(char *s) { grt_centered.txo_fgcolor.v = LIGHTGREEN; grt_centered.txo_font = grf_std; GrSetClipBox(10, 440, 630, 470); GrClearClipBox(CYAN); GrDrawString(s, strlen(s), 320, 455, &grt_centered); GrResetClipBox(); } /************************************************************************/ static void paint_animation(void) { static int pos = 620; static int ini = 0; static GrContext *grc; int ltext, wtext; if (!ini) { grc = GrCreateContext(620, 30, NULL, NULL); if (grc == NULL) return; ini = 1; } grt_left.txo_fgcolor.v = CYAN; grt_left.txo_font = grf_std; ltext = strlen(animatedtext); wtext = GrStringWidth(animatedtext, ltext, &grt_left); GrSetContext(grc); GrClearContext(DARKGRAY); GrDrawString(animatedtext, ltext, pos, 15, &grt_left); GrSetContext(grcglob); GrBitBlt(NULL, 10, 8, grc, 0, 0, 629, 29, GrWRITE); pos -= 1; if (pos <= -wtext) pos = 620; } /************************************************************************/ static void disaster(char *s) { void _GrCloseVideoDriver(void); char aux[81]; gfaz_fin(); _GrCloseVideoDriver(); printf("DemoGRX: %s\n", s); printf("press Return to continue\n"); fgets(aux, 80, stdin); exit(1); }