roo_e/thirdparty/grx249/test/demogrx.c
2022-05-16 17:59:47 -05:00

524 lines
16 KiB
C

/**
** 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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#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);
}