android_graphics_Canvas.cpp revision 3d4eed7f1aa99401dabe2e45b82f98fb4fc2d754
1c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh/* 2c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * Copyright (C) 2014 The Android Open Source Project 3c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * 4c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 5c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * you may not use this file except in compliance with the License. 6c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * You may obtain a copy of the License at 7c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * 8c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * http://www.apache.org/licenses/LICENSE-2.0 9c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * 10c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * Unless required by applicable law or agreed to in writing, software 11c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS, 12c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * See the License for the specific language governing permissions and 14c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * limitations under the License. 15c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh */ 16c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 173e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh#include "jni.h" 1825f5ece09fc045850785f09ddd9193e45b52c9d3Quddus Chong#include "GraphicsJNI.h" 193e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh#include "core_jni_helpers.h" 203e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh 213e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh#include "Canvas.h" 223e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh#include "SkDrawFilter.h" 233e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh#include "SkGraphics.h" 243e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh#include "SkPorterDuff.h" 253e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh#include "Paint.h" 26c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include "TypefaceImpl.h" 27c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 28c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include "MinikinUtils.h" 29c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 30c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehnamespace android { 31c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 32c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehnamespace CanvasJNI { 33c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 34c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstatic Canvas* get_canvas(jlong canvasHandle) { 35c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh return reinterpret_cast<Canvas*>(canvasHandle); 36c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh} 37c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 38c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstatic void finalizer(JNIEnv* env, jobject clazz, jlong canvasHandle) { 392975a24dc42c8953125b39a5194da3aec244cbefDan Albert delete get_canvas(canvasHandle); 402975a24dc42c8953125b39a5194da3aec244cbefDan Albert} 41c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 42c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh// Native wrapper constructor used by Canvas(Bitmap) 43c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstatic jlong initRaster(JNIEnv* env, jobject, jlong bitmapHandle) { 44c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 45c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh return reinterpret_cast<jlong>(Canvas::create_canvas(bitmap)); 46c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh} 47c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 48c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh// Set the given bitmap as the new draw target (wrapped in a new SkCanvas), 492975a24dc42c8953125b39a5194da3aec244cbefDan Albert// optionally copying canvas matrix & clip state. 502975a24dc42c8953125b39a5194da3aec244cbefDan Albertstatic void setBitmap(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle, 511d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jboolean copyState) { 521d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 531d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->setBitmap(bitmap, copyState); 541d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 55c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 56c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstatic jboolean isOpaque(JNIEnv*, jobject, jlong canvasHandle) { 571d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return get_canvas(canvasHandle)->isOpaque() ? JNI_TRUE : JNI_FALSE; 581d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 591d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 601d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jint getWidth(JNIEnv*, jobject, jlong canvasHandle) { 611d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return static_cast<jint>(get_canvas(canvasHandle)->width()); 621d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 631d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 641d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jint getHeight(JNIEnv*, jobject, jlong canvasHandle) { 651d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return static_cast<jint>(get_canvas(canvasHandle)->height()); 661d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 671d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 681d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jint getSaveCount(JNIEnv*, jobject, jlong canvasHandle) { 691d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return static_cast<jint>(get_canvas(canvasHandle)->getSaveCount()); 701d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 711d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 721d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jint save(JNIEnv*, jobject, jlong canvasHandle, jint flagsHandle) { 731d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkCanvas::SaveFlags flags = static_cast<SkCanvas::SaveFlags>(flagsHandle); 741d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return static_cast<jint>(get_canvas(canvasHandle)->save(flags)); 751d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 761d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 771d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jint saveLayer(JNIEnv* env, jobject, jlong canvasHandle, jfloat l, jfloat t, 781d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat r, jfloat b, jlong paintHandle, jint flagsHandle) { 791d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh Paint* paint = reinterpret_cast<Paint*>(paintHandle); 801d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkCanvas::SaveFlags flags = static_cast<SkCanvas::SaveFlags>(flagsHandle); 811d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return static_cast<jint>(get_canvas(canvasHandle)->saveLayer(l, t, r, b, paint, flags)); 821d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 831d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 841d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jint saveLayerAlpha(JNIEnv* env, jobject, jlong canvasHandle, jfloat l, jfloat t, 851d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat r, jfloat b, jint alpha, jint flagsHandle) { 861d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkCanvas::SaveFlags flags = static_cast<SkCanvas::SaveFlags>(flagsHandle); 871d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha, flags)); 881d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 89c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 90c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstatic void restore(JNIEnv* env, jobject, jlong canvasHandle) { 91c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh Canvas* canvas = get_canvas(canvasHandle); 92c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh if (canvas->getSaveCount() <= 1) { // cannot restore anymore 931d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh doThrowISE(env, "Underflow in restore"); 941d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return; 951d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh } 961d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh canvas->restore(); 971d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 981d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 991d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void restoreToCount(JNIEnv* env, jobject, jlong canvasHandle, jint restoreCount) { 1001d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh Canvas* canvas = get_canvas(canvasHandle); 1011d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh if (restoreCount < 1 || restoreCount > canvas->getSaveCount()) { 1021d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh doThrowIAE(env, "Underflow in restoreToCount"); 103c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh return; 104c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh } 1051d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh canvas->restoreToCount(restoreCount); 1061d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1071d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1081d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void getCTM(JNIEnv* env, jobject, jlong canvasHandle, jlong matrixHandle) { 1091d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); 1101d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->getMatrix(matrix); 1111d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1121d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1131d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void setMatrix(JNIEnv* env, jobject, jlong canvasHandle, jlong matrixHandle) { 1141d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); 1151d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->setMatrix(matrix ? *matrix : SkMatrix::I()); 1161d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1171d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 118c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstatic void concat(JNIEnv* env, jobject, jlong canvasHandle, jlong matrixHandle) { 1191d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); 1201d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->concat(*matrix); 1211d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1221d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1231d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void rotate(JNIEnv*, jobject, jlong canvasHandle, jfloat degrees) { 1241d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->rotate(degrees); 1251d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1261d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1271d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void scale(JNIEnv*, jobject, jlong canvasHandle, jfloat sx, jfloat sy) { 1281d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->scale(sx, sy); 1291d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1301d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1311d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void skew(JNIEnv*, jobject, jlong canvasHandle, jfloat sx, jfloat sy) { 1321d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->skew(sx, sy); 133c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh} 1341d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1351d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void translate(JNIEnv*, jobject, jlong canvasHandle, jfloat dx, jfloat dy) { 1361d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->translate(dx, dy); 1371d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1381d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1391d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jboolean getClipBounds(JNIEnv* env, jobject, jlong canvasHandle, jobject bounds) { 1401d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkRect r; 1411d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkIRect ir; 1421d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh bool result = get_canvas(canvasHandle)->getClipBounds(&r); 1431d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1441d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh if (!result) { 1451d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh r.setEmpty(); 1461d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh } 1471d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh r.round(&ir); 1481d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 149c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh (void)GraphicsJNI::irect_to_jrect(ir, env, bounds); 1501d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return result ? JNI_TRUE : JNI_FALSE; 1511d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1521d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1531d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jboolean quickRejectRect(JNIEnv* env, jobject, jlong canvasHandle, 1541d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat left, jfloat top, jfloat right, jfloat bottom) { 1551d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh bool result = get_canvas(canvasHandle)->quickRejectRect(left, top, right, bottom); 1561d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return result ? JNI_TRUE : JNI_FALSE; 1571d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1581d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1591d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jboolean quickRejectPath(JNIEnv* env, jobject, jlong canvasHandle, jlong pathHandle) { 1601d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkPath* path = reinterpret_cast<SkPath*>(pathHandle); 1611d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh bool result = get_canvas(canvasHandle)->quickRejectPath(*path); 162c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh return result ? JNI_TRUE : JNI_FALSE; 1631d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1641d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1651d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jboolean clipRect(JNIEnv*, jobject, jlong canvasHandle, jfloat l, jfloat t, 1661d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat r, jfloat b, jint opHandle) { 1671d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkRegion::Op op = static_cast<SkRegion::Op>(opHandle); 1681d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh bool emptyClip = get_canvas(canvasHandle)->clipRect(l, t, r, b, op); 1691d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return emptyClip ? JNI_FALSE : JNI_TRUE; 1701d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1711d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1721d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jboolean clipPath(JNIEnv* env, jobject, jlong canvasHandle, jlong pathHandle, 1731d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jint opHandle) { 1741d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkPath* path = reinterpret_cast<SkPath*>(pathHandle); 175c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh SkRegion::Op op = static_cast<SkRegion::Op>(opHandle); 176c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh bool emptyClip = get_canvas(canvasHandle)->clipPath(path, op); 1771d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return emptyClip ? JNI_FALSE : JNI_TRUE; 1781d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1791d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1801d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic jboolean clipRegion(JNIEnv* env, jobject, jlong canvasHandle, jlong deviceRgnHandle, 1811d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jint opHandle) { 1821d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkRegion* deviceRgn = reinterpret_cast<SkRegion*>(deviceRgnHandle); 1831d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkRegion::Op op = static_cast<SkRegion::Op>(opHandle); 1841d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh bool emptyClip = get_canvas(canvasHandle)->clipRegion(deviceRgn, op); 1851d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return emptyClip ? JNI_FALSE : JNI_TRUE; 1861d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1871d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1881d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawColor(JNIEnv* env, jobject, jlong canvasHandle, jint color, jint modeHandle) { 1891d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh SkPorterDuff::Mode mode = static_cast<SkPorterDuff::Mode>(modeHandle); 1901d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawColor(color, SkPorterDuff::ToXfermodeMode(mode)); 1911d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1921d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1931d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawPaint(JNIEnv* env, jobject, jlong canvasHandle, jlong paintHandle) { 1941d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh Paint* paint = reinterpret_cast<Paint*>(paintHandle); 1951d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawPaint(*paint); 1961d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 1971d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 1981d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawPoint(JNIEnv*, jobject, jlong canvasHandle, jfloat x, jfloat y, 1991d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jlong paintHandle) { 2001d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2011d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawPoint(x, y, *paint); 2021d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2031d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2041d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawPoints(JNIEnv* env, jobject, jlong canvasHandle, jfloatArray jptsArray, 2051d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jint offset, jint count, jlong paintHandle) { 2061d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh NPE_CHECK_RETURN_VOID(env, jptsArray); 2071d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh AutoJavaFloatArray autoPts(env, jptsArray); 2081d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh float* floats = autoPts.ptr(); 2091d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const int length = autoPts.length(); 2101d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 211c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh if ((offset | count) < 0 || offset + count > length) { 212c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh doThrowAIOOBE(env); 2131d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return; 2141d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh } 2151d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2161d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2171d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawPoints(floats + offset, count, *paint); 2181d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2191d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2201d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawLine(JNIEnv* env, jobject, jlong canvasHandle, jfloat startX, jfloat startY, 2211d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat stopX, jfloat stopY, jlong paintHandle) { 2221d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2231d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawLine(startX, startY, stopX, stopY, *paint); 2241d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2251d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2261d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawLines(JNIEnv* env, jobject, jlong canvasHandle, jfloatArray jptsArray, 2271d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jint offset, jint count, jlong paintHandle) { 2281d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh NPE_CHECK_RETURN_VOID(env, jptsArray); 2291d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh AutoJavaFloatArray autoPts(env, jptsArray); 2301d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh float* floats = autoPts.ptr(); 2311d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const int length = autoPts.length(); 2321d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2331d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh if ((offset | count) < 0 || offset + count > length) { 2341d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh doThrowAIOOBE(env); 2351d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh return; 2361d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh } 2371d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2381d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2391d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawLines(floats + offset, count, *paint); 2401d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2411d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2421d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawRect(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top, 2431d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat right, jfloat bottom, jlong paintHandle) { 2441d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2451d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawRect(left, top, right, bottom, *paint); 2461d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2471d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2481d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawRoundRect(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top, 2491d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat right, jfloat bottom, jfloat rx, jfloat ry, jlong paintHandle) { 2501d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2511d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawRoundRect(left, top, right, bottom, rx, ry, *paint); 2521d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2531d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2541d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawCircle(JNIEnv* env, jobject, jlong canvasHandle, jfloat cx, jfloat cy, 255c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh jfloat radius, jlong paintHandle) { 256c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2571d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawCircle(cx, cy, radius, *paint); 2581d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2591d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2601d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawOval(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top, 2611d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jfloat right, jfloat bottom, jlong paintHandle) { 2621d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2631d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawOval(left, top, right, bottom, *paint); 2641d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 265c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 266c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstatic void drawArc(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top, 267c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh jfloat right, jfloat bottom, jfloat startAngle, jfloat sweepAngle, 2681d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jboolean useCenter, jlong paintHandle) { 2691d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2701d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawArc(left, top, right, bottom, startAngle, sweepAngle, 2711d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh useCenter, *paint); 2721d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2731d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2741d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawPath(JNIEnv* env, jobject, jlong canvasHandle, jlong pathHandle, 2751d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jlong paintHandle) { 2761d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const SkPath* path = reinterpret_cast<SkPath*>(pathHandle); 2771d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 2781d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh get_canvas(canvasHandle)->drawPath(*path, *paint); 2791d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh} 2801d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2811d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yehstatic void drawVertices(JNIEnv* env, jobject, jlong canvasHandle, 282c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh jint modeHandle, jint vertexCount, 283c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh jfloatArray jverts, jint vertIndex, 284c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh jfloatArray jtexs, jint texIndex, 2851d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jintArray jcolors, jint colorIndex, 2861d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jshortArray jindices, jint indexIndex, 2871d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh jint indexCount, jlong paintHandle) { 2881d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh AutoJavaFloatArray vertA(env, jverts, vertIndex + vertexCount); 2891d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh AutoJavaFloatArray texA(env, jtexs, texIndex + vertexCount); 2901d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh AutoJavaIntArray colorA(env, jcolors, colorIndex + vertexCount); 2911d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh AutoJavaShortArray indexA(env, jindices, indexIndex + indexCount); 2921d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 2931d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const float* verts = vertA.ptr() + vertIndex; 2941d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const float* texs = texA.ptr() + vertIndex; 2951d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const int* colors = NULL; 2961d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh const uint16_t* indices = NULL; 2971d0955cb5257a59f0ae435fefe26c05af4f4fbb6Yin-Chia Yeh 298c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh if (jcolors != NULL) { 299c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh colors = colorA.ptr() + colorIndex; 300c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh } 3012975a24dc42c8953125b39a5194da3aec244cbefDan Albert if (jindices != NULL) { 3022975a24dc42c8953125b39a5194da3aec244cbefDan Albert indices = (const uint16_t*)(indexA.ptr() + indexIndex); 303355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 304355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 305355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai SkCanvas::VertexMode mode = static_cast<SkCanvas::VertexMode>(modeHandle); 306355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 307355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai get_canvas(canvasHandle)->drawVertices(mode, vertexCount, verts, texs, colors, 308355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai indices, indexCount, *paint); 309355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai} 310e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai 311e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Caistatic void drawBitmap(JNIEnv* env, jobject jcanvas, jlong canvasHandle, jlong bitmapHandle, 312e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai jfloat left, jfloat top, jlong paintHandle, jint canvasDensity, 313e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai jint screenDensity, jint bitmapDensity) { 314e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai Canvas* canvas = get_canvas(canvasHandle); 315e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 316e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 317e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai 318e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai if (canvasDensity == bitmapDensity || canvasDensity == 0 || bitmapDensity == 0) { 319e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai if (screenDensity != 0 && screenDensity != bitmapDensity) { 320e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai Paint filteredPaint; 321e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai if (paint) { 322e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai filteredPaint = *paint; 323e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai } 324e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai filteredPaint.setFilterLevel(Paint::kLow_FilterLevel); 325e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai canvas->drawBitmap(*bitmap, left, top, &filteredPaint); 326e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai } else { 327e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai canvas->drawBitmap(*bitmap, left, top, paint); 328e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai } 329e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai } else { 330e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai canvas->save(SkCanvas::kMatrixClip_SaveFlag); 331e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai SkScalar scale = canvasDensity / (float)bitmapDensity; 332e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai canvas->translate(left, top); 333e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai canvas->scale(scale, scale); 334355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 335355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai Paint filteredPaint; 336355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai if (paint) { 337355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai filteredPaint = *paint; 338355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 339355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai filteredPaint.setFilterLevel(Paint::kLow_FilterLevel); 340e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai 341e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai canvas->drawBitmap(*bitmap, 0, 0, &filteredPaint); 342355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai canvas->restore(); 343355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 344355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai} 345355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 346355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Caistatic void drawBitmapMatrix(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle, 347355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai jlong matrixHandle, jlong paintHandle) { 348355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 349355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); 350355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 351355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai get_canvas(canvasHandle)->drawBitmap(*bitmap, *matrix, paint); 352355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai} 353355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 354355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Caistatic void drawBitmapRect(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle, 355355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai float srcLeft, float srcTop, float srcRight, float srcBottom, 356355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai float dstLeft, float dstTop, float dstRight, float dstBottom, 357355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai jlong paintHandle, jint screenDensity, jint bitmapDensity) { 358355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai Canvas* canvas = get_canvas(canvasHandle); 359355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 360355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 361355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 362355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai if (screenDensity != 0 && screenDensity != bitmapDensity) { 363355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai Paint filteredPaint; 364355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai if (paint) { 365355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai filteredPaint = *paint; 366355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 367355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai filteredPaint.setFilterLevel(Paint::kLow_FilterLevel); 368355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai canvas->drawBitmap(*bitmap, srcLeft, srcTop, srcRight, srcBottom, 369355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai dstLeft, dstTop, dstRight, dstBottom, &filteredPaint); 370355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } else { 371355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai canvas->drawBitmap(*bitmap, srcLeft, srcTop, srcRight, srcBottom, 372355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai dstLeft, dstTop, dstRight, dstBottom, paint); 373355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 374355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai} 375355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 376355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Caistatic void drawBitmapArray(JNIEnv* env, jobject, jlong canvasHandle, 377355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai jintArray jcolors, jint offset, jint stride, 378355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai jfloat x, jfloat y, jint width, jint height, 379355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai jboolean hasAlpha, jlong paintHandle) { 380355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai // Note: If hasAlpha is false, kRGB_565_SkColorType will be used, which will 381355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai // correct the alphaType to kOpaque_SkAlphaType. 382355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai SkImageInfo info = SkImageInfo::Make(width, height, 383355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType, 384355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai kPremul_SkAlphaType); 385355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai SkBitmap bitmap; 386355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai bitmap.setInfo(info); 387355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai if (!GraphicsJNI::allocatePixels(env, &bitmap, NULL)) { 388355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai return; 389355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 390355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 391355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai if (!GraphicsJNI::SetPixels(env, jcolors, offset, stride, 0, 0, width, height, bitmap)) { 392355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai return; 393355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 394355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 395355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 396355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai get_canvas(canvasHandle)->drawBitmap(bitmap, x, y, paint); 397355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai} 398355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 399355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Caistatic void drawBitmapMesh(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle, 400355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai jint meshWidth, jint meshHeight, jfloatArray jverts, 401355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai jint vertIndex, jintArray jcolors, jint colorIndex, jlong paintHandle) { 402355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const int ptCount = (meshWidth + 1) * (meshHeight + 1); 403355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai AutoJavaFloatArray vertA(env, jverts, vertIndex + (ptCount << 1)); 404355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai AutoJavaIntArray colorA(env, jcolors, colorIndex + ptCount); 405355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 406355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle); 407355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const Paint* paint = reinterpret_cast<Paint*>(paintHandle); 408355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai get_canvas(canvasHandle)->drawBitmapMesh(*bitmap, meshWidth, meshHeight, 409355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai vertA.ptr(), colorA.ptr(), paint); 410355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai} 411355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 412355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Caiclass DrawTextFunctor { 413355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Caipublic: 414355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai DrawTextFunctor(const Layout& layout, Canvas* canvas, uint16_t* glyphs, float* pos, 415355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai const SkPaint& paint, float x, float y, MinikinRect& bounds, 416355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai float totalAdvance) 417355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai : layout(layout), canvas(canvas), glyphs(glyphs), pos(pos), paint(paint), 418355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai x(x), y(y), bounds(bounds), totalAdvance(totalAdvance) { } 419355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 420355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai void operator()(size_t start, size_t end) { 421355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai if (canvas->drawTextAbsolutePos()) { 422355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai for (size_t i = start; i < end; i++) { 423355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai glyphs[i] = layout.getGlyphId(i); 424355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai pos[2 * i] = x + layout.getX(i); 425355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai pos[2 * i + 1] = y + layout.getY(i); 426355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 427355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } else { 428355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai for (size_t i = start; i < end; i++) { 429355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai glyphs[i] = layout.getGlyphId(i); 430355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai pos[2 * i] = layout.getX(i); 431355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai pos[2 * i + 1] = layout.getY(i); 432355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 433355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 434355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai 435355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai size_t glyphCount = end - start; 436355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, paint, x, y, 437355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, 438355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai totalAdvance); 439355d99044ff82d943792f52b83d9aa2b1c42fc8eJiwen 'Steve' Cai } 440c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehprivate: 441c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh const Layout& layout; 442c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh Canvas* canvas; 443c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh uint16_t* glyphs; 444c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh float* pos; 4453e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh const SkPaint& paint; 4463e49be17d8c8c53f50bb0d39affbbc36f6a12488Yin-Chia Yeh float x; 447 float y; 448 MinikinRect& bounds; 449 float totalAdvance; 450}; 451 452// Same values used by Skia 453#define kStdStrikeThru_Offset (-6.0f / 21.0f) 454#define kStdUnderline_Offset (1.0f / 9.0f) 455#define kStdUnderline_Thickness (1.0f / 18.0f) 456 457void drawTextDecorations(Canvas* canvas, float x, float y, float length, const SkPaint& paint) { 458 uint32_t flags; 459 SkDrawFilter* drawFilter = canvas->getDrawFilter(); 460 if (drawFilter) { 461 SkPaint paintCopy(paint); 462 drawFilter->filter(&paintCopy, SkDrawFilter::kText_Type); 463 flags = paintCopy.getFlags(); 464 } else { 465 flags = paint.getFlags(); 466 } 467 if (flags & (SkPaint::kUnderlineText_Flag | SkPaint::kStrikeThruText_Flag)) { 468 SkScalar left = x; 469 SkScalar right = x + length; 470 float textSize = paint.getTextSize(); 471 float strokeWidth = fmax(textSize * kStdUnderline_Thickness, 1.0f); 472 if (flags & SkPaint::kUnderlineText_Flag) { 473 SkScalar top = y + textSize * kStdUnderline_Offset - 0.5f * strokeWidth; 474 SkScalar bottom = y + textSize * kStdUnderline_Offset + 0.5f * strokeWidth; 475 canvas->drawRect(left, top, right, bottom, paint); 476 } 477 if (flags & SkPaint::kStrikeThruText_Flag) { 478 SkScalar top = y + textSize * kStdStrikeThru_Offset - 0.5f * strokeWidth; 479 SkScalar bottom = y + textSize * kStdStrikeThru_Offset + 0.5f * strokeWidth; 480 canvas->drawRect(left, top, right, bottom, paint); 481 } 482 } 483} 484 485void drawText(Canvas* canvas, const uint16_t* text, int start, int count, int contextCount, 486 float x, float y, int bidiFlags, const Paint& origPaint, TypefaceImpl* typeface) { 487 // minikin may modify the original paint 488 Paint paint(origPaint); 489 490 Layout layout; 491 MinikinUtils::doLayout(&layout, &paint, bidiFlags, typeface, text, start, count, contextCount); 492 493 size_t nGlyphs = layout.nGlyphs(); 494 uint16_t* glyphs = new uint16_t[nGlyphs]; 495 float* pos = new float[nGlyphs * 2]; 496 497 x += MinikinUtils::xOffsetForTextAlign(&paint, layout); 498 499 MinikinRect bounds; 500 layout.getBounds(&bounds); 501 if (!canvas->drawTextAbsolutePos()) { 502 bounds.offset(x, y); 503 } 504 505 DrawTextFunctor f(layout, canvas, glyphs, pos, paint, x, y, bounds, layout.getAdvance()); 506 MinikinUtils::forFontRun(layout, &paint, f); 507 508 drawTextDecorations(canvas, x, y, layout.getAdvance(), paint); 509 510 delete[] glyphs; 511 delete[] pos; 512} 513 514static void drawTextChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray text, 515 jint index, jint count, jfloat x, jfloat y, jint bidiFlags, 516 jlong paintHandle, jlong typefaceHandle) { 517 Paint* paint = reinterpret_cast<Paint*>(paintHandle); 518 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle); 519 jchar* jchars = env->GetCharArrayElements(text, NULL); 520 drawText(get_canvas(canvasHandle), jchars + index, 0, count, count, x, y, 521 bidiFlags, *paint, typeface); 522 env->ReleaseCharArrayElements(text, jchars, JNI_ABORT); 523} 524 525static void drawTextString(JNIEnv* env, jobject, jlong canvasHandle, jstring text, 526 jint start, jint end, jfloat x, jfloat y, jint bidiFlags, 527 jlong paintHandle, jlong typefaceHandle) { 528 Paint* paint = reinterpret_cast<Paint*>(paintHandle); 529 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle); 530 const int count = end - start; 531 const jchar* jchars = env->GetStringChars(text, NULL); 532 drawText(get_canvas(canvasHandle), jchars + start, 0, count, count, x, y, 533 bidiFlags, *paint, typeface); 534 env->ReleaseStringChars(text, jchars); 535} 536 537static void drawTextRunChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray text, jint index, 538 jint count, jint contextIndex, jint contextCount, jfloat x, jfloat y, 539 jboolean isRtl, jlong paintHandle, jlong typefaceHandle) { 540 Paint* paint = reinterpret_cast<Paint*>(paintHandle); 541 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle); 542 543 const int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR; 544 jchar* jchars = env->GetCharArrayElements(text, NULL); 545 drawText(get_canvas(canvasHandle), jchars + contextIndex, index - contextIndex, count, 546 contextCount, x, y, bidiFlags, *paint, typeface); 547 env->ReleaseCharArrayElements(text, jchars, JNI_ABORT); 548} 549 550static void drawTextRunString(JNIEnv* env, jobject obj, jlong canvasHandle, jstring text, 551 jint start, jint end, jint contextStart, jint contextEnd, 552 jfloat x, jfloat y, jboolean isRtl, jlong paintHandle, 553 jlong typefaceHandle) { 554 Paint* paint = reinterpret_cast<Paint*>(paintHandle); 555 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle); 556 557 int bidiFlags = isRtl ? kBidi_Force_RTL : kBidi_Force_LTR; 558 jint count = end - start; 559 jint contextCount = contextEnd - contextStart; 560 const jchar* jchars = env->GetStringChars(text, NULL); 561 drawText(get_canvas(canvasHandle), jchars + contextStart, start - contextStart, count, 562 contextCount, x, y, bidiFlags, *paint, typeface); 563 env->ReleaseStringChars(text, jchars); 564} 565 566class DrawTextOnPathFunctor { 567public: 568 DrawTextOnPathFunctor(const Layout& layout, Canvas* canvas, float hOffset, 569 float vOffset, const Paint& paint, const SkPath& path) 570 : layout(layout), canvas(canvas), hOffset(hOffset), vOffset(vOffset), 571 paint(paint), path(path) { 572 } 573 void operator()(size_t start, size_t end) { 574 uint16_t glyphs[1]; 575 for (size_t i = start; i < end; i++) { 576 glyphs[0] = layout.getGlyphId(i); 577 float x = hOffset + layout.getX(i); 578 float y = vOffset + layout.getY(i); 579 canvas->drawTextOnPath(glyphs, 1, path, x, y, paint); 580 } 581 } 582private: 583 const Layout& layout; 584 Canvas* canvas; 585 float hOffset; 586 float vOffset; 587 const Paint& paint; 588 const SkPath& path; 589}; 590 591static void drawTextOnPath(Canvas* canvas, const uint16_t* text, int count, int bidiFlags, 592 const SkPath& path, float hOffset, float vOffset, 593 const Paint& paint, TypefaceImpl* typeface) { 594 Paint paintCopy(paint); 595 Layout layout; 596 MinikinUtils::doLayout(&layout, &paintCopy, bidiFlags, typeface, text, 0, count, count); 597 hOffset += MinikinUtils::hOffsetForTextAlign(&paintCopy, layout, path); 598 599 // Set align to left for drawing, as we don't want individual 600 // glyphs centered or right-aligned; the offset above takes 601 // care of all alignment. 602 paintCopy.setTextAlign(Paint::kLeft_Align); 603 604 DrawTextOnPathFunctor f(layout, canvas, hOffset, vOffset, paintCopy, path); 605 MinikinUtils::forFontRun(layout, &paintCopy, f); 606} 607 608static void drawTextOnPathChars(JNIEnv* env, jobject, jlong canvasHandle, jcharArray text, 609 jint index, jint count, jlong pathHandle, jfloat hOffset, 610 jfloat vOffset, jint bidiFlags, jlong paintHandle, 611 jlong typefaceHandle) { 612 SkPath* path = reinterpret_cast<SkPath*>(pathHandle); 613 Paint* paint = reinterpret_cast<Paint*>(paintHandle); 614 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle); 615 616 jchar* jchars = env->GetCharArrayElements(text, NULL); 617 618 drawTextOnPath(get_canvas(canvasHandle), jchars + index, count, bidiFlags, *path, 619 hOffset, vOffset, *paint, typeface); 620 621 env->ReleaseCharArrayElements(text, jchars, 0); 622} 623 624static void drawTextOnPathString(JNIEnv* env, jobject, jlong canvasHandle, jstring text, 625 jlong pathHandle, jfloat hOffset, jfloat vOffset, 626 jint bidiFlags, jlong paintHandle, jlong typefaceHandle) { 627 SkPath* path = reinterpret_cast<SkPath*>(pathHandle); 628 Paint* paint = reinterpret_cast<Paint*>(paintHandle); 629 TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle); 630 631 const jchar* jchars = env->GetStringChars(text, NULL); 632 int count = env->GetStringLength(text); 633 634 drawTextOnPath(get_canvas(canvasHandle), jchars, count, bidiFlags, *path, 635 hOffset, vOffset, *paint, typeface); 636 637 env->ReleaseStringChars(text, jchars); 638} 639 640static void setDrawFilter(JNIEnv* env, jobject, jlong canvasHandle, jlong filterHandle) { 641 get_canvas(canvasHandle)->setDrawFilter(reinterpret_cast<SkDrawFilter*>(filterHandle)); 642} 643 644static void freeCaches(JNIEnv* env, jobject) { 645 SkGraphics::PurgeFontCache(); 646} 647 648static void freeTextLayoutCaches(JNIEnv* env, jobject) { 649 Layout::purgeCaches(); 650} 651 652}; // namespace CanvasJNI 653 654static JNINativeMethod gMethods[] = { 655 {"finalizer", "(J)V", (void*) CanvasJNI::finalizer}, 656 {"initRaster", "(J)J", (void*) CanvasJNI::initRaster}, 657 {"native_setBitmap", "(JJZ)V", (void*) CanvasJNI::setBitmap}, 658 {"native_isOpaque","(J)Z", (void*) CanvasJNI::isOpaque}, 659 {"native_getWidth","(J)I", (void*) CanvasJNI::getWidth}, 660 {"native_getHeight","(J)I", (void*) CanvasJNI::getHeight}, 661 {"native_save","(JI)I", (void*) CanvasJNI::save}, 662 {"native_saveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer}, 663 {"native_saveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha}, 664 {"native_getSaveCount","(J)I", (void*) CanvasJNI::getSaveCount}, 665 {"native_restore","(J)V", (void*) CanvasJNI::restore}, 666 {"native_restoreToCount","(JI)V", (void*) CanvasJNI::restoreToCount}, 667 {"native_getCTM", "(JJ)V", (void*)CanvasJNI::getCTM}, 668 {"native_setMatrix","(JJ)V", (void*) CanvasJNI::setMatrix}, 669 {"native_concat","(JJ)V", (void*) CanvasJNI::concat}, 670 {"native_rotate","(JF)V", (void*) CanvasJNI::rotate}, 671 {"native_scale","(JFF)V", (void*) CanvasJNI::scale}, 672 {"native_skew","(JFF)V", (void*) CanvasJNI::skew}, 673 {"native_translate","(JFF)V", (void*) CanvasJNI::translate}, 674 {"native_getClipBounds","(JLandroid/graphics/Rect;)Z", (void*) CanvasJNI::getClipBounds}, 675 {"native_quickReject","(JJ)Z", (void*) CanvasJNI::quickRejectPath}, 676 {"native_quickReject","(JFFFF)Z", (void*)CanvasJNI::quickRejectRect}, 677 {"native_clipRect","(JFFFFI)Z", (void*) CanvasJNI::clipRect}, 678 {"native_clipPath","(JJI)Z", (void*) CanvasJNI::clipPath}, 679 {"native_clipRegion","(JJI)Z", (void*) CanvasJNI::clipRegion}, 680 {"native_drawColor","(JII)V", (void*) CanvasJNI::drawColor}, 681 {"native_drawPaint","(JJ)V", (void*) CanvasJNI::drawPaint}, 682 {"native_drawPoint", "(JFFJ)V", (void*) CanvasJNI::drawPoint}, 683 {"native_drawPoints", "(J[FIIJ)V", (void*) CanvasJNI::drawPoints}, 684 {"native_drawLine", "(JFFFFJ)V", (void*) CanvasJNI::drawLine}, 685 {"native_drawLines", "(J[FIIJ)V", (void*) CanvasJNI::drawLines}, 686 {"native_drawRect","(JFFFFJ)V", (void*) CanvasJNI::drawRect}, 687 {"native_drawRoundRect","(JFFFFFFJ)V", (void*) CanvasJNI::drawRoundRect}, 688 {"native_drawCircle","(JFFFJ)V", (void*) CanvasJNI::drawCircle}, 689 {"native_drawOval","(JFFFFJ)V", (void*) CanvasJNI::drawOval}, 690 {"native_drawArc","(JFFFFFFZJ)V", (void*) CanvasJNI::drawArc}, 691 {"native_drawPath","(JJJ)V", (void*) CanvasJNI::drawPath}, 692 {"nativeDrawVertices", "(JII[FI[FI[II[SIIJ)V", (void*)CanvasJNI::drawVertices}, 693 {"native_drawBitmap","(JJFFJIII)V", (void*) CanvasJNI::drawBitmap}, 694 {"nativeDrawBitmapMatrix", "(JJJJ)V", (void*)CanvasJNI::drawBitmapMatrix}, 695 {"native_drawBitmap","(JJFFFFFFFFJII)V", (void*) CanvasJNI::drawBitmapRect}, 696 {"native_drawBitmap", "(J[IIIFFIIZJ)V", (void*)CanvasJNI::drawBitmapArray}, 697 {"nativeDrawBitmapMesh", "(JJII[FI[IIJ)V", (void*)CanvasJNI::drawBitmapMesh}, 698 {"native_drawText","(J[CIIFFIJJ)V", (void*) CanvasJNI::drawTextChars}, 699 {"native_drawText","(JLjava/lang/String;IIFFIJJ)V", (void*) CanvasJNI::drawTextString}, 700 {"native_drawTextRun","(J[CIIIIFFZJJ)V", (void*) CanvasJNI::drawTextRunChars}, 701 {"native_drawTextRun","(JLjava/lang/String;IIIIFFZJJ)V", (void*) CanvasJNI::drawTextRunString}, 702 {"native_drawTextOnPath","(J[CIIJFFIJJ)V", (void*) CanvasJNI::drawTextOnPathChars}, 703 {"native_drawTextOnPath","(JLjava/lang/String;JFFIJJ)V", (void*) CanvasJNI::drawTextOnPathString}, 704 {"nativeSetDrawFilter", "(JJ)V", (void*) CanvasJNI::setDrawFilter}, 705 {"freeCaches", "()V", (void*) CanvasJNI::freeCaches}, 706 {"freeTextLayoutCaches", "()V", (void*) CanvasJNI::freeTextLayoutCaches} 707}; 708 709int register_android_graphics_Canvas(JNIEnv* env) { 710 return RegisterMethodsOrDie(env, "android/graphics/Canvas", gMethods, NELEM(gMethods)); 711} 712 713}; // namespace android 714