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