19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* libs/android_runtime/android/graphics/Matrix.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
594931bd87e27e766167cf005788b148af49f6ac2John Reck** Licensed under the Apache License, Version 2.0 (the "License");
694931bd87e27e766167cf005788b148af49f6ac2John Reck** you may not use this file except in compliance with the License.
794931bd87e27e766167cf005788b148af49f6ac2John Reck** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
994931bd87e27e766167cf005788b148af49f6ac2John Reck**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
1194931bd87e27e766167cf005788b148af49f6ac2John Reck** Unless required by applicable law or agreed to in writing, software
1294931bd87e27e766167cf005788b148af49f6ac2John Reck** distributed under the License is distributed on an "AS IS" BASIS,
1394931bd87e27e766167cf005788b148af49f6ac2John Reck** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1494931bd87e27e766167cf005788b148af49f6ac2John Reck** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
1920e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown#include "Matrix.h"
2060126efd7d905ca24822765c6dafac17fef278abBen Wagner#include "SkMatrix.h"
2160126efd7d905ca24822765c6dafac17fef278abBen Wagner#include "core_jni_helpers.h"
2220e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <Caches.h>
2460126efd7d905ca24822765c6dafac17fef278abBen Wagner#include <jni.h>
255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2894931bd87e27e766167cf005788b148af49f6ac2John Reckstatic_assert(sizeof(SkMatrix) == 40, "Unexpected sizeof(SkMatrix), "
2994931bd87e27e766167cf005788b148af49f6ac2John Reck        "update size in Matrix.java#NATIVE_ALLOCATION_SIZE and here");
3094931bd87e27e766167cf005788b148af49f6ac2John Reckstatic_assert(SK_SCALAR_IS_FLOAT, "SK_SCALAR_IS_FLOAT is false, "
3194931bd87e27e766167cf005788b148af49f6ac2John Reck        "only float scalar is supported");
3294931bd87e27e766167cf005788b148af49f6ac2John Reck
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkMatrixGlue {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3694931bd87e27e766167cf005788b148af49f6ac2John Reck    // ---------------- Regular JNI -----------------------------
3794931bd87e27e766167cf005788b148af49f6ac2John Reck
3894931bd87e27e766167cf005788b148af49f6ac2John Reck    static void finalizer(jlong objHandle) {
3936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete obj;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4394931bd87e27e766167cf005788b148af49f6ac2John Reck    static jlong getNativeFinalizer(JNIEnv* env, jobject clazz) {
4494931bd87e27e766167cf005788b148af49f6ac2John Reck        return static_cast<jlong>(reinterpret_cast<uintptr_t>(&finalizer));
4594931bd87e27e766167cf005788b148af49f6ac2John Reck    }
4694931bd87e27e766167cf005788b148af49f6ac2John Reck
4736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong create(JNIEnv* env, jobject clazz, jlong srcHandle) {
4836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        const SkMatrix* src = reinterpret_cast<SkMatrix*>(srcHandle);
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkMatrix* obj = new SkMatrix();
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (src)
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *obj = *src;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            obj->reset();
5436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
5794931bd87e27e766167cf005788b148af49f6ac2John Reck    // ---------------- @FastNative -----------------------------
5894931bd87e27e766167cf005788b148af49f6ac2John Reck
5994931bd87e27e766167cf005788b148af49f6ac2John Reck    static void mapPoints(JNIEnv* env, jobject clazz, jlong matrixHandle,
6094931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloatArray dst, jint dstIndex, jfloatArray src, jint srcIndex,
6194931bd87e27e766167cf005788b148af49f6ac2John Reck            jint ptCount, jboolean isPts) {
6294931bd87e27e766167cf005788b148af49f6ac2John Reck        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
6394931bd87e27e766167cf005788b148af49f6ac2John Reck        SkASSERT(ptCount >= 0);
6494931bd87e27e766167cf005788b148af49f6ac2John Reck        AutoJavaFloatArray autoSrc(env, src, srcIndex + (ptCount << 1),
6594931bd87e27e766167cf005788b148af49f6ac2John Reck                kRO_JNIAccess);
6694931bd87e27e766167cf005788b148af49f6ac2John Reck        AutoJavaFloatArray autoDst(env, dst, dstIndex + (ptCount << 1),
6794931bd87e27e766167cf005788b148af49f6ac2John Reck                kRW_JNIAccess);
6894931bd87e27e766167cf005788b148af49f6ac2John Reck        float* srcArray = autoSrc.ptr() + srcIndex;
6994931bd87e27e766167cf005788b148af49f6ac2John Reck        float* dstArray = autoDst.ptr() + dstIndex;
7094931bd87e27e766167cf005788b148af49f6ac2John Reck        if (isPts)
7194931bd87e27e766167cf005788b148af49f6ac2John Reck            matrix->mapPoints((SkPoint*) dstArray, (const SkPoint*) srcArray,
7294931bd87e27e766167cf005788b148af49f6ac2John Reck                    ptCount);
7394931bd87e27e766167cf005788b148af49f6ac2John Reck        else
7494931bd87e27e766167cf005788b148af49f6ac2John Reck            matrix->mapVectors((SkVector*) dstArray, (const SkVector*) srcArray,
7594931bd87e27e766167cf005788b148af49f6ac2John Reck                    ptCount);
7694931bd87e27e766167cf005788b148af49f6ac2John Reck    }
7794931bd87e27e766167cf005788b148af49f6ac2John Reck
7894931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean mapRect__RectFRectF(JNIEnv* env, jobject clazz,
7994931bd87e27e766167cf005788b148af49f6ac2John Reck            jlong matrixHandle, jobjectArray dst, jobject src) {
8094931bd87e27e766167cf005788b148af49f6ac2John Reck        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
8194931bd87e27e766167cf005788b148af49f6ac2John Reck        SkRect dst_, src_;
8294931bd87e27e766167cf005788b148af49f6ac2John Reck        GraphicsJNI::jrectf_to_rect(env, src, &src_);
8394931bd87e27e766167cf005788b148af49f6ac2John Reck        jboolean rectStaysRect = matrix->mapRect(&dst_, src_);
8494931bd87e27e766167cf005788b148af49f6ac2John Reck        GraphicsJNI::rect_to_jrectf(dst_, env, dst);
8594931bd87e27e766167cf005788b148af49f6ac2John Reck        return rectStaysRect ? JNI_TRUE : JNI_FALSE;
8694931bd87e27e766167cf005788b148af49f6ac2John Reck    }
8794931bd87e27e766167cf005788b148af49f6ac2John Reck
8894931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean setRectToRect(JNIEnv* env, jobject clazz,
8994931bd87e27e766167cf005788b148af49f6ac2John Reck            jlong matrixHandle, jobject src, jobject dst, jint stfHandle) {
9094931bd87e27e766167cf005788b148af49f6ac2John Reck        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
9194931bd87e27e766167cf005788b148af49f6ac2John Reck        SkMatrix::ScaleToFit stf = static_cast<SkMatrix::ScaleToFit>(stfHandle);
9294931bd87e27e766167cf005788b148af49f6ac2John Reck        SkRect src_;
9394931bd87e27e766167cf005788b148af49f6ac2John Reck        GraphicsJNI::jrectf_to_rect(env, src, &src_);
9494931bd87e27e766167cf005788b148af49f6ac2John Reck        SkRect dst_;
9594931bd87e27e766167cf005788b148af49f6ac2John Reck        GraphicsJNI::jrectf_to_rect(env, dst, &dst_);
9694931bd87e27e766167cf005788b148af49f6ac2John Reck        return matrix->setRectToRect(src_, dst_, stf) ? JNI_TRUE : JNI_FALSE;
9794931bd87e27e766167cf005788b148af49f6ac2John Reck    }
9894931bd87e27e766167cf005788b148af49f6ac2John Reck
9994931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean setPolyToPoly(JNIEnv* env, jobject clazz,
10094931bd87e27e766167cf005788b148af49f6ac2John Reck            jlong matrixHandle, jfloatArray jsrc, jint srcIndex,
10194931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloatArray jdst, jint dstIndex, jint ptCount) {
10294931bd87e27e766167cf005788b148af49f6ac2John Reck        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
10394931bd87e27e766167cf005788b148af49f6ac2John Reck        SkASSERT(srcIndex >= 0);
10494931bd87e27e766167cf005788b148af49f6ac2John Reck        SkASSERT(dstIndex >= 0);
10594931bd87e27e766167cf005788b148af49f6ac2John Reck        SkASSERT((unsigned )ptCount <= 4);
10694931bd87e27e766167cf005788b148af49f6ac2John Reck
10794931bd87e27e766167cf005788b148af49f6ac2John Reck        AutoJavaFloatArray autoSrc(env, jsrc, srcIndex + (ptCount << 1),
10894931bd87e27e766167cf005788b148af49f6ac2John Reck                kRO_JNIAccess);
10994931bd87e27e766167cf005788b148af49f6ac2John Reck        AutoJavaFloatArray autoDst(env, jdst, dstIndex + (ptCount << 1),
11094931bd87e27e766167cf005788b148af49f6ac2John Reck                kRW_JNIAccess);
11194931bd87e27e766167cf005788b148af49f6ac2John Reck        float* src = autoSrc.ptr() + srcIndex;
11294931bd87e27e766167cf005788b148af49f6ac2John Reck        float* dst = autoDst.ptr() + dstIndex;
11394931bd87e27e766167cf005788b148af49f6ac2John Reck        bool result;
11494931bd87e27e766167cf005788b148af49f6ac2John Reck
11594931bd87e27e766167cf005788b148af49f6ac2John Reck        result = matrix->setPolyToPoly((const SkPoint*) src,
11694931bd87e27e766167cf005788b148af49f6ac2John Reck                (const SkPoint*) dst, ptCount);
11794931bd87e27e766167cf005788b148af49f6ac2John Reck        return result ? JNI_TRUE : JNI_FALSE;
11894931bd87e27e766167cf005788b148af49f6ac2John Reck    }
11994931bd87e27e766167cf005788b148af49f6ac2John Reck
12094931bd87e27e766167cf005788b148af49f6ac2John Reck    static void getValues(JNIEnv* env, jobject clazz, jlong matrixHandle,
12194931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloatArray values) {
12294931bd87e27e766167cf005788b148af49f6ac2John Reck        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
12394931bd87e27e766167cf005788b148af49f6ac2John Reck        AutoJavaFloatArray autoValues(env, values, 9, kRW_JNIAccess);
12494931bd87e27e766167cf005788b148af49f6ac2John Reck        float* dst = autoValues.ptr();
12594931bd87e27e766167cf005788b148af49f6ac2John Reck        for (int i = 0; i < 9; i++) {
12694931bd87e27e766167cf005788b148af49f6ac2John Reck            dst[i] = matrix->get(i);
12794931bd87e27e766167cf005788b148af49f6ac2John Reck        }
12894931bd87e27e766167cf005788b148af49f6ac2John Reck    }
12994931bd87e27e766167cf005788b148af49f6ac2John Reck
13094931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setValues(JNIEnv* env, jobject clazz, jlong matrixHandle,
13194931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloatArray values) {
13294931bd87e27e766167cf005788b148af49f6ac2John Reck        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
13394931bd87e27e766167cf005788b148af49f6ac2John Reck        AutoJavaFloatArray autoValues(env, values, 9, kRO_JNIAccess);
13494931bd87e27e766167cf005788b148af49f6ac2John Reck        const float* src = autoValues.ptr();
13594931bd87e27e766167cf005788b148af49f6ac2John Reck
13694931bd87e27e766167cf005788b148af49f6ac2John Reck        for (int i = 0; i < 9; i++) {
13794931bd87e27e766167cf005788b148af49f6ac2John Reck            matrix->set(i, src[i]);
13894931bd87e27e766167cf005788b148af49f6ac2John Reck        }
13994931bd87e27e766167cf005788b148af49f6ac2John Reck    }
14094931bd87e27e766167cf005788b148af49f6ac2John Reck
14194931bd87e27e766167cf005788b148af49f6ac2John Reck    // ---------------- @CriticalNative -----------------------------
14294931bd87e27e766167cf005788b148af49f6ac2John Reck
14394931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean isIdentity(jlong objHandle) {
14436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
14536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return obj->isIdentity() ? JNI_TRUE : JNI_FALSE;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1472961769ea94f69c191a2dd785b2504666c7292d0Svetoslav
14894931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean isAffine(jlong objHandle) {
1492961769ea94f69c191a2dd785b2504666c7292d0Svetoslav        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1502961769ea94f69c191a2dd785b2504666c7292d0Svetoslav        return obj->asAffine(NULL) ? JNI_TRUE : JNI_FALSE;
1512961769ea94f69c191a2dd785b2504666c7292d0Svetoslav    }
1522961769ea94f69c191a2dd785b2504666c7292d0Svetoslav
15394931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean rectStaysRect(jlong objHandle) {
15436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
15536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return obj->rectStaysRect() ? JNI_TRUE : JNI_FALSE;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1572961769ea94f69c191a2dd785b2504666c7292d0Svetoslav
15894931bd87e27e766167cf005788b148af49f6ac2John Reck    static void reset(jlong objHandle) {
15936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj->reset();
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16294931bd87e27e766167cf005788b148af49f6ac2John Reck
16394931bd87e27e766167cf005788b148af49f6ac2John Reck    static void set(jlong objHandle, jlong otherHandle) {
16436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
16536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *obj = *other;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16894931bd87e27e766167cf005788b148af49f6ac2John Reck
16994931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setTranslate(jlong objHandle, jfloat dx, jfloat dy) {
17036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1712e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setTranslate(dx, dy);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17394931bd87e27e766167cf005788b148af49f6ac2John Reck
17494931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setScale__FFFF(jlong objHandle, jfloat sx, jfloat sy, jfloat px,
17594931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
17636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1772e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setScale(sx, sy, px, py);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17994931bd87e27e766167cf005788b148af49f6ac2John Reck
18094931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setScale__FF(jlong objHandle, jfloat sx, jfloat sy) {
18136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1822e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setScale(sx, sy);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18494931bd87e27e766167cf005788b148af49f6ac2John Reck
18594931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setRotate__FFF(jlong objHandle, jfloat degrees, jfloat px,
18694931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
18736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1882e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setRotate(degrees, px, py);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19094931bd87e27e766167cf005788b148af49f6ac2John Reck
19194931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setRotate__F(jlong objHandle, jfloat degrees) {
19236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1932e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setRotate(degrees);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19594931bd87e27e766167cf005788b148af49f6ac2John Reck
19694931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setSinCos__FFFF(jlong objHandle, jfloat sinValue,
19794931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat cosValue, jfloat px, jfloat py) {
19836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
1992e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setSinCos(sinValue, cosValue, px, py);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20194931bd87e27e766167cf005788b148af49f6ac2John Reck
20294931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setSinCos__FF(jlong objHandle, jfloat sinValue,
20394931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat cosValue) {
20436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2052e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setSinCos(sinValue, cosValue);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20794931bd87e27e766167cf005788b148af49f6ac2John Reck
20894931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setSkew__FFFF(jlong objHandle, jfloat kx, jfloat ky, jfloat px,
20994931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
21036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2112e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setSkew(kx, ky, px, py);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21394931bd87e27e766167cf005788b148af49f6ac2John Reck
21494931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setSkew__FF(jlong objHandle, jfloat kx, jfloat ky) {
21536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2162e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->setSkew(kx, ky);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21894931bd87e27e766167cf005788b148af49f6ac2John Reck
21994931bd87e27e766167cf005788b148af49f6ac2John Reck    static void setConcat(jlong objHandle, jlong aHandle, jlong bHandle) {
22036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
22136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle);
22236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle);
223cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins        obj->setConcat(*a, *b);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
22694931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preTranslate(jlong objHandle, jfloat dx, jfloat dy) {
22736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2282e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->preTranslate(dx, dy);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
23194931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preScale__FFFF(jlong objHandle, jfloat sx, jfloat sy, jfloat px,
23294931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
23336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2342e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->preScale(sx, sy, px, py);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
23794931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preScale__FF(jlong objHandle, jfloat sx, jfloat sy) {
23836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2392e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->preScale(sx, sy);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
24294931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preRotate__FFF(jlong objHandle, jfloat degrees, jfloat px,
24394931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
24436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2452e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->preRotate(degrees, px, py);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
24894931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preRotate__F(jlong objHandle, jfloat degrees) {
24936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2502e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->preRotate(degrees);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
25394931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preSkew__FFFF(jlong objHandle, jfloat kx, jfloat ky, jfloat px,
25494931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
25536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2562e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->preSkew(kx, ky, px, py);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
25994931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preSkew__FF(jlong objHandle, jfloat kx, jfloat ky) {
26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2612e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->preSkew(kx, ky);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
26494931bd87e27e766167cf005788b148af49f6ac2John Reck    static void preConcat(jlong objHandle, jlong otherHandle) {
26536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
26636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
267cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins        obj->preConcat(*other);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
27094931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postTranslate(jlong objHandle, jfloat dx, jfloat dy) {
27136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2722e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->postTranslate(dx, dy);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
27594931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postScale__FFFF(jlong objHandle, jfloat sx, jfloat sy,
27694931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat px, jfloat py) {
27736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2782e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->postScale(sx, sy, px, py);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
28194931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postScale__FF(jlong objHandle, jfloat sx, jfloat sy) {
28236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2832e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->postScale(sx, sy);
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
28694931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postRotate__FFF(jlong objHandle, jfloat degrees, jfloat px,
28794931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
28836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2892e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->postRotate(degrees, px, py);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
29294931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postRotate__F(jlong objHandle, jfloat degrees) {
29336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
2942e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->postRotate(degrees);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
29794931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postSkew__FFFF(jlong objHandle, jfloat kx, jfloat ky, jfloat px,
29894931bd87e27e766167cf005788b148af49f6ac2John Reck            jfloat py) {
29936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* obj = reinterpret_cast<SkMatrix*>(objHandle);
3002e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        obj->postSkew(kx, ky, px, py);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
30394931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postSkew__FF(jlong matrixHandle, jfloat kx, jfloat ky) {
30436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
3052e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        matrix->postSkew(kx, ky);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
30894931bd87e27e766167cf005788b148af49f6ac2John Reck    static void postConcat(jlong matrixHandle, jlong otherHandle) {
30936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
31036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* other = reinterpret_cast<SkMatrix*>(otherHandle);
311cc11f15f76a62ded3e403cb2bc818c6aa5bf261cLeon Scroggins        matrix->postConcat(*other);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
31494931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean invert(jlong matrixHandle, jlong inverseHandle) {
31536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
31636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* inverse = reinterpret_cast<SkMatrix*>(inverseHandle);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return matrix->invert(inverse);
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
32094931bd87e27e766167cf005788b148af49f6ac2John Reck    static jfloat mapRadius(jlong matrixHandle, jfloat radius) {
32136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle);
32236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        float result;
3232e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        result = SkScalarToFloat(matrix->mapRadius(radius));
32436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jfloat>(result);
32536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    }
32636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat
32794931bd87e27e766167cf005788b148af49f6ac2John Reck    static jboolean equals(jlong aHandle, jlong bHandle) {
32836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        const SkMatrix* a = reinterpret_cast<SkMatrix*>(aHandle);
32936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        const SkMatrix* b = reinterpret_cast<SkMatrix*>(bHandle);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return *a == *b;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33294931bd87e27e766167cf005788b148af49f6ac2John Reck};
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33476f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod methods[] = {
33594931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nGetNativeFinalizer", "()J", (void*) SkMatrixGlue::getNativeFinalizer},
33694931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nCreate","(J)J", (void*) SkMatrixGlue::create},
33794931bd87e27e766167cf005788b148af49f6ac2John Reck
33894931bd87e27e766167cf005788b148af49f6ac2John Reck    // ------- @FastNative below here ---------------
33994931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nMapPoints","(J[FI[FIIZ)V", (void*) SkMatrixGlue::mapPoints},
34094931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nMapRect","(JLandroid/graphics/RectF;Landroid/graphics/RectF;)Z",
34194931bd87e27e766167cf005788b148af49f6ac2John Reck            (void*) SkMatrixGlue::mapRect__RectFRectF},
34294931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetRectToRect","(JLandroid/graphics/RectF;Landroid/graphics/RectF;I)Z",
34394931bd87e27e766167cf005788b148af49f6ac2John Reck            (void*) SkMatrixGlue::setRectToRect},
34494931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetPolyToPoly","(J[FI[FII)Z", (void*) SkMatrixGlue::setPolyToPoly},
34594931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nGetValues","(J[F)V", (void*) SkMatrixGlue::getValues},
34694931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetValues","(J[F)V", (void*) SkMatrixGlue::setValues},
34794931bd87e27e766167cf005788b148af49f6ac2John Reck
34894931bd87e27e766167cf005788b148af49f6ac2John Reck    // ------- @CriticalNative below here ---------------
34994931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nIsIdentity","(J)Z", (void*) SkMatrixGlue::isIdentity},
35094931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nIsAffine","(J)Z", (void*) SkMatrixGlue::isAffine},
35194931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nRectStaysRect","(J)Z", (void*) SkMatrixGlue::rectStaysRect},
35294931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nReset","(J)V", (void*) SkMatrixGlue::reset},
35394931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSet","(JJ)V", (void*) SkMatrixGlue::set},
35494931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetTranslate","(JFF)V", (void*) SkMatrixGlue::setTranslate},
35594931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetScale","(JFFFF)V", (void*) SkMatrixGlue::setScale__FFFF},
35694931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetScale","(JFF)V", (void*) SkMatrixGlue::setScale__FF},
35794931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetRotate","(JFFF)V", (void*) SkMatrixGlue::setRotate__FFF},
35894931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetRotate","(JF)V", (void*) SkMatrixGlue::setRotate__F},
35994931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetSinCos","(JFFFF)V", (void*) SkMatrixGlue::setSinCos__FFFF},
36094931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetSinCos","(JFF)V", (void*) SkMatrixGlue::setSinCos__FF},
36194931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetSkew","(JFFFF)V", (void*) SkMatrixGlue::setSkew__FFFF},
36294931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetSkew","(JFF)V", (void*) SkMatrixGlue::setSkew__FF},
36394931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nSetConcat","(JJJ)V", (void*) SkMatrixGlue::setConcat},
36494931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreTranslate","(JFF)V", (void*) SkMatrixGlue::preTranslate},
36594931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreScale","(JFFFF)V", (void*) SkMatrixGlue::preScale__FFFF},
36694931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreScale","(JFF)V", (void*) SkMatrixGlue::preScale__FF},
36794931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreRotate","(JFFF)V", (void*) SkMatrixGlue::preRotate__FFF},
36894931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreRotate","(JF)V", (void*) SkMatrixGlue::preRotate__F},
36994931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreSkew","(JFFFF)V", (void*) SkMatrixGlue::preSkew__FFFF},
37094931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreSkew","(JFF)V", (void*) SkMatrixGlue::preSkew__FF},
37194931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPreConcat","(JJ)V", (void*) SkMatrixGlue::preConcat},
37294931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostTranslate","(JFF)V", (void*) SkMatrixGlue::postTranslate},
37394931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostScale","(JFFFF)V", (void*) SkMatrixGlue::postScale__FFFF},
37494931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostScale","(JFF)V", (void*) SkMatrixGlue::postScale__FF},
37594931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostRotate","(JFFF)V", (void*) SkMatrixGlue::postRotate__FFF},
37694931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostRotate","(JF)V", (void*) SkMatrixGlue::postRotate__F},
37794931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostSkew","(JFFFF)V", (void*) SkMatrixGlue::postSkew__FFFF},
37894931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostSkew","(JFF)V", (void*) SkMatrixGlue::postSkew__FF},
37994931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nPostConcat","(JJ)V", (void*) SkMatrixGlue::postConcat},
38094931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nInvert","(JJ)Z", (void*) SkMatrixGlue::invert},
38194931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nMapRadius","(JF)F", (void*) SkMatrixGlue::mapRadius},
38294931bd87e27e766167cf005788b148af49f6ac2John Reck    {"nEquals", "(JJ)Z", (void*) SkMatrixGlue::equals}
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38520e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brownstatic jfieldID sNativeInstanceField;
38620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Matrix(JNIEnv* env) {
388ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    int result = RegisterMethodsOrDie(env, "android/graphics/Matrix", methods, NELEM(methods));
38920e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
390ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    jclass clazz = FindClassOrDie(env, "android/graphics/Matrix");
391ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe    sNativeInstanceField = GetFieldIDOrDie(env, clazz, "native_instance", "J");
39220e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39620e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff BrownSkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj) {
39736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    return reinterpret_cast<SkMatrix*>(env->GetLongField(matrixObj, sNativeInstanceField));
39820e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown}
39920e987bfc35d0ae6cb6344ead65ed44ee7cf8750Jeff Brown
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
401