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