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(); 7648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams entry->mObjectName = headerStream->loadString(); 7748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams 786598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("Header data, entry name = %s", entry->mObjectName.string()); 79b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mType = (RsA3DClassID)headerStream->loadU32(); 80afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 81b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadOffset(); 82b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadOffset(); 83afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 84b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadU32(); 85b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadU32(); 86b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 87b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = NULL; 88b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mIndex.push(entry); 89b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 90b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 91b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 925224a27798f89093b13722b41143551a057ce550Alex Sakhartchoukbool FileA3D::load(Asset *asset) { 93a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#if !defined(__RS_PDK__) 945224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk mAsset = asset; 955224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return load(asset->getBuffer(false), asset->getLength()); 96a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#else 97a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams return false; 98a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#endif 995224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 1005224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 101afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(const void *data, size_t length) { 102b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const uint8_t *localData = (const uint8_t *)data; 103b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 104b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t lengthRemaining = length; 105b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t magicStrLen = 12; 106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if ((length < magicStrLen) || 107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcmp(data, "Android3D_ff", magicStrLen)) { 108b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 109b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 110b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 111b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += magicStrLen; 112b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= magicStrLen; 113b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 114b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Next we get our header size 115b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint64_t headerSize = 0; 116afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(headerSize)) { 117b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 118b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 119b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 120b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&headerSize, localData, sizeof(headerSize)); 121b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(headerSize); 122b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(headerSize); 123b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 124afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < headerSize) { 125b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 126b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 127b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 128b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Now open the stream to parse the header 129dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk IStream headerStream(localData, false); 130b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 131b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 132b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += headerSize; 133b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= headerSize; 134b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 135afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(mDataSize)) { 136b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 137b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 138b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 139b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Read the size of the data 140b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&mDataSize, localData, sizeof(mDataSize)); 141b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(mDataSize); 142b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(mDataSize); 143b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 144afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < mDataSize) { 145b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 146b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 147b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 148b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // We should know enough to read the file in at this point. 149dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk mData = (uint8_t *)localData; 150b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 151b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 152b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return true; 153b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 154b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 155afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(FILE *f) { 156a5597fcd411badad50c1345b3eca26453da45bbbJason Sams char magicString[12]; 157a5597fcd411badad50c1345b3eca26453da45bbbJason Sams size_t len; 158a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 1596598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("file open 1"); 160a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(magicString, 1, 12, f); 161a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if ((len != 12) || 162a5597fcd411badad50c1345b3eca26453da45bbbJason Sams memcmp(magicString, "Android3D_ff", 12)) { 163a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 164a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 165a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = 0; 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&headerSize, 1, sizeof(headerSize), f); 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(headerSize) || headerSize == 0) { 170a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 171a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 172a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *headerData = (uint8_t *)malloc(headerSize); 174afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!headerData) { 175a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 176a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 177a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(headerData, 1, headerSize, f); 179fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != headerSize) { 180a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 181a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now open the stream to parse the header 184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk IStream headerStream(headerData, false); 185b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 187b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk free(headerData); 188fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&mDataSize, 1, sizeof(mDataSize), f); 191fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(mDataSize) || mDataSize == 0) { 192fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 193a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 194a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 1956598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("file open size = %lli", mDataSize); 196a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 197a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We should know enough to read the file in at this point. 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = malloc(mDataSize); 199a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (!mAlloc) { 200a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 202a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = (uint8_t *)mAlloc; 203a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(mAlloc, 1, mDataSize, f); 204a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != mDataSize) { 205a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 206a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 207a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 208fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2106598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("Header is read an stream initialized"); 211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 212a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 213a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 214b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouksize_t FileA3D::getNumIndexEntries() const { 215fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex.size(); 216a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 217a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 21848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason SamsFileA3D::A3DIndexEntry::~A3DIndexEntry() { 21948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams delete[] mObjectName; 22048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams} 22148ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams 222b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchoukconst FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const { 223afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index < mIndex.size()) { 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex[index]; 225a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 228a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 229b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex SakhartchoukObjectBase *FileA3D::initializeFromEntry(size_t index) { 230afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index >= mIndex.size()) { 231b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 232b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 233b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 234b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D::A3DIndexEntry *entry = mIndex[index]; 235afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!entry) { 236fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 237a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 238a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 239afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 240b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 241b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 242b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 243b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 244fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Seek to the beginning of object 245fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream->reset(entry->mOffset); 246fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk switch (entry->mType) { 247b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_UNKNOWN: 248fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 249b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_MESH: 250b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Mesh::createFromStream(mRSC, mReadStream); 251b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 252b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_TYPE: 253b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Type::createFromStream(mRSC, mReadStream); 254b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 255b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ELEMENT: 256b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Element::createFromStream(mRSC, mReadStream); 257b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 258b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ALLOCATION: 259b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Allocation::createFromStream(mRSC, mReadStream); 260b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 261b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_VERTEX: 262099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramVertex::createFromStream(mRSC, mReadStream); 263b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 264b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_RASTER: 265099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramRaster::createFromStream(mRSC, mReadStream); 266b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 267b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_FRAGMENT: 268099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramFragment::createFromStream(mRSC, mReadStream); 269b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 270b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_STORE: 271099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramStore::createFromStream(mRSC, mReadStream); 272b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 273b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SAMPLER: 274099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Sampler::createFromStream(mRSC, mReadStream); 275b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 276b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ANIMATION: 277099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Animation::createFromStream(mRSC, mReadStream); 278b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 279b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_1D: 280099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter1D::createFromStream(mRSC, mReadStream); 281b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 282b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_2D: 283099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter2D::createFromStream(mRSC, mReadStream); 284b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 285b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SCRIPT_C: 286099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk break; 287dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_KERNEL_ID: 288dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 289dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_FIELD_ID: 290dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 291dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_METHOD_ID: 292dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 293dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_GROUP: 294dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 295a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 296afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 297b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 298b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 299b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 300a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 301a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 302afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::writeFile(const char *filename) { 303afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 304af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 305fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 306a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 307afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream->getPos() == 0) { 308af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 309fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 310a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 311a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 312fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk FILE *writeHandle = fopen(filename, "wb"); 313afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!writeHandle) { 314af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't open the file for writing\n"); 315fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 316b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 317b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 318fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Open a new stream to make writing the header easier 319fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk OStream headerStream(5*1024, false); 320fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMajorVersion); 321fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMinorVersion); 322fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t is64Bit = 0; 323fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(is64Bit); 324fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 325fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t writeIndexSize = mWriteIndex.size(); 326fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(writeIndexSize); 327afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < writeIndexSize; i ++) { 32848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams headerStream.addString(mWriteIndex[i]->mObjectName); 329fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32((uint32_t)mWriteIndex[i]->mType); 330afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 331fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mOffset); 332b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mLength); 333afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 334fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset; 335fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(offset); 336b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk offset = (uint32_t)mWriteIndex[i]->mLength; 337b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addU32(offset); 338b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 339a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 340a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 341fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write our magic string so we know we are reading the right file 34248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams fwrite(A3D_MAGIC_KEY, sizeof(char), strlen(A3D_MAGIC_KEY), writeHandle); 343a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 344fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the size of the header to make it easier to parse when we read it 345fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = headerStream.getPos(); 346fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&headerSize, sizeof(headerSize), 1, writeHandle); 347a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 348fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write our header 349fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle); 350a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 351fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the size of the data part of the file for easier parsing later 352fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t fileDataSize = mWriteStream->getPos(); 353fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle); 354a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 355fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle); 356b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 357fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk int status = fclose(writeHandle); 358a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 359afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (status != 0) { 360af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't close file\n"); 361fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 362fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 363a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 364fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 365fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 366fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 367e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid FileA3D::appendToFile(Context *con, ObjectBase *obj) { 368afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!obj) { 369fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return; 370fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 371afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 372fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk const uint64_t initialStreamSize = 256*1024; 373fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = new OStream(initialStreamSize, false); 374a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 375fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DIndexEntry *indexEntry = new A3DIndexEntry(); 37648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams indexEntry->mObjectName = rsuCopyString(obj->getName()); 377fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mType = obj->getClassId(); 378fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mOffset = mWriteStream->getPos(); 379b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mRsObj = obj; 380fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteIndex.push(indexEntry); 381e3150cfb3edb028407669e4a65e087eae77e718cJason Sams obj->serialize(con, mWriteStream); 382b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset; 383b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mWriteStream->align(4); 384a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 385a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 386afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) { 387dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 388afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 389af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load entry. No valid file"); 390dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return NULL; 391dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk } 392dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 393dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk ObjectBase *obj = fa3d->initializeFromEntry(index); 3946598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("Returning object with name %s", obj->getName()); 395dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 396dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return obj; 397dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 398dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 399dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 400afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file) { 401b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 402b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 403afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (fa3d) { 404b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = fa3d->getNumIndexEntries(); 405afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 406b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = 0; 407b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 408b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 409b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 410afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file) { 411b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 412b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 413afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 414af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load index entries. No valid file"); 415b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 416b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 417b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 418b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numFileEntries = fa3d->getNumIndexEntries(); 419afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numFileEntries != numEntries || numEntries == 0 || fileEntries == NULL) { 420af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load index entries. Invalid number requested"); 421b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 422b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 423b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 424afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numFileEntries; i ++) { 425b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i); 426b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fileEntries[i].classID = entry->getType(); 42748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams fileEntries[i].objectName = rsuCopyString(entry->getObjectName()); 428b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 429b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 430b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 4315224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) { 432b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if (data == NULL) { 433af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("File load failed. Asset stream is NULL"); 434b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 435b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 436b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 437dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk Context *rsc = static_cast<Context *>(con); 438b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 439b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fa3d->incUserRef(); 440b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 441dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk fa3d->load(data, len); 442b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return fa3d; 443b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 4445224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4455224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromAsset(RsContext con, void *_asset) { 446a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#if !defined(__RS_PDK__) 4475224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Context *rsc = static_cast<Context *>(con); 4485224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Asset *asset = static_cast<Asset *>(_asset); 4495224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 4505224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->incUserRef(); 4515224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4525224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->load(asset); 4535224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return fa3d; 454a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#else 455a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams return NULL; 456a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams#endif 4575224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 4585224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4595224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) { 4605224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (path == NULL) { 461af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("File load failed. Path is NULL"); 4625224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return NULL; 4635224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 4645224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4655224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Context *rsc = static_cast<Context *>(con); 4665224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FileA3D *fa3d = NULL; 4675224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4685224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FILE *f = fopen(path, "rb"); 4695224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (f) { 4705224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d = new FileA3D(rsc); 4715224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->incUserRef(); 4725224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->load(f); 4735224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fclose(f); 4745224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } else { 475af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Could not open file %s", path); 4765224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 4775224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4785224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return fa3d; 4795224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 480