Picture.cpp revision b59508fce51b23f0201f4dcba7e4f18bab4f9d1a
1/*
2 * Copyright (C) 2008 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
17#include "jni.h"
18#include "GraphicsJNI.h"
19#include <android_runtime/AndroidRuntime.h>
20#include "AndroidPicture.h"
21
22#include "SkCanvas.h"
23#include "SkStream.h"
24#include "SkTemplates.h"
25#include "CreateJavaOutputStreamAdaptor.h"
26
27namespace android {
28
29class SkPictureGlue {
30public:
31    static jlong newPicture(JNIEnv* env, jobject, jlong srcHandle) {
32        const AndroidPicture* src = reinterpret_cast<AndroidPicture*>(srcHandle);
33        return reinterpret_cast<jlong>(new AndroidPicture(src));
34    }
35
36    static jlong deserialize(JNIEnv* env, jobject, jobject jstream,
37                             jbyteArray jstorage) {
38        AndroidPicture* picture = NULL;
39        SkStream* strm = CreateJavaInputStreamAdaptor(env, jstream, jstorage);
40        if (strm) {
41            picture = AndroidPicture::CreateFromStream(strm);
42            delete strm;
43        }
44        return reinterpret_cast<jlong>(picture);
45    }
46
47    static void killPicture(JNIEnv* env, jobject, jlong pictureHandle) {
48        AndroidPicture* picture = reinterpret_cast<AndroidPicture*>(pictureHandle);
49        SkASSERT(picture);
50        delete picture;
51    }
52
53    static void draw(JNIEnv* env, jobject, jlong canvasHandle,
54                            jlong pictureHandle) {
55        SkCanvas* canvas = GraphicsJNI::getNativeCanvas(canvasHandle);
56        AndroidPicture* picture = reinterpret_cast<AndroidPicture*>(pictureHandle);
57        SkASSERT(canvas);
58        SkASSERT(picture);
59        picture->draw(canvas);
60    }
61
62    static jboolean serialize(JNIEnv* env, jobject, jlong pictureHandle,
63                              jobject jstream, jbyteArray jstorage) {
64        AndroidPicture* picture = reinterpret_cast<AndroidPicture*>(pictureHandle);
65        SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage);
66
67        if (NULL != strm) {
68            picture->serialize(strm);
69            delete strm;
70            return JNI_TRUE;
71        }
72        return JNI_FALSE;
73    }
74
75    static jint getWidth(JNIEnv* env, jobject jpic) {
76        NPE_CHECK_RETURN_ZERO(env, jpic);
77        AndroidPicture* pict = GraphicsJNI::getNativePicture(env, jpic);
78        int width = pict->width();
79        return static_cast<jint>(width);
80    }
81
82    static jint getHeight(JNIEnv* env, jobject jpic) {
83        NPE_CHECK_RETURN_ZERO(env, jpic);
84        AndroidPicture* pict = GraphicsJNI::getNativePicture(env, jpic);
85        int height = pict->height();
86        return static_cast<jint>(height);
87    }
88
89    static jlong beginRecording(JNIEnv* env, jobject, jlong pictHandle,
90                                jint w, jint h) {
91        AndroidPicture* pict = reinterpret_cast<AndroidPicture*>(pictHandle);
92        // beginRecording does not ref its return value, it just returns it.
93        SkCanvas* canvas = pict->beginRecording(w, h);
94        // the java side will wrap this guy in a Canvas.java, which will call
95        // unref in its finalizer, so we have to ref it here, so that both that
96        // Canvas.java and our picture can both be owners
97        canvas->ref();
98        return reinterpret_cast<jlong>(canvas);
99    }
100
101    static void endRecording(JNIEnv* env, jobject, jlong pictHandle) {
102        AndroidPicture* pict = reinterpret_cast<AndroidPicture*>(pictHandle);
103        pict->endRecording();
104    }
105};
106
107static JNINativeMethod gPictureMethods[] = {
108    {"getWidth", "()I", (void*) SkPictureGlue::getWidth},
109    {"getHeight", "()I", (void*) SkPictureGlue::getHeight},
110    {"nativeConstructor", "(J)J", (void*) SkPictureGlue::newPicture},
111    {"nativeCreateFromStream", "(Ljava/io/InputStream;[B)J", (void*)SkPictureGlue::deserialize},
112    {"nativeBeginRecording", "(JII)J", (void*) SkPictureGlue::beginRecording},
113    {"nativeEndRecording", "(J)V", (void*) SkPictureGlue::endRecording},
114    {"nativeDraw", "(JJ)V", (void*) SkPictureGlue::draw},
115    {"nativeWriteToStream", "(JLjava/io/OutputStream;[B)Z", (void*)SkPictureGlue::serialize},
116    {"nativeDestructor","(J)V", (void*) SkPictureGlue::killPicture}
117};
118
119#include <android_runtime/AndroidRuntime.h>
120
121#define REG(env, name, array) \
122    result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
123    SK_ARRAY_COUNT(array));  \
124    if (result < 0) return result
125
126int register_android_graphics_Picture(JNIEnv* env) {
127    int result;
128
129    REG(env, "android/graphics/Picture", gPictureMethods);
130
131    return result;
132}
133
134}
135
136
137