From 0492eefece5ba2bb1d9ab5b3af7e350fd50343e9 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Mon, 7 May 2018 10:59:31 -0400 Subject: [PATCH] Allow AssetStreamAdaptor to be seekable Bug: 78866720 Test: Manual It already supports rewinding, and the underlying Asset supports seeking. Allow it to be seeked so that SkGifCodec can read directly from it rather than copying data it needs for internal use. Change-Id: I0765dcf4a507724878a5a700a770d35802c4b7be --- core/jni/android/graphics/Utils.cpp | 32 +++++++++++++++++++++++++++++ core/jni/android/graphics/Utils.h | 4 ++++ 2 files changed, 36 insertions(+) diff --git a/core/jni/android/graphics/Utils.cpp b/core/jni/android/graphics/Utils.cpp index dd9bafe3b4111..462d052cbf10b 100644 --- a/core/jni/android/graphics/Utils.cpp +++ b/core/jni/android/graphics/Utils.cpp @@ -49,6 +49,38 @@ SkStreamRewindable* AssetStreamAdaptor::onDuplicate() const { return NULL; } +bool AssetStreamAdaptor::hasPosition() const { + return fAsset->seek(0, SEEK_CUR) != -1; +} + +size_t AssetStreamAdaptor::getPosition() const { + const off64_t offset = fAsset->seek(0, SEEK_CUR); + if (offset == -1) { + SkDebugf("---- fAsset->seek(0, SEEK_CUR) failed\n"); + return 0; + } + + return offset; +} + +bool AssetStreamAdaptor::seek(size_t position) { + if (fAsset->seek(position, SEEK_SET) == -1) { + SkDebugf("---- fAsset->seek(0, SEEK_SET) failed\n"); + return false; + } + + return true; +} + +bool AssetStreamAdaptor::move(long offset) { + if (fAsset->seek(offset, SEEK_CUR) == -1) { + SkDebugf("---- fAsset->seek(%i, SEEK_CUR) failed\n", offset); + return false; + } + + return true; +} + size_t AssetStreamAdaptor::read(void* buffer, size_t size) { ssize_t amount; diff --git a/core/jni/android/graphics/Utils.h b/core/jni/android/graphics/Utils.h index 2f2ee9654489a..ac291ea77f628 100644 --- a/core/jni/android/graphics/Utils.h +++ b/core/jni/android/graphics/Utils.h @@ -34,6 +34,10 @@ public: virtual size_t read(void* buffer, size_t size); virtual bool hasLength() const { return true; } virtual size_t getLength() const; + virtual bool hasPosition() const; + virtual size_t getPosition() const; + virtual bool seek(size_t position); + virtual bool move(long offset); virtual bool isAtEnd() const; protected: