19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h" 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/android_util_AssetManager.h> 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkStream.h" 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkTypeface.h" 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/AssetManager.h> 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoJavaStringToUTF8 { 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str) 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fCStr = env->GetStringUTFChars(str, NULL); 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AutoJavaStringToUTF8() 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fEnv->ReleaseStringUTFChars(fJStr, fCStr); 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* c_str() const { return fCStr; } 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* fEnv; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring fJStr; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* fCStr; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic SkTypeface* Typeface_create(JNIEnv* env, jobject, jstring name, 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkTypeface::Style style) { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkTypeface* face; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == name) { 354df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project face = SkTypeface::CreateFromName(NULL, (SkTypeface::Style)style); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaStringToUTF8 str(env, name); 394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project face = SkTypeface::CreateFromName(str.c_str(), style); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return face; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic SkTypeface* Typeface_createFromTypeface(JNIEnv* env, jobject, SkTypeface* family, int style) { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkTypeface::CreateFromTypeface(family, (SkTypeface::Style)style); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void Typeface_unref(JNIEnv* env, jobject obj, SkTypeface* face) { 4931a69fdbe1edd8d686043e8ca7d278289f65808eMike Reed SkSafeUnref(face); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int Typeface_getStyle(JNIEnv* env, jobject obj, SkTypeface* face) { 534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return face->style(); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AssetStream : public SkStream { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetStream(Asset* asset, bool hasMemoryBase) : fAsset(asset) 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fMemoryBase = hasMemoryBase ? fAsset->getBuffer(false) : NULL; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AssetStream() 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete fAsset; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual const void* getMemoryBase() 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fMemoryBase; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool rewind() 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project off_t pos = fAsset->seek(0, SEEK_SET); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pos != (off_t)-1; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual size_t read(void* buffer, size_t size) 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t amount; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == size) // caller is asking us for our total length 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fAsset->getLength(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // asset->seek returns new total offset 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we want to return amount that was skipped 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project off_t oldOffset = fAsset->seek(0, SEEK_CUR); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == oldOffset) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project off_t newOffset = fAsset->seek(size, SEEK_CUR); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (-1 == newOffset) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project amount = newOffset - oldOffset; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project amount = fAsset->read(buffer, size); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amount < 0) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project amount = 0; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return amount; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* fAsset; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const void* fMemoryBase; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic SkTypeface* Typeface_createFromAsset(JNIEnv* env, jobject, 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject jassetMgr, 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring jpath) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jassetMgr); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NPE_CHECK_RETURN_ZERO(env, jpath); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* mgr = assetManagerForJavaObject(env, jassetMgr); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == mgr) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoJavaStringToUTF8 str(env, jpath); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == asset) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SkTypeface::CreateFromStream(new AssetStream(asset, true)); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 136a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guystatic SkTypeface* Typeface_createFromFile(JNIEnv* env, jobject, jstring jpath) { 137a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy NPE_CHECK_RETURN_ZERO(env, jpath); 138a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy 139a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy AutoJavaStringToUTF8 str(env, jpath); 140a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy 141a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy return SkTypeface::CreateFromFile(str.c_str()); 142a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy} 143a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy 144dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed#define MIN_GAMMA (0.1f) 145dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed#define MAX_GAMMA (10.0f) 146dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reedstatic float pinGamma(float gamma) { 147dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed if (gamma < MIN_GAMMA) { 148dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed gamma = MIN_GAMMA; 149dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed } else if (gamma > MAX_GAMMA) { 150dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed gamma = MAX_GAMMA; 151dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed } 152dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed return gamma; 153dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed} 154dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed 155dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reedextern void skia_set_text_gamma(float, float); 156dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed 157dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reedstatic void Typeface_setGammaForText(JNIEnv* env, jobject, jfloat blackGamma, 158dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed jfloat whiteGamma) { 159dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed // Comment this out for release builds. This is only used during development 160dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed skia_set_text_gamma(pinGamma(blackGamma), pinGamma(whiteGamma)); 161dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed} 162dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gTypefaceMethods[] = { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeCreate", "(Ljava/lang/String;I)I", (void*)Typeface_create }, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeCreateFromTypeface", "(II)I", (void*)Typeface_createFromTypeface }, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeUnref", "(I)V", (void*)Typeface_unref }, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "nativeGetStyle", "(I)I", (void*)Typeface_getStyle }, 170a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy { "nativeCreateFromAsset", "(Landroid/content/res/AssetManager;Ljava/lang/String;)I", 171a87a132ebf1c2dd733cf52feff6e44525257c961Romain Guy (void*)Typeface_createFromAsset }, 1722bb3ea162a58c0f1dddccdbe68b64e02456f11f9Romain Guy { "nativeCreateFromFile", "(Ljava/lang/String;)I", 173dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed (void*)Typeface_createFromFile }, 174dbade9d6a075b1d5b8ebe10ee8961a5de296c93bMike Reed { "setGammaForText", "(FF)V", (void*)Typeface_setGammaForText }, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Typeface(JNIEnv* env); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Typeface(JNIEnv* env) 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return android::AndroidRuntime::registerNativeMethods(env, 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/graphics/Typeface", 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypefaceMethods, 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SK_ARRAY_COUNT(gTypefaceMethods)); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 185