extern "C" SEXP xaml_graphicsdevice_new(SEXP args) { args = CDR(args); SEXP file = CAR(args); args = CDR(args); SEXP width = CAR(args); args = CDR(args); SEXP height = CAR(args); const char *f = R_CHAR(STRING_ELT(file, 0)); double *w = REAL(width); double *h = REAL(height); int ver = R_GE_getVersion(); if (ver < R_32_GE_version || ver > R_33_GE_version) { Rf_error("Graphics API version %d is not supported.", ver); } R_CheckDeviceAvailable(); BEGIN_SUSPEND_INTERRUPTS{ auto dev = xaml_device::create(f, *w, *h); pGEDevDesc gdd = GEcreateDevDesc(dev->device_desc); GEaddDevice2f(gdd, "xaml", f); // Owner is DevDesc::deviceSpecific, and is released in close() dev.release(); } END_SUSPEND_INTERRUPTS; return R_NilValue; }
/* cairo(filename, type, width, height, pointsize, bg, res, antialias, quality, family) */ SEXP in_Cairo(SEXP args) { pGEDevDesc gdd; SEXP sc; const char *filename, *family; int type, quality, width, height, pointsize, bgcolor, res, antialias; const void *vmax = vmaxget(); args = CDR(args); /* skip entry point name */ if (!isString(CAR(args)) || LENGTH(CAR(args)) < 1) error(_("invalid '%s' argument"), "filename"); filename = translateChar(STRING_ELT(CAR(args), 0)); args = CDR(args); type = asInteger(CAR(args)); if(type == NA_INTEGER || type <= 0) error(_("invalid '%s' argument"), "type"); args = CDR(args); width = asInteger(CAR(args)); if(width == NA_INTEGER || width <= 0) error(_("invalid '%s' argument"), "width"); args = CDR(args); height = asInteger(CAR(args)); if(height == NA_INTEGER || height <= 0) error(_("invalid '%s' argument"), "height"); args = CDR(args); pointsize = asInteger(CAR(args)); if(pointsize == NA_INTEGER || pointsize <= 0) error(_("invalid '%s' argument"), "pointsize"); args = CDR(args); sc = CAR(args); if (!isString(sc) && !isInteger(sc) && !isLogical(sc) && !isReal(sc)) error(_("invalid '%s' value"), "bg"); bgcolor = RGBpar(sc, 0); args = CDR(args); res = asInteger(CAR(args)); args = CDR(args); antialias = asInteger(CAR(args)); if(antialias == NA_INTEGER) error(_("invalid '%s' argument"), "antialias"); args = CDR(args); quality = asInteger(CAR(args)); if(quality == NA_INTEGER || quality < 0 || quality > 100) error(_("invalid '%s' argument"), "quality"); args = CDR(args); if (!isString(CAR(args)) || LENGTH(CAR(args)) < 1) error(_("invalid '%s' argument"), "family"); family = translateChar(STRING_ELT(CAR(args), 0)); R_GE_checkVersionOrDie(R_GE_version); R_CheckDeviceAvailable(); BEGIN_SUSPEND_INTERRUPTS { pDevDesc dev; /* Allocate and initialize the device driver data */ if (!(dev = (pDevDesc) calloc(1, sizeof(DevDesc)))) return 0; if (!BMDeviceDriver(dev, devtable[type].gtype, filename, quality, width, height, pointsize, bgcolor, res, antialias, family)) { free(dev); error(_("unable to start device '%s'"), devtable[type].name); } gdd = GEcreateDevDesc(dev); GEaddDevice2f(gdd, devtable[type].name, filename); } END_SUSPEND_INTERRUPTS; vmaxset(vmax); return R_NilValue; }