blob: a349a7f9fde99a400eb6f04e56ebd76bb462ea2e [file] [log] [blame]
Raph Leviena0336302013-05-22 16:16:59 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080017#include "jni.h"
18#include <android_runtime/AndroidRuntime.h>
19
20#include "GraphicsJNI.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021#include "SkStream.h"
22#include "SkTypeface.h"
Raph Leviena0336302013-05-22 16:16:59 -070023#include "TypefaceImpl.h"
Mathias Agopianb13b9bd2012-02-17 18:27:36 -080024#include <android_runtime/android_util_AssetManager.h>
25#include <androidfw/AssetManager.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080026
27using namespace android;
28
29class AutoJavaStringToUTF8 {
30public:
31 AutoJavaStringToUTF8(JNIEnv* env, jstring str) : fEnv(env), fJStr(str)
32 {
33 fCStr = env->GetStringUTFChars(str, NULL);
34 }
35 ~AutoJavaStringToUTF8()
36 {
37 fEnv->ReleaseStringUTFChars(fJStr, fCStr);
38 }
39 const char* c_str() const { return fCStr; }
40
41private:
42 JNIEnv* fEnv;
43 jstring fJStr;
44 const char* fCStr;
45};
46
Ashok Bhat36bef0b2014-01-20 20:08:01 +000047static jlong Typeface_create(JNIEnv* env, jobject, jstring name,
48 jint styleHandle) {
49 SkTypeface::Style style = static_cast<SkTypeface::Style>(styleHandle);
Raph Leviena0336302013-05-22 16:16:59 -070050 TypefaceImpl* face = NULL;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080051
Derek Sollenberger89ec8292013-09-18 15:07:46 -040052 if (NULL != name) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080053 AutoJavaStringToUTF8 str(env, name);
Raph Leviena0336302013-05-22 16:16:59 -070054 face = TypefaceImpl_createFromName(str.c_str(), style);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080055 }
Derek Sollenberger89ec8292013-09-18 15:07:46 -040056
57 // return the default font at the best style if no exact match exists
58 if (NULL == face) {
Raph Leviena0336302013-05-22 16:16:59 -070059 face = TypefaceImpl_createFromName(NULL, style);
Derek Sollenberger89ec8292013-09-18 15:07:46 -040060 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +000061 return reinterpret_cast<jlong>(face);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080062}
63
Ashok Bhat36bef0b2014-01-20 20:08:01 +000064static jlong Typeface_createFromTypeface(JNIEnv* env, jobject, jlong familyHandle, jint style) {
65 SkTypeface* family = reinterpret_cast<SkTypeface*>(familyHandle);
Raph Leviena0336302013-05-22 16:16:59 -070066 TypefaceImpl* face = TypefaceImpl_createFromTypeface(family, (SkTypeface::Style)style);
Raph Levien4f0064f2013-11-06 11:12:11 -080067 // Try to find the closest matching font, using the standard heuristic
68 if (NULL == face) {
Raph Leviena0336302013-05-22 16:16:59 -070069 face = TypefaceImpl_createFromTypeface(family, (SkTypeface::Style)(style ^ SkTypeface::kItalic));
Raph Levien4f0064f2013-11-06 11:12:11 -080070 }
71 for (int i = 0; NULL == face && i < 4; i++) {
Raph Leviena0336302013-05-22 16:16:59 -070072 face = TypefaceImpl_createFromTypeface(family, (SkTypeface::Style)i);
Raph Levien4f0064f2013-11-06 11:12:11 -080073 }
Derek Sollenbergerfe8e21f2013-09-23 08:32:16 -040074 if (NULL == face) {
Raph Leviena0336302013-05-22 16:16:59 -070075 face = TypefaceImpl_createFromName(NULL, (SkTypeface::Style)style);
Derek Sollenbergerfe8e21f2013-09-23 08:32:16 -040076 }
Ashok Bhat36bef0b2014-01-20 20:08:01 +000077 return reinterpret_cast<jlong>(face);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080078}
Elliott Hughes4cb17532011-04-12 16:10:26 -070079
Ashok Bhat36bef0b2014-01-20 20:08:01 +000080static void Typeface_unref(JNIEnv* env, jobject obj, jlong faceHandle) {
81 TypefaceImpl* face = reinterpret_cast<TypefaceImpl*>(faceHandle);
Raph Leviena0336302013-05-22 16:16:59 -070082 TypefaceImpl_unref(face);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080083}
84
Ashok Bhat36bef0b2014-01-20 20:08:01 +000085static jint Typeface_getStyle(JNIEnv* env, jobject obj, jlong faceHandle) {
86 TypefaceImpl* face = reinterpret_cast<TypefaceImpl*>(faceHandle);
Raph Leviena0336302013-05-22 16:16:59 -070087 return TypefaceImpl_getStyle(face);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088}
89
Ashok Bhat36bef0b2014-01-20 20:08:01 +000090static jlong Typeface_createFromAsset(JNIEnv* env, jobject,
91 jobject jassetMgr,
92 jstring jpath) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080093 NPE_CHECK_RETURN_ZERO(env, jassetMgr);
94 NPE_CHECK_RETURN_ZERO(env, jpath);
Elliott Hughes4cb17532011-04-12 16:10:26 -070095
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080096 AssetManager* mgr = assetManagerForJavaObject(env, jassetMgr);
97 if (NULL == mgr) {
98 return NULL;
99 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700100
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000101 AutoJavaStringToUTF8 str(env, jpath);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800102 Asset* asset = mgr->open(str.c_str(), Asset::ACCESS_BUFFER);
103 if (NULL == asset) {
104 return NULL;
105 }
Elliott Hughes4cb17532011-04-12 16:10:26 -0700106
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000107 return reinterpret_cast<jlong>(TypefaceImpl_createFromAsset(asset));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800108}
109
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000110static jlong Typeface_createFromFile(JNIEnv* env, jobject, jstring jpath) {
Romain Guya87a1322009-05-12 13:22:18 -0700111 NPE_CHECK_RETURN_ZERO(env, jpath);
112
113 AutoJavaStringToUTF8 str(env, jpath);
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000114 return reinterpret_cast<jlong>(TypefaceImpl_createFromFile(str.c_str()));
Romain Guya87a1322009-05-12 13:22:18 -0700115}
116
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800117///////////////////////////////////////////////////////////////////////////////
118
119static JNINativeMethod gTypefaceMethods[] = {
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000120 { "nativeCreate", "(Ljava/lang/String;I)J", (void*)Typeface_create },
121 { "nativeCreateFromTypeface", "(JI)J", (void*)Typeface_createFromTypeface },
122 { "nativeUnref", "(J)V", (void*)Typeface_unref },
123 { "nativeGetStyle", "(J)I", (void*)Typeface_getStyle },
124 { "nativeCreateFromAsset", "(Landroid/content/res/AssetManager;Ljava/lang/String;)J",
Romain Guya87a1322009-05-12 13:22:18 -0700125 (void*)Typeface_createFromAsset },
Ashok Bhat36bef0b2014-01-20 20:08:01 +0000126 { "nativeCreateFromFile", "(Ljava/lang/String;)J",
Mike Reeddbade9d2009-08-25 13:20:19 -0400127 (void*)Typeface_createFromFile },
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800128};
129
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800130int register_android_graphics_Typeface(JNIEnv* env)
131{
132 return android::AndroidRuntime::registerNativeMethods(env,
133 "android/graphics/Typeface",
134 gTypefaceMethods,
135 SK_ARRAY_COUNT(gTypefaceMethods));
136}