Paint.cpp revision 0a1413e4bf9dcda2a8abb2287e43f612a7fb2453
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 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkBlurDrawLooper.h" 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkColorFilter.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkMaskFilter.h" 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkRasterizer.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkShader.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkTypeface.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkXfermode.h" 290c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt#include "unicode/ushape.h" 30f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt#include "TextLayout.h" 310c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 320c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt// temporary for debugging 335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <Caches.h> 340c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt#include <utils/Log.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct JMetricsID { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID top; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID ascent; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID descent; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID bottom; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID leading; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass gFontMetrics_class; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JMetricsID gFontMetrics_fieldID; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jclass gFontMetricsInt_class; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JMetricsID gFontMetricsInt_fieldID; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 523d63e0119dc763ed0a06fd7498375746fd391d80Mike Reedstatic void defaultSettingsForAndroid(SkPaint* paint) { 533d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed // looks best we decided 543d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed paint->setHinting(SkPaint::kSlight_Hinting); 553d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed // utf16 is required for java 563d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed paint->setTextEncoding(SkPaint::kUTF16_TextEncoding); 573d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed} 583d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkPaintGlue { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 610c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt enum MoveOpt { 620c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt AFTER, AT_OR_AFTER, BEFORE, AT_OR_BEFORE, AT 630c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt }; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void finalizer(JNIEnv* env, jobject clazz, SkPaint* obj) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete obj; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPaint* init(JNIEnv* env, jobject clazz) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint* obj = new SkPaint(); 713d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed defaultSettingsForAndroid(obj); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPaint* intiWithPaint(JNIEnv* env, jobject clazz, SkPaint* paint) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint* obj = new SkPaint(*paint); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 798451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void reset(JNIEnv* env, jobject clazz, SkPaint* obj) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj->reset(); 823d63e0119dc763ed0a06fd7498375746fd391d80Mike Reed defaultSettingsForAndroid(obj); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 848451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void assign(JNIEnv* env, jobject clazz, SkPaint* dst, const SkPaint* src) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *dst = *src; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 888451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getFlags(JNIEnv* env, jobject paint) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GraphicsJNI::getNativePaint(env, paint)->getFlags(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 938451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setFlags(JNIEnv* env, jobject paint, jint flags) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setFlags(flags); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 988451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setAntiAlias(JNIEnv* env, jobject paint, jboolean aa) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setAntiAlias(aa); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1038451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setLinearText(JNIEnv* env, jobject paint, jboolean linearText) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setLinearText(linearText); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1088451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setSubpixelText(JNIEnv* env, jobject paint, jboolean subpixelText) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setSubpixelText(subpixelText); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1138451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setUnderlineText(JNIEnv* env, jobject paint, jboolean underlineText) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setUnderlineText(underlineText); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1188451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setStrikeThruText(JNIEnv* env, jobject paint, jboolean strikeThruText) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setStrikeThruText(strikeThruText); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1238451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setFakeBoldText(JNIEnv* env, jobject paint, jboolean fakeBoldText) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setFakeBoldText(fakeBoldText); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1288451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setFilterBitmap(JNIEnv* env, jobject paint, jboolean filterBitmap) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setFilterBitmap(filterBitmap); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1338451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setDither(JNIEnv* env, jobject paint, jboolean dither) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setDither(dither); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1388451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getStyle(JNIEnv* env, jobject clazz, SkPaint* obj) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->getStyle(); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1428451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setStyle(JNIEnv* env, jobject clazz, SkPaint* obj, SkPaint::Style style) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj->setStyle(style); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1468451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getColor(JNIEnv* env, jobject paint) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GraphicsJNI::getNativePaint(env, paint)->getColor(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1518451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getAlpha(JNIEnv* env, jobject paint) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return GraphicsJNI::getNativePaint(env, paint)->getAlpha(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1568451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setColor(JNIEnv* env, jobject paint, jint color) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setColor(color); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1618451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setAlpha(JNIEnv* env, jobject paint, jint a) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setAlpha(a); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1668451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat getStrokeWidth(JNIEnv* env, jobject paint) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getStrokeWidth()); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1718451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setStrokeWidth(JNIEnv* env, jobject paint, jfloat width) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setStrokeWidth(SkFloatToScalar(width)); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1768451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat getStrokeMiter(JNIEnv* env, jobject paint) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getStrokeMiter()); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1818451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setStrokeMiter(JNIEnv* env, jobject paint, jfloat miter) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setStrokeMiter(SkFloatToScalar(miter)); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1868451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getStrokeCap(JNIEnv* env, jobject clazz, SkPaint* obj) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->getStrokeCap(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1908451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setStrokeCap(JNIEnv* env, jobject clazz, SkPaint* obj, SkPaint::Cap cap) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj->setStrokeCap(cap); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1948451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getStrokeJoin(JNIEnv* env, jobject clazz, SkPaint* obj) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->getStrokeJoin(); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1988451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setStrokeJoin(JNIEnv* env, jobject clazz, SkPaint* obj, SkPaint::Join join) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj->setStrokeJoin(join); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2028451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jboolean getFillPath(JNIEnv* env, jobject clazz, SkPaint* obj, SkPath* src, SkPath* dst) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->getFillPath(*src, dst); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2068451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkShader* setShader(JNIEnv* env, jobject clazz, SkPaint* obj, SkShader* shader) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->setShader(shader); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2108451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkColorFilter* setColorFilter(JNIEnv* env, jobject clazz, SkPaint* obj, SkColorFilter* filter) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->setColorFilter(filter); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2148451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkXfermode* setXfermode(JNIEnv* env, jobject clazz, SkPaint* obj, SkXfermode* xfermode) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->setXfermode(xfermode); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2188451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkPathEffect* setPathEffect(JNIEnv* env, jobject clazz, SkPaint* obj, SkPathEffect* effect) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->setPathEffect(effect); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2228451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkMaskFilter* setMaskFilter(JNIEnv* env, jobject clazz, SkPaint* obj, SkMaskFilter* maskfilter) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->setMaskFilter(maskfilter); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2268451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkTypeface* setTypeface(JNIEnv* env, jobject clazz, SkPaint* obj, SkTypeface* typeface) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->setTypeface(typeface); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2308451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SkRasterizer* setRasterizer(JNIEnv* env, jobject clazz, SkPaint* obj, SkRasterizer* rasterizer) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->setRasterizer(rasterizer); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2348451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getTextAlign(JNIEnv* env, jobject clazz, SkPaint* obj) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obj->getTextAlign(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2388451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setTextAlign(JNIEnv* env, jobject clazz, SkPaint* obj, SkPaint::Align align) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj->setTextAlign(align); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2428451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat getTextSize(JNIEnv* env, jobject paint) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getTextSize()); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2478451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setTextSize(JNIEnv* env, jobject paint, jfloat textSize) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setTextSize(SkFloatToScalar(textSize)); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2528451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat getTextScaleX(JNIEnv* env, jobject paint) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getTextScaleX()); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2578451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setTextScaleX(JNIEnv* env, jobject paint, jfloat scaleX) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setTextScaleX(SkFloatToScalar(scaleX)); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2628451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat getTextSkewX(JNIEnv* env, jobject paint) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(GraphicsJNI::getNativePaint(env, paint)->getTextSkewX()); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2678451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setTextSkewX(JNIEnv* env, jobject paint, jfloat skewX) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, paint); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->setTextSkewX(SkFloatToScalar(skewX)); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2728451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat ascent(JNIEnv* env, jobject paint) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::FontMetrics metrics; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void)GraphicsJNI::getNativePaint(env, paint)->getFontMetrics(&metrics); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(metrics.fAscent); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2798451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat descent(JNIEnv* env, jobject paint) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::FontMetrics metrics; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void)GraphicsJNI::getNativePaint(env, paint)->getFontMetrics(&metrics); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(metrics.fDescent); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2868451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat getFontMetrics(JNIEnv* env, jobject paint, jobject metricsObj) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::FontMetrics metrics; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalar spacing = GraphicsJNI::getNativePaint(env, paint)->getFontMetrics(&metrics); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (metricsObj) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(env->IsInstanceOf(metricsObj, gFontMetrics_class)); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(metricsObj, gFontMetrics_fieldID.top, SkScalarToFloat(metrics.fTop)); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(metricsObj, gFontMetrics_fieldID.ascent, SkScalarToFloat(metrics.fAscent)); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(metricsObj, gFontMetrics_fieldID.descent, SkScalarToFloat(metrics.fDescent)); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(metricsObj, gFontMetrics_fieldID.bottom, SkScalarToFloat(metrics.fBottom)); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetFloatField(metricsObj, gFontMetrics_fieldID.leading, SkScalarToFloat(metrics.fLeading)); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkScalarToFloat(spacing); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3028451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jint getFontMetricsInt(JNIEnv* env, jobject paint, jobject metricsObj) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, paint); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::FontMetrics metrics; 3068451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::getNativePaint(env, paint)->getFontMetrics(&metrics); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ascent = SkScalarRound(metrics.fAscent); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int descent = SkScalarRound(metrics.fDescent); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int leading = SkScalarRound(metrics.fLeading); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (metricsObj) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(env->IsInstanceOf(metricsObj, gFontMetricsInt_class)); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(metricsObj, gFontMetricsInt_fieldID.top, SkScalarFloor(metrics.fTop)); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(metricsObj, gFontMetricsInt_fieldID.ascent, ascent); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(metricsObj, gFontMetricsInt_fieldID.descent, descent); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(metricsObj, gFontMetricsInt_fieldID.bottom, SkScalarCeil(metrics.fBottom)); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntField(metricsObj, gFontMetricsInt_fieldID.leading, leading); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return descent - ascent + leading; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat measureText_CII(JNIEnv* env, jobject jpaint, jcharArray text, int index, int count) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jpaint); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, text); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t textLength = env->GetArrayLength(text); 3288451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((index | count) < 0 || (size_t)(index + count) > textLength) { 3308451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes doThrowAIOOBE(env); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3344f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetCharArrayElements(text, NULL); 3364f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio jfloat result = 0; 3374f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#if RTL_USE_HARFBUZZ 3384f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio TextLayout::getTextRunAdvances(paint, textArray, index, count, count, paint->getFlags(), 3394f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio NULL /* dont need all advances */, result); 3404f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#else 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we double count, since measureText wants a byteLength 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalar width = paint->measureText(textArray + index, count << 1); 3434f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio result = SkScalarToFloat(width); 3444f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#endif 3454f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray), JNI_ABORT); 3464f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio return result; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3488451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat measureText_StringII(JNIEnv* env, jobject jpaint, jstring text, int start, int end) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jpaint); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, text); 3528451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3538451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetStringChars(text, NULL); 3558451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = end - start; 3574f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio size_t textLength = env->GetStringLength(text); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((start | count) < 0 || (size_t)count > textLength) { 3598451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes doThrowAIOOBE(env); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3624f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio jfloat width = 0; 3638451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3644f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#if RTL_USE_HARFBUZZ 3654f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio TextLayout::getTextRunAdvances(paint, textArray, 0, count, count, paint->getFlags(), 3664f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio NULL /* dont need all advances */, width); 3674f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#else 3684f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio 3694f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio width = SkScalarToFloat(paint->measureText(textArray + start, count << 1)); 3704f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#endif 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(text, textArray); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return width; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3748451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static jfloat measureText_String(JNIEnv* env, jobject jpaint, jstring text) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jpaint); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, text); 3788451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3798451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetStringChars(text, NULL); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t textLength = env->GetStringLength(text); 3824f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio jfloat width = 0; 3834f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#if RTL_USE_HARFBUZZ 3844f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio TextLayout::getTextRunAdvances(paint, textArray, 0, textLength, textLength, paint->getFlags(), 3854f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio NULL /* dont need all advances */, width); 3864f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#else 3874f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio width = SkScalarToFloat(paint->measureText(textArray, textLength << 1)); 3884f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#endif 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(text, textArray); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return width; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3928451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int dotextwidths(JNIEnv* env, SkPaint* paint, const jchar text[], int count, jfloatArray widths) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaFloatArray autoWidths(env, widths, count); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* widthsArray = autoWidths.ptr(); 3964f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#if RTL_USE_HARFBUZZ 3974f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio jfloat totalAdvance; 3984f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio 3994f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio TextLayout::getTextRunAdvances(paint, text, 0, count, count, paint->getFlags(), 4004f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio widthsArray, totalAdvance); 4014f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#else 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalar* scalarArray = (SkScalar*)widthsArray; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4048451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes count = paint->getTextWidths(text, count << 1, scalarArray); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project widthsArray[i] = SkScalarToFloat(scalarArray[i]); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4084f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#endif 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4118451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int getTextWidths___CII_F(JNIEnv* env, jobject clazz, SkPaint* paint, jcharArray text, int index, int count, jfloatArray widths) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetCharArrayElements(text, NULL); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = dotextwidths(env, paint, textArray + index, count, widths); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray), 4168451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes JNI_ABORT); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4198451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 4209f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio static int getTextWidths__StringII_F(JNIEnv* env, jobject clazz, SkPaint* paint, jstring text, 4219f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio int start, int end, jfloatArray widths) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetStringChars(text, NULL); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = dotextwidths(env, paint, textArray + start, end - start, widths); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(text, textArray); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4270c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 4289f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio static int doTextGlyphs(JNIEnv* env, SkPaint* paint, const jchar* text, jint start, jint count, 4299f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio jint contextCount, jint flags, jcharArray glyphs) { 4309f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio jchar* glyphsArray = env->GetCharArrayElements(glyphs, NULL); 4319f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio HB_ShaperItem shaperItem; 4329f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio HB_FontRec font; 4339f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio FontData fontData; 4341de9e7a9dffb4391a446000f748e4c017d948f6bFabrice Di Meglio TextLayoutCacheValue::shapeWithHarfbuzz(&shaperItem, &font, &fontData, paint, text, 4359f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio start, count, contextCount, flags); 4369f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio 4379f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio int glyphCount = shaperItem.num_glyphs; 4389f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio for (int i = 0; i < glyphCount; i++) { 4399f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio glyphsArray[i] = (jchar) shaperItem.glyphs[i]; 4409f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio } 441eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio env->ReleaseCharArrayElements(glyphs, glyphsArray, JNI_ABORT); 4429f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio return glyphCount; 4439f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio } 4449f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio 4459f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio static int getTextGlyphs__StringIIIII_C(JNIEnv* env, jobject clazz, SkPaint* paint, 4469f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio jstring text, jint start, jint end, jint contextStart, jint contextEnd, jint flags, 4479f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio jcharArray glyphs) { 4489f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio const jchar* textArray = env->GetStringChars(text, NULL); 4499f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio int count = doTextGlyphs(env, paint, textArray + contextStart, start - contextStart, 4509f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio end - start, contextEnd - contextStart, flags, glyphs); 4519f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio env->ReleaseStringChars(text, textArray); 4529f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio return count; 4539f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio } 4549f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio 455f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt static jfloat doTextRunAdvances(JNIEnv *env, SkPaint *paint, const jchar *text, 456f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt jint start, jint count, jint contextCount, jint flags, 4570c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jfloatArray advances, jint advancesIndex) { 4580c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jfloat advancesArray[count]; 459f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt jfloat totalAdvance; 4600c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 461f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt TextLayout::getTextRunAdvances(paint, text, start, count, contextCount, flags, 462f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt advancesArray, totalAdvance); 4630c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 4640c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (advances != NULL) { 4650c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt env->SetFloatArrayRegion(advances, advancesIndex, count, advancesArray); 4660c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 4670c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return totalAdvance; 4680c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 4690c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 470eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio static jfloat doTextRunAdvancesICU(JNIEnv *env, SkPaint *paint, const jchar *text, 471eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio jint start, jint count, jint contextCount, jint flags, 472eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio jfloatArray advances, jint advancesIndex) { 473eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio jfloat advancesArray[count]; 474eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio jfloat totalAdvance; 475eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 476eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio TextLayout::getTextRunAdvancesICU(paint, text, start, count, contextCount, flags, 477eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio advancesArray, totalAdvance); 478eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 479eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio if (advances != NULL) { 480eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio env->SetFloatArrayRegion(advances, advancesIndex, count, advancesArray); 481eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 482eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio return totalAdvance; 483eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 484eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 4850a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio static float getTextRunAdvances___CIIIII_FII(JNIEnv* env, jobject clazz, SkPaint* paint, 4860c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jcharArray text, jint index, jint count, jint contextIndex, jint contextCount, 4870a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio jint flags, jfloatArray advances, jint advancesIndex, jint reserved) { 4880c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jchar* textArray = env->GetCharArrayElements(text, NULL); 4890a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio jfloat result = (reserved == 0) ? 4900a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio doTextRunAdvances(env, paint, textArray + contextIndex, index - contextIndex, 4910a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio count, contextCount, flags, advances, advancesIndex) : 4920a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio doTextRunAdvancesICU(env, paint, textArray + contextIndex, index - contextIndex, 4930a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio count, contextCount, flags, advances, advancesIndex); 4940c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 4950c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return result; 4960c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 4970c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 4980a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio static float getTextRunAdvances__StringIIIII_FII(JNIEnv* env, jobject clazz, SkPaint* paint, 4990c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jstring text, jint start, jint end, jint contextStart, jint contextEnd, jint flags, 5000a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio jfloatArray advances, jint advancesIndex, jint reserved) { 5010c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt const jchar* textArray = env->GetStringChars(text, NULL); 5020a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio jfloat result = (reserved == 0) ? 5030a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio doTextRunAdvances(env, paint, textArray + contextStart, start - contextStart, 5040a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio end - start, contextEnd - contextStart, flags, advances, advancesIndex) : 5050a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio doTextRunAdvancesICU(env, paint, textArray + contextStart, start - contextStart, 5060a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio end - start, contextEnd - contextStart, flags, advances, advancesIndex); 507eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio env->ReleaseStringChars(text, textArray); 508eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio return result; 509eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio } 510eee49c699c035ffba188417489f40d34f587d65cFabrice Di Meglio 5110c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt static jint doTextRunCursor(JNIEnv *env, SkPaint* paint, const jchar *text, jint start, 5120c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jint count, jint flags, jint offset, jint opt) { 5134f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#if RTL_USE_HARFBUZZ 5144f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio jfloat scalarArray[count]; 5154f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio jfloat totalAdvance; 5164f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio 5174f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio TextLayout::getTextRunAdvances(paint, text, start, count, count, flags, 5184f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio scalarArray, totalAdvance); 5194f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#else 5200c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt SkScalar scalarArray[count]; 5210c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jchar buffer[count]; 5220c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 5230c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // this is where we'd call harfbuzz 5240c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // for now we just use ushape.c and widths returned from skia 5250c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 5260c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt int widths; 5270c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (flags & 0x1) { // rtl, call arabic shaping in case 5280c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt UErrorCode status = U_ZERO_ERROR; 5290c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // Use fixed length since we need to keep start and count valid 5300c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt u_shapeArabic(text + start, count, buffer, count, 5310c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt U_SHAPE_LENGTH_FIXED_SPACES_NEAR | U_SHAPE_TEXT_DIRECTION_LOGICAL | 5320c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt U_SHAPE_LETTERS_SHAPE | U_SHAPE_X_LAMALEF_SUB_ALTERNATE, &status); 5330c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // we shouldn't fail unless there's an out of memory condition, 5340c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // in which case we're hosed anyway 5350c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt for (int i = 0; i < count; ++i) { 5360c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (buffer[i] == 0xffff) { 5370c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt buffer[i] = 0x200b; // zero-width-space for skia 5380c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5390c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5400c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt widths = paint->getTextWidths(buffer, count << 1, scalarArray); 5410c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } else { 5420c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt widths = paint->getTextWidths(text + start, count << 1, scalarArray); 5430c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5440c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 5450c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (widths < count) { 5460c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // Skia operates on code points, not code units, so surrogate pairs return only one 5470c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // value. Expand the result so we have one value per UTF-16 code unit. 5480c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 5490c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // Note, skia's getTextWidth gets confused if it encounters a surrogate pair, 5500c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // leaving the remaining widths zero. Not nice. 5510c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt const jchar *chars = text + start; 5520c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt for (int i = count, p = widths - 1; --i > p;) { 5530c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (chars[i] >= 0xdc00 && chars[i] < 0xe000 && 5540c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt chars[i-1] >= 0xd800 && chars[i-1] < 0xdc00) { 5550c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt scalarArray[i] = 0; 5560c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } else { 5570c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt scalarArray[i] = scalarArray[--p]; 5580c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5590c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5600c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5614f810c8535055bd9a8d89a7d1ba0a7c712a8843dFabrice Di Meglio#endif 5620c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jint pos = offset - start; 5630c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt switch (opt) { 5640c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt case AFTER: 5650c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (pos < count) { 5660c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt pos += 1; 5670c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5680c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // fall through 5690c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt case AT_OR_AFTER: 5700c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt while (pos < count && scalarArray[pos] == 0) { 5710c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt ++pos; 5720c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5730c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt break; 5740c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt case BEFORE: 5750c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (pos > 0) { 5760c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt --pos; 5770c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5780c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt // fall through 5790c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt case AT_OR_BEFORE: 5800c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt while (pos > 0 && scalarArray[pos] == 0) { 5810c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt --pos; 5820c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5830c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt break; 5840c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt case AT: 5850c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt default: 5860c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (scalarArray[pos] == 0) { 5870c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt pos = -1; 5880c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5890c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt break; 5900c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5910c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 5920c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt if (pos != -1) { 5930c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt pos += start; 5940c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5950c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 5960c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return pos; 5970c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 5980c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 5990c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt static jint getTextRunCursor___C(JNIEnv* env, jobject clazz, SkPaint* paint, jcharArray text, 6000c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jint contextStart, jint contextCount, jint flags, jint offset, jint cursorOpt) { 6010c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jchar* textArray = env->GetCharArrayElements(text, NULL); 6020c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jint result = doTextRunCursor(env, paint, textArray, contextStart, contextCount, flags, 6030c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt offset, cursorOpt); 6040c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt env->ReleaseCharArrayElements(text, textArray, JNI_ABORT); 6050c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return result; 6060c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 6070c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 6080c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt static jint getTextRunCursor__String(JNIEnv* env, jobject clazz, SkPaint* paint, jstring text, 6090c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jint contextStart, jint contextEnd, jint flags, jint offset, jint cursorOpt) { 6100c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt const jchar* textArray = env->GetStringChars(text, NULL); 6110c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt jint result = doTextRunCursor(env, paint, textArray, contextStart, 6120c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt contextEnd - contextStart, flags, offset, cursorOpt); 6130c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt env->ReleaseStringChars(text, textArray); 6140c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt return result; 6150c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt } 6160c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt 617f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt static void getTextPath(JNIEnv* env, SkPaint* paint, const jchar* text, jint count, 618f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt jint bidiFlags, jfloat x, jfloat y, SkPath *path) { 619f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt TextLayout::getTextPath(paint, text, count, bidiFlags, x, y, path); 620f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt } 621f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt 622f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt static void getTextPath___C(JNIEnv* env, jobject clazz, SkPaint* paint, jint bidiFlags, 623f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt jcharArray text, int index, int count, jfloat x, jfloat y, SkPath* path) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetCharArrayElements(text, NULL); 625f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt getTextPath(env, paint, textArray + index, count, bidiFlags, x, y, path); 626f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray), JNI_ABORT); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 628f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt 629f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt static void getTextPath__String(JNIEnv* env, jobject clazz, SkPaint* paint, jint bidiFlags, 630f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt jstring text, int start, int end, jfloat x, jfloat y, SkPath* path) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetStringChars(text, NULL); 632f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt getTextPath(env, paint, textArray + start, end - start, bidiFlags, x, y, path); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(text, textArray); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 635f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void setShadowLayer(JNIEnv* env, jobject jpaint, jfloat radius, 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat dx, jfloat dy, int color) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_VOID(env, jpaint); 6398451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 6408451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (radius <= 0) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paint->setLooper(NULL); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paint->setLooper(new SkBlurDrawLooper(SkFloatToScalar(radius), 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkFloatToScalar(dx), 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkFloatToScalar(dy), 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (SkColor)color))->unref(); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int breakText(JNIEnv* env, const SkPaint& paint, const jchar text[], 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count, float maxWidth, jfloatArray jmeasured, 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::TextBufferDirection tbd) { 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(paint.getTextEncoding() == SkPaint::kUTF16_TextEncoding); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkScalar measured; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t bytes = paint.breakText(text, count << 1, 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkFloatToScalar(maxWidth), &measured, tbd); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT((bytes & 1) == 0); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (jmeasured && env->GetArrayLength(jmeasured) > 0) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaFloatArray autoMeasured(env, jmeasured, 1); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfloat* array = autoMeasured.ptr(); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array[0] = SkScalarToFloat(measured); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bytes >> 1; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int breakTextC(JNIEnv* env, jobject jpaint, jcharArray jtext, 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index, int count, float maxWidth, jfloatArray jmeasuredWidth) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jpaint); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jtext); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::TextBufferDirection tbd; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count < 0) { 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tbd = SkPaint::kBackward_TextBufferDirection; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = -count; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tbd = SkPaint::kForward_TextBufferDirection; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((index < 0) || (index + count > env->GetArrayLength(jtext))) { 6858451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes doThrowAIOOBE(env); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint); 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* text = env->GetCharArrayElements(jtext, NULL); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = breakText(env, *paint, text + index, count, maxWidth, 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmeasuredWidth, tbd); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseCharArrayElements(jtext, const_cast<jchar*>(text), 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNI_ABORT); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int breakTextS(JNIEnv* env, jobject jpaint, jstring jtext, 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool forwards, float maxWidth, jfloatArray jmeasuredWidth) { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jpaint); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jtext); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::TextBufferDirection tbd = forwards ? 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::kForward_TextBufferDirection : 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint::kBackward_TextBufferDirection; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkPaint* paint = GraphicsJNI::getNativePaint(env, jpaint); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = env->GetStringLength(jtext); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* text = env->GetStringChars(jtext, NULL); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = breakText(env, *paint, text, count, maxWidth, 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmeasuredWidth, tbd); 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(jtext, text); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void doTextBounds(JNIEnv* env, const jchar* text, int count, 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject bounds, const SkPaint& paint) 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkRect r; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkIRect ir; 7218451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paint.measureText(text, count << 1, &r); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.roundOut(&ir); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GraphicsJNI::irect_to_jrect(ir, env, bounds); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void getStringBounds(JNIEnv* env, jobject, const SkPaint* paint, 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring text, int start, int end, jobject bounds) 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetStringChars(text, NULL); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doTextBounds(env, textArray + start, end - start, bounds, *paint); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(text, textArray); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7348451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void getCharArrayBounds(JNIEnv* env, jobject, const SkPaint* paint, 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jcharArray text, int index, int count, jobject bounds) 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jchar* textArray = env->GetCharArrayElements(text, NULL); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doTextBounds(env, textArray + index, count, bounds, *paint); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseCharArrayElements(text, const_cast<jchar*>(textArray), 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNI_ABORT); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7438451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod methods[] = { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"finalizer", "(I)V", (void*) SkPaintGlue::finalizer}, 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_init","()I", (void*) SkPaintGlue::init}, 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_initWithPaint","(I)I", (void*) SkPaintGlue::intiWithPaint}, 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_reset","(I)V", (void*) SkPaintGlue::reset}, 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_set","(II)V", (void*) SkPaintGlue::assign}, 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getFlags","()I", (void*) SkPaintGlue::getFlags}, 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setFlags","(I)V", (void*) SkPaintGlue::setFlags}, 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setAntiAlias","(Z)V", (void*) SkPaintGlue::setAntiAlias}, 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setSubpixelText","(Z)V", (void*) SkPaintGlue::setSubpixelText}, 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setLinearText","(Z)V", (void*) SkPaintGlue::setLinearText}, 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setUnderlineText","(Z)V", (void*) SkPaintGlue::setUnderlineText}, 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setStrikeThruText","(Z)V", (void*) SkPaintGlue::setStrikeThruText}, 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setFakeBoldText","(Z)V", (void*) SkPaintGlue::setFakeBoldText}, 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setFilterBitmap","(Z)V", (void*) SkPaintGlue::setFilterBitmap}, 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setDither","(Z)V", (void*) SkPaintGlue::setDither}, 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getStyle","(I)I", (void*) SkPaintGlue::getStyle}, 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setStyle","(II)V", (void*) SkPaintGlue::setStyle}, 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getColor","()I", (void*) SkPaintGlue::getColor}, 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setColor","(I)V", (void*) SkPaintGlue::setColor}, 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getAlpha","()I", (void*) SkPaintGlue::getAlpha}, 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setAlpha","(I)V", (void*) SkPaintGlue::setAlpha}, 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getStrokeWidth","()F", (void*) SkPaintGlue::getStrokeWidth}, 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setStrokeWidth","(F)V", (void*) SkPaintGlue::setStrokeWidth}, 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getStrokeMiter","()F", (void*) SkPaintGlue::getStrokeMiter}, 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setStrokeMiter","(F)V", (void*) SkPaintGlue::setStrokeMiter}, 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getStrokeCap","(I)I", (void*) SkPaintGlue::getStrokeCap}, 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setStrokeCap","(II)V", (void*) SkPaintGlue::setStrokeCap}, 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getStrokeJoin","(I)I", (void*) SkPaintGlue::getStrokeJoin}, 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setStrokeJoin","(II)V", (void*) SkPaintGlue::setStrokeJoin}, 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getFillPath","(III)Z", (void*) SkPaintGlue::getFillPath}, 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setShader","(II)I", (void*) SkPaintGlue::setShader}, 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setColorFilter","(II)I", (void*) SkPaintGlue::setColorFilter}, 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setXfermode","(II)I", (void*) SkPaintGlue::setXfermode}, 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setPathEffect","(II)I", (void*) SkPaintGlue::setPathEffect}, 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setMaskFilter","(II)I", (void*) SkPaintGlue::setMaskFilter}, 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setTypeface","(II)I", (void*) SkPaintGlue::setTypeface}, 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setRasterizer","(II)I", (void*) SkPaintGlue::setRasterizer}, 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getTextAlign","(I)I", (void*) SkPaintGlue::getTextAlign}, 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setTextAlign","(II)V", (void*) SkPaintGlue::setTextAlign}, 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getTextSize","()F", (void*) SkPaintGlue::getTextSize}, 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setTextSize","(F)V", (void*) SkPaintGlue::setTextSize}, 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getTextScaleX","()F", (void*) SkPaintGlue::getTextScaleX}, 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setTextScaleX","(F)V", (void*) SkPaintGlue::setTextScaleX}, 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getTextSkewX","()F", (void*) SkPaintGlue::getTextSkewX}, 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setTextSkewX","(F)V", (void*) SkPaintGlue::setTextSkewX}, 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"ascent","()F", (void*) SkPaintGlue::ascent}, 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"descent","()F", (void*) SkPaintGlue::descent}, 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getFontMetrics", "(Landroid/graphics/Paint$FontMetrics;)F", (void*)SkPaintGlue::getFontMetrics}, 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getFontMetricsInt", "(Landroid/graphics/Paint$FontMetricsInt;)I", (void*)SkPaintGlue::getFontMetricsInt}, 796afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn {"native_measureText","([CII)F", (void*) SkPaintGlue::measureText_CII}, 797afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn {"native_measureText","(Ljava/lang/String;)F", (void*) SkPaintGlue::measureText_String}, 798afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn {"native_measureText","(Ljava/lang/String;II)F", (void*) SkPaintGlue::measureText_StringII}, 799afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn {"native_breakText","([CIIF[F)I", (void*) SkPaintGlue::breakTextC}, 800afa78967b8553443aa32579d78970a076d7581f6Dianne Hackborn {"native_breakText","(Ljava/lang/String;ZF[F)I", (void*) SkPaintGlue::breakTextS}, 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getTextWidths","(I[CII[F)I", (void*) SkPaintGlue::getTextWidths___CII_F}, 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_getTextWidths","(ILjava/lang/String;II[F)I", (void*) SkPaintGlue::getTextWidths__StringII_F}, 8030a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio {"native_getTextRunAdvances","(I[CIIIII[FII)F", 8040a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio (void*) SkPaintGlue::getTextRunAdvances___CIIIII_FII}, 8050a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio {"native_getTextRunAdvances","(ILjava/lang/String;IIIII[FII)F", 8060a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio (void*) SkPaintGlue::getTextRunAdvances__StringIIIII_FII}, 8070a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio 8080a1413e4bf9dcda2a8abb2287e43f612a7fb2453Fabrice Di Meglio 8099f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio {"native_getTextGlyphs","(ILjava/lang/String;IIIII[C)I", 8109f82b580d744ce4baf057b061994394dcf239eedFabrice Di Meglio (void*) SkPaintGlue::getTextGlyphs__StringIIIII_C}, 8110c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt {"native_getTextRunCursor", "(I[CIIIII)I", (void*) SkPaintGlue::getTextRunCursor___C}, 8120c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt {"native_getTextRunCursor", "(ILjava/lang/String;IIIII)I", 8130c702b88c5d0d4380930b920f5be6e66dd95a0d8Doug Felt (void*) SkPaintGlue::getTextRunCursor__String}, 814f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt {"native_getTextPath","(II[CIIFFI)V", (void*) SkPaintGlue::getTextPath___C}, 815f7cb1f75fdaedf996cab7c4690b080adc7bc5b97Doug Felt {"native_getTextPath","(IILjava/lang/String;IIFFI)V", (void*) SkPaintGlue::getTextPath__String}, 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetStringBounds", "(ILjava/lang/String;IILandroid/graphics/Rect;)V", 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) SkPaintGlue::getStringBounds }, 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"nativeGetCharArrayBounds", "(I[CIILandroid/graphics/Rect;)V", 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) SkPaintGlue::getCharArrayBounds }, 8201e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy {"nSetShadowLayer", "(FFFI)V", (void*)SkPaintGlue::setShadowLayer} 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jfieldID req_fieldID(jfieldID id) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(id); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return id; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Paint(JNIEnv* env) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetrics_class = env->FindClass("android/graphics/Paint$FontMetrics"); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(gFontMetrics_class); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetrics_class = (jclass)env->NewGlobalRef(gFontMetrics_class); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetrics_fieldID.top = req_fieldID(env->GetFieldID(gFontMetrics_class, "top", "F")); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetrics_fieldID.ascent = req_fieldID(env->GetFieldID(gFontMetrics_class, "ascent", "F")); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetrics_fieldID.descent = req_fieldID(env->GetFieldID(gFontMetrics_class, "descent", "F")); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetrics_fieldID.bottom = req_fieldID(env->GetFieldID(gFontMetrics_class, "bottom", "F")); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetrics_fieldID.leading = req_fieldID(env->GetFieldID(gFontMetrics_class, "leading", "F")); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetricsInt_class = env->FindClass("android/graphics/Paint$FontMetricsInt"); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkASSERT(gFontMetricsInt_class); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetricsInt_class = (jclass)env->NewGlobalRef(gFontMetricsInt_class); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetricsInt_fieldID.top = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "top", "I")); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetricsInt_fieldID.ascent = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "ascent", "I")); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetricsInt_fieldID.descent = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "descent", "I")); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetricsInt_fieldID.bottom = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "bottom", "I")); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gFontMetricsInt_fieldID.leading = req_fieldID(env->GetFieldID(gFontMetricsInt_class, "leading", "I")); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result = AndroidRuntime::registerNativeMethods(env, "android/graphics/Paint", methods, 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sizeof(methods) / sizeof(methods[0])); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 855