14b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger/*
24b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * Copyright (C) 2008 The Android Open Source Project
34b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger *
44b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License");
54b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * you may not use this file except in compliance with the License.
64b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * You may obtain a copy of the License at
74b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger *
84b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger *      http://www.apache.org/licenses/LICENSE-2.0
94b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger *
104b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * Unless required by applicable law or agreed to in writing, software
114b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS,
124b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * See the License for the specific language governing permissions and
144b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger * limitations under the License.
154b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger */
164b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
174b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include "jni.h"
184b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include "GraphicsJNI.h"
194b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include <android_runtime/AndroidRuntime.h>
204b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
214b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include "Picture.h"
224b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
234b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include "SkCanvas.h"
244b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include "SkStream.h"
254b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include "SkTemplates.h"
264b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger#include "CreateJavaOutputStreamAdaptor.h"
274b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
284b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergernamespace android {
294b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
304b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic jlong android_graphics_Picture_newPicture(JNIEnv* env, jobject, jlong srcHandle) {
314b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    const Picture* src = reinterpret_cast<Picture*>(srcHandle);
324b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    return reinterpret_cast<jlong>(new Picture(src));
334b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
344b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
354b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic jlong android_graphics_Picture_deserialize(JNIEnv* env, jobject, jobject jstream,
364b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger                                                  jbyteArray jstorage) {
374b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* picture = NULL;
384b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    SkStream* strm = CreateJavaInputStreamAdaptor(env, jstream, jstorage);
394b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    if (strm) {
404b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger        picture = Picture::CreateFromStream(strm);
414b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger        delete strm;
424b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    }
434b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    return reinterpret_cast<jlong>(picture);
444b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
454b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
464b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic void android_graphics_Picture_killPicture(JNIEnv* env, jobject, jlong pictureHandle) {
474b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* picture = reinterpret_cast<Picture*>(pictureHandle);
484b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    SkASSERT(picture);
494b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    delete picture;
504b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
514b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
524b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic void android_graphics_Picture_draw(JNIEnv* env, jobject, jlong canvasHandle,
534b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger                                          jlong pictureHandle) {
548872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger    Canvas* canvas = reinterpret_cast<Canvas*>(canvasHandle);
554b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* picture = reinterpret_cast<Picture*>(pictureHandle);
564b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    SkASSERT(canvas);
574b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    SkASSERT(picture);
584b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    picture->draw(canvas);
594b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
604b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
614b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic jboolean android_graphics_Picture_serialize(JNIEnv* env, jobject, jlong pictureHandle,
624b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger                                                   jobject jstream, jbyteArray jstorage) {
634b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* picture = reinterpret_cast<Picture*>(pictureHandle);
644b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage);
654b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
664b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    if (NULL != strm) {
674b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger        picture->serialize(strm);
684b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger        delete strm;
694b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger        return JNI_TRUE;
704b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    }
714b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    return JNI_FALSE;
724b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
734b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
744b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic jint android_graphics_Picture_getWidth(JNIEnv* env, jobject, jlong pictureHandle) {
754b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* pict = reinterpret_cast<Picture*>(pictureHandle);
764b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    return static_cast<jint>(pict->width());
774b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
784b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
794b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic jint android_graphics_Picture_getHeight(JNIEnv* env, jobject, jlong pictureHandle) {
804b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* pict = reinterpret_cast<Picture*>(pictureHandle);
814b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    return static_cast<jint>(pict->height());
824b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
834b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
844b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic jlong android_graphics_Picture_beginRecording(JNIEnv* env, jobject, jlong pictHandle,
854b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger                                                     jint w, jint h) {
864b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* pict = reinterpret_cast<Picture*>(pictHandle);
878872b38ef403cc2c44aca07d392f5e9426fd7f54Derek Sollenberger    Canvas* canvas = pict->beginRecording(w, h);
884b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    return reinterpret_cast<jlong>(canvas);
894b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
904b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
914b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic void android_graphics_Picture_endRecording(JNIEnv* env, jobject, jlong pictHandle) {
924b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    Picture* pict = reinterpret_cast<Picture*>(pictHandle);
934b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    pict->endRecording();
944b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
954b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
964b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerstatic JNINativeMethod gMethods[] = {
974b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeGetWidth", "(J)I", (void*) android_graphics_Picture_getWidth},
984b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeGetHeight", "(J)I", (void*) android_graphics_Picture_getHeight},
994b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeConstructor", "(J)J", (void*) android_graphics_Picture_newPicture},
1004b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeCreateFromStream", "(Ljava/io/InputStream;[B)J", (void*)android_graphics_Picture_deserialize},
1014b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeBeginRecording", "(JII)J", (void*) android_graphics_Picture_beginRecording},
1024b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeEndRecording", "(J)V", (void*) android_graphics_Picture_endRecording},
1034b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeDraw", "(JJ)V", (void*) android_graphics_Picture_draw},
1044b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeWriteToStream", "(JLjava/io/OutputStream;[B)Z", (void*)android_graphics_Picture_serialize},
1054b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    {"nativeDestructor","(J)V", (void*) android_graphics_Picture_killPicture}
1064b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger};
1074b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
1084b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenbergerint register_android_graphics_Picture(JNIEnv* env) {
1094b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger    return AndroidRuntime::registerNativeMethods(env, "android/graphics/Picture", gMethods, NELEM(gMethods));
1104b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}
1114b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger
1124b0959d8db20c08ab1fed37f397b303af229162bDerek Sollenberger}; // namespace android
113