1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _ANDROID_GRAPHICS_UTILS_H_ 18 #define _ANDROID_GRAPHICS_UTILS_H_ 19 20 #include "SkStream.h" 21 22 #include "android_util_Binder.h" 23 24 #include <jni.h> 25 #include <androidfw/Asset.h> 26 27 namespace android { 28 29 class AssetStreamAdaptor : public SkStreamRewindable { 30 public: 31 explicit AssetStreamAdaptor(Asset*); 32 33 virtual bool rewind(); 34 virtual size_t read(void* buffer, size_t size); hasLength()35 virtual bool hasLength() const { return true; } 36 virtual size_t getLength() const; 37 virtual bool hasPosition() const; 38 virtual size_t getPosition() const; 39 virtual bool seek(size_t position); 40 virtual bool move(long offset); 41 virtual bool isAtEnd() const; 42 43 protected: 44 SkStreamRewindable* onDuplicate() const override; 45 46 private: 47 Asset* fAsset; 48 }; 49 50 /** 51 * Make a deep copy of the asset, and return it as a stream, or NULL if there 52 * was an error. 53 * FIXME: If we could "ref/reopen" the asset, we may not need to copy it here. 54 */ 55 56 SkMemoryStream* CopyAssetToStream(Asset*); 57 58 /** Restore the file descriptor's offset in our destructor 59 */ 60 class AutoFDSeek { 61 public: AutoFDSeek(int fd)62 explicit AutoFDSeek(int fd) : fFD(fd) { 63 fCurr = ::lseek(fd, 0, SEEK_CUR); 64 } ~AutoFDSeek()65 ~AutoFDSeek() { 66 if (fCurr >= 0) { 67 ::lseek(fFD, fCurr, SEEK_SET); 68 } 69 } 70 private: 71 int fFD; 72 off64_t fCurr; 73 }; 74 75 jobject nullObjectReturn(const char msg[]); 76 77 /** Check if the file descriptor is seekable. 78 */ 79 bool isSeekable(int descriptor); 80 81 JNIEnv* get_env_or_die(JavaVM* jvm); 82 83 }; // namespace android 84 85 #endif // _ANDROID_GRAPHICS_UTILS_H_ 86