void gpath_draw_filled(GContext *ctx, GPath *path) { LOCK(screen); SDL_Point *points = _gpath_to_sdl(path); SDL_FillPolygon(screen, points, path->num_points, getRawColor(ctx->fill_color)); free(points); UNLOCK(screen); }
/* Calls to commands created via [sdl.surface] are implemented by this * C command. */ static int JimSdlHandlerCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { JimSdlSurface *jss = Jim_CmdPrivData(interp); int option; const char *options[] = { "free", "flip", "pixel", "rectangle", "box", "line", "aaline", "circle", "aacircle", "fcircle", NULL }; enum {OPT_FREE, OPT_FLIP, OPT_PIXEL, OPT_RECTANGLE, OPT_BOX, OPT_LINE, OPT_AALINE, OPT_CIRCLE, OPT_AACIRCLE, OPT_FCIRCLE}; if (argc < 2) { Jim_WrongNumArgs(interp, 1, argv, "method ?args ...?"); return JIM_ERR; } if (Jim_GetEnum(interp, argv[1], options, &option, "SDL surface method", JIM_ERRMSG) != JIM_OK) return JIM_ERR; if (option == OPT_PIXEL) { /* PIXEL */ long x, y, red, green, blue, alpha = 255; if (argc != 7 && argc != 8) { Jim_WrongNumArgs(interp, 2, argv, "x y red green blue ?alpha?"); return JIM_ERR; } if (Jim_GetLong(interp, argv[2], &x) != JIM_OK || Jim_GetLong(interp, argv[3], &y) != JIM_OK || Jim_GetLong(interp, argv[4], &red) != JIM_OK || Jim_GetLong(interp, argv[5], &green) != JIM_OK || Jim_GetLong(interp, argv[6], &blue) != JIM_OK) { return JIM_ERR; } if (argc == 8 && Jim_GetLong(interp, argv[7], &alpha) != JIM_OK) return JIM_ERR; // pixelRGBA(jss->screen, x, y, red, green, blue, alpha); uint32_t color = 0; color |= alpha << 24; color |= red << 16; color |= green << 8; color |= blue; SDL_DrawPixel(jss->screen, x, y, color); return JIM_OK; } else if (option == OPT_RECTANGLE || option == OPT_BOX || option == OPT_LINE || option == OPT_AALINE) { /* RECTANGLE, BOX, LINE, AALINE */ long x1, y1, x2, y2, red, green, blue, alpha = 255; if (argc != 9 && argc != 10) { Jim_WrongNumArgs(interp, 2, argv, "x y red green blue ?alpha?"); return JIM_ERR; } if (Jim_GetLong(interp, argv[2], &x1) != JIM_OK || Jim_GetLong(interp, argv[3], &y1) != JIM_OK || Jim_GetLong(interp, argv[4], &x2) != JIM_OK || Jim_GetLong(interp, argv[5], &y2) != JIM_OK || Jim_GetLong(interp, argv[6], &red) != JIM_OK || Jim_GetLong(interp, argv[7], &green) != JIM_OK || Jim_GetLong(interp, argv[8], &blue) != JIM_OK) { return JIM_ERR; } if (argc == 10 && Jim_GetLong(interp, argv[9], &alpha) != JIM_OK) return JIM_ERR; uint32_t color = 0; color |= alpha << 24; color |= red << 16; color |= green << 8; color |= blue; switch(option) { case OPT_RECTANGLE: { // rectangleRGBA(jss->screen, x1, y1, x2, y2, red, green, blue, alpha); SDL_Rect r = { .x = x1, .y = y1, .w = x2 - x1, .h = y2 - y1 }; SDL_DrawRect(jss->screen, &r, color); break; } case OPT_BOX: { // boxRGBA(jss->screen, x1, y1, x2, y2, red, green, blue, alpha); SDL_Point rect_poly[4] = { { .x = x1, .y = y1 }, { .x = x2, .y = y1 }, { .x = x2, .y = y2 }, { .x = x1, .y = y2 } }; SDL_FillPolygon(jss->screen, rect_poly, sizeof(rect_poly)/sizeof(rect_poly[0]), color); break; }