blob: 045f127e830e07c711ade06a38ecf2d120bc1de3 [file] [log] [blame]
Doris Liu4bbc2932015-12-01 17:59:40 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Doris Liu4bbc2932015-12-01 17:59:40 -080017#include "GraphicsJNI.h"
Doris Liu1d8e1942016-03-02 15:16:28 -080018#include "jni.h"
Doris Liu4bbc2932015-12-01 17:59:40 -080019#include "core_jni_helpers.h"
Doris Liu4bbc2932015-12-01 17:59:40 -080020
Doris Liu1d8e1942016-03-02 15:16:28 -080021#include "PathParser.h"
Doris Liu4bbc2932015-12-01 17:59:40 -080022#include "VectorDrawable.h"
23
sergeyvdccca442016-03-21 15:38:21 -070024#include <hwui/Paint.h>
25
Doris Liu4bbc2932015-12-01 17:59:40 -080026namespace android {
27using namespace uirenderer;
28using namespace uirenderer::VectorDrawable;
29
Doris Liu1d8e1942016-03-02 15:16:28 -080030/**
31 * VectorDrawable's pre-draw construction.
32 */
Doris Liu4bbc2932015-12-01 17:59:40 -080033static jlong createTree(JNIEnv*, jobject, jlong groupPtr) {
34 VectorDrawable::Group* rootGroup = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
35 VectorDrawable::Tree* tree = new VectorDrawable::Tree(rootGroup);
36 return reinterpret_cast<jlong>(tree);
37}
38
Doris Liu335d7d12016-05-26 15:19:15 -070039static jlong createTreeFromCopy(JNIEnv*, jobject, jlong treePtr, jlong groupPtr) {
40 VectorDrawable::Group* rootGroup = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
41 VectorDrawable::Tree* treeToCopy = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
42 VectorDrawable::Tree* tree = new VectorDrawable::Tree(treeToCopy, rootGroup);
43 return reinterpret_cast<jlong>(tree);
44}
45
Doris Liu4bbc2932015-12-01 17:59:40 -080046static jlong createEmptyFullPath(JNIEnv*, jobject) {
47 VectorDrawable::FullPath* newPath = new VectorDrawable::FullPath();
48 return reinterpret_cast<jlong>(newPath);
49}
50
51static jlong createFullPath(JNIEnv*, jobject, jlong srcFullPathPtr) {
52 VectorDrawable::FullPath* srcFullPath =
53 reinterpret_cast<VectorDrawable::FullPath*>(srcFullPathPtr);
54 VectorDrawable::FullPath* newPath = new VectorDrawable::FullPath(*srcFullPath);
55 return reinterpret_cast<jlong>(newPath);
56}
57
Doris Liu4bbc2932015-12-01 17:59:40 -080058static jlong createEmptyClipPath(JNIEnv*, jobject) {
59 VectorDrawable::ClipPath* newPath = new VectorDrawable::ClipPath();
60 return reinterpret_cast<jlong>(newPath);
61}
62
63static jlong createClipPath(JNIEnv*, jobject, jlong srcClipPathPtr) {
64 VectorDrawable::ClipPath* srcClipPath =
65 reinterpret_cast<VectorDrawable::ClipPath*>(srcClipPathPtr);
66 VectorDrawable::ClipPath* newPath = new VectorDrawable::ClipPath(*srcClipPath);
67 return reinterpret_cast<jlong>(newPath);
68}
69
70static jlong createEmptyGroup(JNIEnv*, jobject) {
71 VectorDrawable::Group* newGroup = new VectorDrawable::Group();
72 return reinterpret_cast<jlong>(newGroup);
73}
74
75static jlong createGroup(JNIEnv*, jobject, jlong srcGroupPtr) {
76 VectorDrawable::Group* srcGroup = reinterpret_cast<VectorDrawable::Group*>(srcGroupPtr);
77 VectorDrawable::Group* newGroup = new VectorDrawable::Group(*srcGroup);
78 return reinterpret_cast<jlong>(newGroup);
79}
80
Doris Liu4bbc2932015-12-01 17:59:40 -080081static void setNodeName(JNIEnv* env, jobject, jlong nodePtr, jstring nameStr) {
82 VectorDrawable::Node* node = reinterpret_cast<VectorDrawable::Node*>(nodePtr);
83 const char* nodeName = env->GetStringUTFChars(nameStr, NULL);
84 node->setName(nodeName);
85 env->ReleaseStringUTFChars(nameStr, nodeName);
86}
87
Doris Liu4bbc2932015-12-01 17:59:40 -080088static void addChild(JNIEnv*, jobject, jlong groupPtr, jlong childPtr) {
89 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
90 VectorDrawable::Node* child = reinterpret_cast<VectorDrawable::Node*>(childPtr);
91 group->addChild(child);
92}
93
Doris Liu1d8e1942016-03-02 15:16:28 -080094static void setAllowCaching(JNIEnv*, jobject, jlong treePtr, jboolean allowCaching) {
95 VectorDrawable::Tree* tree = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
96 tree->setAllowCaching(allowCaching);
97}
98
99/**
100 * Draw
101 */
Doris Liuf8d131c2016-04-29 18:41:29 -0700102static int draw(JNIEnv* env, jobject, jlong treePtr, jlong canvasPtr,
Doris Liu1d8e1942016-03-02 15:16:28 -0800103 jlong colorFilterPtr, jobject jrect, jboolean needsMirroring, jboolean canReuseCache) {
104 VectorDrawable::Tree* tree = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
105 Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
106 SkRect rect;
107 GraphicsJNI::jrect_to_rect(env, jrect, &rect);
108 SkColorFilter* colorFilter = reinterpret_cast<SkColorFilter*>(colorFilterPtr);
Doris Liuf8d131c2016-04-29 18:41:29 -0700109 return tree->draw(canvas, colorFilter, rect, needsMirroring, canReuseCache);
Doris Liu1d8e1942016-03-02 15:16:28 -0800110}
111
112/**
113 * Setters and getters for updating staging properties that can happen both pre-draw and post draw.
114 */
115static void setTreeViewportSize(JNIEnv*, jobject, jlong treePtr,
116 jfloat viewportWidth, jfloat viewportHeight) {
117 VectorDrawable::Tree* tree = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
118 tree->mutateStagingProperties()->setViewportSize(viewportWidth, viewportHeight);
119}
120
121static jboolean setRootAlpha(JNIEnv*, jobject, jlong treePtr, jfloat alpha) {
122 VectorDrawable::Tree* tree = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
123 return tree->mutateStagingProperties()->setRootAlpha(alpha);
124}
125
126static jfloat getRootAlpha(JNIEnv*, jobject, jlong treePtr) {
127 VectorDrawable::Tree* tree = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
128 return tree->stagingProperties()->getRootAlpha();
129}
130
131static void updateFullPathPropertiesAndStrokeStyles(JNIEnv*, jobject, jlong fullPathPtr,
132 jfloat strokeWidth, jint strokeColor, jfloat strokeAlpha, jint fillColor, jfloat fillAlpha,
133 jfloat trimPathStart, jfloat trimPathEnd, jfloat trimPathOffset, jfloat strokeMiterLimit,
134 jint strokeLineCap, jint strokeLineJoin, jint fillType) {
135 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
136 fullPath->mutateStagingProperties()->updateProperties(strokeWidth, strokeColor, strokeAlpha,
137 fillColor, fillAlpha, trimPathStart, trimPathEnd, trimPathOffset, strokeMiterLimit,
138 strokeLineCap, strokeLineJoin, fillType);
139}
140
141static void updateFullPathFillGradient(JNIEnv*, jobject, jlong pathPtr, jlong fillGradientPtr) {
142 VectorDrawable::FullPath* path = reinterpret_cast<VectorDrawable::FullPath*>(pathPtr);
143 SkShader* fillShader = reinterpret_cast<SkShader*>(fillGradientPtr);
144 path->mutateStagingProperties()->setFillGradient(fillShader);
145}
146
147static void updateFullPathStrokeGradient(JNIEnv*, jobject, jlong pathPtr, jlong strokeGradientPtr) {
148 VectorDrawable::FullPath* path = reinterpret_cast<VectorDrawable::FullPath*>(pathPtr);
149 SkShader* strokeShader = reinterpret_cast<SkShader*>(strokeGradientPtr);
150 path->mutateStagingProperties()->setStrokeGradient(strokeShader);
151}
152
153static jboolean getFullPathProperties(JNIEnv* env, jobject, jlong fullPathPtr,
154 jbyteArray outProperties, jint length) {
155 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
156 int8_t pathProperties[length];
157 bool success = fullPath->stagingProperties()->copyProperties(pathProperties, length);
158 env->SetByteArrayRegion(outProperties, 0, length, reinterpret_cast<int8_t*>(&pathProperties));
159 return success;
160}
161
162static jboolean getGroupProperties(JNIEnv* env, jobject, jlong groupPtr,
163 jfloatArray outProperties, jint length) {
164 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
165 float groupProperties[length];
166 bool success = group->stagingProperties()->copyProperties(groupProperties, length);
167 env->SetFloatArrayRegion(outProperties, 0, length, reinterpret_cast<float*>(&groupProperties));
168 return success;
169}
170
171static void updateGroupProperties(JNIEnv*, jobject, jlong groupPtr, jfloat rotate, jfloat pivotX,
172 jfloat pivotY, jfloat scaleX, jfloat scaleY, jfloat translateX, jfloat translateY) {
173 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
174 group->mutateStagingProperties()->updateProperties(rotate, pivotX, pivotY, scaleX, scaleY,
175 translateX, translateY);
176}
177
Doris Liu4bbc2932015-12-01 17:59:40 -0800178static void setPathString(JNIEnv* env, jobject, jlong pathPtr, jstring inputStr,
179 jint stringLength) {
180 VectorDrawable::Path* path = reinterpret_cast<VectorDrawable::Path*>(pathPtr);
181 const char* pathString = env->GetStringUTFChars(inputStr, NULL);
Doris Liu1d8e1942016-03-02 15:16:28 -0800182
183 PathParser::ParseResult result;
184 PathData data;
Doris Liub35da392016-04-12 11:06:23 -0700185 PathParser::getPathDataFromAsciiString(&data, &result, pathString, stringLength);
Doris Liu0a1a5162016-04-07 15:03:11 -0700186 if (result.failureOccurred) {
187 doThrowIAE(env, result.failureMessage.c_str());
188 }
Doris Liu1d8e1942016-03-02 15:16:28 -0800189 path->mutateStagingProperties()->setData(data);
Doris Liu4bbc2932015-12-01 17:59:40 -0800190 env->ReleaseStringUTFChars(inputStr, pathString);
191}
192
Doris Liu1d8e1942016-03-02 15:16:28 -0800193/**
194 * Setters and getters that should only be called from animation thread for animation purpose.
195 */
Doris Liu4bbc2932015-12-01 17:59:40 -0800196static jfloat getRotation(JNIEnv*, jobject, jlong groupPtr) {
197 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800198 return group->stagingProperties()->getRotation();
Doris Liu4bbc2932015-12-01 17:59:40 -0800199}
200
201static void setRotation(JNIEnv*, jobject, jlong groupPtr, jfloat rotation) {
202 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800203 group->mutateStagingProperties()->setRotation(rotation);
Doris Liu4bbc2932015-12-01 17:59:40 -0800204}
205
206static jfloat getPivotX(JNIEnv*, jobject, jlong groupPtr) {
207 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800208 return group->stagingProperties()->getPivotX();
Doris Liu4bbc2932015-12-01 17:59:40 -0800209}
210
211static void setPivotX(JNIEnv*, jobject, jlong groupPtr, jfloat pivotX) {
212 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800213 group->mutateStagingProperties()->setPivotX(pivotX);
Doris Liu4bbc2932015-12-01 17:59:40 -0800214}
215
216static jfloat getPivotY(JNIEnv*, jobject, jlong groupPtr) {
217 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800218 return group->stagingProperties()->getPivotY();
Doris Liu4bbc2932015-12-01 17:59:40 -0800219}
220
221static void setPivotY(JNIEnv*, jobject, jlong groupPtr, jfloat pivotY) {
222 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800223 group->mutateStagingProperties()->setPivotY(pivotY);
Doris Liu4bbc2932015-12-01 17:59:40 -0800224}
225
226static jfloat getScaleX(JNIEnv*, jobject, jlong groupPtr) {
227 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800228 return group->stagingProperties()->getScaleX();
Doris Liu4bbc2932015-12-01 17:59:40 -0800229}
230
231static void setScaleX(JNIEnv*, jobject, jlong groupPtr, jfloat scaleX) {
232 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800233 group->mutateStagingProperties()->setScaleX(scaleX);
Doris Liu4bbc2932015-12-01 17:59:40 -0800234}
235
236static jfloat getScaleY(JNIEnv*, jobject, jlong groupPtr) {
237 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800238 return group->stagingProperties()->getScaleY();
Doris Liu4bbc2932015-12-01 17:59:40 -0800239}
240
241static void setScaleY(JNIEnv*, jobject, jlong groupPtr, jfloat scaleY) {
242 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800243 group->mutateStagingProperties()->setScaleY(scaleY);
Doris Liu4bbc2932015-12-01 17:59:40 -0800244}
245
246static jfloat getTranslateX(JNIEnv*, jobject, jlong groupPtr) {
247 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800248 return group->stagingProperties()->getTranslateX();
Doris Liu4bbc2932015-12-01 17:59:40 -0800249}
250
251static void setTranslateX(JNIEnv*, jobject, jlong groupPtr, jfloat translateX) {
252 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800253 group->mutateStagingProperties()->setTranslateX(translateX);
Doris Liu4bbc2932015-12-01 17:59:40 -0800254}
255
256static jfloat getTranslateY(JNIEnv*, jobject, jlong groupPtr) {
257 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800258 return group->stagingProperties()->getTranslateY();
Doris Liu4bbc2932015-12-01 17:59:40 -0800259}
260
261static void setTranslateY(JNIEnv*, jobject, jlong groupPtr, jfloat translateY) {
262 VectorDrawable::Group* group = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800263 group->mutateStagingProperties()->setTranslateY(translateY);
Doris Liu4bbc2932015-12-01 17:59:40 -0800264}
265
266static void setPathData(JNIEnv*, jobject, jlong pathPtr, jlong pathDataPtr) {
267 VectorDrawable::Path* path = reinterpret_cast<VectorDrawable::Path*>(pathPtr);
268 PathData* pathData = reinterpret_cast<PathData*>(pathDataPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800269 path->mutateStagingProperties()->setData(*pathData);
Doris Liu4bbc2932015-12-01 17:59:40 -0800270}
271
272static jfloat getStrokeWidth(JNIEnv*, jobject, jlong fullPathPtr) {
273 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800274 return fullPath->stagingProperties()->getStrokeWidth();
Doris Liu4bbc2932015-12-01 17:59:40 -0800275}
276
277static void setStrokeWidth(JNIEnv*, jobject, jlong fullPathPtr, jfloat strokeWidth) {
278 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800279 fullPath->mutateStagingProperties()->setStrokeWidth(strokeWidth);
Doris Liu4bbc2932015-12-01 17:59:40 -0800280}
281
282static jint getStrokeColor(JNIEnv*, jobject, jlong fullPathPtr) {
283 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800284 return fullPath->stagingProperties()->getStrokeColor();
Doris Liu4bbc2932015-12-01 17:59:40 -0800285}
286
287static void setStrokeColor(JNIEnv*, jobject, jlong fullPathPtr, jint strokeColor) {
288 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800289 fullPath->mutateStagingProperties()->setStrokeColor(strokeColor);
Doris Liu4bbc2932015-12-01 17:59:40 -0800290}
291
292static jfloat getStrokeAlpha(JNIEnv*, jobject, jlong fullPathPtr) {
293 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800294 return fullPath->stagingProperties()->getStrokeAlpha();
Doris Liu4bbc2932015-12-01 17:59:40 -0800295}
296
297static void setStrokeAlpha(JNIEnv*, jobject, jlong fullPathPtr, jfloat strokeAlpha) {
298 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800299 fullPath->mutateStagingProperties()->setStrokeAlpha(strokeAlpha);
Doris Liu4bbc2932015-12-01 17:59:40 -0800300}
301
302static jint getFillColor(JNIEnv*, jobject, jlong fullPathPtr) {
303 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800304 return fullPath->stagingProperties()->getFillColor();
Doris Liu4bbc2932015-12-01 17:59:40 -0800305}
306
307static void setFillColor(JNIEnv*, jobject, jlong fullPathPtr, jint fillColor) {
308 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800309 fullPath->mutateStagingProperties()->setFillColor(fillColor);
Doris Liu4bbc2932015-12-01 17:59:40 -0800310}
311
312static jfloat getFillAlpha(JNIEnv*, jobject, jlong fullPathPtr) {
313 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800314 return fullPath->stagingProperties()->getFillAlpha();
Doris Liu4bbc2932015-12-01 17:59:40 -0800315}
316
317static void setFillAlpha(JNIEnv*, jobject, jlong fullPathPtr, jfloat fillAlpha) {
318 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800319 fullPath->mutateStagingProperties()->setFillAlpha(fillAlpha);
Doris Liu4bbc2932015-12-01 17:59:40 -0800320}
321
322static jfloat getTrimPathStart(JNIEnv*, jobject, jlong fullPathPtr) {
323 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800324 return fullPath->stagingProperties()->getTrimPathStart();
Doris Liu4bbc2932015-12-01 17:59:40 -0800325}
326
327static void setTrimPathStart(JNIEnv*, jobject, jlong fullPathPtr, jfloat trimPathStart) {
328 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800329 fullPath->mutateStagingProperties()->setTrimPathStart(trimPathStart);
Doris Liu4bbc2932015-12-01 17:59:40 -0800330}
331
332static jfloat getTrimPathEnd(JNIEnv*, jobject, jlong fullPathPtr) {
333 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800334 return fullPath->stagingProperties()->getTrimPathEnd();
Doris Liu4bbc2932015-12-01 17:59:40 -0800335}
336
337static void setTrimPathEnd(JNIEnv*, jobject, jlong fullPathPtr, jfloat trimPathEnd) {
338 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800339 fullPath->mutateStagingProperties()->setTrimPathEnd(trimPathEnd);
Doris Liu4bbc2932015-12-01 17:59:40 -0800340}
341
342static jfloat getTrimPathOffset(JNIEnv*, jobject, jlong fullPathPtr) {
343 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800344 return fullPath->stagingProperties()->getTrimPathOffset();
Doris Liu4bbc2932015-12-01 17:59:40 -0800345}
346
347static void setTrimPathOffset(JNIEnv*, jobject, jlong fullPathPtr, jfloat trimPathOffset) {
348 VectorDrawable::FullPath* fullPath = reinterpret_cast<VectorDrawable::FullPath*>(fullPathPtr);
Doris Liu1d8e1942016-03-02 15:16:28 -0800349 fullPath->mutateStagingProperties()->setTrimPathOffset(trimPathOffset);
Doris Liu4bbc2932015-12-01 17:59:40 -0800350}
351
352static const JNINativeMethod gMethods[] = {
Doris Liucdedc9a2016-04-11 18:13:01 -0700353 {"nCreateTree", "!(J)J", (void*)createTree},
Doris Liu335d7d12016-05-26 15:19:15 -0700354 {"nCreateTreeFromCopy", "!(JJ)J", (void*)createTreeFromCopy},
Doris Liu4bbc2932015-12-01 17:59:40 -0800355 {"nSetRendererViewportSize", "!(JFF)V", (void*)setTreeViewportSize},
356 {"nSetRootAlpha", "!(JF)Z", (void*)setRootAlpha},
357 {"nGetRootAlpha", "!(J)F", (void*)getRootAlpha},
358 {"nSetAllowCaching", "!(JZ)V", (void*)setAllowCaching},
359
Doris Liuf8d131c2016-04-29 18:41:29 -0700360 {"nDraw", "(JJJLandroid/graphics/Rect;ZZ)I", (void*)draw},
Doris Liu4bbc2932015-12-01 17:59:40 -0800361 {"nCreateFullPath", "!()J", (void*)createEmptyFullPath},
362 {"nCreateFullPath", "!(J)J", (void*)createFullPath},
Teng-Hui Zhu46591f42016-03-15 14:32:16 -0700363 {"nUpdateFullPathProperties", "!(JFIFIFFFFFIII)V", (void*)updateFullPathPropertiesAndStrokeStyles},
Teng-Hui Zhudbee9bb2015-12-15 11:01:27 -0800364 {"nUpdateFullPathFillGradient", "!(JJ)V", (void*)updateFullPathFillGradient},
365 {"nUpdateFullPathStrokeGradient", "!(JJ)V", (void*)updateFullPathStrokeGradient},
Doris Liu4bbc2932015-12-01 17:59:40 -0800366 {"nGetFullPathProperties", "(J[BI)Z", (void*)getFullPathProperties},
367 {"nGetGroupProperties", "(J[FI)Z", (void*)getGroupProperties},
368
369 {"nCreateClipPath", "!()J", (void*)createEmptyClipPath},
370 {"nCreateClipPath", "!(J)J", (void*)createClipPath},
371 {"nCreateGroup", "!()J", (void*)createEmptyGroup},
372 {"nCreateGroup", "!(J)J", (void*)createGroup},
Doris Liu4bbc2932015-12-01 17:59:40 -0800373 {"nSetName", "(JLjava/lang/String;)V", (void*)setNodeName},
374 {"nUpdateGroupProperties", "!(JFFFFFFF)V", (void*)updateGroupProperties},
375
376 {"nAddChild", "!(JJ)V", (void*)addChild},
377 {"nSetPathString", "(JLjava/lang/String;I)V", (void*)setPathString},
378
379 {"nGetRotation", "!(J)F", (void*)getRotation},
380 {"nSetRotation", "!(JF)V", (void*)setRotation},
381 {"nGetPivotX", "!(J)F", (void*)getPivotX},
382 {"nSetPivotX", "!(JF)V", (void*)setPivotX},
383 {"nGetPivotY", "!(J)F", (void*)getPivotY},
384 {"nSetPivotY", "!(JF)V", (void*)setPivotY},
385 {"nGetScaleX", "!(J)F", (void*)getScaleX},
386 {"nSetScaleX", "!(JF)V", (void*)setScaleX},
387 {"nGetScaleY", "!(J)F", (void*)getScaleY},
388 {"nSetScaleY", "!(JF)V", (void*)setScaleY},
389 {"nGetTranslateX", "!(J)F", (void*)getTranslateX},
390 {"nSetTranslateX", "!(JF)V", (void*)setTranslateX},
391 {"nGetTranslateY", "!(J)F", (void*)getTranslateY},
392 {"nSetTranslateY", "!(JF)V", (void*)setTranslateY},
393
394 {"nSetPathData", "!(JJ)V", (void*)setPathData},
395 {"nGetStrokeWidth", "!(J)F", (void*)getStrokeWidth},
396 {"nSetStrokeWidth", "!(JF)V", (void*)setStrokeWidth},
397 {"nGetStrokeColor", "!(J)I", (void*)getStrokeColor},
398 {"nSetStrokeColor", "!(JI)V", (void*)setStrokeColor},
399 {"nGetStrokeAlpha", "!(J)F", (void*)getStrokeAlpha},
400 {"nSetStrokeAlpha", "!(JF)V", (void*)setStrokeAlpha},
401 {"nGetFillColor", "!(J)I", (void*)getFillColor},
402 {"nSetFillColor", "!(JI)V", (void*)setFillColor},
403 {"nGetFillAlpha", "!(J)F", (void*)getFillAlpha},
404 {"nSetFillAlpha", "!(JF)V", (void*)setFillAlpha},
405 {"nGetTrimPathStart", "!(J)F", (void*)getTrimPathStart},
406 {"nSetTrimPathStart", "!(JF)V", (void*)setTrimPathStart},
407 {"nGetTrimPathEnd", "!(J)F", (void*)getTrimPathEnd},
408 {"nSetTrimPathEnd", "!(JF)V", (void*)setTrimPathEnd},
409 {"nGetTrimPathOffset", "!(J)F", (void*)getTrimPathOffset},
410 {"nSetTrimPathOffset", "!(JF)V", (void*)setTrimPathOffset},
411};
412
413int register_android_graphics_drawable_VectorDrawable(JNIEnv* env) {
414 return RegisterMethodsOrDie(env, "android/graphics/drawable/VectorDrawable", gMethods, NELEM(gMethods));
415}
416
417}; // namespace android