Paint.cpp revision 1a73f732f91e97c9c66b808c245ddda36a10e987
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* libs/android_runtime/android/graphics/Paint.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
58451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes** Licensed under the Apache License, Version 2.0 (the "License");
68451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes** you may not use this file except in compliance with the License.
78451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
98451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
118451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes** Unless required by applicable law or agreed to in writing, software
128451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes** distributed under the License is distributed on an "AS IS" BASIS,
138451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes** 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
18f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn#define LOG_TAG "Paint"
19f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn
20f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn#include <utils/Log.h>
21f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
25ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett#include <ScopedUtfChars.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkBlurDrawLooper.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkColorFilter.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkMaskFilter.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkRasterizer.h"
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkShader.h"
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkTypeface.h"
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkXfermode.h"
34ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett#include "unicode/uloc.h"
350c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt#include "unicode/ushape.h"
36f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt#include "TextLayout.h"
370c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
381a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
391a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include <minikin/Layout.h>
401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinSkia.h"
411a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#include "MinikinUtils.h"
421a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
431a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
440c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt// temporary for debugging
455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <Caches.h>
460c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt#include <utils/Log.h>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct JMetricsID {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID    top;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID    ascent;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID    descent;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID    bottom;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID    leading;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass   gFontMetrics_class;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JMetricsID gFontMetrics_fieldID;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass   gFontMetricsInt_class;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JMetricsID gFontMetricsInt_fieldID;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
643d63e0119dc763ed0a06fd7498375746fd391d80Mike Reedstatic void defaultSettingsForAndroid(SkPaint* paint) {
65c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // GlyphID encoding is required because we are using Harfbuzz shaping
66c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
67d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger
68d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger    SkPaintOptionsAndroid paintOpts = paint->getPaintOptionsAndroid();
69d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger    paintOpts.setUseFontFallbacks(true);
70d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger    paint->setPaintOptionsAndroid(paintOpts);
713d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed}
723d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkPaintGlue {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
750c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    enum MoveOpt {
760c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        AFTER, AT_OR_AFTER, BEFORE, AT_OR_BEFORE, AT
770c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    };
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle) {
8036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete obj;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong init(JNIEnv* env, jobject clazz) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint* obj = new SkPaint();
863d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed        defaultSettingsForAndroid(obj);
8736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong initWithPaint(JNIEnv* env, jobject clazz, jlong paintHandle) {
9136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint* obj = new SkPaint(*paint);
9336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
958451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
9636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void reset(JNIEnv* env, jobject clazz, jlong objHandle) {
9736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj->reset();
993d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed        defaultSettingsForAndroid(obj);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1018451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
10236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void assign(JNIEnv* env, jobject clazz, jlong dstPaintHandle, jlong srcPaintHandle) {
10336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* dst = reinterpret_cast<SkPaint*>(dstPaintHandle);
10436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        const SkPaint* src = reinterpret_cast<SkPaint*>(srcPaintHandle);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *dst = *src;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1078451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jint getFlags(JNIEnv* env, jobject paint) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
11036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        int result;
11136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        result = GraphicsJNI::getNativePaint(env, paint)->getFlags();
11236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jint>(result);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1148451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setFlags(JNIEnv* env, jobject paint, jint flags) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setFlags(flags);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1198451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
120f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn    static jint getHinting(JNIEnv* env, jobject paint) {
121f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn        NPE_CHECK_RETURN_ZERO(env, paint);
122f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn        return GraphicsJNI::getNativePaint(env, paint)->getHinting()
123f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn                == SkPaint::kNo_Hinting ? 0 : 1;
124f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn    }
125f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn
126f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn    static void setHinting(JNIEnv* env, jobject paint, jint mode) {
127f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn        NPE_CHECK_RETURN_VOID(env, paint);
128f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn        GraphicsJNI::getNativePaint(env, paint)->setHinting(
1298870538f7c8d32187255707bc3217bd3625d397eVictoria Lease                mode == 0 ? SkPaint::kNo_Hinting : SkPaint::kNormal_Hinting);
130f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn    }
131f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setAntiAlias(JNIEnv* env, jobject paint, jboolean aa) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setAntiAlias(aa);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1368451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setLinearText(JNIEnv* env, jobject paint, jboolean linearText) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setLinearText(linearText);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1418451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setSubpixelText(JNIEnv* env, jobject paint, jboolean subpixelText) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setSubpixelText(subpixelText);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1468451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setUnderlineText(JNIEnv* env, jobject paint, jboolean underlineText) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setUnderlineText(underlineText);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1518451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setStrikeThruText(JNIEnv* env, jobject paint, jboolean strikeThruText) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setStrikeThruText(strikeThruText);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1568451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setFakeBoldText(JNIEnv* env, jobject paint, jboolean fakeBoldText) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setFakeBoldText(fakeBoldText);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1618451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setFilterBitmap(JNIEnv* env, jobject paint, jboolean filterBitmap) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
164b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger        GraphicsJNI::getNativePaint(env, paint)->setFilterLevel(
165b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger                filterBitmap ? SkPaint::kLow_FilterLevel : SkPaint::kNone_FilterLevel);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1678451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setDither(JNIEnv* env, jobject paint, jboolean dither) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setDither(dither);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1728451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
17336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint getStyle(JNIEnv* env, jobject clazz,jlong objHandle) {
17436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
17536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jint>(obj->getStyle());
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1778451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
17836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void setStyle(JNIEnv* env, jobject clazz, jlong objHandle, jint styleHandle) {
17936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
18036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint::Style style = static_cast<SkPaint::Style>(styleHandle);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj->setStyle(style);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1838451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jint getColor(JNIEnv* env, jobject paint) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
18636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        int color;
18736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        color = GraphicsJNI::getNativePaint(env, paint)->getColor();
18836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jint>(color);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1908451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jint getAlpha(JNIEnv* env, jobject paint) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
19336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        int alpha;
19436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        alpha = GraphicsJNI::getNativePaint(env, paint)->getAlpha();
19536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jint>(alpha);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1978451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setColor(JNIEnv* env, jobject paint, jint color) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setColor(color);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2028451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setAlpha(JNIEnv* env, jobject paint, jint a) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::getNativePaint(env, paint)->setAlpha(a);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2078451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat getStrokeWidth(JNIEnv* env, jobject paint) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getStrokeWidth());
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2128451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setStrokeWidth(JNIEnv* env, jobject paint, jfloat width) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
2152e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        GraphicsJNI::getNativePaint(env, paint)->setStrokeWidth(width);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2178451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat getStrokeMiter(JNIEnv* env, jobject paint) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getStrokeMiter());
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2228451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setStrokeMiter(JNIEnv* env, jobject paint, jfloat miter) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
2252e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        GraphicsJNI::getNativePaint(env, paint)->setStrokeMiter(miter);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2278451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
22836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint getStrokeCap(JNIEnv* env, jobject clazz, jlong objHandle) {
22936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
23036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jint>(obj->getStrokeCap());
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2328451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
23336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void setStrokeCap(JNIEnv* env, jobject clazz, jlong objHandle, jint capHandle) {
23436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
23536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint::Cap cap = static_cast<SkPaint::Cap>(capHandle);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj->setStrokeCap(cap);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2388451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
23936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint getStrokeJoin(JNIEnv* env, jobject clazz, jlong objHandle) {
24036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
24136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jint>(obj->getStrokeJoin());
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2438451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
24436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void setStrokeJoin(JNIEnv* env, jobject clazz, jlong objHandle, jint joinHandle) {
24536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
24636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint::Join join = (SkPaint::Join) joinHandle;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj->setStrokeJoin(join);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2498451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
25036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jboolean getFillPath(JNIEnv* env, jobject clazz, jlong objHandle, jlong srcHandle, jlong dstHandle) {
25136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
25236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPath* src = reinterpret_cast<SkPath*>(srcHandle);
25336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPath* dst = reinterpret_cast<SkPath*>(dstHandle);
25436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return obj->getFillPath(*src, dst) ? JNI_TRUE : JNI_FALSE;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2568451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
25736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong setShader(JNIEnv* env, jobject clazz, jlong objHandle, jlong shaderHandle) {
25836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
25936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle);
26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj->setShader(shader));
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2628451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
26336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong setColorFilter(JNIEnv* env, jobject clazz, jlong objHandle, jlong filterHandle) {
26436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint *>(objHandle);
26536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkColorFilter* filter  = reinterpret_cast<SkColorFilter *>(filterHandle);
26636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj->setColorFilter(filter));
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2688451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
26936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong setXfermode(JNIEnv* env, jobject clazz, jlong objHandle, jlong xfermodeHandle) {
27036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
27136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkXfermode* xfermode = reinterpret_cast<SkXfermode*>(xfermodeHandle);
27236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj->setXfermode(xfermode));
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2748451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
27536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong setPathEffect(JNIEnv* env, jobject clazz, jlong objHandle, jlong effectHandle) {
27636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
27736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPathEffect* effect  = reinterpret_cast<SkPathEffect*>(effectHandle);
27836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj->setPathEffect(effect));
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2808451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
28136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong setMaskFilter(JNIEnv* env, jobject clazz, jlong objHandle, jlong maskfilterHandle) {
28236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
28336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkMaskFilter* maskfilter  = reinterpret_cast<SkMaskFilter*>(maskfilterHandle);
28436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj->setMaskFilter(maskfilter));
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2868451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
28736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong setTypeface(JNIEnv* env, jobject clazz, jlong objHandle, jlong typefaceHandle) {
288a033630e805c407080221e20b236b6054f324670Raph Levien#ifndef USE_MINIKIN
28936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
29036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkTypeface* typeface = reinterpret_cast<SkTypeface*>(typefaceHandle);
29136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj->setTypeface(typeface));
292a033630e805c407080221e20b236b6054f324670Raph Levien#else
293a033630e805c407080221e20b236b6054f324670Raph Levien        // TODO(raph): not yet implemented
294a033630e805c407080221e20b236b6054f324670Raph Levien        return NULL;
295a033630e805c407080221e20b236b6054f324670Raph Levien#endif
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2978451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
29836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jlong setRasterizer(JNIEnv* env, jobject clazz, jlong objHandle, jlong rasterizerHandle) {
29936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
30036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkRasterizer* rasterizer = reinterpret_cast<SkRasterizer*>(rasterizerHandle);
30136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return reinterpret_cast<jlong>(obj->setRasterizer(rasterizer));
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3038451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
30436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint getTextAlign(JNIEnv* env, jobject clazz, jlong objHandle) {
30536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
30636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        return static_cast<jint>(obj->getTextAlign());
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3088451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
30936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void setTextAlign(JNIEnv* env, jobject clazz, jlong objHandle, jint alignHandle) {
31036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
31136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint::Align align = static_cast<SkPaint::Align>(alignHandle);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj->setTextAlign(align);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3148451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
315ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett    // generate bcp47 identifier for the supplied locale
316ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett    static void toLanguageTag(char* output, size_t outSize,
317ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            const char* locale) {
318ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        if (output == NULL || outSize <= 0) {
319ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            return;
320ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        }
321ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        if (locale == NULL) {
322ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            output[0] = '\0';
323ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            return;
324ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        }
325ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        char canonicalChars[ULOC_FULLNAME_CAPACITY];
326ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        UErrorCode uErr = U_ZERO_ERROR;
327ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        uloc_canonicalize(locale, canonicalChars, ULOC_FULLNAME_CAPACITY,
328ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                &uErr);
329ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        if (U_SUCCESS(uErr)) {
330ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            char likelyChars[ULOC_FULLNAME_CAPACITY];
331ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            uErr = U_ZERO_ERROR;
332ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            uloc_addLikelySubtags(canonicalChars, likelyChars,
333ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                    ULOC_FULLNAME_CAPACITY, &uErr);
334ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            if (U_SUCCESS(uErr)) {
335ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                uErr = U_ZERO_ERROR;
336ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                uloc_toLanguageTag(likelyChars, output, outSize, FALSE, &uErr);
337ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                if (U_SUCCESS(uErr)) {
338ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                    return;
339ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                } else {
340ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                    ALOGD("uloc_toLanguageTag(\"%s\") failed: %s", likelyChars,
341ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                            u_errorName(uErr));
342ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                }
343ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            } else {
344ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                ALOGD("uloc_addLikelySubtags(\"%s\") failed: %s",
345ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                        canonicalChars, u_errorName(uErr));
346ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            }
347ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        } else {
348ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett            ALOGD("uloc_canonicalize(\"%s\") failed: %s", locale,
349ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett                    u_errorName(uErr));
350ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        }
351ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        // unable to build a proper language identifier
352ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        output[0] = '\0';
353ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett    }
354ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett
35536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void setTextLocale(JNIEnv* env, jobject clazz, jlong objHandle, jstring locale) {
35636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* obj = reinterpret_cast<SkPaint*>(objHandle);
357ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        ScopedUtfChars localeChars(env, locale);
358ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        char langTag[ULOC_FULLNAME_CAPACITY];
359ac1cbaf2e5575ac75a0160e13089d51a0bb232faBilly Hewlett        toLanguageTag(langTag, ULOC_FULLNAME_CAPACITY, localeChars.c_str());
360d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger
361d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger        SkPaintOptionsAndroid paintOpts = obj->getPaintOptionsAndroid();
362d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger        paintOpts.setLanguage(langTag);
363d7a80774f0a2175f9ee81a7741f9a171c78e0b8bDerek Sollenberger        obj->setPaintOptionsAndroid(paintOpts);
364517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio    }
365517825f1a9f14f92908bd7859b91b927c2eec6d9Fabrice Di Meglio
36653c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    static jboolean isElegantTextHeight(JNIEnv* env, jobject paint) {
36753c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        NPE_CHECK_RETURN_ZERO(env, paint);
36853c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkPaint* obj = GraphicsJNI::getNativePaint(env, paint);
36953c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkPaintOptionsAndroid paintOpts = obj->getPaintOptionsAndroid();
37053c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        return paintOpts.getFontVariant() == SkPaintOptionsAndroid::kElegant_Variant;
37153c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    }
37253c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien
37353c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    static void setElegantTextHeight(JNIEnv* env, jobject paint, jboolean aa) {
37453c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        NPE_CHECK_RETURN_VOID(env, paint);
37553c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkPaint* obj = GraphicsJNI::getNativePaint(env, paint);
37653c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkPaintOptionsAndroid::FontVariant variant =
37753c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            aa ? SkPaintOptionsAndroid::kElegant_Variant :
37853c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            SkPaintOptionsAndroid::kDefault_Variant;
37953c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkPaintOptionsAndroid paintOpts = obj->getPaintOptionsAndroid();
38053c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        paintOpts.setFontVariant(variant);
38153c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        obj->setPaintOptionsAndroid(paintOpts);
38253c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    }
38353c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat getTextSize(JNIEnv* env, jobject paint) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getTextSize());
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3888451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setTextSize(JNIEnv* env, jobject paint, jfloat textSize) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
3912e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        GraphicsJNI::getNativePaint(env, paint)->setTextSize(textSize);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3938451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat getTextScaleX(JNIEnv* env, jobject paint) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getTextScaleX());
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3988451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setTextScaleX(JNIEnv* env, jobject paint, jfloat scaleX) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
4012e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        GraphicsJNI::getNativePaint(env, paint)->setTextScaleX(scaleX);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4038451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat getTextSkewX(JNIEnv* env, jobject paint) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getTextSkewX());
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4088451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setTextSkewX(JNIEnv* env, jobject paint, jfloat skewX) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, paint);
4112e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III        GraphicsJNI::getNativePaint(env, paint)->setTextSkewX(skewX);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4138451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat ascent(JNIEnv* env, jobject paint) {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint::FontMetrics    metrics;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void)GraphicsJNI::getNativePaint(env, paint)->getFontMetrics(&metrics);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(metrics.fAscent);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4208451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat descent(JNIEnv* env, jobject paint) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint::FontMetrics    metrics;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void)GraphicsJNI::getNativePaint(env, paint)->getFontMetrics(&metrics);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(metrics.fDescent);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4278451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
42853c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    static SkScalar getMetricsInternal(SkPaint *paint, SkPaint::FontMetrics *metrics) {
42953c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        const int kElegantTop = 2500;
43053c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        const int kElegantBottom = -1000;
43153c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        const int kElegantAscent = 1946;
43253c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        const int kElegantDescent = -512;
43353c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        const int kElegantLeading = 0;
43453c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkScalar spacing = paint->getFontMetrics(metrics);
43553c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkPaintOptionsAndroid paintOpts = paint->getPaintOptionsAndroid();
43653c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        if (paintOpts.getFontVariant() == SkPaintOptionsAndroid::kElegant_Variant) {
43753c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            SkScalar size = paint->getTextSize();
43853c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            metrics->fTop = -size * kElegantTop / 2048;
43953c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            metrics->fBottom = -size * kElegantBottom / 2048;
44053c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            metrics->fAscent = -size * kElegantAscent / 2048;
44153c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            metrics->fDescent = -size * kElegantDescent / 2048;
44253c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            metrics->fLeading = size * kElegantLeading / 2048;
44353c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien            spacing = metrics->fDescent - metrics->fAscent + metrics->fLeading;
44453c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        }
44553c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        return spacing;
44653c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    }
44753c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jfloat getFontMetrics(JNIEnv* env, jobject paint, jobject metricsObj) {
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint::FontMetrics metrics;
45153c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        SkScalar spacing = getMetricsInternal(GraphicsJNI::getNativePaint(env, paint), &metrics);
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (metricsObj) {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SkASSERT(env->IsInstanceOf(metricsObj, gFontMetrics_class));
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetFloatField(metricsObj, gFontMetrics_fieldID.top, SkScalarToFloat(metrics.fTop));
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetFloatField(metricsObj, gFontMetrics_fieldID.ascent, SkScalarToFloat(metrics.fAscent));
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetFloatField(metricsObj, gFontMetrics_fieldID.descent, SkScalarToFloat(metrics.fDescent));
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetFloatField(metricsObj, gFontMetrics_fieldID.bottom, SkScalarToFloat(metrics.fBottom));
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetFloatField(metricsObj, gFontMetrics_fieldID.leading, SkScalarToFloat(metrics.fLeading));
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SkScalarToFloat(spacing);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4638451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static jint getFontMetricsInt(JNIEnv* env, jobject paint, jobject metricsObj) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, paint);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint::FontMetrics metrics;
4678451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
46853c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien        getMetricsInternal(GraphicsJNI::getNativePaint(env, paint), &metrics);
46946cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins        int ascent = SkScalarRoundToInt(metrics.fAscent);
47046cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins        int descent = SkScalarRoundToInt(metrics.fDescent);
47146cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins        int leading = SkScalarRoundToInt(metrics.fLeading);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (metricsObj) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SkASSERT(env->IsInstanceOf(metricsObj, gFontMetricsInt_class));
47546cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins            env->SetIntField(metricsObj, gFontMetricsInt_fieldID.top, SkScalarFloorToInt(metrics.fTop));
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetIntField(metricsObj, gFontMetricsInt_fieldID.ascent, ascent);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetIntField(metricsObj, gFontMetricsInt_fieldID.descent, descent);
47846cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins            env->SetIntField(metricsObj, gFontMetricsInt_fieldID.bottom, SkScalarCeilToInt(metrics.fBottom));
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetIntField(metricsObj, gFontMetricsInt_fieldID.leading, leading);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return descent - ascent + leading;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jfloat measureText_CIII(JNIEnv* env, jobject jpaint, jcharArray text, jint index, jint count,
485626d3c228116103e95d4429b06dad70f9812561aVictoria Lease            jint bidiFlags) {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jpaint);
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, text);
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t textLength = env->GetArrayLength(text);
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((index | count) < 0 || (size_t)(index + count) > textLength) {
4918451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes            doThrowAIOOBE(env);
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4946ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if (count == 0) {
4956ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
4966ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4984f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio        SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* textArray = env->GetCharArrayElements(text, NULL);
5004f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio        jfloat result = 0;
501b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio
5021a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
5031a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        Layout layout;
5041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* typeface = GraphicsJNI::getNativeTypeface(env, jpaint);
5051a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        MinikinUtils::SetLayoutProperties(&layout, paint, typeface);
5061a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        layout.doLayout(textArray + index, count);
5071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        result = layout.getAdvance();
5081a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#else
5098fb507171f68d4170cfeb1187ee7d1f70f98917dFabrice Di Meglio        TextLayout::getTextRunAdvances(paint, textArray, index, count, textLength,
510626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                bidiFlags, NULL /* dont need all advances */, &result);
5111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
512b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio
5134f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio        env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray), JNI_ABORT);
5144f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio        return result;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5168451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
51736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jfloat measureText_StringIII(JNIEnv* env, jobject jpaint, jstring text, jint start, jint end,
518626d3c228116103e95d4429b06dad70f9812561aVictoria Lease            jint bidiFlags) {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jpaint);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, text);
5218451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
52251f383d65f9ee3c7d73d0508b576550e7998c5b5Fabrice Di Meglio        size_t textLength = env->GetStringLength(text);
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = end - start;
52451f383d65f9ee3c7d73d0508b576550e7998c5b5Fabrice Di Meglio        if ((start | count) < 0 || (size_t)end > textLength) {
5256ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            doThrowAIOOBE(env);
5266ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
5276ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
5286ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if (count == 0) {
5296ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
5306ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
5316ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio
5326ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        const jchar* textArray = env->GetStringChars(text, NULL);
5336ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint);
5344f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio        jfloat width = 0;
5358451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
5361a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
5371a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        Layout layout;
5381a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* typeface = GraphicsJNI::getNativeTypeface(env, jpaint);
5391a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        MinikinUtils::SetLayoutProperties(&layout, paint, typeface);
5401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        layout.doLayout(textArray + start, count);
5411a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        width = layout.getAdvance();
5421a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#else
54351f383d65f9ee3c7d73d0508b576550e7998c5b5Fabrice Di Meglio        TextLayout::getTextRunAdvances(paint, textArray, start, count, textLength,
544626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                bidiFlags, NULL /* dont need all advances */, &width);
5451a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
5464f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(text, textArray);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return width;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5508451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
551626d3c228116103e95d4429b06dad70f9812561aVictoria Lease    static jfloat measureText_StringI(JNIEnv* env, jobject jpaint, jstring text, jint bidiFlags) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jpaint);
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, text);
5548451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        size_t textLength = env->GetStringLength(text);
5566ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if (textLength == 0) {
5576ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
5586ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
5596ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio
5606ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        const jchar* textArray = env->GetStringChars(text, NULL);
5616ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint);
5624f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio        jfloat width = 0;
5636ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio
5641a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
5651a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        Layout layout;
5661a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* typeface = GraphicsJNI::getNativeTypeface(env, jpaint);
5671a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        MinikinUtils::SetLayoutProperties(&layout, paint, typeface);
5681a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        layout.doLayout(textArray, textLength);
5691a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        width = layout.getAdvance();
5701a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#else
5718fb507171f68d4170cfeb1187ee7d1f70f98917dFabrice Di Meglio        TextLayout::getTextRunAdvances(paint, textArray, 0, textLength, textLength,
572626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                bidiFlags, NULL /* dont need all advances */, &width);
5731a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
574b02d0ca5553300063e4332192632312600caf4b9Fabrice Di Meglio
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(text, textArray);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return width;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5788451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
5791a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    static int dotextwidths(JNIEnv* env, SkPaint* paint, TypefaceImpl* typeface, const jchar text[], int count,
5801a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            jfloatArray widths, jint bidiFlags) {
5816ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        NPE_CHECK_RETURN_ZERO(env, paint);
5826ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        NPE_CHECK_RETURN_ZERO(env, text);
5836ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio
5846ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if (count < 0 || !widths) {
5856ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            doThrowAIOOBE(env);
5866ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
5876ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
5886ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if (count == 0) {
5896ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
5906ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
5916ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        size_t widthsLength = env->GetArrayLength(widths);
5926ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if ((size_t)count > widthsLength) {
5936ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            doThrowAIOOBE(env);
5946ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
5956ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
5966ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AutoJavaFloatArray autoWidths(env, widths, count);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jfloat* widthsArray = autoWidths.ptr();
5996ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio
6001a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
6011a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        Layout layout;
6021a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        MinikinUtils::SetLayoutProperties(&layout, paint, typeface);
6031a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        layout.doLayout(text, count);
6041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        layout.getAdvances(widthsArray);
6051a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#else
6068fb507171f68d4170cfeb1187ee7d1f70f98917dFabrice Di Meglio        TextLayout::getTextRunAdvances(paint, text, 0, count, count,
607626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                bidiFlags, widthsArray, NULL /* dont need totalAdvance */);
6081a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return count;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6128451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
6131a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    static jint getTextWidths___CIII_F(JNIEnv* env, jobject clazz, jlong paintHandle, jlong typefaceHandle, jcharArray text,
61436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            jint index, jint count, jint bidiFlags, jfloatArray widths) {
61536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
6161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* textArray = env->GetCharArrayElements(text, NULL);
6181a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        count = dotextwidths(env, paint, typeface, textArray + index, count, widths, bidiFlags);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray),
6208451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes                                      JNI_ABORT);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return count;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6238451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
6241a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    static jint getTextWidths__StringIII_F(JNIEnv* env, jobject clazz, jlong paintHandle, jlong typefaceHandle, jstring text,
62536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            jint start, jint end, jint bidiFlags, jfloatArray widths) {
62636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
6271a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* textArray = env->GetStringChars(text, NULL);
6291a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        int count = dotextwidths(env, paint, typeface, textArray + start, end - start, widths, bidiFlags);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(text, textArray);
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return count;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6330c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
634da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    static int doTextGlyphs(JNIEnv* env, SkPaint* paint, const jchar* text, jint start, jint count,
635da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            jint contextCount, jint flags, jcharArray glyphs) {
636da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        NPE_CHECK_RETURN_ZERO(env, paint);
637da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        NPE_CHECK_RETURN_ZERO(env, text);
638da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
639da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        if ((start | count | contextCount) < 0 || contextCount < count || !glyphs) {
640da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            doThrowAIOOBE(env);
641da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            return 0;
642da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        }
643da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        if (count == 0) {
644da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            return 0;
645da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        }
646da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        size_t glypthsLength = env->GetArrayLength(glyphs);
647da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        if ((size_t)count > glypthsLength) {
648da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            doThrowAIOOBE(env);
649da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            return 0;
650da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        }
651da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
652da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        jchar* glyphsArray = env->GetCharArrayElements(glyphs, NULL);
653da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
654da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
655da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio                text, start, count, contextCount, flags);
656da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        const jchar* shapedGlyphs = value->getGlyphs();
657da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        size_t glyphsCount = value->getGlyphsCount();
658da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        memcpy(glyphsArray, shapedGlyphs, sizeof(jchar) * glyphsCount);
659da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
660da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        env->ReleaseCharArrayElements(glyphs, glyphsArray, JNI_ABORT);
661da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        return glyphsCount;
662da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    }
663da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
66436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint getTextGlyphs__StringIIIII_C(JNIEnv* env, jobject clazz, jlong paintHandle,
665da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            jstring text, jint start, jint end, jint contextStart, jint contextEnd, jint flags,
666da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            jcharArray glyphs) {
66736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
668da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        const jchar* textArray = env->GetStringChars(text, NULL);
669da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        int count = doTextGlyphs(env, paint, textArray + contextStart, start - contextStart,
670da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio                end - start, contextEnd - contextStart, flags, glyphs);
671da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        env->ReleaseStringChars(text, textArray);
672da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        return count;
673da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio    }
674da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
6751a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    static jfloat doTextRunAdvances(JNIEnv *env, SkPaint *paint, TypefaceImpl* typeface, const jchar *text,
676da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio                                    jint start, jint count, jint contextCount, jint flags,
6770c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt                                    jfloatArray advances, jint advancesIndex) {
6786ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        NPE_CHECK_RETURN_ZERO(env, paint);
6796ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        NPE_CHECK_RETURN_ZERO(env, text);
6806ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio
6816ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if ((start | count | contextCount | advancesIndex) < 0 || contextCount < count) {
6826ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            doThrowAIOOBE(env);
6836ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
6846ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
6856ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if (count == 0) {
6866ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            return 0;
6876ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
6886ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        if (advances) {
6896ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            size_t advancesLength = env->GetArrayLength(advances);
6906ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            if ((size_t)count > advancesLength) {
6916ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio                doThrowAIOOBE(env);
6926ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio                return 0;
6936ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio            }
6946ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        }
6953af2a37e057b31617b8f4eeb22ac3ef85c3fd5aaVictoria Lease        jfloat* advancesArray = new jfloat[count];
6966ab90ed017fb52aac4493a2fac897299d345874fFabrice Di Meglio        jfloat totalAdvance = 0;
6970c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
6981a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#ifdef USE_MINIKIN
6991a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        Layout layout;
7001a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        MinikinUtils::SetLayoutProperties(&layout, paint, typeface);
7011a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        layout.doLayout(text + start, count);
7021a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        layout.getAdvances(advancesArray);
7031a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        totalAdvance = layout.getAdvance();
7041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#else
705da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        TextLayout::getTextRunAdvances(paint, text, start, count, contextCount, flags,
70679df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio                                       advancesArray, &totalAdvance);
7071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien#endif
7080c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
7090c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        if (advances != NULL) {
7100c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt            env->SetFloatArrayRegion(advances, advancesIndex, count, advancesArray);
7110c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        }
7123af2a37e057b31617b8f4eeb22ac3ef85c3fd5aaVictoria Lease        delete [] advancesArray;
7130c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        return totalAdvance;
7140c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    }
7150c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
71636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jfloat getTextRunAdvances___CIIIII_FI(JNIEnv* env, jobject clazz, jlong paintHandle,
7171a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            jlong typefaceHandle,
7180c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt            jcharArray text, jint index, jint count, jint contextIndex, jint contextCount,
719665f02c66702b77db25e950ff433230186bc3243Fabrice Di Meglio            jint flags, jfloatArray advances, jint advancesIndex) {
72036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
7211a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
7220c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        jchar* textArray = env->GetCharArrayElements(text, NULL);
7231a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jfloat result = doTextRunAdvances(env, paint, typeface, textArray + contextIndex,
724665f02c66702b77db25e950ff433230186bc3243Fabrice Di Meglio                index - contextIndex, count, contextCount, flags, advances, advancesIndex);
7250c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
7260c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        return result;
7270c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    }
7280c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
72936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jfloat getTextRunAdvances__StringIIIII_FI(JNIEnv* env, jobject clazz, jlong paintHandle,
7301a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien            jlong typefaceHandle,
731da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio            jstring text, jint start, jint end, jint contextStart, jint contextEnd, jint flags,
732665f02c66702b77db25e950ff433230186bc3243Fabrice Di Meglio            jfloatArray advances, jint advancesIndex) {
73336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
7341a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        TypefaceImpl* typeface = reinterpret_cast<TypefaceImpl*>(typefaceHandle);
7350c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        const jchar* textArray = env->GetStringChars(text, NULL);
7361a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien        jfloat result = doTextRunAdvances(env, paint, typeface, textArray + contextStart,
737665f02c66702b77db25e950ff433230186bc3243Fabrice Di Meglio                start - contextStart, end - start, contextEnd - contextStart, flags,
738665f02c66702b77db25e950ff433230186bc3243Fabrice Di Meglio                advances, advancesIndex);
739eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        env->ReleaseStringChars(text, textArray);
740eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio        return result;
741eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio    }
742eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio
7430c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    static jint doTextRunCursor(JNIEnv *env, SkPaint* paint, const jchar *text, jint start,
744a4bf8114a73371b51a0eba9d5d61dfeb597a1abbFabrice Di Meglio            jint count, jint flags, jint offset, jint opt) {
7454f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio        jfloat scalarArray[count];
7469c418dbc56efd334c68872d281f75138e16eae46Fabrice Di Meglio
747da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        TextLayout::getTextRunAdvances(paint, text, start, count, start + count, flags,
74879df5323e7ed541b854cea5684a89e8be8c2dfc9Fabrice Di Meglio                scalarArray, NULL /* dont need totalAdvance */);
7490c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
7500c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        jint pos = offset - start;
7510c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        switch (opt) {
7520c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        case AFTER:
7530c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          if (pos < count) {
7540c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt            pos += 1;
7550c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          }
7560c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          // fall through
7570c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        case AT_OR_AFTER:
7580c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          while (pos < count && scalarArray[pos] == 0) {
7590c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt            ++pos;
7600c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          }
7610c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          break;
7620c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        case BEFORE:
7630c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          if (pos > 0) {
7640c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt            --pos;
7650c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          }
7660c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          // fall through
7670c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        case AT_OR_BEFORE:
7680c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          while (pos > 0 && scalarArray[pos] == 0) {
7690c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt            --pos;
7700c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          }
7710c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          break;
7720c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        case AT:
7730c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        default:
7740c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          if (scalarArray[pos] == 0) {
7750c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt            pos = -1;
7760c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          }
7770c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          break;
7780c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        }
7790c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
7800c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        if (pos != -1) {
7810c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt          pos += start;
7820c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        }
7830c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
7840c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        return pos;
7850c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    }
7860c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
78736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint getTextRunCursor___C(JNIEnv* env, jobject clazz, jlong paintHandle, jcharArray text,
788a4bf8114a73371b51a0eba9d5d61dfeb597a1abbFabrice Di Meglio            jint contextStart, jint contextCount, jint flags, jint offset, jint cursorOpt) {
78936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
7900c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        jchar* textArray = env->GetCharArrayElements(text, NULL);
791a4bf8114a73371b51a0eba9d5d61dfeb597a1abbFabrice Di Meglio        jint result = doTextRunCursor(env, paint, textArray, contextStart, contextCount, flags,
7920c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt                offset, cursorOpt);
7930c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
7940c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        return result;
7950c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    }
7960c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
79736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint getTextRunCursor__String(JNIEnv* env, jobject clazz, jlong paintHandle, jstring text,
798a4bf8114a73371b51a0eba9d5d61dfeb597a1abbFabrice Di Meglio            jint contextStart, jint contextEnd, jint flags, jint offset, jint cursorOpt) {
79936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
8000c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        const jchar* textArray = env->GetStringChars(text, NULL);
8010c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        jint result = doTextRunCursor(env, paint, textArray, contextStart,
802a4bf8114a73371b51a0eba9d5d61dfeb597a1abbFabrice Di Meglio                contextEnd - contextStart, flags, offset, cursorOpt);
8030c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        env->ReleaseStringChars(text, textArray);
8040c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        return result;
8050c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt    }
8060c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt
807f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt    static void getTextPath(JNIEnv* env, SkPaint* paint, const jchar* text, jint count,
808da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio                            jint bidiFlags, jfloat x, jfloat y, SkPath *path) {
809da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        TextLayout::getTextPath(paint, text, count, bidiFlags, x, y, path);
810f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt    }
811f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt
81236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void getTextPath___C(JNIEnv* env, jobject clazz, jlong paintHandle, jint bidiFlags,
81336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            jcharArray text, jint index, jint count, jfloat x, jfloat y, jlong pathHandle) {
81436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
81536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* textArray = env->GetCharArrayElements(text, NULL);
817da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        getTextPath(env, paint, textArray + index, count, bidiFlags, x, y, path);
818f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt        env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray), JNI_ABORT);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
820f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt
82136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void getTextPath__String(JNIEnv* env, jobject clazz, jlong paintHandle, jint bidiFlags,
82236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            jstring text, jint start, jint end, jfloat x, jfloat y, jlong pathHandle) {
82336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
82436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        SkPath* path = reinterpret_cast<SkPath*>(pathHandle);
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* textArray = env->GetStringChars(text, NULL);
826da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        getTextPath(env, paint, textArray + start, end - start, bidiFlags, x, y, path);
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(text, textArray);
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void setShadowLayer(JNIEnv* env, jobject jpaint, jfloat radius,
83136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                               jfloat dx, jfloat dy, jint color) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_VOID(env, jpaint);
8338451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
8348451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint);
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (radius <= 0) {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            paint->setLooper(NULL);
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
8392e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III            paint->setLooper(new SkBlurDrawLooper(radius, dx, dy, (SkColor)color))->unref();
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
843bd901dee317d10c6a921922c3d7d788b90306c82Fabrice Di Meglio    static int breakText(JNIEnv* env, SkPaint& paint, const jchar text[],
844626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                         int count, float maxWidth, jint bidiFlags, jfloatArray jmeasured,
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                         SkPaint::TextBufferDirection tbd) {
846a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio        sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(&paint,
847626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                text, 0, count, count, bidiFlags);
848bd901dee317d10c6a921922c3d7d788b90306c82Fabrice Di Meglio        if (value == NULL) {
849a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio            return 0;
850bd901dee317d10c6a921922c3d7d788b90306c82Fabrice Di Meglio        }
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkScalar     measured;
852bd901dee317d10c6a921922c3d7d788b90306c82Fabrice Di Meglio        size_t       bytes = paint.breakText(value->getGlyphs(), value->getGlyphsCount() << 1,
8532e0103eb340822f9d580c1aa8492bae8394b8243Leon Scroggins III                maxWidth, &measured, tbd);
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkASSERT((bytes & 1) == 0);
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (jmeasured && env->GetArrayLength(jmeasured) > 0) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AutoJavaFloatArray autoMeasured(env, jmeasured, 1);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jfloat* array = autoMeasured.ptr();
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            array[0] = SkScalarToFloat(measured);
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return bytes >> 1;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint breakTextC(JNIEnv* env, jobject jpaint, jcharArray jtext,
86536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat            jint index, jint count, jfloat maxWidth, jint bidiFlags, jfloatArray jmeasuredWidth) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jpaint);
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jtext);
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint::TextBufferDirection tbd;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (count < 0) {
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tbd = SkPaint::kBackward_TextBufferDirection;
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            count = -count;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else {
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            tbd = SkPaint::kForward_TextBufferDirection;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((index < 0) || (index + count > env->GetArrayLength(jtext))) {
8798451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes            doThrowAIOOBE(env);
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint*     paint = GraphicsJNI::getNativePaint(env, jpaint);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* text = env->GetCharArrayElements(jtext, NULL);
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        count = breakText(env, *paint, text + index, count, maxWidth,
886626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                          bidiFlags, jmeasuredWidth, tbd);
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseCharArrayElements(jtext, const_cast<jchar*>(text),
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      JNI_ABORT);
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return count;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static jint breakTextS(JNIEnv* env, jobject jpaint, jstring jtext,
89336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                jboolean forwards, jfloat maxWidth, jint bidiFlags, jfloatArray jmeasuredWidth) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jpaint);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jtext);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint::TextBufferDirection tbd = forwards ?
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        SkPaint::kForward_TextBufferDirection :
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        SkPaint::kBackward_TextBufferDirection;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint);
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int count = env->GetStringLength(jtext);
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* text = env->GetStringChars(jtext, NULL);
904626d3c228116103e95d4429b06dad70f9812561aVictoria Lease        count = breakText(env, *paint, text, count, maxWidth, bidiFlags, jmeasuredWidth, tbd);
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(jtext, text);
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return count;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void doTextBounds(JNIEnv* env, const jchar* text, int count,
910626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                             jobject bounds, const SkPaint& paint, jint bidiFlags) {
911059e12ccd20f5c249724a8362d6bac325334ea76Romain Guy        SkRect  r;
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkIRect ir;
9138451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
914a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio        sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(&paint,
915626d3c228116103e95d4429b06dad70f9812561aVictoria Lease                text, 0, count, count, bidiFlags);
916bd901dee317d10c6a921922c3d7d788b90306c82Fabrice Di Meglio        if (value == NULL) {
917a731b082b2c43204e6e9f927ab82fb732934a83bFabrice Di Meglio            return;
918bd901dee317d10c6a921922c3d7d788b90306c82Fabrice Di Meglio        }
919bd901dee317d10c6a921922c3d7d788b90306c82Fabrice Di Meglio        paint.measureText(value->getGlyphs(), value->getGlyphsCount() << 1, &r);
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        r.roundOut(&ir);
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GraphicsJNI::irect_to_jrect(ir, env, bounds);
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void getStringBounds(JNIEnv* env, jobject, jlong paintHandle,
92536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                                jstring text, jint start, jint end, jint bidiFlags, jobject bounds) {
92636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        const SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* textArray = env->GetStringChars(text, NULL);
928626d3c228116103e95d4429b06dad70f9812561aVictoria Lease        doTextBounds(env, textArray + start, end - start, bounds, *paint, bidiFlags);
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(text, textArray);
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9318451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
93236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    static void getCharArrayBounds(JNIEnv* env, jobject, jlong paintHandle,
93336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat                        jcharArray text, jint index, jint count, jint bidiFlags, jobject bounds) {
93436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat        const SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle);
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const jchar* textArray = env->GetCharArrayElements(text, NULL);
936626d3c228116103e95d4429b06dad70f9812561aVictoria Lease        doTextBounds(env, textArray + index, count, bounds, *paint, bidiFlags);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray),
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      JNI_ABORT);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9408451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod methods[] = {
94436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"finalizer", "(J)V", (void*) SkPaintGlue::finalizer},
94536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_init","()J", (void*) SkPaintGlue::init},
94636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_initWithPaint","(J)J", (void*) SkPaintGlue::initWithPaint},
94736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_reset","(J)V", (void*) SkPaintGlue::reset},
94836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_set","(JJ)V", (void*) SkPaintGlue::assign},
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getFlags","()I", (void*) SkPaintGlue::getFlags},
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setFlags","(I)V", (void*) SkPaintGlue::setFlags},
951f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn    {"getHinting","()I", (void*) SkPaintGlue::getHinting},
952f43fa5746ee5b81a6e386d36594094d079ac8160Dianne Hackborn    {"setHinting","(I)V", (void*) SkPaintGlue::setHinting},
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setAntiAlias","(Z)V", (void*) SkPaintGlue::setAntiAlias},
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setSubpixelText","(Z)V", (void*) SkPaintGlue::setSubpixelText},
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setLinearText","(Z)V", (void*) SkPaintGlue::setLinearText},
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setUnderlineText","(Z)V", (void*) SkPaintGlue::setUnderlineText},
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setStrikeThruText","(Z)V", (void*) SkPaintGlue::setStrikeThruText},
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setFakeBoldText","(Z)V", (void*) SkPaintGlue::setFakeBoldText},
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setFilterBitmap","(Z)V", (void*) SkPaintGlue::setFilterBitmap},
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setDither","(Z)V", (void*) SkPaintGlue::setDither},
96136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getStyle","(J)I", (void*) SkPaintGlue::getStyle},
96236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setStyle","(JI)V", (void*) SkPaintGlue::setStyle},
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getColor","()I", (void*) SkPaintGlue::getColor},
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setColor","(I)V", (void*) SkPaintGlue::setColor},
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getAlpha","()I", (void*) SkPaintGlue::getAlpha},
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setAlpha","(I)V", (void*) SkPaintGlue::setAlpha},
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getStrokeWidth","()F", (void*) SkPaintGlue::getStrokeWidth},
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setStrokeWidth","(F)V", (void*) SkPaintGlue::setStrokeWidth},
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getStrokeMiter","()F", (void*) SkPaintGlue::getStrokeMiter},
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setStrokeMiter","(F)V", (void*) SkPaintGlue::setStrokeMiter},
97136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getStrokeCap","(J)I", (void*) SkPaintGlue::getStrokeCap},
97236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setStrokeCap","(JI)V", (void*) SkPaintGlue::setStrokeCap},
97336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getStrokeJoin","(J)I", (void*) SkPaintGlue::getStrokeJoin},
97436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setStrokeJoin","(JI)V", (void*) SkPaintGlue::setStrokeJoin},
97536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getFillPath","(JJJ)Z", (void*) SkPaintGlue::getFillPath},
97636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setShader","(JJ)J", (void*) SkPaintGlue::setShader},
97736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setColorFilter","(JJ)J", (void*) SkPaintGlue::setColorFilter},
97836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setXfermode","(JJ)J", (void*) SkPaintGlue::setXfermode},
97936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setPathEffect","(JJ)J", (void*) SkPaintGlue::setPathEffect},
98036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setMaskFilter","(JJ)J", (void*) SkPaintGlue::setMaskFilter},
98136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setTypeface","(JJ)J", (void*) SkPaintGlue::setTypeface},
98236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setRasterizer","(JJ)J", (void*) SkPaintGlue::setRasterizer},
98336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getTextAlign","(J)I", (void*) SkPaintGlue::getTextAlign},
98436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setTextAlign","(JI)V", (void*) SkPaintGlue::setTextAlign},
98536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_setTextLocale","(JLjava/lang/String;)V", (void*) SkPaintGlue::setTextLocale},
98653c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    {"isElegantTextHeight","()Z", (void*) SkPaintGlue::isElegantTextHeight},
98753c0077256afebb0312f01ef4f60a7445da1f5d9Raph Levien    {"setElegantTextHeight","(Z)V", (void*) SkPaintGlue::setElegantTextHeight},
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getTextSize","()F", (void*) SkPaintGlue::getTextSize},
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setTextSize","(F)V", (void*) SkPaintGlue::setTextSize},
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getTextScaleX","()F", (void*) SkPaintGlue::getTextScaleX},
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setTextScaleX","(F)V", (void*) SkPaintGlue::setTextScaleX},
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getTextSkewX","()F", (void*) SkPaintGlue::getTextSkewX},
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setTextSkewX","(F)V", (void*) SkPaintGlue::setTextSkewX},
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"ascent","()F", (void*) SkPaintGlue::ascent},
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"descent","()F", (void*) SkPaintGlue::descent},
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getFontMetrics", "(Landroid/graphics/Paint$FontMetrics;)F", (void*)SkPaintGlue::getFontMetrics},
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getFontMetricsInt", "(Landroid/graphics/Paint$FontMetricsInt;)I", (void*)SkPaintGlue::getFontMetricsInt},
998626d3c228116103e95d4429b06dad70f9812561aVictoria Lease    {"native_measureText","([CIII)F", (void*) SkPaintGlue::measureText_CIII},
999626d3c228116103e95d4429b06dad70f9812561aVictoria Lease    {"native_measureText","(Ljava/lang/String;I)F", (void*) SkPaintGlue::measureText_StringI},
1000626d3c228116103e95d4429b06dad70f9812561aVictoria Lease    {"native_measureText","(Ljava/lang/String;III)F", (void*) SkPaintGlue::measureText_StringIII},
1001626d3c228116103e95d4429b06dad70f9812561aVictoria Lease    {"native_breakText","([CIIFI[F)I", (void*) SkPaintGlue::breakTextC},
1002626d3c228116103e95d4429b06dad70f9812561aVictoria Lease    {"native_breakText","(Ljava/lang/String;ZFI[F)I", (void*) SkPaintGlue::breakTextS},
10031a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    {"native_getTextWidths","(JJ[CIII[F)I", (void*) SkPaintGlue::getTextWidths___CIII_F},
10041a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    {"native_getTextWidths","(JJLjava/lang/String;III[F)I", (void*) SkPaintGlue::getTextWidths__StringIII_F},
10051a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    {"native_getTextRunAdvances","(JJ[CIIIII[FI)F",
1006665f02c66702b77db25e950ff433230186bc3243Fabrice Di Meglio        (void*) SkPaintGlue::getTextRunAdvances___CIIIII_FI},
10071a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    {"native_getTextRunAdvances","(JJLjava/lang/String;IIIII[FI)F",
1008665f02c66702b77db25e950ff433230186bc3243Fabrice Di Meglio        (void*) SkPaintGlue::getTextRunAdvances__StringIIIII_FI},
1009da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
1010da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio
101136bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getTextGlyphs","(JLjava/lang/String;IIIII[C)I",
1012da12f389eb4be0c08ca3fa9ca7663f4977858df5Fabrice Di Meglio        (void*) SkPaintGlue::getTextGlyphs__StringIIIII_C},
101336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getTextRunCursor", "(J[CIIIII)I", (void*) SkPaintGlue::getTextRunCursor___C},
101436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getTextRunCursor", "(JLjava/lang/String;IIIII)I",
10150c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt        (void*) SkPaintGlue::getTextRunCursor__String},
101636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getTextPath","(JI[CIIFFJ)V", (void*) SkPaintGlue::getTextPath___C},
101736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"native_getTextPath","(JILjava/lang/String;IIFFJ)V", (void*) SkPaintGlue::getTextPath__String},
101836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"nativeGetStringBounds", "(JLjava/lang/String;IIILandroid/graphics/Rect;)V",
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        (void*) SkPaintGlue::getStringBounds },
102036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat    {"nativeGetCharArrayBounds", "(J[CIIILandroid/graphics/Rect;)V",
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    (void*) SkPaintGlue::getCharArrayBounds },
10221e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy    {"nSetShadowLayer", "(FFFI)V", (void*)SkPaintGlue::setShadowLayer}
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID req_fieldID(jfieldID id) {
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkASSERT(id);
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return id;
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Paint(JNIEnv* env) {
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetrics_class = env->FindClass("android/graphics/Paint$FontMetrics");
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkASSERT(gFontMetrics_class);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetrics_class = (jclass)env->NewGlobalRef(gFontMetrics_class);
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetrics_fieldID.top = req_fieldID(env->GetFieldID(gFontMetrics_class, "top", "F"));
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetrics_fieldID.ascent = req_fieldID(env->GetFieldID(gFontMetrics_class, "ascent", "F"));
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetrics_fieldID.descent = req_fieldID(env->GetFieldID(gFontMetrics_class, "descent", "F"));
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetrics_fieldID.bottom = req_fieldID(env->GetFieldID(gFontMetrics_class, "bottom", "F"));
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetrics_fieldID.leading = req_fieldID(env->GetFieldID(gFontMetrics_class, "leading", "F"));
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetricsInt_class = env->FindClass("android/graphics/Paint$FontMetricsInt");
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SkASSERT(gFontMetricsInt_class);
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetricsInt_class = (jclass)env->NewGlobalRef(gFontMetricsInt_class);
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetricsInt_fieldID.top = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "top", "I"));
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetricsInt_fieldID.ascent = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "ascent", "I"));
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetricsInt_fieldID.descent = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "descent", "I"));
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetricsInt_fieldID.bottom = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "bottom", "I"));
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gFontMetricsInt_fieldID.leading = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "leading", "I"));
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result = AndroidRuntime::registerNativeMethods(env, "android/graphics/Paint", methods,
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sizeof(methods) / sizeof(methods[0]));
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1057