/** * gjs_cairo_surface_from_surface: * @context: the context * @surface: cairo_surface to attach to the object * * Constructs a surface wrapper given cairo surface. * A reference to @surface will be taken. * */ JSObject * gjs_cairo_surface_from_surface(JSContext *context, cairo_surface_t *surface) { JSObject *object; g_return_val_if_fail(context != NULL, NULL); g_return_val_if_fail(surface != NULL, NULL); switch (cairo_surface_get_type(surface)) { case CAIRO_SURFACE_TYPE_IMAGE: return gjs_cairo_image_surface_from_surface(context, surface); case CAIRO_SURFACE_TYPE_PDF: return gjs_cairo_pdf_surface_from_surface(context, surface); /* case CAIRO_SURFACE_TYPE_PS: return gjs_cairo_ps_surface_from_surface(context, surface); */ case CAIRO_SURFACE_TYPE_SVG: return gjs_cairo_svg_surface_from_surface(context, surface); default: break; } object = JS_NewObject(context, &gjs_cairo_surface_class, NULL, NULL); if (!object) { gjs_throw(context, "failed to create surface"); return NULL; } gjs_cairo_surface_construct(context, object, surface); return object; }
/** * gjs_cairo_surface_from_surface: * @context: the context * @surface: cairo_surface to attach to the object * * Constructs a surface wrapper given cairo surface. * A reference to @surface will be taken. * */ JSObject * gjs_cairo_surface_from_surface(JSContext *context, cairo_surface_t *surface) { g_return_val_if_fail(context != NULL, NULL); g_return_val_if_fail(surface != NULL, NULL); cairo_surface_type_t type = cairo_surface_get_type(surface); if (type == CAIRO_SURFACE_TYPE_IMAGE) return gjs_cairo_image_surface_from_surface(context, surface); if (type == CAIRO_SURFACE_TYPE_PDF) return gjs_cairo_pdf_surface_from_surface(context, surface); if (type == CAIRO_SURFACE_TYPE_PS) return gjs_cairo_ps_surface_from_surface(context, surface); if (type == CAIRO_SURFACE_TYPE_SVG) return gjs_cairo_svg_surface_from_surface(context, surface); JS::RootedObject proto(context, gjs_cairo_surface_get_proto(context)); JS::RootedObject object(context, JS_NewObjectWithGivenProto(context, &gjs_cairo_surface_class, proto)); if (!object) { gjs_throw(context, "failed to create surface"); return NULL; } gjs_cairo_surface_construct(context, object, surface); return object; }
static JSBool gjs_cairo_ps_surface_constructor(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { char *filename; double width, height; cairo_surface_t *surface; if (!gjs_check_constructing(context)) return JS_FALSE; if (!gjs_parse_args(context, "PSSurface", "sff", argc, argv, "filename", &filename, "width", &width, "height", &height)) return JS_FALSE; surface = cairo_ps_surface_create(filename, width, height); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) { g_free(filename); return JS_FALSE; } gjs_cairo_surface_construct(context, obj, surface); cairo_surface_destroy(surface); g_free(filename); return JS_TRUE; }
static JSBool createFromPNG_func(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { char *filename; cairo_surface_t *surface; JSObject *surface_wrapper; if (!gjs_parse_args(context, "createFromPNG", "s", argc, argv, "filename", &filename)) return JS_FALSE; surface = cairo_image_surface_create_from_png(filename); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) return JS_FALSE; surface_wrapper = JS_NewObject(context, &gjs_cairo_image_surface_class, NULL, NULL); if (!surface_wrapper) { gjs_throw(context, "failed to create surface"); return JS_FALSE; } gjs_cairo_surface_construct(context, surface_wrapper, surface); cairo_surface_destroy(surface); *retval = OBJECT_TO_JSVAL(surface_wrapper); return JS_TRUE; }
static JSBool gjs_cairo_image_surface_constructor(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { int format, width, height; cairo_surface_t *surface; if (!gjs_check_constructing(context)) return JS_FALSE; // create_for_data optional parameter if (!gjs_parse_args(context, "ImageSurface", "iii", argc, argv, "format", &format, "width", &width, "height", &height)) return JS_FALSE; surface = cairo_image_surface_create(format, width, height); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) return JS_FALSE; gjs_cairo_surface_construct(context, obj, surface); cairo_surface_destroy(surface); return JS_TRUE; }
JSObject * gjs_cairo_ps_surface_from_surface(JSContext *context, cairo_surface_t *surface) { JSObject *object; g_return_val_if_fail(context != NULL, NULL); g_return_val_if_fail(surface != NULL, NULL); g_return_val_if_fail(cairo_surface_get_type(surface) == CAIRO_SURFACE_TYPE_PS, NULL); object = JS_NewObject(context, &gjs_cairo_ps_surface_class, NULL, NULL); if (!object) { gjs_throw(context, "failed to create ps surface"); return NULL; } gjs_cairo_surface_construct(context, object, surface); return object; }