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 226b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenbool AssetStreamAdaptor::rewind() { 23ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root off64_t pos = fAsset->seek(0, SEEK_SET); 24ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root if (pos == (off64_t)-1) { 256b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("----- fAsset->seek(rewind) failed\n"); 266b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return false; 276b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 286b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return true; 296b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen} 306b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 31ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIIsize_t AssetStreamAdaptor::getLength() const { 32ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return fAsset->getLength(); 33ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 34ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 35ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIIbool AssetStreamAdaptor::isAtEnd() const { 36ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return fAsset->getRemainingLength() == 0; 37ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 38ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 39ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIISkStreamRewindable* AssetStreamAdaptor::duplicate() const { 40ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkASSERT(false); 41ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III // Cannot create a duplicate, since each AssetStreamAdaptor 42ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III // would be modifying the Asset. 43ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III //return new AssetStreamAdaptor(fAsset); 44ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 45ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 46ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 476b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chensize_t AssetStreamAdaptor::read(void* buffer, size_t size) { 486b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen ssize_t amount; 496b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 506b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (NULL == buffer) { 51ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (0 == size) { 52ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return 0; 536b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 546b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen // asset->seek returns new total offset 556b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen // we want to return amount that was skipped 566b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 57ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root off64_t oldOffset = fAsset->seek(0, SEEK_CUR); 586b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (-1 == oldOffset) { 596b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("---- fAsset->seek(oldOffset) failed\n"); 606b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return 0; 616b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 62ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root off64_t newOffset = fAsset->seek(size, SEEK_CUR); 636b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (-1 == newOffset) { 646b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("---- fAsset->seek(%d) failed\n", size); 656b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return 0; 666b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 676b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen amount = newOffset - oldOffset; 686b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } else { 696b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen amount = fAsset->read(buffer, size); 706b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (amount <= 0) { 716b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("---- fAsset->read(%d) returned %d\n", size, amount); 726b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 736b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 746b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 756b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (amount < 0) { 766b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen amount = 0; 776b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 786b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return amount; 796b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen} 806b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen 81ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins IIISkMemoryStream* android::CopyAssetToStream(Asset* asset) { 82ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (NULL == asset) { 83ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 84ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 85ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 86ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III off64_t size = asset->seek(0, SEEK_SET); 87ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if ((off64_t)-1 == size) { 88ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkDebugf("---- copyAsset: asset rewind failed\n"); 89ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 90ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 91ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 92ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III size = asset->getLength(); 93ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (size <= 0) { 94ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkDebugf("---- copyAsset: asset->getLength() returned %d\n", size); 95ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return NULL; 96ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 97ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 98ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkMemoryStream* stream = new SkMemoryStream(size); 99ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III void* data = const_cast<void*>(stream->getMemoryBase()); 100ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III off64_t len = asset->read(data, size); 101ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III if (len != size) { 102ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III SkDebugf("---- copyAsset: asset->read(%d) returned %d\n", size, len); 103ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III delete stream; 104ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III stream = NULL; 105ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III } 106ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III return stream; 107ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III} 108ca32021b43f326af7d3f4ae041f8db297f98a518Leon Scroggins III 1096b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chenjobject android::nullObjectReturn(const char msg[]) { 1106b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen if (msg) { 1116b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen SkDebugf("--- %s\n", msg); 1126b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen } 1136b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen return NULL; 1146b849e2123be98eb2a1a25b8abf0b13a279ce952Wei-Ta Chen} 115