rsFileA3D.cpp revision dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48
1a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 2a5597fcd411badad50c1345b3eca26453da45bbbJason Sams/* 3a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Copyright (C) 2009 The Android Open Source Project 4a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * 5a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 6a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * you may not use this file except in compliance with the License. 7a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * You may obtain a copy of the License at 8a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * 9a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * http://www.apache.org/licenses/LICENSE-2.0 10a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * 11a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Unless required by applicable law or agreed to in writing, software 12a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 13a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * See the License for the specific language governing permissions and 15a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * limitations under the License. 16a5597fcd411badad50c1345b3eca26453da45bbbJason Sams */ 17a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 18a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsContext.h" 19a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsFileA3D.h" 20a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 21a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsMesh.h" 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsAnimation.h" 23e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#include "rs.h" 24d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 25a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#if !defined(__RS_PDK__) 26a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams #include <androidfw/Asset.h> 27a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#endif 28a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams 29a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android; 30a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android::renderscript; 31a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 32afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::FileA3D(Context *rsc) : ObjectBase(rsc) { 33fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = NULL; 34fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = NULL; 35fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = NULL; 36fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = NULL; 375224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk mAsset = NULL; 38fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 39fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMajorVersion = 0; 40fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMinorVersion = 1; 41fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mDataSize = 0; 42a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 43a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 44afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::~FileA3D() { 45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mIndex.size(); i ++) { 46fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mIndex[i]; 47fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 48afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mWriteIndex.size(); i ++) { 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteIndex[i]; 50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream) { 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mReadStream) { 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 57afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAlloc) { 58fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mAlloc); 59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 605224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (mAsset) { 61a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#if !defined(__RS_PDK__) 625224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk delete mAsset; 63a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#endif 645224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 65a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 66a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid FileA3D::parseHeader(IStream *headerStream) { 68b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMajorVersion = headerStream->loadU32(); 69b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMinorVersion = headerStream->loadU32(); 70b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t flags = headerStream->loadU32(); 71b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mUse64BitOffsets = (flags & 1) != 0; 72b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 73b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numIndexEntries = headerStream->loadU32(); 74afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numIndexEntries; i ++) { 75b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk A3DIndexEntry *entry = new A3DIndexEntry(); 76b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream->loadString(&entry->mObjectName); 776598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("Header data, entry name = %s", entry->mObjectName.string()); 78b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mType = (RsA3DClassID)headerStream->loadU32(); 79afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 80b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadOffset(); 81b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadOffset(); 82afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 83b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadU32(); 84b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadU32(); 85b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 86b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = NULL; 87b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mIndex.push(entry); 88b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 89b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 90b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 915224a27798f89093b13722b41143551a057ce550Alex Sakhartchoukbool FileA3D::load(Asset *asset) { 92a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#if !defined(__RS_PDK__) 935224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk mAsset = asset; 945224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return load(asset->getBuffer(false), asset->getLength()); 95a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#else 96a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams return false; 97a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#endif 985224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 995224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 100afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(const void *data, size_t length) { 101b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const uint8_t *localData = (const uint8_t *)data; 102b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 103b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t lengthRemaining = length; 104b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t magicStrLen = 12; 105b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if ((length < magicStrLen) || 106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcmp(data, "Android3D_ff", magicStrLen)) { 107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 108b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 109b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 110b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += magicStrLen; 111b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= magicStrLen; 112b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 113b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Next we get our header size 114b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint64_t headerSize = 0; 115afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(headerSize)) { 116b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 117b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 118b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 119b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&headerSize, localData, sizeof(headerSize)); 120b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(headerSize); 121b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(headerSize); 122b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 123afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < headerSize) { 124b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 125b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 126b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 127b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Now open the stream to parse the header 128dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk IStream headerStream(localData, false); 129b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 130b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 131b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += headerSize; 132b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= headerSize; 133b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 134afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(mDataSize)) { 135b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 136b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 137b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 138b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Read the size of the data 139b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&mDataSize, localData, sizeof(mDataSize)); 140b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(mDataSize); 141b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(mDataSize); 142b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 143afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < mDataSize) { 144b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 145b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 146b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 147b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // We should know enough to read the file in at this point. 148dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk mData = (uint8_t *)localData; 149b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 150b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 151b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return true; 152b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 153b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 154afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(FILE *f) { 155a5597fcd411badad50c1345b3eca26453da45bbbJason Sams char magicString[12]; 156a5597fcd411badad50c1345b3eca26453da45bbbJason Sams size_t len; 157a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 1586598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("file open 1"); 159a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(magicString, 1, 12, f); 160a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if ((len != 12) || 161a5597fcd411badad50c1345b3eca26453da45bbbJason Sams memcmp(magicString, "Android3D_ff", 12)) { 162a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 163a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 164a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = 0; 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&headerSize, 1, sizeof(headerSize), f); 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(headerSize) || headerSize == 0) { 169a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 170a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 171a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *headerData = (uint8_t *)malloc(headerSize); 173afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!headerData) { 174a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 175a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 176a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(headerData, 1, headerSize, f); 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != headerSize) { 179a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 180a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now open the stream to parse the header 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk IStream headerStream(headerData, false); 184b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 186b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk free(headerData); 187fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 188fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&mDataSize, 1, sizeof(mDataSize), f); 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(mDataSize) || mDataSize == 0) { 191fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 192a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 193a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 1946598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("file open size = %lli", mDataSize); 195a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 196a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We should know enough to read the file in at this point. 197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = malloc(mDataSize); 198a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (!mAlloc) { 199a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 200a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = (uint8_t *)mAlloc; 202a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(mAlloc, 1, mDataSize, f); 203a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != mDataSize) { 204a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 205a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 206a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 207fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 208fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2096598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("Header is read an stream initialized"); 210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 211a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 212a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 213b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouksize_t FileA3D::getNumIndexEntries() const { 214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex.size(); 215a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 216a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 217b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchoukconst FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const { 218afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index < mIndex.size()) { 219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex[index]; 220a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 222fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 223a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 224b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex SakhartchoukObjectBase *FileA3D::initializeFromEntry(size_t index) { 225afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index >= mIndex.size()) { 226b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 227b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 228b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 229b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D::A3DIndexEntry *entry = mIndex[index]; 230afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!entry) { 231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 232a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 233a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 234afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 235b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 236b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 237b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 238b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 239fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Seek to the beginning of object 240fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream->reset(entry->mOffset); 241fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk switch (entry->mType) { 242b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_UNKNOWN: 243fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 244b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_MESH: 245b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Mesh::createFromStream(mRSC, mReadStream); 246b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 247b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_TYPE: 248b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Type::createFromStream(mRSC, mReadStream); 249b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 250b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ELEMENT: 251b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Element::createFromStream(mRSC, mReadStream); 252b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 253b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ALLOCATION: 254b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Allocation::createFromStream(mRSC, mReadStream); 255b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 256b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_VERTEX: 257099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramVertex::createFromStream(mRSC, mReadStream); 258b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 259b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_RASTER: 260099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramRaster::createFromStream(mRSC, mReadStream); 261b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 262b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_FRAGMENT: 263099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramFragment::createFromStream(mRSC, mReadStream); 264b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 265b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_STORE: 266099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramStore::createFromStream(mRSC, mReadStream); 267b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 268b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SAMPLER: 269099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Sampler::createFromStream(mRSC, mReadStream); 270b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 271b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ANIMATION: 272099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Animation::createFromStream(mRSC, mReadStream); 273b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 274b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_1D: 275099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter1D::createFromStream(mRSC, mReadStream); 276b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 277b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_2D: 278099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter2D::createFromStream(mRSC, mReadStream); 279b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 280b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SCRIPT_C: 281099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk break; 282dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_KERNEL_ID: 283dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 284dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_FIELD_ID: 285dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 286dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_METHOD_ID: 287dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 288dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_GROUP: 289dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 290a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 291afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 292b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 293b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 294b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 295a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 296a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::writeFile(const char *filename) { 298afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 299af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 300fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 301a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 302afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream->getPos() == 0) { 303af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 304fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 305a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 306a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 307fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk FILE *writeHandle = fopen(filename, "wb"); 308afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!writeHandle) { 309af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't open the file for writing\n"); 310fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 311b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 312b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 313fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Open a new stream to make writing the header easier 314fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk OStream headerStream(5*1024, false); 315fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMajorVersion); 316fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMinorVersion); 317fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t is64Bit = 0; 318fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(is64Bit); 319fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 320fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t writeIndexSize = mWriteIndex.size(); 321fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(writeIndexSize); 322afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < writeIndexSize; i ++) { 323b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addString(&mWriteIndex[i]->mObjectName); 324fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32((uint32_t)mWriteIndex[i]->mType); 325afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 326fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mOffset); 327b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mLength); 328afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 329fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset; 330fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(offset); 331b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk offset = (uint32_t)mWriteIndex[i]->mLength; 332b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addU32(offset); 333b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 334a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 335a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 336fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write our magic string so we know we are reading the right file 337fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 magicString(A3D_MAGIC_KEY); 338fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(magicString.string(), sizeof(char), magicString.size(), writeHandle); 339a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 340fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the size of the header to make it easier to parse when we read it 341fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = headerStream.getPos(); 342fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&headerSize, sizeof(headerSize), 1, writeHandle); 343a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 344fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write our header 345fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle); 346a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 347fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the size of the data part of the file for easier parsing later 348fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t fileDataSize = mWriteStream->getPos(); 349fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle); 350a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 351fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle); 352b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 353fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk int status = fclose(writeHandle); 354a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 355afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (status != 0) { 356af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't close file\n"); 357fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 358fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 359a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 360fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 361fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 362fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 363e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid FileA3D::appendToFile(Context *con, ObjectBase *obj) { 364afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!obj) { 365fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return; 366fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 367afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 368fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk const uint64_t initialStreamSize = 256*1024; 369fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = new OStream(initialStreamSize, false); 370a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 371fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DIndexEntry *indexEntry = new A3DIndexEntry(); 372b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mObjectName.setTo(obj->getName()); 373fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mType = obj->getClassId(); 374fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mOffset = mWriteStream->getPos(); 375b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mRsObj = obj; 376fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteIndex.push(indexEntry); 377e3150cfb3edb028407669e4a65e087eae77e718cJason Sams obj->serialize(con, mWriteStream); 378b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset; 379b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mWriteStream->align(4); 380a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 381a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 382afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) { 383dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 384afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 385af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load entry. No valid file"); 386dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return NULL; 387dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk } 388dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 389dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk ObjectBase *obj = fa3d->initializeFromEntry(index); 3906598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("Returning object with name %s", obj->getName()); 391dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 392dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return obj; 393dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 394dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 395dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 396afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file) { 397b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 398b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 399afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (fa3d) { 400b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = fa3d->getNumIndexEntries(); 401afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 402b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = 0; 403b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 404b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 405b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 406afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file) { 407b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 408b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 409afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 410af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load index entries. No valid file"); 411b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 412b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 413b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 414b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numFileEntries = fa3d->getNumIndexEntries(); 415afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numFileEntries != numEntries || numEntries == 0 || fileEntries == NULL) { 416af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load index entries. Invalid number requested"); 417b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 418b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 419b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 420afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numFileEntries; i ++) { 421b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i); 422b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fileEntries[i].classID = entry->getType(); 423b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fileEntries[i].objectName = entry->getObjectName().string(); 424b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 425b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 426b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 4275224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) { 428b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if (data == NULL) { 429af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("File load failed. Asset stream is NULL"); 430b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 431b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 432b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 433dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk Context *rsc = static_cast<Context *>(con); 434b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 435b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fa3d->incUserRef(); 436b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 437dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk fa3d->load(data, len); 438b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return fa3d; 439b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 4405224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4415224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromAsset(RsContext con, void *_asset) { 442a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#if !defined(__RS_PDK__) 4435224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Context *rsc = static_cast<Context *>(con); 4445224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Asset *asset = static_cast<Asset *>(_asset); 4455224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 4465224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->incUserRef(); 4475224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4485224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->load(asset); 4495224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return fa3d; 450a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#else 451a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams return NULL; 452a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#endif 4535224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 4545224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4555224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) { 4565224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (path == NULL) { 457af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("File load failed. Path is NULL"); 4585224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return NULL; 4595224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 4605224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4615224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Context *rsc = static_cast<Context *>(con); 4625224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FileA3D *fa3d = NULL; 4635224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4645224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FILE *f = fopen(path, "rb"); 4655224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (f) { 4665224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d = new FileA3D(rsc); 4675224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->incUserRef(); 4685224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->load(f); 4695224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fclose(f); 4705224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } else { 471af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Could not open file %s", path); 4725224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 4735224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4745224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return fa3d; 4755224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 476