16b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen/* 26b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * Copyright (C) 2010 The Android Open Source Project 36b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * 46b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License"); 56b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * you may not use this file except in compliance with the License. 66b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * You may obtain a copy of the License at 76b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * 86b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * http://www.apache.org/licenses/LICENSE-2.0 96b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * 106b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software 116b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS, 126b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * See the License for the specific language governing permissions and 146b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen * limitations under the License. 156b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen */ 166b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 176b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen#include "Utils.h" 186b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen#include "SkUtils.h" 196b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 206b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenusing namespace android; 216b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 22b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins IIIAssetStreamAdaptor::AssetStreamAdaptor(Asset* asset, OwnAsset ownAsset, 23b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III HasMemoryBase hasMemoryBase) 24b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III : fAsset(asset) 25b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III , fMemoryBase(kYes_HasMemoryBase == hasMemoryBase ? 26b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III asset->getBuffer(false) : NULL) 27b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III , fOwnAsset(ownAsset) 28b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III{ 29b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III} 30b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III 31b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins IIIAssetStreamAdaptor::~AssetStreamAdaptor() { 32b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III if (kYes_OwnAsset == fOwnAsset) { 33b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III delete fAsset; 34b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III } 35b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III} 36b9c58ab617c257dbece105167b21e94faad67320Leon Scroggins III 376b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenbool AssetStreamAdaptor::rewind() { 38ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root off64_t pos = fAsset->seek(0, SEEK_SET); 39ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root if (pos == (off64_t)-1) { 406b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("----- fAsset->seek(rewind) failed\n"); 416b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return false; 426b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 436b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return true; 446b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen} 456b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 46ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIIsize_t AssetStreamAdaptor::getLength() const { 47ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return fAsset->getLength(); 48ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 49ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 50ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIIbool AssetStreamAdaptor::isAtEnd() const { 51ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return fAsset->getRemainingLength() == 0; 52ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 53ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 54ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIISkStreamRewindable* AssetStreamAdaptor::duplicate() const { 55ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III // Cannot create a duplicate, since each AssetStreamAdaptor 56ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III // would be modifying the Asset. 57ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III //return new AssetStreamAdaptor(fAsset); 58ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 59ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 60ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 616b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chensize_t AssetStreamAdaptor::read(void* buffer, size_t size) { 626b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen ssize_t amount; 636b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 646b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (NULL == buffer) { 65ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (0 == size) { 66ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return 0; 676b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 686b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen // asset->seek returns new total offset 696b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen // we want to return amount that was skipped 706b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 71ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root off64_t oldOffset = fAsset->seek(0, SEEK_CUR); 726b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (-1 == oldOffset) { 736b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("---- fAsset->seek(oldOffset) failed\n"); 746b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return 0; 756b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 76ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root off64_t newOffset = fAsset->seek(size, SEEK_CUR); 776b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (-1 == newOffset) { 786b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("---- fAsset->seek(%d) failed\n", size); 796b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return 0; 806b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 816b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen amount = newOffset - oldOffset; 826b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } else { 836b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen amount = fAsset->read(buffer, size); 846b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (amount <= 0) { 856b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("---- fAsset->read(%d) returned %d\n", size, amount); 866b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 876b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 886b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 896b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (amount < 0) { 906b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen amount = 0; 916b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 926b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return amount; 936b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen} 946b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 95ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIISkMemoryStream* android::CopyAssetToStream(Asset* asset) { 96ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (NULL == asset) { 97ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 98ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 99ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 100ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III off64_t size = asset->seek(0, SEEK_SET); 101ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if ((off64_t)-1 == size) { 102ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkDebugf("---- copyAsset: asset rewind failed\n"); 103ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 104ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 105ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 106ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III size = asset->getLength(); 107ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (size <= 0) { 108ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkDebugf("---- copyAsset: asset->getLength() returned %d\n", size); 109ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 110ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 111ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 112ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkMemoryStream* stream = new SkMemoryStream(size); 113ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III void* data = const_cast<void*>(stream->getMemoryBase()); 114ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III off64_t len = asset->read(data, size); 115ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (len != size) { 116ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkDebugf("---- copyAsset: asset->read(%d) returned %d\n", size, len); 117ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III delete stream; 118ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III stream = NULL; 119ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 120ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return stream; 121ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 122ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 1236b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenjobject android::nullObjectReturn(const char msg[]) { 1246b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (msg) { 1256b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("--- %s\n", msg); 1266b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 1276b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return NULL; 1286b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen} 129