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