Picture.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GraphicsJNI.h"
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkCanvas.h"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkPicture.h"
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "SkTemplates.h"
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "CreateJavaOutputStreamAdaptor.h"
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SkPictureGlue {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPicture* newPicture(JNIEnv* env, jobject, const SkPicture* src) {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (src) {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new SkPicture(*src);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new SkPicture;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkPicture* deserialize(JNIEnv* env, jobject, jobject jstream,
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  jbyteArray jstorage) {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkPicture* picture = NULL;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkStream* strm = CreateJavaInputStreamAdaptor(env, jstream, jstorage);
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (strm) {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            picture = new SkPicture(strm);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete strm;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return picture;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void killPicture(JNIEnv* env, jobject, SkPicture* picture) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkASSERT(picture);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete picture;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void draw(JNIEnv* env, jobject, SkCanvas* canvas,
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            SkPicture* picture) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkASSERT(canvas);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkASSERT(picture);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        picture->draw(canvas);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool serialize(JNIEnv* env, jobject, SkPicture* picture,
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          jobject jstream, jbyteArray jstorage) {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (NULL != strm) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            picture->serialize(strm);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete strm;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int getWidth(JNIEnv* env, jobject jpic) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jpic);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return GraphicsJNI::getNativePicture(env, jpic)->width();
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static int getHeight(JNIEnv* env, jobject jpic) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NPE_CHECK_RETURN_ZERO(env, jpic);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return GraphicsJNI::getNativePicture(env, jpic)->height();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static SkCanvas* beginRecording(JNIEnv* env, jobject, SkPicture* pict,
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    int w, int h) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // beginRecording does not ref its return value, it just returns it.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SkCanvas* canvas = pict->beginRecording(w, h);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the java side will wrap this guy in a Canvas.java, which will call
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // unref in its finalizer, so we have to ref it here, so that both that
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Canvas.java and our picture can both be owners
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas->ref();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return canvas;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void endRecording(JNIEnv* env, jobject, SkPicture* pict) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pict->endRecording();
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gPictureMethods[] = {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getWidth", "()I", (void*) SkPictureGlue::getWidth},
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getHeight", "()I", (void*) SkPictureGlue::getHeight},
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"nativeConstructor", "(I)I", (void*) SkPictureGlue::newPicture},
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"nativeCreateFromStream", "(Ljava/io/InputStream;[B)I", (void*)SkPictureGlue::deserialize},
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"nativeBeginRecording", "(III)I", (void*) SkPictureGlue::beginRecording},
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"nativeEndRecording", "(I)V", (void*) SkPictureGlue::endRecording},
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"nativeDraw", "(II)V", (void*) SkPictureGlue::draw},
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"nativeWriteToStream", "(ILjava/io/OutputStream;[B)Z", (void*)SkPictureGlue::serialize},
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"nativeDestructor","(I)V", (void*) SkPictureGlue::killPicture}
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define REG(env, name, array) \
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = android::AndroidRuntime::registerNativeMethods(env, name, array, \
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SK_ARRAY_COUNT(array));  \
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result < 0) return result
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_graphics_Picture(JNIEnv* env) {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    REG(env, "android/graphics/Picture", gPictureMethods);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129