/* Raise a fatal error condition. */ void AG_FatalError(const char *fmt, ...) { va_list args; char *buf; /* Use callback if defined. The callback must gracefully exit. */ if (agErrorCallback != NULL) { if (fmt != NULL) { va_start(args, fmt); Vasprintf(&buf, fmt, args); va_end(args); agErrorCallback(buf); abort(); /* not reached */ } else { agErrorCallback(AG_GetError()); abort(); /* not reached */ } } else { fprintf(stderr, "Fatal error: "); if (fmt != NULL) { va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } else { fprintf(stderr, "%s", AG_GetError()); } fprintf(stderr, "\n"); abort(); } }
int main(int argc, char *argv[]) { Uint flags = AG_VIDEO_RESIZABLE; int c, i, fps = -1; char *s; if (AG_InitCore("agar-bench", 0) == -1) { fprintf(stderr, "%s\n", AG_GetError()); return (1); } while ((c = getopt(argc, argv, "?vegt:r:T:")) != -1) { extern char *optarg; switch (c) { case 'v': exit(0); case 'g': flags |= AG_VIDEO_OPENGL; break; case 't': AG_TextParseFontSpec(optarg); break; case 'T': AG_SetString(agConfig, "font-path", optarg); break; case 'r': fps = atoi(optarg); break; case '?': default: printf("%s [-vfFgG] [-w width] [-h height] [-r fps]" " [-t font,size,flags] [-T font-path]\n", agProgName); exit(0); } } if (AG_InitVideo(640, 480, 32, flags) == -1) { fprintf(stderr, "%s\n", AG_GetError()); return (-1); } AG_BindGlobalKey(AG_KEY_ESCAPE, AG_KEYMOD_ANY, AG_Quit); AG_BindGlobalKey(AG_KEY_F8, AG_KEYMOD_ANY, AG_ViewCapture); AG_SetRefreshRate(fps); MainWindow(); AG_EventLoop(); AG_Destroy(); return (0); fail: AG_Destroy(); return (1); }
int AGOL_InitVideo(const string& drivers, const int width, const int height, const short depth) { ostringstream spec; cout << "Initializing with resolution (" << width << "x" << height << ")..." << endl; /* Initialize Agar-GUI. */ if(drivers.size()) spec << drivers; else spec << "<OpenGL>"; spec << "(width=" << width << ":height=" << height << ":depth=" << depth << ")"; if (AG_InitGraphics(spec.str().c_str()) == -1) { cerr << AG_GetError() << endl; return -1; } #ifdef _XBOX // Software cursor only updates at the refresh rate so make it respectable if(agDriverSw) AG_SetRefreshRate(60); #endif return 0; }
int main(int argc, char *argv[]) { char *driverSpec = NULL, *optArg; int c; while ((c = AG_Getopt(argc, argv, "?hd:", &optArg, NULL)) != -1) { switch (c) { case 'd': driverSpec = optArg; break; case '?': case 'h': default: printf("Usage: keyevents [-d agar-driver-spec]\n"); return (1); } } if (AG_InitCore("agar-keyevents-demo", 0) == -1 || AG_InitGraphics(driverSpec) == -1) { fprintf(stderr, "%s\n", AG_GetError()); return (1); } AG_BindGlobalKey(AG_KEY_ESCAPE, AG_KEYMOD_ANY, AG_QuitGUI); AG_BindGlobalKey(AG_KEY_F8, AG_KEYMOD_ANY, AG_ViewCapture); CreateWindow(); AG_EventLoop(); AG_Destroy(); return (0); }
/* * Dump the display surface(s) to a jpeg in ~/.appname/screenshot/. * It is customary to assign a AG_GlobalKeys(3) shortcut for this function. */ void AG_ViewCapture(void) { AG_Surface *s; char *pname; char dir[AG_PATHNAME_MAX]; char file[AG_PATHNAME_MAX]; Uint seq; if (agDriverSw == NULL) { Verbose("AG_ViewCapture() is not implemented under " "multiple-window drivers\n"); return; } AG_LockVFS(&agDrivers); if (AGDRIVER_SW_CLASS(agDriverSw)->videoCapture(agDriverSw, &s) == -1) { Verbose("Capture failed: %s\n", AG_GetError()); goto out; } /* Save to a new file. */ AG_GetString(agConfig, "save-path", dir, sizeof(dir)); Strlcat(dir, AG_PATHSEP, sizeof(dir)); Strlcat(dir, "screenshot", sizeof(dir)); if (!AG_FileExists(dir) && AG_MkPath(dir) == -1) { Verbose("Capture failed: %s\n", AG_GetError()); goto out; } pname = (agProgName != NULL) ? agProgName : "agarapp"; for (seq = 0; ; seq++) { Snprintf(file, sizeof(file), "%s%c%s%u.jpg", dir, AG_PATHSEPCHAR, pname, seq++); if (!AG_FileExists(file)) break; /* XXX race condition */ } if (AG_SurfaceExportJPEG(s, file) == 0) { Verbose("Saved capture to: %s\n", file); } else { Verbose("Capture failed: %s\n", AG_GetError()); } AG_SurfaceFree(s); out: AG_UnlockVFS(&agDrivers); }
static void SaveConfig(AG_Event *event) { AG_TestInstance *ti = AG_PTR(1); if (AG_ConfigSave() == 0) { TestMsg(ti, "Saved configuration successfully"); } else { TestMsg(ti, "AG_ConfigSave: %s", AG_GetError()); } }
/* Write Agar archive version information. */ int AG_WriteVersion(AG_DataSource *ds, const char *name, const AG_Version *ver) { char nbuf[AG_VERSION_NAME_MAX]; int i; for (i = 0; i < sizeof(nbuf); i += 4) { nbuf[i ] = 'a'; nbuf[i+1] = 'g'; nbuf[i+2] = 'a'; nbuf[i+3] = 'r'; } Strlcpy(nbuf, name, sizeof(nbuf)); if (AG_Write(ds, nbuf, sizeof(nbuf), 1) != 0) { AG_SetError("Writing magic: %s", AG_GetError()); return (-1); } if (AG_WriteUint32v(ds, &ver->major) == -1 || AG_WriteUint32v(ds, &ver->minor) == -1) { AG_SetError("Writing version numbers: %s", AG_GetError()); return (-1); } return (0); }
static void UpdateFontSelection(AG_FontSelector *fs) { AG_Variable *bFont; AG_Font *font, **pFont; font = AG_FetchFont(fs->curFace, fs->curSize, fs->curStyle); if (font == NULL) { AG_TextError(_("Error opening font: %s"), AG_GetError()); return; } bFont = AG_GetVariable(fs, "font", &pFont); *pFont = font; AG_UnlockVariable(bFont); }
/* Load a surface from a given bmp file. */ AG_Surface * AG_SurfaceFromBMP(const char *path) { AG_DataSource *ds; AG_Surface *s; if ((ds = AG_OpenFile(path, "rb")) == NULL) { return (NULL); } if ((s = AG_ReadSurfaceFromBMP(ds)) == NULL) { AG_SetError("%s: %s", path, AG_GetError()); AG_CloseFile(ds); return (NULL); } AG_CloseFile(ds); return (s); }
static void SDLGL_CaptureOutput(AG_DriverSDLGL *sgl) { char path[AG_PATHNAME_MAX]; AG_DriverSw *dsw = (AG_DriverSw *)sgl; AG_Surface *s; Snprintf(path, sizeof(path), sgl->outPath, sgl->outFrame); glReadPixels(0, 0, dsw->w, dsw->h, GL_RGBA, GL_UNSIGNED_BYTE, sgl->outBuf); if (AG_PackedPixelFlip(sgl->outBuf, dsw->h, dsw->w*4) == -1) { goto fail_disable; } s = AG_SurfaceFromPixelsRGBA(sgl->outBuf, dsw->w, dsw->h, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0); if (s == NULL) goto fail; switch (sgl->outMode) { case AG_SDLGL_OUT_JPEG: if (AG_SurfaceExportJPEG(s, path) == -1) { goto fail; } break; case AG_SDLGL_OUT_PNG: if (AG_SurfaceExportPNG(s, path) == -1) { goto fail; } break; } if (++sgl->outFrame == sgl->outLast) { Verbose("Reached last frame; terminating\n"); AG_Terminate(0); } AG_SurfaceFree(s); return; fail: AG_SurfaceFree(s); fail_disable: AG_Verbose("%s; disabling capture\n", AG_GetError()); sgl->outMode = AG_SDLGL_OUT_NONE; }
/* Copy the full pathname of a data file to a sized buffer. */ int AG_ConfigFile(const char *path_key, const char *name, const char *ext, char *path, size_t path_len) { char file[AG_PATHNAME_MAX]; char *dir, *pathp = path; int rv; AG_GetString(agConfig, path_key, path, path_len); for (dir = Strsep(&pathp, AG_PATHSEPMULTI); dir != NULL; dir = Strsep(&pathp, AG_PATHSEPMULTI)) { Strlcpy(file, dir, sizeof(file)); if (name[0] != AG_PATHSEPCHAR) { Strlcat(file, AG_PATHSEP, sizeof(file)); } Strlcat(file, name, sizeof(file)); if (ext != NULL) { Strlcat(file, ".", sizeof(file)); Strlcat(file, ext, sizeof(file)); } if ((rv = AG_FileExists(file)) == 1) { if (Strlcpy(path, file, path_len) >= path_len) { AG_SetError(_("The search path is too big.")); return (-1); } return (0); } else if (rv == -1) { AG_SetError("%s: %s", file, AG_GetError()); return (-1); } } AG_GetString(agConfig, path_key, path, path_len); AG_SetError(_("Cannot find %s.%s (in <%s>:%s)."), name, (ext != NULL) ? ext : "", path_key, path); return (-1); }
/* Read Agar archive version information. */ int AG_ReadVersion(AG_DataSource *ds, const char *name, const AG_Version *ver, AG_Version *rver) { char nbuf[AG_VERSION_NAME_MAX]; size_t nlen; Uint32 major, minor; nlen = strlen(name); if (AG_Read(ds, nbuf, sizeof(nbuf), 1) != 0 || strncmp(nbuf, name, nlen) != 0) { AG_SetError("%s: Bad magic (\"%s\" != %s)", name, nbuf, name); return (-1); } if (AG_ReadUint32v(ds, &major) == -1 || AG_ReadUint32v(ds, &minor) == -1) { AG_SetError("Reading version numbers: %s", AG_GetError()); return (-1); } if (rver != NULL) { rver->major = major; rver->minor = minor; } if (major != ver->major) { AG_SetError(_("%s: Major differs: v%u.%u != %u.%u"), name, (Uint)major, (Uint)minor, (Uint)ver->major, (Uint)ver->minor); return (-1); } if (minor != ver->minor) { Verbose(_("Warning: %s: Minor differs: v%u.%u != %u.%u\n"), name, (Uint)major, (Uint)minor, (Uint)ver->major, (Uint)ver->minor); } return (0); }
static void CreateTestWindow(AG_Event *event) { MyTestInstance *ti = AG_PTR(1); AG_Window *winParent = AG_PTR(2); AG_Window *win; if ((win = AG_WindowNew(ti->testFlags)) == NULL) { TestMsg(ti, "AG_WindowNew() failed: %s", AG_GetError()); return; } AG_WindowSetCaption(win, "Test window"); AG_LabelNewS(win, 0, "This is a test window"); AG_LabelNew(win, 0, "Flags = 0x%x", ti->testFlags); AG_ButtonNewFn(win, AG_BUTTON_HFILL, "Close this window", AGWINDETACH(win)); AG_WindowAttach(winParent, win); if (ti->makeTransient) AG_WindowMakeTransient(winParent, win); if (ti->makePinned) AG_WindowPin(winParent, win); AG_WindowShow(win); }
int main(int argc, char *argv[]) { extern char *optarg; extern int optind; AG_Den *den; int c, i; AG_InitError(); while ((c = getopt(argc, argv, "?vo:h:n:l:a:c:d:k:")) != -1) { switch (c) { case 'v': verbose = 1; break; case 'o': outfile = optarg; break; case 'h': hint = optarg; break; case 'n': name = optarg; break; case 'l': lang = optarg; break; case 'a': author = optarg; break; case 'c': copy = optarg; break; case 'd': descr = optarg; break; case 'k': keyw = optarg; break; case '?': default: printusage(); goto fail1; } } argc -= optind; argv += optind; if (outfile == NULL) { fprintf(stderr, "No output file (-o) was specified\n"); printusage(); goto fail1; } den = AG_DenOpen(outfile, AG_DEN_WRITE); if (den == NULL) { fprintf(stderr, "opening %s: %s\n", outfile, AG_GetError()); goto fail1; } if (verbose) { printf("Encoding `%s':\n", name); printf("\tHint: %s\n", hint); printf("\tLanguage: %s\n", lang); if (author[0] != '\0') printf("\tAuthor: %s\n", author); if (copy[0] != '\0') printf("\tCopyright: %s\n", copy); if (descr[0] != '\0') printf("\tDescr: %s\n", descr); if (keyw[0] != '\0') printf("\tKeywords: %s\n", keyw); printf("\n"); } Strlcpy(den->hint, hint, sizeof(den->hint)); Strlcpy(den->name, name, sizeof(den->name)); den->author = strdup(author); den->copyright = strdup(copy); den->descr = strdup(descr); den->keywords = strdup(keyw); AG_DenWriteHeader(den, argc); for (i = 0; i < argc; i++) { char *s, *fspec = argv[i]; char *name = NULL, *langspec = NULL; if ((s = AG_Strsep(&fspec, ":")) != NULL && s[0] != '\0') name = s; if ((s = AG_Strsep(&fspec, ":")) != NULL && s[0] != '\0') langspec = s; if (langspec == NULL) langspec = lang; printf("+ %s (%s)\n", name, langspec); if (AG_DenImportFile(den, i, name, langspec, argv[i]) == -1) { fprintf(stderr, "Import of `%s' failed\n", argv[i]); goto fail2; } } AG_DenWriteMappings(den); AG_DenClose(den); AG_DestroyError(); return (0); fail2: AG_DenClose(den); fail1: AG_DestroyError(); return (1); }
int main(int argc, char *argv[]) { char *file, *s; extern char *optarg; extern int optind; int i, c; AG_DataSource *ds = NULL; AG_ObjectHeader oh; Uint32 pos, sLen; size_t len; Uint8 *buf, *p; int asis = 0; if (AG_InitCore("agar-disasm", 0) == -1) { return (0); } while ((c = getopt(argc, argv, "?")) != -1) { switch (c) { case '?': default: printusage(); return (1); } } if (argc < 2) { printusage(); return (1); } file = argv[1]; if ((ds = AG_OpenFile(file, "r")) == NULL) { goto fail; } if (AG_ObjectReadHeader(ds, &oh) == -1) { goto fail; } printf("Class:\t\t%s\n", oh.cs.hier); if (oh.cs.libs[0] != '\0') { printf("Modules:\t%s\n", oh.cs.libs); } printf("Dataset at:\t%lx\n", (unsigned long)oh.dataOffs); printf("Version:\t%u.%u\n", oh.ver.major, oh.ver.minor); printf("Flags:\t\t0x%x\n", oh.flags); printf("\n"); if (AG_Seek(ds, 0, AG_SEEK_END) == -1) { goto fail; } len = AG_Tell(ds) - oh.dataOffs; if (AG_Seek(ds, (off_t)oh.dataOffs, AG_SEEK_SET) == -1) { goto fail; } pos = 0; if ((buf = malloc(len)) == NULL) { AG_SetError("Out of memory for dataset (%lu)", (unsigned long)len); goto fail; } if (AG_Read(ds, buf, len) == -1) goto fail; for (p = buf; ;) { for (i = 0; i < nTypes; i++) { if (AG_SwapBE32(*(Uint32 *)p) == types[i].type) { if (asis) { printf("\n"); } asis = 0; break; } } if (i == nTypes) { if (!asis) { printf("[%8s] ", "???"); asis = 1; } if (isprint(*(Uint8 *)p)) { fputc(*(Uint8 *)p, stdout); } else { printf("\\%x", *(Uint8 *)p); } FORWARD(1); continue; } FORWARD(4); printf("[%8s] ", types[i].name); switch (types[i].type) { case AG_SOURCE_UINT8: printf("%u\n", *(Uint8 *)p); FORWARD(1); break; case AG_SOURCE_UINT16: { Uint16 v = AG_SwapBE16(*(Uint16 *)p); printf("%u\n", (unsigned)v); FORWARD(2); } break; case AG_SOURCE_UINT32: { Uint32 v = AG_SwapBE32(*(Uint32 *)p); printf("%lu\n", (unsigned long)v); FORWARD(4); } break; #ifdef HAVE_64BIT case AG_SOURCE_UINT64: { Uint64 v = AG_SwapBE64(*(Uint64 *)p); printf("%llu\n", (unsigned long long)v); FORWARD(8); } break; #endif case AG_SOURCE_FLOAT: { float f = AG_SwapBEFLT(*(float *)p); printf("%f\n", f); FORWARD(4); } break; case AG_SOURCE_DOUBLE: { double f = AG_SwapBEDBL(*(double *)p); printf("%f\n", f); FORWARD(8); } break; #ifdef HAVE_LONG_DOUBLE case AG_SOURCE_LONG_DOUBLE: { long double f=AG_SwapBELDBL(*(long double *)p); printf("%Lf\n", f); FORWARD(16); } break; #endif case AG_SOURCE_STRING: if (AG_SwapBE32(*(Uint32 *)p) != AG_SOURCE_UINT32) { printf("Bad string length!\n"); break; } FORWARD(4); sLen = AG_SwapBE32(*(Uint32 *)p); FORWARD(4); if ((s = malloc(sLen+1)) == NULL) { printf("Out of memory for string!\n"); break; } memcpy(s, p, sLen); s[sLen] = '\0'; printf("\"%s\"\n", s); free(s); FORWARD(sLen); break; default: printf("(skipping)\n"); break; } } out: AG_CloseFile(ds); return (0); fail: fprintf(stderr, "%s\n", AG_GetError()); if (ds != NULL) { AG_CloseFile(ds); } AG_Destroy(); return (1); }
int main(int argc, char *argv[]) { char s[256]; double v = 10.0; char *driverSpec = NULL, *optArg; int c; while ((c = AG_Getopt(argc, argv, "?hd:", &optArg, NULL)) != -1) { switch (c) { case 'd': driverSpec = optArg; break; case '?': case 'h': default: printf("Usage: textdlg [-d agar-driver-spec]\n"); return (1); } } if (AG_InitCore("agar-textdlg-demo", 0) == -1 || AG_InitGraphics(driverSpec) == -1) { fprintf(stderr, "%s\n", AG_GetError()); return (1); } AG_BindGlobalKey(AG_KEY_ESCAPE, AG_KEYMOD_ANY, AG_QuitGUI); AG_BindGlobalKey(AG_KEY_F8, AG_KEYMOD_ANY, AG_ViewCapture); /* Prompt for a series of options. */ { AG_Button *btns[3]; btns[0] = AG_ButtonNew(NULL, 0, NULL); btns[1] = AG_ButtonNew(NULL, 0, NULL); btns[2] = AG_ButtonNew(NULL, 0, NULL); AG_TextPromptOptions(btns, 3, "Multiple-choice selection: "); AG_ButtonText(btns[0], "Yes"); AG_ButtonText(btns[1], "No"); AG_ButtonText(btns[2], "Maybe"); } /* Prompt for a string and invoke callback on return. */ AG_TextPromptString("Prompt for a string: ", EnteredString, NULL); /* Various canned dialogs as described in AG_Text(3). */ AG_TextWarning("my-warning-key", "This is a warning"); AG_TextError("This is an error message"); AG_TextTmsg(AG_MSG_INFO, 3000, "This is a timed message"); AG_TextMsg(AG_MSG_INFO, "This is an informational message"); AG_TextInfo("infomsg", "This is an informational message. Multiline text is " "always allowed. Text will be wrapped to multiple lines " "if it cannot be displayed properly on a single line."); /* Edit an existing floating-point variable. */ AG_TextEditFloat(&v, 0.0, 100.0, "cm", "Edit a float value: "); /* Edit an existing fixed-size string buffer. */ AG_Strlcpy(s, "Test string", sizeof(s)); AG_TextEditString(s, sizeof(s), "Edit a string: "); /* Use the standard Agar event loop. */ AG_EventLoop(); AG_Destroy(); return (0); }
static void UpdateFaces(AG_Event *event) { AG_Variable *bFont; AG_Font **pFont; AG_FontSelector *fs = AG_SELF(); char fontPath[AG_SEARCHPATH_MAX], *pFontPath = &fontPath[0]; AG_TlistItem *ti; char *s; int i; const int stdSizes[] = { 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 22,24,26,28,32,48,64 }; const int nStdSizes = sizeof(stdSizes) / sizeof(stdSizes[0]); bFont = AG_GetVariable(fs, "font", &pFont); AG_PushTextState(); fs->flags &= ~(AG_FONTSELECTOR_UPDATE); for (i = 0; i < agBuiltinFontCount; i++) { AG_StaticFont *font = agBuiltinFonts[i]; ti = AG_TlistAdd(fs->tlFaces, NULL, "_%s", font->name); ti->p1 = font; if (*pFont != NULL && strcmp(ti->text, OBJECT(*pFont)->name) == 0) ti->selected++; } AG_CopyCfgString("font-path", fontPath, sizeof(fontPath)); while ((s = AG_Strsep(&pFontPath, ":")) != NULL) { AG_Dir *dir; int i; if ((dir = AG_OpenDir(s)) == NULL) { AG_Verbose(_("Ignoring: %s\n"), AG_GetError()); continue; } for (i = 0; i < dir->nents; i++) { char path[AG_FILENAME_MAX]; AG_FileInfo info; char *file = dir->ents[i], *pExt; if (file[0] == '.' || (pExt = strrchr(file, '.')) == NULL) { continue; } if (strcmp(pExt, ".ttf") != 0 && strcmp(pExt, ".TTF") != 0) continue; Strlcpy(path, s, sizeof(path)); Strlcat(path, AG_PATHSEP, sizeof(path)); Strlcat(path, file, sizeof(path)); if (AG_GetFileInfo(path, &info) == -1 || info.type != AG_FILE_REGULAR) { continue; } ti = AG_TlistAddS(fs->tlFaces, NULL, file); if (*pFont != NULL && strcmp(file, OBJECT(*pFont)->name) == 0) ti->selected++; } AG_CloseDir(dir); } /* XXX */ for (i = 0; i < nStdSizes; i++) { ti = AG_TlistAdd(fs->tlSizes, NULL, "%d", stdSizes[i]); if (*pFont != NULL && stdSizes[i] == (*pFont)->size) ti->selected++; } ti = AG_TlistAdd(fs->tlStyles, NULL, _("Regular")); if (*pFont != NULL && (*pFont)->flags == 0) { ti->selected++; } ti = AG_TlistAdd(fs->tlStyles, NULL, _("Italic")); if (*pFont != NULL && (*pFont)->flags == AG_FONT_ITALIC) { ti->selected++; } ti = AG_TlistAdd(fs->tlStyles, NULL, _("Bold")); if (*pFont != NULL && (*pFont)->flags == AG_FONT_BOLD) { ti->selected++; } ti = AG_TlistAdd(fs->tlStyles, NULL, _("Bold Italic")); if (*pFont != NULL && (*pFont)->flags == (AG_FONT_BOLD|AG_FONT_ITALIC)) { ti->selected++; } UpdatePreview(fs); AG_UnlockVariable(bFont); }
static int TestGUI(void *obj, AG_Window *win) { char path[AG_PATHNAME_MAX]; AG_Surface *su, *su2; /* Load, display and save a PNG file. */ AG_LabelNewS(win, 0, "Loading agar.png:"); if (!AG_ConfigFile("load-path", "agar", "png", path, sizeof(path))) { if ((su = AG_SurfaceFromPNG(path)) == NULL) { AG_LabelNew(win, 0, "%s: %s", path, AG_GetError()); } else { AG_PixmapFromSurface(win, 0, su); } AG_LabelNewS(win, 0, "Saving agar.png:"); if (AG_SurfaceExportPNG(su, "agar-save.png") == -1) { AG_LabelNew(win, 0, "Save failed: %s", AG_GetError()); } else { if ((su2 = AG_SurfaceFromPNG("agar-save.png")) == NULL) { AG_LabelNew(win, 0, "Load failed: %s", AG_GetError()); } else { AG_PixmapFromSurface(win, 0, su2); } } } else { AG_LabelNewS(win, 0, AG_GetError()); } /* Load/save a PNG file in indexed color format. */ AG_LabelNewS(win, 0, "Loading agar-index.png:"); if (!AG_ConfigFile("load-path", "agar-index", "png", path, sizeof(path))) { if ((su = AG_SurfaceFromPNG(path)) == NULL) { AG_LabelNew(win, 0, "Failed: %s", AG_GetError()); } else { AG_PixmapFromSurface(win, 0, su); } AG_LabelNewS(win, 0, "Saving agar-index.png:"); if (AG_SurfaceExportPNG(su, "agar-index-save.png") == -1) { AG_LabelNew(win, 0, "Save failed: %s", AG_GetError()); } else { if ((su2 = AG_SurfaceFromPNG("agar-index-save.png")) == NULL) { AG_LabelNew(win, 0, "Load failed: %s", AG_GetError()); } else { AG_PixmapFromSurface(win, 0, su2); } } } else { AG_LabelNewS(win, 0, AG_GetError()); } /* Load/save a JPEG file. */ AG_LabelNewS(win, 0, "Loading pepe.jpg:"); if (!AG_ConfigFile("load-path", "pepe", "jpg", path, sizeof(path))) { if ((su = AG_SurfaceFromJPEG(path)) == NULL) { AG_LabelNew(win, 0, "Failed: %s", AG_GetError()); } else { AG_PixmapFromSurface(win, 0, su); } AG_LabelNewS(win, 0, "Saving pepe.jpg:"); if (AG_SurfaceExportJPEG(su, "pepe-save.jpg") == -1) { AG_LabelNew(win, 0, "Save failed: %s", AG_GetError()); } else { if ((su2 = AG_SurfaceFromJPEG("pepe-save.jpg")) == NULL) { AG_LabelNew(win, 0, "Load failed: %s", AG_GetError()); } else { AG_PixmapFromSurface(win, 0, su2); } } } else { AG_LabelNewS(win, 0, AG_GetError()); } return (0); }
int main(int argc, char *argv[]) { #ifdef HAVE_SDL AG_Window *win; SDL_Surface *screen, *bmp, *tex1, *tex2, *avatar; AG_Surface *agbmp, *agavatar; int c, useGL = 0; Uint32 sdlFlags = 0; char *optArg; Uint32 rmask, gmask, bmask, amask; if (AG_InitCore("agar-sdl-demo", 0) == -1) { fprintf(stderr, "AG_InitCore: %s\n", AG_GetError()); goto fail; } while ((c = AG_Getopt(argc, argv, "?g", &optArg, NULL)) != -1) { switch (c) { case 'g': useGL = 1; break; default: printf("Usage: %s [-g]\n", agProgName); break; } } /* Set up SDL */ if (SDL_Init(SDL_INIT_VIDEO) == -1) { fprintf(stderr, "SDL_Init: %s\n", SDL_GetError()); return (1); } if (useGL) { sdlFlags = SDL_RESIZABLE|SDL_OPENGL; } else { sdlFlags = SDL_RESIZABLE|SDL_SWSURFACE; } if ((screen = SDL_SetVideoMode(320, 240, 32, sdlFlags)) == NULL) { fprintf(stderr, "SDL_SetVideoMode: %s\n", SDL_GetError()); goto fail; } if (useGL) { /* Set up OpenGL viewport and projection. */ AG_GL_InitContext(AG_RECT(0,0,320,240)); } /* Initialize Agar-GUI to reuse display */ if (AG_InitVideoSDL(screen, 0) == -1) { fprintf(stderr, "%s\n", AG_GetError()); AG_Destroy(); goto fail; } AG_BindGlobalKey(AG_KEY_ESCAPE, AG_KEYMOD_ANY, AG_QuitGUI); /* Display some test widgets. */ win = AG_WindowNew(AG_WINDOW_PLAIN); AG_LabelNew(win, 0, "Attached to existing %s display", useGL ? "SDL/OpenGL" : "SDL"); /* Test conversion from SDL_Surface to AG_Surface. */ if ((bmp = SDL_LoadBMP("agar.bmp")) != NULL) { if ((agbmp = AG_SurfaceFromSDL(bmp)) != NULL) { AG_PixmapFromSurface(win, 0, agbmp); } else { AG_LabelNewS(win, 0, AG_GetError()); } } #ifdef HAVE_SDL_IMAGE if ((tex1 = IMG_Load("test1.png")) == NULL || (tex2 = IMG_Load("test2.png")) == NULL) { fprintf(stderr, "IMG_Load() failed\n"); goto fail; } # if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; # else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; # endif avatar = SDL_CreateRGBSurface(SDL_SWSURFACE|SDL_SRCALPHA, 64, 128, tex1->format->BitsPerPixel, rmask, gmask, bmask, amask); SDL_SetAlpha(tex1, 0, 0); SDL_BlitSurface(tex1, NULL, avatar, NULL); SDL_SetAlpha(tex2, SDL_SRCALPHA, 0); SDL_BlitSurface(tex2, NULL, avatar, NULL); if ((agavatar = AG_SurfaceFromSDL(avatar)) != NULL) { AG_PixmapFromSurface(win, 0, agavatar); } else { AG_LabelNewS(win, 0, AG_GetError()); } #endif /* HAVE_SDL_IMAGE */ AG_WindowShow(win); AG_EventLoop(); AG_Destroy(); SDL_Quit(); return (0); fail: SDL_Quit(); return (1); #else fprintf(stderr, "Agar was compiled without SDL support\n"); return (1); #endif /* HAVE_SDL */ }
/* Insert a new character at current cursor position. */ static int Insert(AG_Editable *ed, AG_EditableBuffer *buf, AG_KeySym keysym, Uint keymod, Uint32 ch) { Uint32 ins[3]; int i, nIns; Uint32 uch = ch; if (keysym == 0) return (0); #ifdef __APPLE__ if ((keymod & AG_KEYMOD_LMETA) || (keymod & AG_KEYMOD_RMETA)) return (0); #endif if (!(ed->flags & AG_EDITABLE_NOLATIN1)) { for (i = 0; ; i++) { const struct ag_key_mapping *km = &agKeymapLATIN1[i]; if (keysym == km->key) { if (((keymod & AG_KEYMOD_ALT) && (keymod & AG_KEYMOD_SHIFT) && (km->modmask == (AG_KEYMOD_ALT|AG_KEYMOD_SHIFT)))) { uch = km->unicode; break; } else if (keymod & AG_KEYMOD_ALT && km->modmask == AG_KEYMOD_ALT) { uch = km->unicode; break; } } else if (km->key == AG_KEY_LAST) { break; } } } if (uch == 0) { return (0); } if (uch == '\r') { uch = '\n'; } if (Strcasecmp(ed->encoding, "US-ASCII") == 0 && !isascii((int)uch)) return (0); if (agTextComposition) { if ((nIns = AG_KeyInputCompose(ed, uch, ins)) == 0) return (0); } else { ins[0] = uch; nIns = 1; } ins[nIns] = '\0'; if (ed->sel != 0) { AG_EditableDelete(ed, buf); } if (AG_EditableGrowBuffer(ed, buf, ins, (size_t)nIns) == -1) { Verbose("Insert Failed: %s\n", AG_GetError()); return (0); } if (ed->pos == buf->len) { /* Append */ for (i = 0; i < nIns; i++) buf->s[buf->len + i] = ins[i]; } else { /* Insert */ memmove(&buf->s[ed->pos + nIns], &buf->s[ed->pos], (buf->len - ed->pos)*sizeof(Uint32)); for (i = 0; i < nIns; i++) buf->s[ed->pos + i] = ins[i]; } buf->len += nIns; buf->s[buf->len] = '\0'; ed->pos += nIns; if (!(ed->flags & AG_EDITABLE_MULTILINE)) { /* Optimize case */ int wIns; AG_TextSizeUCS4(ins, &wIns, NULL); ed->xScrollPx += wIns; } else { ed->xScrollTo = &ed->xCurs; ed->yScrollTo = &ed->yCurs; } ed->flags |= AG_EDITABLE_BLINK_ON; return (1); }
void MainLoop(int argc, char *argv[]) { int c; char *drivers = NULL; char *optArg; char strbuf[2048]; char homedir[2048]; const SDL_VideoInfo *inf; BOOL flag; SDL_Surface *s; // mtrace(); if(AG_GetVariable(agConfig, "font.size", NULL) == NULL) { AG_SetInt(agConfig, "font.size", UI_PT); } while ((c = AG_Getopt(argc, argv, "?fWd:w:h:T:t:c:T:F:S:o:O:l:s:i:", &optArg, NULL)) != -1) { switch (c) { case 'd': drivers = optArg; break; case 'f': /* Force full screen */ AG_SetBool(agConfig, "view.full-screen", 1); break; case 'W': /* Force Window */ AG_SetBool(agConfig, "view.full-screen", 0); break; case 'T': /* Set an alternate font directory */ AG_SetString(agConfig, "font-path", optArg); break; case 'F': /* Set an alternate font face */ AG_SetString(agConfig, "font.face", optArg); break; case 'S': /* Set an alternate font face */ AG_SetInt(agConfig, "font.size", atoi(optArg)); break; case 'o': /* Set an alternate font face */ AG_SetString(agConfig, "osdfont.face", optArg); break; case 'O': /* Set an alternate font face */ AG_SetInt(agConfig, "osdfont.size", atoi(optArg)); break; case 'l': /* Set an alternate font face */ AG_SetString(agConfig, "load-path", optArg); break; case 's': /* Set an alternate font face */ AG_SetString(agConfig, "save-path", optArg); break; case 'i': /* Set an alternate font face */ AG_SetString(agConfig, "save-path", optArg); AG_SetString(agConfig, "load-path", optArg); break; case 't': /* Change the default font */ AG_TextParseFontSpec(optArg); break; case '?': default: printf("%s [-v] [-f|-W] [-d driver] [-r fps] [-t fontspec] " "[-w width] [-h height] " "[-F font.face] [-S font.size]" "[-o osd-font.face] [-O osd-font.size]" "[-s SavePath] [-l LoadPath] " "[-T font-path]\n\n" "Usage:\n" "-f : FullScreen\n-W:Window Mode\n", agProgName); exit(0); } } if(SDL_getenv("HOME") != NULL) { strcpy(homedir, SDL_getenv("HOME")); } else { strcpy(homedir, "."); } XM7_DebugLog(XM7_LOG_DEBUG, "HOME = %s", homedir); #ifdef _WINDOWS AG_PrtString(agConfig, "font-path", "%s:%s/xm7:%s:.", homedir, homedir, FONTPATH); #else flag = FALSE; if(AG_GetString(agConfig, "font-path", strbuf, 2047) != NULL) { if((strlen(strbuf) <= 0) || (strncmp(strbuf, "_agFontVera", 11) == 0)){ flag = TRUE; } } else { flag = TRUE; } if(flag) AG_PrtString(agConfig, "font-path", "%s/.fonts:%s:%s/.xm7:%s:.", homedir, homedir, homedir, FONTPATH); flag = FALSE; XM7_DebugLog(XM7_LOG_DEBUG, "font-path = %s", strbuf); #endif /* _WINDOWS */ flag = FALSE; if(AG_GetString(agConfig, "font.face", strbuf, 511) != NULL) { if((strlen(strbuf) <= 0) || (strncmp(strbuf, "_agFontVera", 11) == 0)){ flag = TRUE; } } else { flag = TRUE; } if(flag) AG_SetString(agConfig, "font.face", UI_FONT); flag = FALSE; XM7_DebugLog(XM7_LOG_DEBUG, "font.face = %s", strbuf); stopreq_flag = FALSE; run_flag = TRUE; // Debug #ifdef _XM7_FB_DEBUG // Force FB. drivers = "sdlfb:width=1280:height=880:depth=32"; #endif /* * Agar のメインループに入る */ if(drivers == NULL) { #ifdef USE_OPENGL if(AG_InitGraphics(NULL) == -1){ fprintf(stderr, "%s\n", AG_GetError()); return; } #else if(AG_InitGraphics("cocoa,sdlfb") == -1){ fprintf(stderr, "%s\n", AG_GetError()); return; } #endif } else { if (AG_InitGraphics(drivers) == -1) { fprintf(stderr, "%s\n", AG_GetError()); return; } } OnCreate((AG_Widget *)NULL); // AG_AtExitFunc(OnDestroy); XM7_DebugLog(XM7_LOG_DEBUG, "Widget creation OK."); XM7_DebugLog(XM7_LOG_INFO, "Emulate version:%d", fm7_ver); SDL_InitSubSystem(SDL_INIT_AUDIO | SDL_INIT_JOYSTICK); XM7_DebugLog(XM7_LOG_DEBUG, "Audio and JOYSTICK subsystem was initialised."); InitInstance(); XM7_DebugLog(XM7_LOG_DEBUG, "InitInstance() OK."); if(agDriverSw && AG_UsingSDL(NULL)) { SDL_Init(SDL_INIT_VIDEO); XM7_DebugLog(XM7_LOG_INFO, "Start Single WM with SDL."); switch(fm7_ver) { case 1: // FM7/77 if(!(LoadGlobalIconPng(NULL, "tamori.png"))) { LoadGlobalIconPng(NULL, "xm7.png"); } break; case 2: // FM77AV if(!(LoadGlobalIconPng(NULL, "fujitsu.png"))) { LoadGlobalIconPng(NULL, "xm7.png"); } break; case 3: // FM77AV20/40/EX/SX if(!(LoadGlobalIconPng(NULL, "fujitsu2.png"))) { LoadGlobalIconPng(NULL, "xm7.png"); } break; default: LoadGlobalIconPng(NULL, "xm7.png"); break; } } else { // WM function is managed by SDL, load and set icon for WM. SDL_Init(SDL_INIT_VIDEO); XM7_DebugLog(XM7_LOG_INFO, "Start multi window mode."); } stopreq_flag = FALSE; run_flag = TRUE; AG_DrawInitsub(); inf = SDL_GetVideoInfo(); if(inf != NULL) { RootVideoWidth = inf->current_w; RootVideoHeight = inf->current_h; } else { RootVideoWidth = 640; RootVideoHeight = 400; } newResize = FALSE; nDrawTick1D = XM7_timeGetTime(); nDrawTick1E = nDrawTick1D; ResizeWindow_Agar2(nDrawWidth, nDrawHeight); XM7_DebugLog(XM7_LOG_DEBUG, "Screen is %d x %d.", nDrawWidth, nDrawHeight); switch(nErrorCode) { case 0: break; case 1: ErrorPopup(gettext("Error init VM.\nPlease check ROMS and system-memory.\n")); break; case 2: ErrorPopup(gettext("Error init Emulator.\nPlease check window system, display and more.\n")); break; default: ErrorPopup(gettext("Unknown error on setup.\nPlease email to author.")); break; } #if 0 mtrace(); #endif if(DrawArea != NULL) { AG_RedrawOnTick(DrawArea, 1000 / nDrawFPS); XM7_DebugLog(XM7_LOG_INFO, "Direct draw mode."); } else if(GLDrawArea != NULL) { AG_RedrawOnTick(GLDrawArea, 1000 / nDrawFPS); XM7_DebugLog(XM7_LOG_INFO, "OpenGL mode."); } bEventRunFlag == TRUE; AGDrawTaskEvent(TRUE); // muntrace(); XM7_DebugLog(XM7_LOG_INFO, "All End."); }
int gfxInit() { int detectedBPP; SDL_Surface *icon; int ret; char *fileName; if (SDL_Init(SDL_INIT_VIDEO)) { conAdd(LERR, "SDL Init failed"); conAdd(LERR, SDL_GetError()); sdlCheck(); return 0; } if (TTF_Init()) { conAdd(LERR, "SDL_ttf Init failed"); conAdd(LERR, SDL_GetError()); sdlCheck(); return 0; } video.sdlStarted = 1; fileName = findFile(MISCDIR "/gravit.png"); if (!fileName) { return 0; } icon = IMG_Load(fileName); if (!icon) { sdlCheck(); } SDL_WM_SetIcon(icon, NULL); SDL_FreeSurface(icon); setTitle(0); video.gfxInfo = (SDL_VideoInfo*) SDL_GetVideoInfo(); detectedBPP = video.gfxInfo->vfmt->BitsPerPixel; conAdd(LLOW, "Detected %i BPP", detectedBPP); gfxInitRetry: if (video.screenBPP == 0) video.screenBPP = detectedBPP; ret = gfxSetResolution(); if (ret) { if (ret == 1) { if (video.screenAA) { conAdd(LERR, "You have videoantialiasing on. I'm turning it off and restarting..."); video.screenAA = 0; goto gfxInitRetry; } if (detectedBPP != video.screenBPP) { conAdd(LERR, "Your BPP setting is different to your desktop BPP. I'm restarting with your desktop BPP..."); video.screenBPP = detectedBPP; goto gfxInitRetry; } } return 0; } conAdd(LLOW, "Your video mode is %ix%ix%i", video.screenW, video.screenH, video.gfxInfo->vfmt->BitsPerPixel ); if (!video.screenAA && view.particleRenderMode == 1) { conAdd(LERR, "Warning! You don't have videoantialiasing set to 1. From what I've seen so far"); conAdd(LERR, "this might cause particlerendermode 1 not to work. If you don't see any particles"); conAdd(LERR, "after spawning, hit the \\ (backslash) key)."); } glClearColor(0, 0, 0, 0); glShadeModel(GL_SMOOTH); glEnable(GL_LINE_SMOOTH); glDisable(GL_DEPTH_TEST); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glCheck(); checkPointParameters(); checkPointSprite(); checkDriverBlacklist(); SDL_ShowCursor(view.showCursor); SDL_EnableUNICODE(SDL_ENABLE); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL); #ifndef WITHOUT_AGAR AG_InitCore("gravit", 0); //AG_InitGraphics("sdlgl"); if (AG_InitVideoSDL(video.sdlScreen, AG_VIDEO_OVERLAY | AG_VIDEO_OPENGL_OR_SDL) == -1) conAdd(LERR, "agar error while initializing main window: %s", AG_GetError() ); video.agarStarted = 1; if (!view.screenSaver) osdInitDefaultWindows(); #endif return 1; }