• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 #include "Utils.h"
18 #include "SkUtils.h"
19 #include "SkData.h"
20 
21 using namespace android;
22 
AssetStreamAdaptor(Asset * asset)23 AssetStreamAdaptor::AssetStreamAdaptor(Asset* asset)
24     : fAsset(asset)
25 {
26 }
27 
rewind()28 bool AssetStreamAdaptor::rewind() {
29     off64_t pos = fAsset->seek(0, SEEK_SET);
30     if (pos == (off64_t)-1) {
31         SkDebugf("----- fAsset->seek(rewind) failed\n");
32         return false;
33     }
34     return true;
35 }
36 
getLength() const37 size_t AssetStreamAdaptor::getLength() const {
38     return fAsset->getLength();
39 }
40 
isAtEnd() const41 bool AssetStreamAdaptor::isAtEnd() const {
42     return fAsset->getRemainingLength() == 0;
43 }
44 
onDuplicate() const45 SkStreamRewindable* AssetStreamAdaptor::onDuplicate() const {
46     // Cannot create a duplicate, since each AssetStreamAdaptor
47     // would be modifying the Asset.
48     //return new AssetStreamAdaptor(fAsset);
49     return NULL;
50 }
51 
hasPosition() const52 bool AssetStreamAdaptor::hasPosition() const {
53     return fAsset->seek(0, SEEK_CUR) != -1;
54 }
55 
getPosition() const56 size_t AssetStreamAdaptor::getPosition() const {
57     const off64_t offset = fAsset->seek(0, SEEK_CUR);
58     if (offset == -1) {
59         SkDebugf("---- fAsset->seek(0, SEEK_CUR) failed\n");
60         return 0;
61     }
62 
63     return offset;
64 }
65 
seek(size_t position)66 bool AssetStreamAdaptor::seek(size_t position) {
67     if (fAsset->seek(position, SEEK_SET) == -1) {
68         SkDebugf("---- fAsset->seek(0, SEEK_SET) failed\n");
69         return false;
70     }
71 
72     return true;
73 }
74 
move(long offset)75 bool AssetStreamAdaptor::move(long offset) {
76     if (fAsset->seek(offset, SEEK_CUR) == -1) {
77         SkDebugf("---- fAsset->seek(%i, SEEK_CUR) failed\n", offset);
78         return false;
79     }
80 
81     return true;
82 }
83 
read(void * buffer,size_t size)84 size_t AssetStreamAdaptor::read(void* buffer, size_t size) {
85     ssize_t amount;
86 
87     if (NULL == buffer) {
88         if (0 == size) {
89             return 0;
90         }
91         // asset->seek returns new total offset
92         // we want to return amount that was skipped
93 
94         off64_t oldOffset = fAsset->seek(0, SEEK_CUR);
95         if (-1 == oldOffset) {
96             SkDebugf("---- fAsset->seek(oldOffset) failed\n");
97             return 0;
98         }
99         off64_t newOffset = fAsset->seek(size, SEEK_CUR);
100         if (-1 == newOffset) {
101             SkDebugf("---- fAsset->seek(%d) failed\n", size);
102             return 0;
103         }
104         amount = newOffset - oldOffset;
105     } else {
106         amount = fAsset->read(buffer, size);
107     }
108 
109     if (amount < 0) {
110         amount = 0;
111     }
112     return amount;
113 }
114 
CopyAssetToStream(Asset * asset)115 SkMemoryStream* android::CopyAssetToStream(Asset* asset) {
116     if (NULL == asset) {
117         return NULL;
118     }
119 
120     const off64_t seekReturnVal = asset->seek(0, SEEK_SET);
121     if ((off64_t)-1 == seekReturnVal) {
122         SkDebugf("---- copyAsset: asset rewind failed\n");
123         return NULL;
124     }
125 
126     const off64_t size = asset->getLength();
127     if (size <= 0) {
128         SkDebugf("---- copyAsset: asset->getLength() returned %d\n", size);
129         return NULL;
130     }
131 
132     sk_sp<SkData> data(SkData::MakeUninitialized(size));
133     const off64_t len = asset->read(data->writable_data(), size);
134     if (len != size) {
135         SkDebugf("---- copyAsset: asset->read(%d) returned %d\n", size, len);
136         return NULL;
137     }
138 
139     return new SkMemoryStream(std::move(data));
140 }
141 
nullObjectReturn(const char msg[])142 jobject android::nullObjectReturn(const char msg[]) {
143     if (msg) {
144         SkDebugf("--- %s\n", msg);
145     }
146     return NULL;
147 }
148 
isSeekable(int descriptor)149 bool android::isSeekable(int descriptor) {
150     return ::lseek64(descriptor, 0, SEEK_CUR) != -1;
151 }
152 
get_env_or_die(JavaVM * jvm)153 JNIEnv* android::get_env_or_die(JavaVM* jvm) {
154     JNIEnv* env;
155     if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
156         LOG_ALWAYS_FATAL("Failed to get JNIEnv for JavaVM: %p", jvm);
157     }
158     return env;
159 }
160