xref: /aosp_15_r20/external/skia/experimental/tskit/bindings/extension.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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