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