diff options
Diffstat (limited to 'framesequence')
-rw-r--r-- | framesequence/Android.mk | 2 | ||||
-rw-r--r-- | framesequence/jni/Android.mk | 12 | ||||
-rw-r--r-- | framesequence/jni/FrameSequence.h | 1 | ||||
-rw-r--r-- | framesequence/jni/FrameSequenceJNI.cpp | 25 | ||||
-rw-r--r-- | framesequence/jni/FrameSequence_gif.cpp | 5 | ||||
-rw-r--r-- | framesequence/jni/FrameSequence_gif.h | 4 | ||||
-rw-r--r-- | framesequence/jni/FrameSequence_webp.cpp | 47 | ||||
-rw-r--r-- | framesequence/jni/FrameSequence_webp.h | 5 | ||||
-rw-r--r-- | framesequence/jni/Registry.cpp | 27 | ||||
-rw-r--r-- | framesequence/jni/Registry.h | 4 | ||||
-rw-r--r-- | framesequence/jni/Stream.cpp | 28 | ||||
-rw-r--r-- | framesequence/jni/Stream.h | 16 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/Android.mk (renamed from framesequence/samples/RastermillSamples/Android.mk) | 2 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/AndroidManifest.xml (renamed from framesequence/samples/RastermillSamples/AndroidManifest.xml) | 4 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/build.xml (renamed from framesequence/samples/RastermillSamples/build.xml) | 0 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/proguard.flags (renamed from framesequence/samples/RastermillSamples/proguard.flags) | 0 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/project.properties (renamed from framesequence/samples/RastermillSamples/project.properties) | 0 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/drawable-hdpi/ic_launcher.png (renamed from framesequence/samples/RastermillSamples/res/drawable-hdpi/ic_launcher.png) | bin | 9397 -> 9397 bytes | |||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/drawable-mdpi/ic_launcher.png (renamed from framesequence/samples/RastermillSamples/res/drawable-mdpi/ic_launcher.png) | bin | 5237 -> 5237 bytes | |||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/drawable-xhdpi/ic_launcher.png (renamed from framesequence/samples/RastermillSamples/res/drawable-xhdpi/ic_launcher.png) | bin | 14383 -> 14383 bytes | |||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/layout/basic_test_activity.xml (renamed from framesequence/samples/RastermillSamples/res/layout/basic_test_activity.xml) | 0 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/raw/animated_gif.gif (renamed from framesequence/samples/RastermillSamples/res/raw/animated.gif) | bin | 34978 -> 34978 bytes | |||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webp | bin | 0 -> 380850 bytes | |||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/values/strings.xml (renamed from framesequence/samples/RastermillSamples/res/values/strings.xml) | 2 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/res/values/styles.xml (renamed from framesequence/samples/RastermillSamples/res/values/styles.xml) | 0 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/FrameSequenceTest.java (renamed from framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/AnimatedGifTest.java) | 11 | ||||
-rw-r--r-- | framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/SamplesList.java (renamed from framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/SamplesList.java) | 15 | ||||
-rw-r--r-- | framesequence/src/android/support/rastermill/FrameSequence.java | 15 |
28 files changed, 179 insertions, 46 deletions
diff --git a/framesequence/Android.mk b/framesequence/Android.mk index cc2c16c..1b3cf2d 100644 --- a/framesequence/Android.mk +++ b/framesequence/Android.mk @@ -21,6 +21,8 @@ LOCAL_MODULE := android-common-framesequence LOCAL_SDK_VERSION := 8 LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_PROGUARD_FLAG_FILES := proguard.flags + include $(BUILD_STATIC_JAVA_LIBRARY) include $(call all-makefiles-under, $(LOCAL_PATH)) diff --git a/framesequence/jni/Android.mk b/framesequence/jni/Android.mk index e9d0ec5..7353436 100644 --- a/framesequence/jni/Android.mk +++ b/framesequence/jni/Android.mk @@ -19,13 +19,12 @@ include $(CLEAR_VARS) ## Main library -LOCAL_STATIC_LIBRARIES += libgif libwebp-decode +LOCAL_STATIC_LIBRARIES = libgif LOCAL_LDFLAGS := -llog -ljnigraphics LOCAL_C_INCLUDES := \ - external/giflib \ - external/webp/include + external/giflib LOCAL_MODULE := libframesequence LOCAL_SRC_FILES := \ @@ -33,11 +32,16 @@ LOCAL_SRC_FILES := \ FrameSequence.cpp \ FrameSequenceJNI.cpp \ FrameSequence_gif.cpp \ - FrameSequence_webp.cpp \ JNIHelpers.cpp \ Registry.cpp \ Stream.cpp +ifeq ($(FRAMESEQUENCE_INCLUDE_WEBP),true) + LOCAL_C_INCLUDES += external/webp/include + LOCAL_SRC_FILES += FrameSequence_webp.cpp + LOCAL_STATIC_LIBRARIES += libwebp-decode +endif + LOCAL_CFLAGS += -Wall -Wno-unused-parameter -Wno-unused-variable -Wno-overloaded-virtual LOCAL_CFLAGS += -fvisibility=hidden diff --git a/framesequence/jni/FrameSequence.h b/framesequence/jni/FrameSequence.h index 6667cdd..134c81a 100644 --- a/framesequence/jni/FrameSequence.h +++ b/framesequence/jni/FrameSequence.h @@ -49,6 +49,7 @@ public: virtual bool isOpaque() const = 0; virtual int getFrameCount() const = 0; virtual int getDefaultLoopCount() const = 0; + virtual jobject getRawByteBuffer() const = 0; virtual FrameSequenceState* createState() const = 0; }; diff --git a/framesequence/jni/FrameSequenceJNI.cpp b/framesequence/jni/FrameSequenceJNI.cpp index 08a73bc..dfc51ec 100644 --- a/framesequence/jni/FrameSequenceJNI.cpp +++ b/framesequence/jni/FrameSequenceJNI.cpp @@ -53,12 +53,27 @@ static jobject nativeDecodeByteArray(JNIEnv* env, jobject clazz, "couldn't read array bytes"); return NULL; } - MemoryStream stream(bytes + offset, length); + MemoryStream stream(bytes + offset, length, NULL); FrameSequence* frameSequence = FrameSequence::create(&stream); env->ReleasePrimitiveArrayCritical(byteArray, bytes, 0); return createJavaFrameSequence(env, frameSequence); } +static jobject nativeDecodeByteBuffer(JNIEnv* env, jobject clazz, + jobject buf, jint offset, jint limit) { + jobject globalBuf = env->NewGlobalRef(buf); + JavaVM* vm; + env->GetJavaVM(&vm); + MemoryStream stream( + (reinterpret_cast<uint8_t*>( + env->GetDirectBufferAddress(globalBuf))) + offset, + limit, + globalBuf); + FrameSequence* frameSequence = FrameSequence::create(&stream); + jobject finalSequence = createJavaFrameSequence(env, frameSequence); + return finalSequence; +} + static jobject nativeDecodeStream(JNIEnv* env, jobject clazz, jobject istream, jbyteArray byteArray) { JavaInputStream stream(env, istream, byteArray); @@ -69,6 +84,10 @@ static jobject nativeDecodeStream(JNIEnv* env, jobject clazz, static void nativeDestroyFrameSequence(JNIEnv* env, jobject clazz, jlong frameSequenceLong) { FrameSequence* frameSequence = reinterpret_cast<FrameSequence*>(frameSequenceLong); + jobject buf = frameSequence->getRawByteBuffer(); + if (buf != NULL) { + env->DeleteGlobalRef(buf); + } delete frameSequence; } @@ -123,6 +142,10 @@ static JNINativeMethod gMethods[] = { "([BII)L" JNI_PACKAGE "/FrameSequence;", (void*) nativeDecodeByteArray }, + { "nativeDecodeByteBuffer", + "(Ljava/nio/ByteBuffer;II)L" JNI_PACKAGE "/FrameSequence;", + (void*) nativeDecodeByteBuffer + }, { "nativeDecodeStream", "(Ljava/io/InputStream;[B)L" JNI_PACKAGE "/FrameSequence;", (void*) nativeDecodeStream diff --git a/framesequence/jni/FrameSequence_gif.cpp b/framesequence/jni/FrameSequence_gif.cpp index f3e94df..2188c53 100644 --- a/framesequence/jni/FrameSequence_gif.cpp +++ b/framesequence/jni/FrameSequence_gif.cpp @@ -352,6 +352,10 @@ static bool isGif(void* header, int header_size) { || !memcmp(GIF89_STAMP, header, GIF_STAMP_LEN); } +static bool acceptsBuffers() { + return false; +} + static FrameSequence* createFramesequence(Stream* stream) { return new FrameSequence_gif(stream); } @@ -361,6 +365,7 @@ static RegistryEntry gEntry = { isGif, createFramesequence, NULL, + acceptsBuffers, }; static Registry gRegister(gEntry); diff --git a/framesequence/jni/FrameSequence_gif.h b/framesequence/jni/FrameSequence_gif.h index 8bf57b6..563f5b8 100644 --- a/framesequence/jni/FrameSequence_gif.h +++ b/framesequence/jni/FrameSequence_gif.h @@ -49,6 +49,10 @@ public: return mLoopCount; } + virtual jobject getRawByteBuffer() const { + return NULL; + } + virtual FrameSequenceState* createState() const; GifFileType* getGif() const { return mGif; } diff --git a/framesequence/jni/FrameSequence_webp.cpp b/framesequence/jni/FrameSequence_webp.cpp index 602feb7..c33a7e2 100644 --- a/framesequence/jni/FrameSequence_webp.cpp +++ b/framesequence/jni/FrameSequence_webp.cpp @@ -85,22 +85,28 @@ void FrameSequence_webp::constructDependencyChain() { } FrameSequence_webp::FrameSequence_webp(Stream* stream) { - // Read RIFF header to get file size. - uint8_t riff_header[RIFF_HEADER_SIZE]; - if (stream->read(riff_header, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE) { - ALOGE("WebP header load failed"); - return; - } - mData.size = CHUNK_HEADER_SIZE + GetLE32(riff_header + TAG_SIZE); - mData.bytes = new uint8_t[mData.size]; - memcpy((void*)mData.bytes, riff_header, RIFF_HEADER_SIZE); - - // Read rest of the bytes. - void* remaining_bytes = (void*)(mData.bytes + RIFF_HEADER_SIZE); - size_t remaining_size = mData.size - RIFF_HEADER_SIZE; - if (stream->read(remaining_bytes, remaining_size) != remaining_size) { - ALOGE("WebP full load failed"); - return; + if (stream->getRawBuffer() != NULL) { + mData.size = stream->getRawBufferSize(); + mData.bytes = stream->getRawBufferAddr(); + mRawByteBuffer = stream->getRawBuffer(); + } else { + // Read RIFF header to get file size. + uint8_t riff_header[RIFF_HEADER_SIZE]; + if (stream->read(riff_header, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE) { + ALOGE("WebP header load failed"); + return; + } + mData.size = CHUNK_HEADER_SIZE + GetLE32(riff_header + TAG_SIZE); + mData.bytes = new uint8_t[mData.size]; + memcpy((void*)mData.bytes, riff_header, RIFF_HEADER_SIZE); + + // Read rest of the bytes. + void* remaining_bytes = (void*)(mData.bytes + RIFF_HEADER_SIZE); + size_t remaining_size = mData.size - RIFF_HEADER_SIZE; + if (stream->read(remaining_bytes, remaining_size) != remaining_size) { + ALOGE("WebP full load failed"); + return; + } } // Construct demux. @@ -120,8 +126,10 @@ FrameSequence_webp::FrameSequence_webp(Stream* stream) { FrameSequence_webp::~FrameSequence_webp() { WebPDemuxDelete(mDemux); - delete[] mData.bytes; delete[] mIsKeyFrame; + if (mRawByteBuffer == NULL) { + delete[] mData.bytes; + } } FrameSequenceState* FrameSequence_webp::createState() const { @@ -366,6 +374,10 @@ static bool isWebP(void* header, int header_size) { !memcmp("WEBP", header_str + 8, 4); } +static bool acceptsWebPBuffer() { + return true; +} + static FrameSequence* createFramesequence(Stream* stream) { return new FrameSequence_webp(stream); } @@ -375,6 +387,7 @@ static RegistryEntry gEntry = { isWebP, createFramesequence, NULL, + acceptsWebPBuffer, }; static Registry gRegister(gEntry); diff --git a/framesequence/jni/FrameSequence_webp.h b/framesequence/jni/FrameSequence_webp.h index f4fbec0..94dcc3b 100644 --- a/framesequence/jni/FrameSequence_webp.h +++ b/framesequence/jni/FrameSequence_webp.h @@ -51,6 +51,10 @@ public: return mLoopCount; } + virtual jobject getRawByteBuffer() const { + return mRawByteBuffer; + } + virtual FrameSequenceState* createState() const; WebPDemuxer* getDemuxer() const { return mDemux; } @@ -66,6 +70,7 @@ private: uint32_t mFormatFlags; // mIsKeyFrame[i] is true if ith canvas can be constructed without decoding any prior frames. bool* mIsKeyFrame; + jobject mRawByteBuffer; }; // Produces frames of a possibly-animated WebP file for display. diff --git a/framesequence/jni/Registry.cpp b/framesequence/jni/Registry.cpp index 125ac66..e632bb2 100644 --- a/framesequence/jni/Registry.cpp +++ b/framesequence/jni/Registry.cpp @@ -34,15 +34,26 @@ Registry::Registry(const RegistryEntry& entry) { const RegistryEntry* Registry::Find(Stream* stream) { Registry* registry = gHead; - int headerSize = gHeaderBytesRequired; - char header[headerSize]; - headerSize = stream->peek(header, headerSize); - while (registry) { - if (headerSize >= registry->mImpl.requiredHeaderBytes - && registry->mImpl.checkHeader(header, headerSize)) { - return &(registry->mImpl); + + if (stream->getRawBuffer() != NULL) { + while (registry) { + if (registry->mImpl.acceptsBuffer()) { + return &(registry->mImpl); + } + registry = registry->mNext; + } + } else { + int headerSize = gHeaderBytesRequired; + char header[headerSize]; + headerSize = stream->peek(header, headerSize); + while (registry) { + if (headerSize >= registry->mImpl.requiredHeaderBytes + && registry->mImpl.checkHeader(header, headerSize)) { + return &(registry->mImpl); + } + registry = registry->mNext; } - registry = registry->mNext; } return 0; } + diff --git a/framesequence/jni/Registry.h b/framesequence/jni/Registry.h index 571c611..8db43cf 100644 --- a/framesequence/jni/Registry.h +++ b/framesequence/jni/Registry.h @@ -17,6 +17,9 @@ #ifndef RASTERMILL_REGISTRY_H #define RASTERMILL_REGISTRY_H +#include "jni.h" +#include <stdint.h> + class FrameSequence; class Decoder; class Stream; @@ -26,6 +29,7 @@ struct RegistryEntry { bool (*checkHeader)(void* header, int header_size); FrameSequence* (*createFrameSequence)(Stream* stream); Decoder* (*createDecoder)(Stream* stream); + bool (*acceptsBuffer)(); }; /** diff --git a/framesequence/jni/Stream.cpp b/framesequence/jni/Stream.cpp index b2e0c39..a576e66 100644 --- a/framesequence/jni/Stream.cpp +++ b/framesequence/jni/Stream.cpp @@ -79,6 +79,34 @@ size_t Stream::read(void* buffer, size_t size) { return bytes_read; } +uint8_t* Stream::getRawBufferAddr() { + return NULL; +} + +jobject Stream::getRawBuffer() { + return NULL; +} + +int Stream::getRawBufferSize() { + return 0; +} + +uint8_t* MemoryStream::getRawBufferAddr() { + return mBuffer; +} + +jobject MemoryStream::getRawBuffer() { + return mRawBuffer; +} + +int MemoryStream::getRawBufferSize() { + if (mRawBuffer != NULL) { + return mRemaining; + } else { + return 0; + } +} + size_t MemoryStream::doRead(void* buffer, size_t size) { size = min(size, mRemaining); memcpy(buffer, mBuffer, size); diff --git a/framesequence/jni/Stream.h b/framesequence/jni/Stream.h index f8f2427..f0f3895 100644 --- a/framesequence/jni/Stream.h +++ b/framesequence/jni/Stream.h @@ -28,6 +28,9 @@ public: size_t peek(void* buffer, size_t size); size_t read(void* buffer, size_t size); + virtual uint8_t* getRawBufferAddr(); + virtual jobject getRawBuffer(); + virtual int getRawBufferSize(); protected: virtual size_t doRead(void* buffer, size_t size) = 0; @@ -40,16 +43,21 @@ private: class MemoryStream : public Stream { public: - MemoryStream(void* buffer, size_t size) : - mBuffer((char*)buffer), - mRemaining(size) {} + MemoryStream(void* buffer, size_t size, jobject buf) : + mBuffer((uint8_t*)buffer), + mRemaining(size), + mRawBuffer(buf) {} + virtual uint8_t* getRawBufferAddr(); + virtual jobject getRawBuffer(); + virtual int getRawBufferSize(); protected: virtual size_t doRead(void* buffer, size_t size); private: - char* mBuffer; + uint8_t* mBuffer; size_t mRemaining; + jobject mRawBuffer; }; class FileStream : public Stream { diff --git a/framesequence/samples/RastermillSamples/Android.mk b/framesequence/samples/FrameSequenceSamples/Android.mk index bb8920f..fff4a15 100644 --- a/framesequence/samples/RastermillSamples/Android.mk +++ b/framesequence/samples/FrameSequenceSamples/Android.mk @@ -35,6 +35,6 @@ LOCAL_SDK_VERSION := 19 LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, res) LOCAL_AAPT_FLAGS := --auto-add-overlay -LOCAL_AAPT_FLAGS += --extra-packages com.android.rastermill.samples +LOCAL_AAPT_FLAGS += --extra-packages com.android.framesequence.samples include $(BUILD_PACKAGE) diff --git a/framesequence/samples/RastermillSamples/AndroidManifest.xml b/framesequence/samples/FrameSequenceSamples/AndroidManifest.xml index b554021..d614631 100644 --- a/framesequence/samples/RastermillSamples/AndroidManifest.xml +++ b/framesequence/samples/FrameSequenceSamples/AndroidManifest.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.rastermill.samples" + package="com.android.framesequence.samples" android:versionCode="1" android:versionName="1.0" > @@ -20,7 +20,7 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> - <activity android:name=".AnimatedGifTest" /> + <activity android:name=".FrameSequenceTest" /> </application> </manifest> diff --git a/framesequence/samples/RastermillSamples/build.xml b/framesequence/samples/FrameSequenceSamples/build.xml index 5e55b4e..5e55b4e 100644 --- a/framesequence/samples/RastermillSamples/build.xml +++ b/framesequence/samples/FrameSequenceSamples/build.xml diff --git a/framesequence/samples/RastermillSamples/proguard.flags b/framesequence/samples/FrameSequenceSamples/proguard.flags index 4acde2d..4acde2d 100644 --- a/framesequence/samples/RastermillSamples/proguard.flags +++ b/framesequence/samples/FrameSequenceSamples/proguard.flags diff --git a/framesequence/samples/RastermillSamples/project.properties b/framesequence/samples/FrameSequenceSamples/project.properties index ce39f2d..ce39f2d 100644 --- a/framesequence/samples/RastermillSamples/project.properties +++ b/framesequence/samples/FrameSequenceSamples/project.properties diff --git a/framesequence/samples/RastermillSamples/res/drawable-hdpi/ic_launcher.png b/framesequence/samples/FrameSequenceSamples/res/drawable-hdpi/ic_launcher.png Binary files differindex 96a442e..96a442e 100644 --- a/framesequence/samples/RastermillSamples/res/drawable-hdpi/ic_launcher.png +++ b/framesequence/samples/FrameSequenceSamples/res/drawable-hdpi/ic_launcher.png diff --git a/framesequence/samples/RastermillSamples/res/drawable-mdpi/ic_launcher.png b/framesequence/samples/FrameSequenceSamples/res/drawable-mdpi/ic_launcher.png Binary files differindex 359047d..359047d 100644 --- a/framesequence/samples/RastermillSamples/res/drawable-mdpi/ic_launcher.png +++ b/framesequence/samples/FrameSequenceSamples/res/drawable-mdpi/ic_launcher.png diff --git a/framesequence/samples/RastermillSamples/res/drawable-xhdpi/ic_launcher.png b/framesequence/samples/FrameSequenceSamples/res/drawable-xhdpi/ic_launcher.png Binary files differindex 71c6d76..71c6d76 100644 --- a/framesequence/samples/RastermillSamples/res/drawable-xhdpi/ic_launcher.png +++ b/framesequence/samples/FrameSequenceSamples/res/drawable-xhdpi/ic_launcher.png diff --git a/framesequence/samples/RastermillSamples/res/layout/basic_test_activity.xml b/framesequence/samples/FrameSequenceSamples/res/layout/basic_test_activity.xml index 0b9a2df..0b9a2df 100644 --- a/framesequence/samples/RastermillSamples/res/layout/basic_test_activity.xml +++ b/framesequence/samples/FrameSequenceSamples/res/layout/basic_test_activity.xml diff --git a/framesequence/samples/RastermillSamples/res/raw/animated.gif b/framesequence/samples/FrameSequenceSamples/res/raw/animated_gif.gif Binary files differindex 51baf15..51baf15 100644 --- a/framesequence/samples/RastermillSamples/res/raw/animated.gif +++ b/framesequence/samples/FrameSequenceSamples/res/raw/animated_gif.gif diff --git a/framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webp b/framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webp Binary files differnew file mode 100644 index 0000000..25c6a4d --- /dev/null +++ b/framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webp diff --git a/framesequence/samples/RastermillSamples/res/values/strings.xml b/framesequence/samples/FrameSequenceSamples/res/values/strings.xml index 811c979..dc0962e 100644 --- a/framesequence/samples/RastermillSamples/res/values/strings.xml +++ b/framesequence/samples/FrameSequenceSamples/res/values/strings.xml @@ -3,7 +3,7 @@ <!-- NOTE: all strings should be marked as translatable=false, since this sample app is for testing, and won't be shipped --> - <string name="app_name" translatable="false">Rastermill Samples</string> + <string name="app_name" translatable="false">FrameSequence Samples</string> <string name="action_settings" translatable="false">Settings</string> <string name="start" translatable="false">start</string> diff --git a/framesequence/samples/RastermillSamples/res/values/styles.xml b/framesequence/samples/FrameSequenceSamples/res/values/styles.xml index 737bdc3..737bdc3 100644 --- a/framesequence/samples/RastermillSamples/res/values/styles.xml +++ b/framesequence/samples/FrameSequenceSamples/res/values/styles.xml diff --git a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/AnimatedGifTest.java b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/FrameSequenceTest.java index 2328975..5587dc6 100644 --- a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/AnimatedGifTest.java +++ b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/FrameSequenceTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.rastermill.samples; +package com.android.framesequence.samples; import android.app.Activity; import android.graphics.Bitmap; @@ -27,8 +27,9 @@ import android.widget.Toast; import java.io.InputStream; import java.util.HashSet; -public class AnimatedGifTest extends Activity { +public class FrameSequenceTest extends Activity { FrameSequenceDrawable mDrawable; + int mResourceId; // This provider is entirely unnecessary, just here to validate the acquire/release process private class CheckingProvider implements FrameSequenceDrawable.BitmapProvider { @@ -59,6 +60,8 @@ public class AnimatedGifTest extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mResourceId = getIntent().getIntExtra("resourceId", R.raw.animated_gif); + setContentView(R.layout.basic_test_activity); findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { @Override @@ -91,7 +94,7 @@ public class AnimatedGifTest extends Activity { super.onResume(); ImageView imageView = (ImageView) findViewById(R.id.imageview); - InputStream is = getResources().openRawResource(R.raw.animated); + InputStream is = getResources().openRawResource(mResourceId); FrameSequence fs = FrameSequence.decodeStream(is); mDrawable = new FrameSequenceDrawable(fs, mProvider); @@ -99,7 +102,7 @@ public class AnimatedGifTest extends Activity { @Override public void onFinished(FrameSequenceDrawable drawable) { Toast.makeText(getApplicationContext(), - "THE ANIMATION HAS FINISHED", Toast.LENGTH_SHORT).show(); + "The animation has finished", Toast.LENGTH_SHORT).show(); } }); imageView.setImageDrawable(mDrawable); diff --git a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/SamplesList.java b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/SamplesList.java index 0447537..c67b83c 100644 --- a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/SamplesList.java +++ b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/SamplesList.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.rastermill.samples; +package com.android.framesequence.samples; import android.app.ListActivity; import android.content.Intent; @@ -31,17 +31,20 @@ public class SamplesList extends ListActivity { static final String KEY_NAME = "name"; static final String KEY_CLASS = "clazz"; + static final String KEY_RESOURCE = "res"; - static Map<String,?> makeSample(String name, Class<?> activity) { + static Map<String,?> makeSample(String name, Class<?> activity, int resourceId) { Map<String,Object> ret = new HashMap<String,Object>(); ret.put(KEY_NAME, name); ret.put(KEY_CLASS, activity); + ret.put(KEY_RESOURCE, resourceId); return ret; } @SuppressWarnings("serial") static final ArrayList<Map<String,?>> SAMPLES = new ArrayList<Map<String,?>>() {{ - add(makeSample("Animation Test", AnimatedGifTest.class)); + add(makeSample("GIF animation", FrameSequenceTest.class, R.raw.animated_gif)); + add(makeSample("WEBP animation", FrameSequenceTest.class, R.raw.animated_webp)); }}; @Override @@ -55,7 +58,11 @@ public class SamplesList extends ListActivity { @Override protected void onListItemClick(ListView l, View v, int position, long id) { Class<?> clazz = (Class<?>) SAMPLES.get(position).get(KEY_CLASS); - startActivity(new Intent(this, clazz)); + int resourceId = ((Integer) SAMPLES.get(position).get(KEY_RESOURCE)).intValue(); + + Intent intent = new Intent(this, clazz); + intent.putExtra("resourceId", resourceId); + startActivity(intent); } } diff --git a/framesequence/src/android/support/rastermill/FrameSequence.java b/framesequence/src/android/support/rastermill/FrameSequence.java index d2bd128..8ff241f 100644 --- a/framesequence/src/android/support/rastermill/FrameSequence.java +++ b/framesequence/src/android/support/rastermill/FrameSequence.java @@ -17,6 +17,7 @@ package android.support.rastermill; import android.graphics.Bitmap; +import java.nio.ByteBuffer; import java.io.InputStream; @@ -40,6 +41,7 @@ public class FrameSequence { private static native FrameSequence nativeDecodeByteArray(byte[] data, int offset, int length); private static native FrameSequence nativeDecodeStream(InputStream is, byte[] tempStorage); + private static native FrameSequence nativeDecodeByteBuffer(ByteBuffer buffer, int offset, int capacity); private static native void nativeDestroyFrameSequence(long nativeFrameSequence); private static native long nativeCreateState(long nativeFrameSequence); private static native void nativeDestroyState(long nativeState); @@ -69,6 +71,19 @@ public class FrameSequence { return nativeDecodeByteArray(data, offset, length); } + public static FrameSequence decodeByteBuffer(ByteBuffer buffer) { + if (buffer == null) throw new IllegalArgumentException(); + if (!buffer.isDirect()) { + if (buffer.hasArray()) { + byte[] byteArray = buffer.array(); + return decodeByteArray(byteArray, buffer.position(), buffer.remaining()); + } else { + throw new IllegalArgumentException("Cannot have non-direct ByteBuffer with no byte array"); + } + } + return nativeDecodeByteBuffer(buffer, buffer.position(), buffer.remaining()); + } + public static FrameSequence decodeStream(InputStream stream) { if (stream == null) throw new IllegalArgumentException(); byte[] tempStorage = new byte[16 * 1024]; // TODO: use buffer pool |