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