Branch data Line data Source code
1 : : /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
2 : : // SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
3 : : // SPDX-FileCopyrightText: 2010 litl, LLC.
4 : :
5 : : #include <config.h>
6 : :
7 : : #include <cairo.h>
8 : :
9 : : #include <js/CallArgs.h>
10 : : #include <js/PropertyDescriptor.h> // for JSPROP_READONLY
11 : : #include <js/PropertySpec.h>
12 : : #include <js/RootingAPI.h>
13 : : #include <js/TypeDecls.h>
14 : : #include <jsapi.h> // for JS_NewObjectWithGivenProto
15 : : #include <jspubtd.h> // for JSProtoKey
16 : :
17 : : #include "gjs/jsapi-util-args.h"
18 : : #include "gjs/macros.h"
19 : : #include "modules/cairo-memory.h"
20 : : #include "modules/cairo-private.h"
21 : :
22 : 2 : JSObject* CairoSolidPattern::new_proto(JSContext* cx, JSProtoKey) {
23 : 2 : JS::RootedObject parent_proto(cx, CairoPattern::prototype(cx));
24 : 2 : return JS_NewObjectWithGivenProto(cx, nullptr, parent_proto);
25 : 2 : }
26 : :
27 : : // clang-format off
28 : : const JSPropertySpec CairoSolidPattern::proto_props[] = {
29 : : JS_STRING_SYM_PS(toStringTag, "SolidPattern", JSPROP_READONLY),
30 : : JS_PS_END};
31 : : // clang-format on
32 : :
33 : 9 : void CairoSolidPattern::add_associated_memory(JSObject* obj,
34 : : cairo_pattern_t* pattern) {
35 : 9 : add_associated_memory_for_pattern(obj, pattern);
36 : 9 : }
37 : :
38 : : GJS_JSAPI_RETURN_CONVENTION
39 : 6 : static bool createRGB_func(JSContext* cx, unsigned argc, JS::Value* vp) {
40 : 6 : JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
41 : : double red, green, blue;
42 [ + + ]: 6 : if (!gjs_parse_call_args(cx, "createRGB", args, "fff", "red", &red, "green",
43 : : &green, "blue", &blue))
44 : 1 : return false;
45 : :
46 : 5 : cairo_pattern_t* pattern = cairo_pattern_create_rgb(red, green, blue);
47 [ - + ]: 5 : if (!gjs_cairo_check_status(cx, cairo_pattern_status(pattern), "pattern"))
48 : 0 : return false;
49 : :
50 : 5 : JSObject* pattern_wrapper = CairoSolidPattern::from_c_ptr(cx, pattern);
51 [ - + ]: 5 : if (!pattern_wrapper)
52 : 0 : return false;
53 : 5 : cairo_pattern_destroy(pattern);
54 : :
55 : 5 : args.rval().setObject(*pattern_wrapper);
56 : :
57 : 5 : return true;
58 : : }
59 : :
60 : : GJS_JSAPI_RETURN_CONVENTION
61 : 1 : static bool createRGBA_func(JSContext* cx, unsigned argc, JS::Value* vp) {
62 : 1 : JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
63 : : double red, green, blue, alpha;
64 [ - + ]: 1 : if (!gjs_parse_call_args(cx, "createRGBA", args, "ffff", "red", &red,
65 : : "green", &green, "blue", &blue, "alpha", &alpha))
66 : 0 : return false;
67 : :
68 : : cairo_pattern_t* pattern =
69 : 1 : cairo_pattern_create_rgba(red, green, blue, alpha);
70 [ - + ]: 1 : if (!gjs_cairo_check_status(cx, cairo_pattern_status(pattern), "pattern"))
71 : 0 : return false;
72 : :
73 : 1 : JSObject* pattern_wrapper = CairoSolidPattern::from_c_ptr(cx, pattern);
74 [ - + ]: 1 : if (!pattern_wrapper)
75 : 0 : return false;
76 : 1 : cairo_pattern_destroy(pattern);
77 : :
78 : 1 : args.rval().setObject(*pattern_wrapper);
79 : :
80 : 1 : return true;
81 : : }
82 : :
83 : : // clang-format off
84 : : const JSFunctionSpec CairoSolidPattern::static_funcs[] = {
85 : : JS_FN("createRGB", createRGB_func, 0, 0),
86 : : JS_FN("createRGBA", createRGBA_func, 0, 0),
87 : : JS_FS_END};
88 : : // clang-format on
|