aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools/android/apps/canvasproof/src/main/jni
diff options
context:
space:
mode:
Diffstat (limited to 'platform_tools/android/apps/canvasproof/src/main/jni')
-rw-r--r--platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp61
-rw-r--r--platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.h28
-rw-r--r--platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.cpp42
-rw-r--r--platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_CreateSkiaPicture.h35
-rw-r--r--platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.cpp146
-rw-r--r--platform_tools/android/apps/canvasproof/src/main/jni/org_skia_canvasproof_GaneshPictureRenderer.h52
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