xref: /aosp_15_r20/external/skia/modules/jetski/src/Canvas.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2021 Google Inc.
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 
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRRect.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "modules/jetski/src/Utils.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include <jni.h>
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker namespace {
18*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_GetWidth(JNIEnv * env,jobject,jlong native_instance)19*c8dee2aaSAndroid Build Coastguard Worker jint Canvas_GetWidth(JNIEnv* env, jobject, jlong native_instance) {
20*c8dee2aaSAndroid Build Coastguard Worker     const auto* canvas = reinterpret_cast<const SkCanvas*>(native_instance);
21*c8dee2aaSAndroid Build Coastguard Worker     return canvas ? canvas->imageInfo().width() : 0;
22*c8dee2aaSAndroid Build Coastguard Worker }
23*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_GetHeight(JNIEnv * env,jobject,jlong native_instance)24*c8dee2aaSAndroid Build Coastguard Worker jint Canvas_GetHeight(JNIEnv* env, jobject, jlong native_instance) {
25*c8dee2aaSAndroid Build Coastguard Worker     const auto* canvas = reinterpret_cast<const SkCanvas*>(native_instance);
26*c8dee2aaSAndroid Build Coastguard Worker     return canvas ? canvas->imageInfo().height() : 0;
27*c8dee2aaSAndroid Build Coastguard Worker }
28*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_Save(JNIEnv * env,jobject,jlong native_instance)29*c8dee2aaSAndroid Build Coastguard Worker jint Canvas_Save(JNIEnv* env, jobject, jlong native_instance) {
30*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
31*c8dee2aaSAndroid Build Coastguard Worker         return canvas->save();
32*c8dee2aaSAndroid Build Coastguard Worker     }
33*c8dee2aaSAndroid Build Coastguard Worker     return 0;
34*c8dee2aaSAndroid Build Coastguard Worker }
35*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_Restore(JNIEnv * env,jobject,jlong native_instance)36*c8dee2aaSAndroid Build Coastguard Worker void Canvas_Restore(JNIEnv* env, jobject, jlong native_instance) {
37*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
38*c8dee2aaSAndroid Build Coastguard Worker         canvas->restore();
39*c8dee2aaSAndroid Build Coastguard Worker     }
40*c8dee2aaSAndroid Build Coastguard Worker }
41*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_RestoreToCount(JNIEnv * env,jobject,jlong native_instance,jint count)42*c8dee2aaSAndroid Build Coastguard Worker void Canvas_RestoreToCount(JNIEnv* env, jobject, jlong native_instance, jint count) {
43*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
44*c8dee2aaSAndroid Build Coastguard Worker         canvas->restoreToCount(count);
45*c8dee2aaSAndroid Build Coastguard Worker     }
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_SaveLayer(JNIEnv * env,jobject,jlong native_instance,jlong native_paint)48*c8dee2aaSAndroid Build Coastguard Worker jint Canvas_SaveLayer(JNIEnv* env, jobject, jlong native_instance, jlong native_paint) {
49*c8dee2aaSAndroid Build Coastguard Worker     auto* paint = reinterpret_cast<SkPaint* >(native_paint);
50*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
51*c8dee2aaSAndroid Build Coastguard Worker         return canvas->saveLayer(nullptr, paint);
52*c8dee2aaSAndroid Build Coastguard Worker     }
53*c8dee2aaSAndroid Build Coastguard Worker     return 0;
54*c8dee2aaSAndroid Build Coastguard Worker }
55*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_LocalToDevice(JNIEnv * env,jobject,jlong native_instance)56*c8dee2aaSAndroid Build Coastguard Worker jlong Canvas_LocalToDevice(JNIEnv* env, jobject, jlong native_instance) {
57*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
58*c8dee2aaSAndroid Build Coastguard Worker         SkM44* m = new SkM44(canvas->getLocalToDevice());
59*c8dee2aaSAndroid Build Coastguard Worker         return reinterpret_cast<jlong>(m);
60*c8dee2aaSAndroid Build Coastguard Worker     }
61*c8dee2aaSAndroid Build Coastguard Worker     return 0;
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_Concat(JNIEnv * env,jobject,jlong native_instance,jlong native_matrix)64*c8dee2aaSAndroid Build Coastguard Worker void Canvas_Concat(JNIEnv* env, jobject, jlong native_instance, jlong native_matrix) {
65*c8dee2aaSAndroid Build Coastguard Worker     auto* canvas = reinterpret_cast<SkCanvas*>(native_instance);
66*c8dee2aaSAndroid Build Coastguard Worker     auto* matrix = reinterpret_cast<SkM44*   >(native_matrix);
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     if (canvas && matrix) {
69*c8dee2aaSAndroid Build Coastguard Worker         canvas->concat(*matrix);
70*c8dee2aaSAndroid Build Coastguard Worker     }
71*c8dee2aaSAndroid Build Coastguard Worker }
72*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_Concat16f(JNIEnv * env,jobject,jlong native_instance,jfloatArray jmatrix)73*c8dee2aaSAndroid Build Coastguard Worker void Canvas_Concat16f(JNIEnv* env, jobject, jlong native_instance, jfloatArray jmatrix) {
74*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(env->GetArrayLength(jmatrix) == 16);
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
77*c8dee2aaSAndroid Build Coastguard Worker         auto* m = env->GetFloatArrayElements(jmatrix, nullptr);
78*c8dee2aaSAndroid Build Coastguard Worker         canvas->concat(SkM44::RowMajor(m));
79*c8dee2aaSAndroid Build Coastguard Worker         env->ReleaseFloatArrayElements(jmatrix, m, 0);
80*c8dee2aaSAndroid Build Coastguard Worker     }
81*c8dee2aaSAndroid Build Coastguard Worker }
82*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_Translate(JNIEnv * env,jobject,jlong native_instance,jfloat tx,jfloat ty,jfloat tz)83*c8dee2aaSAndroid Build Coastguard Worker void Canvas_Translate(JNIEnv* env, jobject, jlong native_instance,
84*c8dee2aaSAndroid Build Coastguard Worker                       jfloat tx, jfloat ty, jfloat tz) {
85*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
86*c8dee2aaSAndroid Build Coastguard Worker         canvas->concat(SkM44::Translate(tx, ty, tz));
87*c8dee2aaSAndroid Build Coastguard Worker     }
88*c8dee2aaSAndroid Build Coastguard Worker }
89*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_Scale(JNIEnv * env,jobject,jlong native_instance,jfloat sx,jfloat sy,jfloat sz)90*c8dee2aaSAndroid Build Coastguard Worker void Canvas_Scale(JNIEnv* env, jobject, jlong native_instance, jfloat sx, jfloat sy, jfloat sz) {
91*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
92*c8dee2aaSAndroid Build Coastguard Worker         canvas->concat(SkM44::Scale(sx, sy, sz));
93*c8dee2aaSAndroid Build Coastguard Worker     }
94*c8dee2aaSAndroid Build Coastguard Worker }
95*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_ClipPath(JNIEnv * env,jobject,jlong native_instance,jlong native_path,jint native_clipOp,jboolean doAA)96*c8dee2aaSAndroid Build Coastguard Worker void Canvas_ClipPath(JNIEnv* env, jobject, jlong native_instance, jlong native_path,
97*c8dee2aaSAndroid Build Coastguard Worker                                            jint native_clipOp, jboolean doAA) {
98*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
99*c8dee2aaSAndroid Build Coastguard Worker         if (auto* path = reinterpret_cast<SkPath*>(native_path)) {
100*c8dee2aaSAndroid Build Coastguard Worker             canvas->clipPath(*path, static_cast<SkClipOp>(native_clipOp), doAA);
101*c8dee2aaSAndroid Build Coastguard Worker         }
102*c8dee2aaSAndroid Build Coastguard Worker     }
103*c8dee2aaSAndroid Build Coastguard Worker }
104*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_ClipRect(JNIEnv * env,jobject,jlong native_instance,jfloat l,jfloat t,jfloat r,jfloat b,jint native_clipOp,jboolean doAA)105*c8dee2aaSAndroid Build Coastguard Worker void Canvas_ClipRect(JNIEnv* env, jobject, jlong native_instance, jfloat l, jfloat t, jfloat r, jfloat b,
106*c8dee2aaSAndroid Build Coastguard Worker                                            jint native_clipOp, jboolean doAA) {
107*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
108*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRect(SkRect::MakeLTRB(l, t, r, b), static_cast<SkClipOp>(native_clipOp), doAA);
109*c8dee2aaSAndroid Build Coastguard Worker     }
110*c8dee2aaSAndroid Build Coastguard Worker }
111*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_ClipRRect(JNIEnv * env,jobject,jlong native_instance,jfloat l,jfloat t,jfloat r,jfloat b,jfloat xRad,jfloat yRad,jint native_clipOp,jboolean doAA)112*c8dee2aaSAndroid Build Coastguard Worker void Canvas_ClipRRect(JNIEnv* env, jobject, jlong native_instance, jfloat l, jfloat t, jfloat r, jfloat b,
113*c8dee2aaSAndroid Build Coastguard Worker                                                                    jfloat xRad, jfloat yRad,
114*c8dee2aaSAndroid Build Coastguard Worker                                                                    jint native_clipOp, jboolean doAA) {
115*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
116*c8dee2aaSAndroid Build Coastguard Worker         canvas->clipRRect(SkRRect::MakeRectXY(SkRect::MakeLTRB(l, t, r, b), xRad, yRad),
117*c8dee2aaSAndroid Build Coastguard Worker                           static_cast<SkClipOp>(native_clipOp), doAA);
118*c8dee2aaSAndroid Build Coastguard Worker     }
119*c8dee2aaSAndroid Build Coastguard Worker }
120*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_ClipShader(JNIEnv * env,jobject,jlong native_instance,jlong native_shader,jint native_clipOp)121*c8dee2aaSAndroid Build Coastguard Worker void Canvas_ClipShader(JNIEnv* env, jobject, jlong native_instance, jlong native_shader, jint native_clipOp) {
122*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
123*c8dee2aaSAndroid Build Coastguard Worker         if (auto* shader = reinterpret_cast<SkShader*>(native_shader)) {
124*c8dee2aaSAndroid Build Coastguard Worker             canvas->clipShader(sk_ref_sp(shader), static_cast<SkClipOp>(native_clipOp));
125*c8dee2aaSAndroid Build Coastguard Worker         }
126*c8dee2aaSAndroid Build Coastguard Worker     }
127*c8dee2aaSAndroid Build Coastguard Worker }
128*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_DrawColor(JNIEnv * env,jobject,jlong native_instance,float r,float g,float b,float a)129*c8dee2aaSAndroid Build Coastguard Worker void Canvas_DrawColor(JNIEnv* env, jobject, jlong native_instance,
130*c8dee2aaSAndroid Build Coastguard Worker                       float r, float g, float b, float a) {
131*c8dee2aaSAndroid Build Coastguard Worker     if (auto* canvas = reinterpret_cast<SkCanvas*>(native_instance)) {
132*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawColor(SkColor4f{r, g, b, a});
133*c8dee2aaSAndroid Build Coastguard Worker     }
134*c8dee2aaSAndroid Build Coastguard Worker }
135*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_DrawRect(JNIEnv * env,jobject,jlong native_instance,jfloat left,jfloat top,jfloat right,jfloat bottom,jlong native_paint)136*c8dee2aaSAndroid Build Coastguard Worker void Canvas_DrawRect(JNIEnv* env, jobject, jlong native_instance,
137*c8dee2aaSAndroid Build Coastguard Worker                      jfloat left, jfloat top, jfloat right, jfloat bottom,
138*c8dee2aaSAndroid Build Coastguard Worker                      jlong native_paint) {
139*c8dee2aaSAndroid Build Coastguard Worker     auto* canvas = reinterpret_cast<SkCanvas*>(native_instance);
140*c8dee2aaSAndroid Build Coastguard Worker     auto* paint  = reinterpret_cast<SkPaint* >(native_paint);
141*c8dee2aaSAndroid Build Coastguard Worker     if (canvas && paint) {
142*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(SkRect::MakeLTRB(left, top, right, bottom), *paint);
143*c8dee2aaSAndroid Build Coastguard Worker     }
144*c8dee2aaSAndroid Build Coastguard Worker }
145*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_DrawImage(JNIEnv * env,jobject,jlong native_instance,jlong native_image,jfloat x,jfloat y,jint sampling_desc,jfloat sampling_b,jfloat sampling_c)146*c8dee2aaSAndroid Build Coastguard Worker void Canvas_DrawImage(JNIEnv* env, jobject, jlong native_instance, jlong native_image,
147*c8dee2aaSAndroid Build Coastguard Worker                       jfloat x, jfloat y,
148*c8dee2aaSAndroid Build Coastguard Worker                       jint sampling_desc, jfloat sampling_b, jfloat sampling_c) {
149*c8dee2aaSAndroid Build Coastguard Worker     auto* canvas = reinterpret_cast<SkCanvas*>(native_instance);
150*c8dee2aaSAndroid Build Coastguard Worker     auto*  image = reinterpret_cast<SkImage *>(native_image);
151*c8dee2aaSAndroid Build Coastguard Worker 
152*c8dee2aaSAndroid Build Coastguard Worker     if (canvas && image) {
153*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawImage(image, x, y,
154*c8dee2aaSAndroid Build Coastguard Worker             jetski::utils::SamplingOptions(sampling_desc, sampling_b, sampling_c));
155*c8dee2aaSAndroid Build Coastguard Worker     }
156*c8dee2aaSAndroid Build Coastguard Worker }
157*c8dee2aaSAndroid Build Coastguard Worker 
Canvas_DrawPath(JNIEnv * env,jobject,jlong native_instance,jlong native_path,jlong native_paint)158*c8dee2aaSAndroid Build Coastguard Worker void Canvas_DrawPath(JNIEnv* env, jobject, jlong native_instance, jlong native_path,
159*c8dee2aaSAndroid Build Coastguard Worker                      jlong native_paint) {
160*c8dee2aaSAndroid Build Coastguard Worker     auto* canvas = reinterpret_cast<SkCanvas*>(native_instance);
161*c8dee2aaSAndroid Build Coastguard Worker     auto* path  = reinterpret_cast<SkPath* >(native_path);
162*c8dee2aaSAndroid Build Coastguard Worker     auto* paint  = reinterpret_cast<SkPaint* >(native_paint);
163*c8dee2aaSAndroid Build Coastguard Worker     if (canvas && paint && path) {
164*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawPath(*path, *paint);
165*c8dee2aaSAndroid Build Coastguard Worker     }
166*c8dee2aaSAndroid Build Coastguard Worker }
167*c8dee2aaSAndroid Build Coastguard Worker 
168*c8dee2aaSAndroid Build Coastguard Worker // jPos: a composite array in the form of [x1, y1, x2, y2, ... ,xn, yn]
169*c8dee2aaSAndroid Build Coastguard Worker // callers of this function check should throw IllegalArgumentException in Java
Canvas_DrawGlyphs(JNIEnv * env,jobject,jlong native_instance,jcharArray jglyphs,jfloatArray jPos,jfloat xOrigin,jfloat yOrigin,jlong native_font,jlong native_paint)170*c8dee2aaSAndroid Build Coastguard Worker void Canvas_DrawGlyphs(JNIEnv* env, jobject, jlong native_instance, jcharArray jglyphs,
171*c8dee2aaSAndroid Build Coastguard Worker                                              jfloatArray jPos, jfloat xOrigin, jfloat yOrigin,
172*c8dee2aaSAndroid Build Coastguard Worker                                              jlong native_font, jlong native_paint) {
173*c8dee2aaSAndroid Build Coastguard Worker     auto* canvas = reinterpret_cast<SkCanvas*>(native_instance);
174*c8dee2aaSAndroid Build Coastguard Worker     auto* font = reinterpret_cast<SkFont*>(native_font);
175*c8dee2aaSAndroid Build Coastguard Worker     auto* paint  = reinterpret_cast<SkPaint* >(native_paint);
176*c8dee2aaSAndroid Build Coastguard Worker     if (canvas && font && paint) {
177*c8dee2aaSAndroid Build Coastguard Worker         int count = env->GetArrayLength(jglyphs);
178*c8dee2aaSAndroid Build Coastguard Worker         auto* compositePositions = env->GetFloatArrayElements(jPos, nullptr);
179*c8dee2aaSAndroid Build Coastguard Worker         auto* positions = reinterpret_cast<SkPoint*>(compositePositions);
180*c8dee2aaSAndroid Build Coastguard Worker         auto* glyphs = env->GetCharArrayElements(jglyphs, nullptr);
181*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawGlyphs(count, glyphs, positions, {xOrigin, yOrigin}, *font, *paint);
182*c8dee2aaSAndroid Build Coastguard Worker 
183*c8dee2aaSAndroid Build Coastguard Worker         env->ReleaseCharArrayElements(jglyphs, glyphs, 0);
184*c8dee2aaSAndroid Build Coastguard Worker         env->ReleaseFloatArrayElements(jPos, compositePositions, 0);
185*c8dee2aaSAndroid Build Coastguard Worker     }
186*c8dee2aaSAndroid Build Coastguard Worker }
187*c8dee2aaSAndroid Build Coastguard Worker 
188*c8dee2aaSAndroid Build Coastguard Worker }  // namespace
189*c8dee2aaSAndroid Build Coastguard Worker 
register_jetski_Canvas(JNIEnv * env)190*c8dee2aaSAndroid Build Coastguard Worker int register_jetski_Canvas(JNIEnv* env) {
191*c8dee2aaSAndroid Build Coastguard Worker     static const JNINativeMethod methods[] = {
192*c8dee2aaSAndroid Build Coastguard Worker         {"nGetWidth"        , "(J)I"           , reinterpret_cast<void*>(Canvas_GetWidth)      },
193*c8dee2aaSAndroid Build Coastguard Worker         {"nGetHeight"       , "(J)I"           , reinterpret_cast<void*>(Canvas_GetHeight)     },
194*c8dee2aaSAndroid Build Coastguard Worker         {"nSave"            , "(J)I"           , reinterpret_cast<void*>(Canvas_Save)          },
195*c8dee2aaSAndroid Build Coastguard Worker         {"nSaveLayer"       , "(JJ)I"          , reinterpret_cast<void*>(Canvas_SaveLayer)     },
196*c8dee2aaSAndroid Build Coastguard Worker         {"nRestore"         , "(J)V"           , reinterpret_cast<void*>(Canvas_Restore)       },
197*c8dee2aaSAndroid Build Coastguard Worker         {"nRestoreToCount"  , "(JI)V"          , reinterpret_cast<void*>(Canvas_RestoreToCount)},
198*c8dee2aaSAndroid Build Coastguard Worker         {"nGetLocalToDevice", "(J)J"           , reinterpret_cast<void*>(Canvas_LocalToDevice) },
199*c8dee2aaSAndroid Build Coastguard Worker         {"nConcat"          , "(JJ)V"          , reinterpret_cast<void*>(Canvas_Concat)        },
200*c8dee2aaSAndroid Build Coastguard Worker         {"nConcat16f"       , "(J[F)V"         , reinterpret_cast<void*>(Canvas_Concat16f)     },
201*c8dee2aaSAndroid Build Coastguard Worker         {"nTranslate"       , "(JFFF)V"        , reinterpret_cast<void*>(Canvas_Translate)     },
202*c8dee2aaSAndroid Build Coastguard Worker         {"nScale"           , "(JFFF)V"        , reinterpret_cast<void*>(Canvas_Scale)         },
203*c8dee2aaSAndroid Build Coastguard Worker         {"nClipPath"        , "(JJIZ)V"        , reinterpret_cast<void*>(Canvas_ClipPath)      },
204*c8dee2aaSAndroid Build Coastguard Worker         {"nClipRect"        , "(JFFFFIZ)V"     , reinterpret_cast<void*>(Canvas_ClipRect)      },
205*c8dee2aaSAndroid Build Coastguard Worker         {"nClipRRect"       , "(JFFFFFFIZ)V"   , reinterpret_cast<void*>(Canvas_ClipRRect)     },
206*c8dee2aaSAndroid Build Coastguard Worker         {"nClipShader"      , "(JJI)V"         , reinterpret_cast<void*>(Canvas_ClipShader)    },
207*c8dee2aaSAndroid Build Coastguard Worker         {"nDrawColor"       , "(JFFFF)V"       , reinterpret_cast<void*>(Canvas_DrawColor)     },
208*c8dee2aaSAndroid Build Coastguard Worker         {"nDrawRect"        , "(JFFFFJ)V"      , reinterpret_cast<void*>(Canvas_DrawRect)      },
209*c8dee2aaSAndroid Build Coastguard Worker         {"nDrawImage"       , "(JJFFIFF)V"     , reinterpret_cast<void*>(Canvas_DrawImage)     },
210*c8dee2aaSAndroid Build Coastguard Worker         {"nDrawPath"        , "(JJJ)V"         , reinterpret_cast<void*>(Canvas_DrawPath)      },
211*c8dee2aaSAndroid Build Coastguard Worker         {"nDrawGlyphs"      , "(J[C[FFFJJ)V", reinterpret_cast<void*>(Canvas_DrawGlyphs)    },
212*c8dee2aaSAndroid Build Coastguard Worker 
213*c8dee2aaSAndroid Build Coastguard Worker     };
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     const auto clazz = env->FindClass("org/skia/jetski/Canvas");
216*c8dee2aaSAndroid Build Coastguard Worker     return clazz
217*c8dee2aaSAndroid Build Coastguard Worker         ? env->RegisterNatives(clazz, methods, std::size(methods))
218*c8dee2aaSAndroid Build Coastguard Worker         : JNI_ERR;
219*c8dee2aaSAndroid Build Coastguard Worker }
220