aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2015-09-23 12:40:34 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-23 12:40:34 -0700
commitab26a9b427ec7c525ccd0025f19f0c91b74d8f6d (patch)
treefaf1acf3fc409d7a61e23460c960e351bbf7e360 /platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp
parent3420d2796bad5ce553efb9909790ea72e578dc47 (diff)
android/apps: Add CanvasProof App;
Compare Ganesh and HWUI canvas rendering of SKPs on android. Put SKP files in .../canvasproof/src/main/assets/skps Run on a Marshmallow device. NOTREECHECKS=true Review URL: https://codereview.chromium.org/1258123004
Diffstat (limited to 'platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp')
-rw-r--r--platform_tools/android/apps/canvasproof/src/main/jni/JavaInputStream.cpp61
1 files changed, 61 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;
+}