diff options
Diffstat (limited to 'platform_tools/android/apps/canvasproof/src/main/jni')
6 files changed, 364 insertions, 0 deletions
diff --git a/platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp b/platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp new file mode 100644 index 0000000000..823b72f7ef --- /dev/null +++ b/platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp @@ -0,0 +1,61 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "JavaInputStream.h" + +JavaInputStream::JavaInputStream( + JNIEnv* env, jbyteArray javaBuffer, jobject inputStream) + : fEnv(env) + , fStartIndex(0) + , fEndIndex(0) { + SkASSERT(inputStream); + SkASSERT(javaBuffer); + fInputStream = inputStream; + fJavaBuffer = javaBuffer; + fInputStreamClass = env->FindClass("java/io/InputStream"); + SkASSERT(fInputStreamClass); + fReadMethodID = env->GetMethodID(fInputStreamClass, "read", "([B)I"); + SkASSERT(fReadMethodID); +} + +bool JavaInputStream::isAtEnd() const { return fStartIndex == fEndIndex; } + +size_t JavaInputStream::read(void* voidBuffer, size_t size) { + size_t totalRead = 0; + char* buffer = static_cast<char*>(voidBuffer); // may be NULL; + while (size) { + // make sure the cache has at least one byte or is done. + if (fStartIndex == fEndIndex) { + jint count = + fEnv->CallIntMethod(fInputStream, fReadMethodID, fJavaBuffer); + if (fEnv->ExceptionCheck()) { + fEnv->ExceptionDescribe(); + fEnv->ExceptionClear(); + SkDebugf("---- java.io.InputStream::read() threw an exception\n"); + return 0; + } + fStartIndex = 0; + fEndIndex = count; + if (this->isAtEnd()) { + return totalRead; // No more to read. + } + } + SkASSERT(fEndIndex > fStartIndex); + size_t length = SkTMin(SkToSizeT(fEndIndex - fStartIndex), size); + if (buffer && length) { + jbyte* bufferElements + = fEnv->GetByteArrayElements(fJavaBuffer, NULL); + memcpy(buffer, &bufferElements[fStartIndex], length); + buffer += length; + fEnv->ReleaseByteArrayElements(fJavaBuffer, bufferElements, 0); + } + totalRead += length; + size -= length; + fStartIndex += length; + } + return totalRead; +} diff --git a/platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.h b/platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.h new file mode 100644 index 0000000000..e14e026552 --- /dev/null +++ b/platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.h @@ -0,0 +1,28 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef JavaInputStream_DEFINED +#define JavaInputStream_DEFINED + +#include <jni.h> +#include "SkStream.h" + +class JavaInputStream : public SkStream { +public: + JavaInputStream(JNIEnv*, jbyteArray javaBuffer, jobject javaIoInputStream); + bool isAtEnd() const override; + size_t read(void*, size_t) override; +private: + JNIEnv* fEnv; + jobject fInputStream; + jbyteArray fJavaBuffer; + jclass fInputStreamClass; + jmethodID fReadMethodID; + jint fStartIndex; + jint fEndIndex; +}; + +#endif // JavaInputStream_DEFINED diff --git a/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.cpp b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.cpp new file mode 100644 index 0000000000..c5d9759e54 --- /dev/null +++ b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "org_skia_canvasproof_CreateSkiaPicture.h" +#include "JavaInputStream.h" +#include "SkPicture.h" +#include "SkPictureRecorder.h" + +/* + * Class: org_skia_canvasproof_CreateSkiaPicture + * Method: delete + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_CreateSkiaPicture_deleteImpl( + JNIEnv* env, jclass clazz, jlong ptr) { + SkSafeUnref(reinterpret_cast<SkPicture*>(ptr)); +} + +/* + * Class: org_skia_canvasproof_CreateSkiaPicture + * Method: createImpl + * Signature: (Ljava/io/InputStream;[B)J + */ +JNIEXPORT jlong JNICALL Java_org_skia_canvasproof_CreateSkiaPicture_createImpl + (JNIEnv* env, jclass clazz, jobject inputStream, jbyteArray buffer) { + JavaInputStream stream(env, buffer, inputStream); + #if 0 + SkAutoTUnref<SkPicture> p(SkPicture::CreateFromStream(&stream)); + if (!p) { return 0; } + SkPictureRecorder recorder; + SkRect bounds = p->cullRect(); + SkRTreeFactory bbh; + recorder.beginRecording(bounds, &bbh)->drawPicture(p); + return reinterpret_cast<long>(recorder.endRecordingAsPicture()); + #else + return reinterpret_cast<long>(SkPicture::CreateFromStream(&stream)); + #endif +} diff --git a/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.h b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.h new file mode 100644 index 0000000000..2937d549ef --- /dev/null +++ b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.h @@ -0,0 +1,35 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_skia_canvasproof_CreateSkiaPicture */ + +#ifndef _Included_org_skia_canvasproof_CreateSkiaPicture +#define _Included_org_skia_canvasproof_CreateSkiaPicture +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_skia_canvasproof_CreateSkiaPicture + * Method: deleteImpl + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_CreateSkiaPicture_deleteImpl + (JNIEnv *, jclass, jlong); + +/* + * Class: org_skia_canvasproof_CreateSkiaPicture + * Method: createImpl + * Signature: (Ljava/io/InputStream;[B)J + */ +JNIEXPORT jlong JNICALL Java_org_skia_canvasproof_CreateSkiaPicture_createImpl + (JNIEnv *, jclass, jobject, jbyteArray); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.cpp b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.cpp new file mode 100644 index 0000000000..d1de529674 --- /dev/null +++ b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.cpp @@ -0,0 +1,146 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "org_skia_canvasproof_GaneshPictureRenderer.h" + +#include "GrContext.h" +#include "JavaInputStream.h" +#include "SkCanvas.h" +#include "SkMatrix.h" +#include "SkPicture.h" +#include "SkRect.h" +#include "SkStream.h" +#include "SkSurface.h" + +#define TAG "GaneshPictureRenderer.cpp: " + +static void render_picture(GrContext* grContext, + int width, + int height, + const SkPicture* picture, + const SkMatrix& matrix) { + SkASSERT(grContext); + if (!picture) { + SkDebugf(TAG "!picture\n"); + return; + } + // Render to the default framebuffer render target. + GrBackendRenderTargetDesc desc; + desc.fWidth = width; + desc.fHeight = height; + desc.fConfig = kSkia8888_GrPixelConfig; + desc.fOrigin = kBottomLeft_GrSurfaceOrigin; + SkSurfaceProps surfaceProps(SkSurfaceProps::kUseDeviceIndependentFonts_Flag, + kUnknown_SkPixelGeometry); + // TODO: Check to see if we can keep the surface between draw calls. + SkAutoTUnref<SkSurface> surface( + SkSurface::NewFromBackendRenderTarget( + grContext, desc, &surfaceProps)); + if (surface) { + SkCanvas* canvas = surface->getCanvas(); + SkASSERT(canvas); + canvas->clear(SK_ColorGRAY); + canvas->concat(matrix); + SkRect cullRect = picture->cullRect(); + canvas->clipRect(cullRect); + picture->playback(canvas); + canvas->flush(); + } +} + +namespace { +struct GaneshPictureRendererImpl { + SkAutoTUnref<GrContext> fGrContext; + void render(int w, int h, const SkPicture* p, const SkMatrix& m) { + if (!fGrContext) { + // Cache the rendering context between frames. + fGrContext.reset(GrContext::Create(kOpenGL_GrBackend, 0)); + if (!fGrContext) { + SkDebugf(TAG "GrContext::Create - failed\n"); + return; + } + } + render_picture(fGrContext, w, h, p, m); + } +}; +} // namespace + +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: DrawThisFrame + * Signature: (IIFJ)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_DrawThisFrame( + JNIEnv*, jclass, jint width, jint height, jfloat scale, jlong ptr, jlong pic) { + if (!ptr) { return; } + SkMatrix matrix = SkMatrix::MakeScale((SkScalar)scale); + GaneshPictureRendererImpl* impl = + reinterpret_cast<GaneshPictureRendererImpl*>(ptr); + SkPicture* picture = reinterpret_cast<SkPicture*>(pic); + impl->render((int)width, (int)height, picture, matrix); +} + +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: Ctor + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_Ctor + (JNIEnv *, jclass) { + return reinterpret_cast<jlong>(new GaneshPictureRendererImpl); +} + +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: CleanUp + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_CleanUp + (JNIEnv *, jclass, jlong ptr) { + delete reinterpret_cast<GaneshPictureRendererImpl*>(ptr); +} + +namespace { +struct AndroidRectHelper { + jfieldID fLeft, fTop, fRight, fBottom; + AndroidRectHelper() + : fLeft(nullptr), fTop(nullptr), fRight(nullptr), fBottom(nullptr) {} + void config(JNIEnv *env) { + if (!fLeft) { + jclass rectClass = env->FindClass("android/graphics/Rect"); + SkASSERT(rectClass); + fLeft = env->GetFieldID(rectClass, "left", "I"); + fTop = env->GetFieldID(rectClass, "top", "I"); + fRight = env->GetFieldID(rectClass, "right", "I"); + fBottom = env->GetFieldID(rectClass, "bottom", "I"); + } + } +}; +} // namespace + +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: GetCullRect + * Signature: (Landroid/graphics/Rect;J)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_GetCullRect + (JNIEnv *env, jclass, jobject androidGraphicsRect, jlong picturePtr) { + SkASSERT(androidGraphicsRect); + const SkPicture* picture = reinterpret_cast<SkPicture*>(picturePtr); + SkRect rect = SkRect::MakeEmpty(); + if (picture) { + rect = picture->cullRect(); + } + SkIRect iRect; + rect.roundOut(&iRect); + static AndroidRectHelper help; + help.config(env); + env->SetIntField(androidGraphicsRect, help.fLeft, (jint)(iRect.left())); + env->SetIntField(androidGraphicsRect, help.fTop, (jint)(iRect.top())); + env->SetIntField(androidGraphicsRect, help.fRight, (jint)(iRect.right())); + env->SetIntField(androidGraphicsRect, help.fBottom, (jint)(iRect.bottom())); +} diff --git a/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.h b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.h new file mode 100644 index 0000000000..401fa87872 --- /dev/null +++ b/platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.h @@ -0,0 +1,52 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class org_skia_canvasproof_GaneshPictureRenderer */ + +#ifndef _Included_org_skia_canvasproof_GaneshPictureRenderer +#define _Included_org_skia_canvasproof_GaneshPictureRenderer +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: DrawThisFrame + * Signature: (IIFJJ)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_DrawThisFrame + (JNIEnv *, jclass, jint, jint, jfloat, jlong, jlong); + +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: Ctor + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_Ctor + (JNIEnv *, jclass); + +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: CleanUp + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_CleanUp + (JNIEnv *, jclass, jlong); + +/* + * Class: org_skia_canvasproof_GaneshPictureRenderer + * Method: GetCullRect + * Signature: (Landroid/graphics/Rect;J)V + */ +JNIEXPORT void JNICALL Java_org_skia_canvasproof_GaneshPictureRenderer_GetCullRect + (JNIEnv *, jclass, jobject, jlong); + +#ifdef __cplusplus +} +#endif +#endif |