diff options
| author | Derek Sollenberger <djsollen@google.com> | 2014-06-12 12:31:10 -0400 |
|---|---|---|
| committer | Derek Sollenberger <djsollen@google.com> | 2014-06-17 15:31:43 -0400 |
| commit | 4b0959d8db20c08ab1fed37f397b303af229162b (patch) | |
| tree | b1d6a2a6847437d94d6dec0bb4ab321afa5b3778 /core/jni/android/graphics/Picture.cpp | |
| parent | 88b00784684d7b706c7b0c4e833b1d67d73358b9 (diff) | |
| download | frameworks_base-4b0959d8db20c08ab1fed37f397b303af229162b.zip frameworks_base-4b0959d8db20c08ab1fed37f397b303af229162b.tar.gz frameworks_base-4b0959d8db20c08ab1fed37f397b303af229162b.tar.bz2 | |
Refactor android.graphics.Picture JNI bindings.
This is the first CL in a series of CLs to refactor the Graphics JNI bindings.
bug: 15672762
Change-Id: I1455fa1330c7426407c06eeaad81ad37a57373b1
Diffstat (limited to 'core/jni/android/graphics/Picture.cpp')
| -rw-r--r-- | core/jni/android/graphics/Picture.cpp | 171 |
1 files changed, 75 insertions, 96 deletions
diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp index 0683f73..4a62dc2 100644 --- a/core/jni/android/graphics/Picture.cpp +++ b/core/jni/android/graphics/Picture.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 The Android Open Source Project + * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,123 +14,102 @@ * limitations under the License. */ -#include "jni.h" -#include "GraphicsJNI.h" -#include <android_runtime/AndroidRuntime.h> -#include "AndroidPicture.h" +#include "Picture.h" #include "SkCanvas.h" #include "SkStream.h" -#include "SkTemplates.h" -#include "CreateJavaOutputStreamAdaptor.h" -namespace android { +using namespace android; -class SkPictureGlue { -public: - static jlong newPicture(JNIEnv* env, jobject, jlong srcHandle) { - const AndroidPicture* src = reinterpret_cast<AndroidPicture*>(srcHandle); - return reinterpret_cast<jlong>(new AndroidPicture(src)); - } - - static jlong deserialize(JNIEnv* env, jobject, jobject jstream, - jbyteArray jstorage) { - AndroidPicture* picture = NULL; - SkStream* strm = CreateJavaInputStreamAdaptor(env, jstream, jstorage); - if (strm) { - picture = AndroidPicture::CreateFromStream(strm); - delete strm; +Picture::Picture(const Picture* src) { + if (NULL != src) { + mWidth = src->width(); + mHeight = src->height(); + if (NULL != src->mPicture.get()) { + mPicture.reset(SkRef(src->mPicture.get())); + } if (NULL != src->mRecorder.get()) { + mPicture.reset(src->makePartialCopy()); } - return reinterpret_cast<jlong>(picture); - } - - static void killPicture(JNIEnv* env, jobject, jlong pictureHandle) { - AndroidPicture* picture = reinterpret_cast<AndroidPicture*>(pictureHandle); - SkASSERT(picture); - delete picture; - } - - static void draw(JNIEnv* env, jobject, jlong canvasHandle, - jlong pictureHandle) { - SkCanvas* canvas = GraphicsJNI::getNativeCanvas(canvasHandle); - AndroidPicture* picture = reinterpret_cast<AndroidPicture*>(pictureHandle); - SkASSERT(canvas); - SkASSERT(picture); - picture->draw(canvas); + } else { + mWidth = 0; + mHeight = 0; } +} - static jboolean serialize(JNIEnv* env, jobject, jlong pictureHandle, - jobject jstream, jbyteArray jstorage) { - AndroidPicture* picture = reinterpret_cast<AndroidPicture*>(pictureHandle); - SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); - - if (NULL != strm) { - picture->serialize(strm); - delete strm; - return JNI_TRUE; - } - return JNI_FALSE; - } +SkCanvas* Picture::beginRecording(int width, int height) { + mPicture.reset(NULL); + mRecorder.reset(new SkPictureRecorder); + mWidth = width; + mHeight = height; + return mRecorder->beginRecording(width, height, NULL, 0); +} - static jint getWidth(JNIEnv* env, jobject jpic) { - NPE_CHECK_RETURN_ZERO(env, jpic); - AndroidPicture* pict = GraphicsJNI::getNativePicture(env, jpic); - int width = pict->width(); - return static_cast<jint>(width); +void Picture::endRecording() { + if (NULL != mRecorder.get()) { + mPicture.reset(mRecorder->endRecording()); + mRecorder.reset(NULL); } +} - static jint getHeight(JNIEnv* env, jobject jpic) { - NPE_CHECK_RETURN_ZERO(env, jpic); - AndroidPicture* pict = GraphicsJNI::getNativePicture(env, jpic); - int height = pict->height(); - return static_cast<jint>(height); +int Picture::width() const { + if (NULL != mPicture.get()) { + SkASSERT(mPicture->width() == mWidth); + SkASSERT(mPicture->height() == mHeight); } - static jlong beginRecording(JNIEnv* env, jobject, jlong pictHandle, - jint w, jint h) { - AndroidPicture* pict = reinterpret_cast<AndroidPicture*>(pictHandle); - // beginRecording does not ref its return value, it just returns it. - SkCanvas* canvas = pict->beginRecording(w, h); - // the java side will wrap this guy in a Canvas.java, which will call - // unref in its finalizer, so we have to ref it here, so that both that - // Canvas.java and our picture can both be owners - canvas->ref(); - return reinterpret_cast<jlong>(canvas); - } + return mWidth; +} - static void endRecording(JNIEnv* env, jobject, jlong pictHandle) { - AndroidPicture* pict = reinterpret_cast<AndroidPicture*>(pictHandle); - pict->endRecording(); +int Picture::height() const { + if (NULL != mPicture.get()) { + SkASSERT(mPicture->width() == mWidth); + SkASSERT(mPicture->height() == mHeight); } -}; - -static JNINativeMethod gPictureMethods[] = { - {"getWidth", "()I", (void*) SkPictureGlue::getWidth}, - {"getHeight", "()I", (void*) SkPictureGlue::getHeight}, - {"nativeConstructor", "(J)J", (void*) SkPictureGlue::newPicture}, - {"nativeCreateFromStream", "(Ljava/io/InputStream;[B)J", (void*)SkPictureGlue::deserialize}, - {"nativeBeginRecording", "(JII)J", (void*) SkPictureGlue::beginRecording}, - {"nativeEndRecording", "(J)V", (void*) SkPictureGlue::endRecording}, - {"nativeDraw", "(JJ)V", (void*) SkPictureGlue::draw}, - {"nativeWriteToStream", "(JLjava/io/OutputStream;[B)Z", (void*)SkPictureGlue::serialize}, - {"nativeDestructor","(J)V", (void*) SkPictureGlue::killPicture} -}; -#include <android_runtime/AndroidRuntime.h> + return mHeight; +} -#define REG(env, name, array) \ - result = android::AndroidRuntime::registerNativeMethods(env, name, array, \ - SK_ARRAY_COUNT(array)); \ - if (result < 0) return result +Picture* Picture::CreateFromStream(SkStream* stream) { + Picture* newPict = new Picture; -int register_android_graphics_Picture(JNIEnv* env) { - int result; + newPict->mPicture.reset(SkPicture::CreateFromStream(stream)); + if (NULL != newPict->mPicture.get()) { + newPict->mWidth = newPict->mPicture->width(); + newPict->mHeight = newPict->mPicture->height(); + } - REG(env, "android/graphics/Picture", gPictureMethods); + return newPict; +} - return result; +void Picture::serialize(SkWStream* stream) const { + if (NULL != mRecorder.get()) { + SkAutoTDelete<SkPicture> tempPict(this->makePartialCopy()); + tempPict->serialize(stream); + } else if (NULL != mPicture.get()) { + mPicture->serialize(stream); + } else { + SkPicture empty; + empty.serialize(stream); + } } +void Picture::draw(SkCanvas* canvas) { + if (NULL != mRecorder.get()) { + this->endRecording(); + SkASSERT(NULL != mPicture.get()); + } + if (NULL != mPicture.get()) { + // TODO: remove this const_cast once pictures are immutable + const_cast<SkPicture*>(mPicture.get())->draw(canvas); + } } +SkPicture* Picture::makePartialCopy() const { + SkASSERT(NULL != mRecorder.get()); + SkPictureRecorder reRecorder; + + SkCanvas* canvas = reRecorder.beginRecording(mWidth, mHeight, NULL, 0); + mRecorder->partialReplay(canvas); + return reRecorder.endRecording(); +} |
