1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include <string>
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "experimental/tskit/bindings/bindings.h"
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker // SkRect.h tossed in here to avoid having to include/link it in POC
12*c8dee2aaSAndroid Build Coastguard Worker typedef float SkScalar;
13*c8dee2aaSAndroid Build Coastguard Worker struct SkRect {
14*c8dee2aaSAndroid Build Coastguard Worker SkScalar fLeft; //!< smaller x-axis bounds
15*c8dee2aaSAndroid Build Coastguard Worker SkScalar fTop; //!< smaller y-axis bounds
16*c8dee2aaSAndroid Build Coastguard Worker SkScalar fRight; //!< larger x-axis bounds
17*c8dee2aaSAndroid Build Coastguard Worker SkScalar fBottom; //!< larger y-axis bounds
18*c8dee2aaSAndroid Build Coastguard Worker
containsSkRect19*c8dee2aaSAndroid Build Coastguard Worker bool contains(SkScalar x, SkScalar y) const {
20*c8dee2aaSAndroid Build Coastguard Worker return x >= fLeft && x < fRight && y >= fTop && y < fBottom;
21*c8dee2aaSAndroid Build Coastguard Worker }
22*c8dee2aaSAndroid Build Coastguard Worker };
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker class Extension {
25*c8dee2aaSAndroid Build Coastguard Worker public:
Extension()26*c8dee2aaSAndroid Build Coastguard Worker Extension(): fProp("foo") {}
Extension(std::string n)27*c8dee2aaSAndroid Build Coastguard Worker Extension(std::string n): fProp(n) {}
28*c8dee2aaSAndroid Build Coastguard Worker
getProp()29*c8dee2aaSAndroid Build Coastguard Worker const std::string getProp() {
30*c8dee2aaSAndroid Build Coastguard Worker return fProp;
31*c8dee2aaSAndroid Build Coastguard Worker }
32*c8dee2aaSAndroid Build Coastguard Worker
setProp(std::string p)33*c8dee2aaSAndroid Build Coastguard Worker void setProp(std::string p) {
34*c8dee2aaSAndroid Build Coastguard Worker fProp = p;
35*c8dee2aaSAndroid Build Coastguard Worker }
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Worker private:
38*c8dee2aaSAndroid Build Coastguard Worker std::string fProp;
39*c8dee2aaSAndroid Build Coastguard Worker };
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker struct CompoundObj {
42*c8dee2aaSAndroid Build Coastguard Worker int alpha;
43*c8dee2aaSAndroid Build Coastguard Worker std::string beta;
44*c8dee2aaSAndroid Build Coastguard Worker float gamma;
45*c8dee2aaSAndroid Build Coastguard Worker };
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker
EMSCRIPTEN_BINDINGS(Extension)48*c8dee2aaSAndroid Build Coastguard Worker EMSCRIPTEN_BINDINGS(Extension) {
49*c8dee2aaSAndroid Build Coastguard Worker TS_PRIVATE_EXPORT("_privateExtension(rPtr: number, len: number): number")
50*c8dee2aaSAndroid Build Coastguard Worker function("_privateExtension", optional_override([](uintptr_t rPtr, size_t len)->int {
51*c8dee2aaSAndroid Build Coastguard Worker int containsPoint = 0;
52*c8dee2aaSAndroid Build Coastguard Worker SkRect* rects = reinterpret_cast<SkRect*>(rPtr);
53*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < len; i++) {
54*c8dee2aaSAndroid Build Coastguard Worker if (rects[i].contains(5, 5)) {
55*c8dee2aaSAndroid Build Coastguard Worker containsPoint++;
56*c8dee2aaSAndroid Build Coastguard Worker }
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker return containsPoint;
59*c8dee2aaSAndroid Build Coastguard Worker }));
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker TS_PRIVATE_EXPORT("_withObject(obj: CompoundObj): void")
62*c8dee2aaSAndroid Build Coastguard Worker function("_withObject", optional_override([](CompoundObj o)->void {
63*c8dee2aaSAndroid Build Coastguard Worker printf("Object %d %s %f\n", o.alpha, o.beta.c_str(), o.gamma);
64*c8dee2aaSAndroid Build Coastguard Worker }));
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Worker /**
67*c8dee2aaSAndroid Build Coastguard Worker * The Extension class extends the core components.
68*c8dee2aaSAndroid Build Coastguard Worker */
69*c8dee2aaSAndroid Build Coastguard Worker class_<Extension>("Extension")
70*c8dee2aaSAndroid Build Coastguard Worker .constructor<>()
71*c8dee2aaSAndroid Build Coastguard Worker /**
72*c8dee2aaSAndroid Build Coastguard Worker * Returns an extension with the provided property.
73*c8dee2aaSAndroid Build Coastguard Worker * @param name - if not provided, use a default value
74*c8dee2aaSAndroid Build Coastguard Worker */
75*c8dee2aaSAndroid Build Coastguard Worker TS_EXPORT("new(name?: string): Extension")
76*c8dee2aaSAndroid Build Coastguard Worker .constructor<std::string>()
77*c8dee2aaSAndroid Build Coastguard Worker /**
78*c8dee2aaSAndroid Build Coastguard Worker * Returns the associated property.
79*c8dee2aaSAndroid Build Coastguard Worker */
80*c8dee2aaSAndroid Build Coastguard Worker TS_EXPORT("getProp(): string")
81*c8dee2aaSAndroid Build Coastguard Worker .function("getProp", &Extension::getProp)
82*c8dee2aaSAndroid Build Coastguard Worker TS_PRIVATE_EXPORT("setProp(p: string): void")
83*c8dee2aaSAndroid Build Coastguard Worker .function("_setProp", &Extension::setProp);
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker value_object<CompoundObj>("CompoundObj")
86*c8dee2aaSAndroid Build Coastguard Worker /** @type number */
87*c8dee2aaSAndroid Build Coastguard Worker .field("alpha", &CompoundObj::alpha)
88*c8dee2aaSAndroid Build Coastguard Worker /** @type string */
89*c8dee2aaSAndroid Build Coastguard Worker .field("beta", &CompoundObj::beta)
90*c8dee2aaSAndroid Build Coastguard Worker /**
91*c8dee2aaSAndroid Build Coastguard Worker * This field (gamma) should be documented.
92*c8dee2aaSAndroid Build Coastguard Worker * The default value is 1.0 if not set.
93*c8dee2aaSAndroid Build Coastguard Worker * @type @optional number
94*c8dee2aaSAndroid Build Coastguard Worker */
95*c8dee2aaSAndroid Build Coastguard Worker .field("gamma", &CompoundObj::gamma);
96*c8dee2aaSAndroid Build Coastguard Worker }
97