int draw_window(struct window * w) { int i; /* clear background */ ggiSetGCForeground(w->vis, ggiMapColor(w->vis,&w->backgroundcolor)); ggiDrawBox(w->vis, w->xorigin, w->yorigin, w->xsize, w->ysize); /* draw border */ ggiSetGCForeground(w->vis, ggiMapColor(w->vis,&w->bordercolor)); for (i = w->borderwidth; i > 0; i--){ /*printf("border %d\n", i);*/ ggiDrawHLine(w->vis, w->xorigin, w->yorigin+i-1, w->xsize); ggiDrawHLine(w->vis, w->xorigin, w->yorigin+w->ysize-i, w->xsize); ggiDrawVLine(w->vis, w->xorigin+i-1, w->yorigin, w->ysize); ggiDrawVLine(w->vis, w->xorigin+w->xsize-i, w->yorigin, w->ysize); } ggiSetGCForeground(w->vis, ggiMapColor(w->vis,&w->titlecolor)); ggiSetGCBackground(w->vis, ggiMapColor(w->vis,&w->backgroundcolor)); ggiPuts(w->vis, w->xorigin+10, w->yorigin+/*2*/0, w->title); return 0; }
static void animate(ggi_visual_t vis, ggi_mode * mode, int j) { int f, w, h; ggi_pixel *buf; ggi_color c1, c2; c1.r = ((sin((double) j / 100) + 1) * 32768); c1.g = ((sin(2.094394 + (double) j / 100) + 1) * 32768); c1.b = ((sin(4.188789 + (double) j / 100) + 1) * 32768); c1.a = 0; c2.r = ((sin(3.141592 + (double) j / 100) + 1) * 32768); c2.g = ((sin(5.235986 + (double) j / 100) + 1) * 32768); c2.b = ((sin(7.330381 + (double) j / 100) + 1) * 32768); c2.a = 0; ggiSetGCForeground(vis, ggiMapColor(vis, &c1)); ggiSetGCBackground(vis, ggiMapColor(vis, &c2)); w = mode->virt.x / mode->frames; h = mode->virt.y / 5; buf = malloc(w * h * GT_SIZE(mode->graphtype)); if (buf == NULL) return; ggiSetOrigin(vis, j % (mode->virt.x - mode->visible.x + 1), j % (mode->virt.y - mode->visible.y + 1)); for (f = 0; f < mode->frames; f++) { int x, y, yspan; x = f * w; yspan = mode->virt.y - h; y = (j + (yspan * 2 * (f / mode->frames))) % (2 * yspan); y += yspan * 2 * f / mode->frames; y %= yspan * 2; if (y >= yspan) y = yspan * 2 - y; x += (int)(sin(3.14159264 * 4 * y / yspan) + 1) * (w * 1 / 10); ggiSetWriteFrame(vis, f); ggiSetReadFrame(vis, (f + 1) % mode->frames); animate_one_frame(vis, x, y, w * 4 / 5, h, buf, (x + w * (mode->frames - 1) + w / 2) % mode->virt.x); } free(buf); }
static void testcase1(const char *desc) { ggi_visual_t vis; ggi_color green, back; int err; printteststart(__FILE__, __PRETTY_FUNCTION__, EXPECTED2PASS, desc); if (dontrun) return; err = ggiInit(); printassert(err == GGI_OK, "ggiInit failed with %i\n", err); vis = ggiOpen(NULL); printassert(vis != NULL, "ggiOpen() failed\n"); err = ggiSetGraphMode(vis, GGI_AUTO, GGI_AUTO, GGI_AUTO, GGI_AUTO, GT_8BIT); if(err < 0) { printassert(0, "Palettized mode not available.\n"); printsuccess(); ggiClose(vis); ggiExit(); return; } green.r = 100; green.g = 40000; green.b = 4000; err = ggiSetPalette(vis, GGI_PALETTE_DONTCARE, 1, &green); if (err < 0) { printfailure("Unable to install colormap with one entry.\n"); ggiClose(vis); ggiExit(); return; } printassert(err == (int)ggiMapColor(vis, &green), "ggiMapColor inconsistent with retval of ggiSetPalette.\n"); ggiUnmapPixel(vis, err, &back); if(green.r != back.r || green.g != back.g || green.b != back.b) { printfailure("Unexpected color from ggiUnmapPixel.\n"); ggiClose(vis); ggiExit(); return; } ggiSetGCForeground(vis, err); ggiDrawBox(vis, 0, 0, 3000, 3000); ggiFlush(vis); /* You should see a green square, how to test this? */ ggUSleep(5000000); printsuccess(); ggiClose(vis); ggiExit(); }
static ggi_pixel ggi_getcolor (int index) { unsigned char *palptr = xg_hipal + 3*index; ggi_color col; col.r = ((int) (*palptr++)) << 10; col.g = ((int) (*palptr++)) << 10; col.b = ((int) (*palptr)) << 10; return ggiMapColor (ggiVis, &col); }
static void gl_ggiSetClearColor(GLcontext *ctx, const GLfloat color[4]) { ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx; ggi_color rgb; ggi_pixel col; GLubyte byteColor[3]; GGIMESADPRINT_CORE("gl_ggiSetClearColor() called\n"); CLAMPED_FLOAT_TO_UBYTE(byteColor[0], color[0]); CLAMPED_FLOAT_TO_UBYTE(byteColor[1], color[1]); CLAMPED_FLOAT_TO_UBYTE(byteColor[2], color[2]); rgb.r = (uint16)byteColor[0] << SHIFT; rgb.g = (uint16)byteColor[1] << SHIFT; rgb.b = (uint16)byteColor[2] << SHIFT; col = ggiMapColor(ggi_ctx->ggi_visual, &rgb); ggiSetGCForeground(ggi_ctx->ggi_visual, col); ggi_ctx->clearcolor = col; }
int GGI_palemu_setPalette(ggi_visual_t vis, size_t start, size_t len, const ggi_color *colormap) { ggi_palemu_priv *priv = PALEMU_PRIV(vis); const ggi_color *src = colormap; size_t end = start + len; DPRINT("display-palemu: SetPalette(%d,%d)\n", start, len); if (start < 0 || start + len > 256) { return GGI_ENOSPACE; } memcpy(LIBGGI_PAL(vis)->clut.data+start, src, len*sizeof(ggi_color)); if (end > start) { UPDATE_MOD(vis, 0, 0, LIBGGI_VIRTX(vis), LIBGGI_VIRTY(vis)); } for (; start < end; ++start, ++src) { priv->palette[start] = *src; priv->lookup[start] = ggiMapColor(priv->parent, src); } return 0; }
int main(int argc, const char *argv[]) { ggi_visual_t vis; ggi_mode mode; int i, j, cx, cy, c; char buf[80]; /* Set up the random number generator */ srandom((unsigned)time(NULL)); /* Initialize LibGGI */ if (giiInit() < 0) { fprintf(stderr, "Cannot initialize LibGII!\n"); return 1; } if (ggiInit() < 0) { fprintf(stderr, "Cannot initialize LibGGI!\n"); giiExit(); return 1; } vis = ggNewStem(NULL); if (!vis) { fprintf(stderr, "Cannot open create stem!\n"); ggiExit(); giiExit(); return 1; } if (giiAttach(vis) < 0) { fprintf(stderr, "Cannot attach LibGII!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } if (ggiAttach(vis) < 0) { fprintf(stderr, "Cannot attach LibGGI!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } /* Open default visual */ if (ggiOpen(vis, NULL) < 0) { fprintf(stderr, "Cannot open default visual!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } /* Set visual to async mode (drawing not immediate) */ ggiSetFlags(vis, GGIFLAG_ASYNC); /* Set default mode, but with multiple buffering */ if (argc > 1) { ggiParseMode(argv[1], &mode); } else { ggiParseMode("", &mode); if (mode.frames < 2) mode.frames = 2; } if (ggiSetMode(vis, &mode)) { fprintf(stderr, "Cannot set mode!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } ggiGetCharSize(vis, &cx, &cy); /* Setup palette */ if (GT_SCHEME(mode.graphtype) == GT_PALETTE) { ggiSetColorfulPalette(vis); } /* Write something into each frame */ for (i = 0; i < mode.frames; i++) { if (ggiSetWriteFrame(vis, i)) { fprintf(stderr, "Cannot set write frame!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } ggiSetGCBackground(vis, ggiMapColor(vis, &white)); ggiSetGCForeground(vis, ggiMapColor(vis, &white)); ggiFillscreen(vis); } /* Clip a small border so that clipping can be verified. */ ggiSetGCClipping(vis, 5, 5, mode.virt.x - 5, mode.virt.y - 5); /* Write something into each frame */ for (i = 0; i < mode.frames; i++) { ggiSetWriteFrame(vis, i); ggiSetGCBackground(vis, ggiMapColor(vis, &black)); ggiSetGCForeground(vis, ggiMapColor(vis, &black)); ggiFillscreen(vis); snprintf(buf, sizeof(buf), "Hello World #%d!", i); for (j = 0; j < mode.virt.y; j += cy) { ggi_color col; int x = random() % mode.virt.x; int h = (random() & 0x7fff) + 0x8000; int l = (random() & 0x7fff); /* Use different colors for different frames */ col.r = ((i + 1) & 1) ? h : l; col.g = ((i + 1) & 2) ? h : l; col.b = ((i + 1) & 4) ? h : l; ggiSetGCForeground(vis, ggiMapColor(vis, &col)); ggiPuts(vis, x, j, buf); } /* Flush commands before proceeding to the next frame */ ggiFlush(vis); } /* Cycle through frames */ i = 0; j = 0; do { if (ggiSetDisplayFrame(vis, i)) { ggPanic("Cannot set display frame!\n"); } /* Wait */ c = GIIK_VOID; do { struct timeval tv = { 0, 0 }; int key; /* Flush command before waiting for input */ ggiFlush(vis); key = giiEventPoll(vis, emKeyPress, &tv); if (key & emKeyPress) c = giiGetc(vis); ggUSleep(50000); animate(vis, &mode, j); j++; } while (c == GIIK_VOID || GII_KTYP(c) == GII_KT_MOD); i = (i + 1) % mode.frames; } while (c != 'q' && c != 'Q' && c != 'x' && c != 'X' && c != GIIUC_Escape); ggiClose(vis); ggDelStem(vis); ggiExit(); giiExit(); return 0; }
static void testcase1(const char *desc) { int ret; ggi_visual_t vis; ggi_mode mode; ggi_pixel pixel_color; ggi_color color_color; #if 0 unsigned int j, size; const ggi_directbuffer *dbuf = NULL; #endif color_color.r = 0x0000; color_color.g = 0xffff; color_color.b = 0xffff; printteststart(__FILE__, __PRETTY_FUNCTION__, EXPECTED2PASS, desc); if (dontrun) return; vis = ggNewStem(libggi, NULL); if (vis == NULL) { printfailure("Couldn't create stem for %s", DISPLAYSTR); return; } ret = ggiOpen(vis, DISPLAYSTR, NULL); if (ret != 0) { printfailure("Couldn't open %s", DISPLAYSTR); return; } #if 0 /* Here, XGGI would switch to async mode, * if there were a place to hook in ggiFlush() */ ggiSetFlags(vis, GGIFLAG_ASYNC); #endif /* Now check, if mansync is actually running * - note, we are in sync mode here. */ /* stop mansync. If it runs as it should, * we don't fail with an assertion here */ ret = MANSYNC_stop(STEM_API_DATA(vis, libggi, struct ggi_visual*)); if (ret != 0) { printfailure("BUG: mansync not running - forgot to call " "MANSYNC_start(vis) right after MANSYNC_init(vis)?\n"); goto exit_testcase; } /* now restart it */ ret = MANSYNC_start(STEM_API_DATA(vis, libggi, struct ggi_visual*)); if (ret != 0) { printfailure("BUG: mansync couldn't be relaunched\n"); goto exit_testcase; } ggiParseMode("", &mode); ggiCheckMode(vis, &mode); ret = ggiSetMode(vis, &mode); if (ret != GGI_OK) { printfailure("expected return value: \"%i\"\n" "actual return value: \"%i\"\n", GGI_OK, ret); goto exit_testcase; } /* Disable directbuffer as this is not required to * perform the test */ #if 0 ret = -1; size = GT_SIZE(mode.graphtype); for (j = 0; (dbuf = ggiDBGetBuffer(vis, j)) != NULL; j++) { if ((dbuf->type & GGI_DB_SIMPLE_PLB) && ((8*dbuf->buffer.plb.stride) % size) == 0) { /* found */ ret = GGI_OK; break; } } if (ret != GGI_OK) { printfailure("This mode and target has no suitable DirectBuffer\n"); goto exit_testcase; } if (ggiResourceAcquire(dbuf->resource, GGI_ACTYPE_WRITE | GGI_ACTYPE_READ) != 0) { printfailure("Unable to acquire DirectBuffer\n"); goto exit_testcase; } #endif /* ... and now draw something. */ pixel_color = ggiMapColor(vis, &color_color); ggiSetGCForeground(vis, pixel_color); ggiFillscreen(vis); #if 0 ggiResourceRelease(dbuf->resource); #endif exit_testcase: ggDelStem(vis); printsuccess(); return; }
/* Set the default mode and do all the work. We might want to split * that later ... */ static int setup_mode(void) { int i; ggi_color col; const ggi_directbuffer *buf; ggi_mode gmode; if ((visual=ggNewStem(NULL)) == NULL) { fprintf(stderr, "unable to create stem, exiting.\n"); return -1; } if (ggiAttach(visual) < 0) { fprintf(stderr, "unable to attach ggi api, exiting.\n"); return -1; } if (ggiOpen(visual, NULL) < 0) { fprintf(stderr, "unable to open default visual, exiting.\n"); return -1; } ggiCheckSimpleMode(visual, GGI_AUTO, GGI_AUTO, GGI_AUTO, GT_AUTO, &gmode); if (ggiSetMode(visual, &gmode) == 0) { printf("Graph mode %dx%d (%dx%d virt)\n", gmode.visible.x, gmode.visible.y, gmode.virt.x, gmode.virt.y); } else { fprintf(stderr, "Unable to set any mode at all!\n"); ggiClose(visual); return -1; } col.r = 0xFFFF; col.g = 0xFFFF; col.b = 0xFFFF; printf("white = 0x%"PRIx32"\n", ggiMapColor(visual, &col)); col.r = 0x0000; col.g = 0x0000; col.b = 0x0000; printf("black = 0x%"PRIx32"\n", ggiMapColor(visual, &col)); printf("Pixelformat for Get/Put buffers:\n"); print_pixfmt(ggiGetPixelFormat(visual)); for (i = 0; ; i++) { int acquired = 0; buf = ggiDBGetBuffer(visual, i); if (buf == NULL) break; printf("DirectBuffer (frame #%d):\n", buf->frame); if (ggiResourceMustAcquire(buf->resource)) { switch (db_doacquire(buf)) { case 2: printf("Acquired DirectBuffer read/write\n"); acquired = 1; break; case 1: printf("Acquired DirectBuffer for writing\n"); acquired = 1; break; case 0: printf("Acquired DirectBuffer for read-only\n"); acquired = 1; break; default: printf("DirectBuffer can not be Acquired!\n"); break; } } else { printf("Does not need to be acquired\n"); } printf("Mapped at read:%p, write:%p (paged %u)\n", buf->read, buf->write, buf->page_size); switch (buf->layout) { case blPixelLinearBuffer: printf("Layout: Linear Pixel Buffer\n"); printf("Stride=%d\n", buf->buffer.plb.stride); printf("Pixelformat:\n"); print_pixfmt(buf->buffer.plb.pixelformat); break; default: printf("Layout: Unknown\n"); break; /* Skip it. Don't know it. */ } if (acquired) ggiResourceRelease(buf->resource); } return 0; }
int do_menu(struct menu * m , int selected) { /* select a menu item by either a number or with arrow keys */ int i; int evmask; gii_event ev; struct timeval t= {0,0}; int oldselection = selected; draw_window(&m->w); if (m->toptext != NULL) { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->toptextcolor)); /* FIXME*/ ggiPuts(m->w.vis, m->w.xorigin+m->toptextx, m->w.yorigin+m->toptexty, m->toptext); } if (m->bottomtext != NULL) { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->bottomtextcolor)); /* FIXME*/ ggiPuts(m->w.vis, m->w.xorigin+m->bottomtextx, m->w.yorigin+m->bottomtexty, m->bottomtext); } for (i = 0; i<=m->lastentry; i++) { if (i!=selected) { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->entrycolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis,&m->w.backgroundcolor)); } else { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->selectedcolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis, &m->selectedbackgroundcolor)); } ggiPuts( m->w.vis, m->w.xorigin + m->entry[i].x, m->w.yorigin + m->entry[i].y, m->entry[i].text); } for (;;) { /* if we are in asynchronous mode, we must guarantee */ /* the user sees he's next. */ ggiFlush(m->w.vis); /* get a keypress */ evmask = emKey; giiEventPoll(m->w.vis, evmask, NULL); while (giiEventPoll(m->w.vis, evmask,&t)) { do { giiEventRead(m->w.vis,&ev, evmask); } while (!((1<<ev.any.type)&evmask)); switch(ev.any.type) { case evKeyPress: case evKeyRepeat: switch(ev.key.sym) { case '1': selected = 0; break; case '2': selected = 1; break; case '3': selected = 2; break; case '4': selected = 3; break; case '5': selected = 4; break; case '6': selected = 5; break; case '7': selected = 6; break; case '8': selected = 7; break; case '9': selected = 8; break; case GIIK_Up: selected--; break; case GIIK_Down: selected++; break; case GIIK_Enter: ggiFlush(m->w.vis); /* just to make sure */ return (selected); break; /* never get here */ case GIIUC_Escape: ggiFlush(m->w.vis); /* just to make sure */ return (-1); default: /*printf("unknown sym=%4x code=%4x\n", ev.key.sym, ev.key.code);*/ break; } default: /*printf("can't handle this event yet.\n");*/ break; } } ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->entrycolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis,&m->w.backgroundcolor)); ggiPuts( m->w.vis, m->w.xorigin+m->entry[oldselection].x, m->w.yorigin+m->entry[oldselection].y, m->entry[oldselection].text); if (selected<0) selected = 0; if (selected > m->lastentry) selected = m->lastentry; ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->selectedcolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis, &m->selectedbackgroundcolor)); ggiPuts( m->w.vis, m->w.xorigin + m->entry[selected].x, m->w.yorigin + m->entry[selected].y, m->entry[selected].text); oldselection = selected; } }