rsFileA3D.cpp revision af12ac6a08651464f8d823add667c706f993b587
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" 23a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 24d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 25a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android; 26a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android::renderscript; 27a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 28afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::FileA3D(Context *rsc) : ObjectBase(rsc) { 29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = NULL; 30fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = NULL; 31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = NULL; 32fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = NULL; 335224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk mAsset = NULL; 34fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 35fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMajorVersion = 0; 36fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMinorVersion = 1; 37fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mDataSize = 0; 38a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 39a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 40afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::~FileA3D() { 41afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mIndex.size(); i ++) { 42fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mIndex[i]; 43fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 44afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mWriteIndex.size(); i ++) { 45fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteIndex[i]; 46fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 47afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream) { 48fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 50afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mReadStream) { 51fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 53afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAlloc) { 54fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mAlloc); 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 565224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (mAsset) { 575224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk delete mAsset; 585224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 59a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 60a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 61afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid FileA3D::parseHeader(IStream *headerStream) { 62b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMajorVersion = headerStream->loadU32(); 63b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMinorVersion = headerStream->loadU32(); 64b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t flags = headerStream->loadU32(); 65b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mUse64BitOffsets = (flags & 1) != 0; 66b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 67b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numIndexEntries = headerStream->loadU32(); 68afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numIndexEntries; i ++) { 69b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk A3DIndexEntry *entry = new A3DIndexEntry(); 70b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream->loadString(&entry->mObjectName); 716598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("Header data, entry name = %s", entry->mObjectName.string()); 72b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mType = (RsA3DClassID)headerStream->loadU32(); 73afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 74b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadOffset(); 75b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadOffset(); 76afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 77b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadU32(); 78b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadU32(); 79b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 80b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = NULL; 81b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mIndex.push(entry); 82b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 83b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 84b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 855224a27798f89093b13722b41143551a057ce550Alex Sakhartchoukbool FileA3D::load(Asset *asset) { 865224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk mAsset = asset; 875224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return load(asset->getBuffer(false), asset->getLength()); 885224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 895224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 90afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(const void *data, size_t length) { 91b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const uint8_t *localData = (const uint8_t *)data; 92b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 93b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t lengthRemaining = length; 94b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t magicStrLen = 12; 95b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if ((length < magicStrLen) || 96b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcmp(data, "Android3D_ff", magicStrLen)) { 97b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 98b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 99b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 100b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += magicStrLen; 101b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= magicStrLen; 102b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 103b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Next we get our header size 104b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint64_t headerSize = 0; 105afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(headerSize)) { 106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 108b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 109b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&headerSize, localData, sizeof(headerSize)); 110b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(headerSize); 111b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(headerSize); 112b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 113afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < headerSize) { 114b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 115b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 116b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 117b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Now open the stream to parse the header 118dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk IStream headerStream(localData, false); 119b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 120b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 121b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += headerSize; 122b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= headerSize; 123b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 124afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(mDataSize)) { 125b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 126b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 127b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 128b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Read the size of the data 129b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&mDataSize, localData, sizeof(mDataSize)); 130b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(mDataSize); 131b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(mDataSize); 132b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 133afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < mDataSize) { 134b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 135b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 136b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 137b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // We should know enough to read the file in at this point. 138dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk mData = (uint8_t *)localData; 139b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 140b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 141b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return true; 142b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 143b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 144afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(FILE *f) { 145a5597fcd411badad50c1345b3eca26453da45bbbJason Sams char magicString[12]; 146a5597fcd411badad50c1345b3eca26453da45bbbJason Sams size_t len; 147a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 1486598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("file open 1"); 149a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(magicString, 1, 12, f); 150a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if ((len != 12) || 151a5597fcd411badad50c1345b3eca26453da45bbbJason Sams memcmp(magicString, "Android3D_ff", 12)) { 152a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 153a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 154a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = 0; 157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&headerSize, 1, sizeof(headerSize), f); 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(headerSize) || headerSize == 0) { 159a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 160a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 161a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *headerData = (uint8_t *)malloc(headerSize); 163afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!headerData) { 164a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 165a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 166a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(headerData, 1, headerSize, f); 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != headerSize) { 169a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 170a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now open the stream to parse the header 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk IStream headerStream(headerData, false); 174b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 176b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk free(headerData); 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 179fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&mDataSize, 1, sizeof(mDataSize), f); 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(mDataSize) || mDataSize == 0) { 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 182a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 183a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 1846598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("file open size = %lli", mDataSize); 185a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 186a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We should know enough to read the file in at this point. 187fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = malloc(mDataSize); 188a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (!mAlloc) { 189a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 190a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 191a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = (uint8_t *)mAlloc; 192a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(mAlloc, 1, mDataSize, f); 193a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != mDataSize) { 194a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 195a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 196a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1996598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("Header is read an stream initialized"); 200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 202a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 203b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouksize_t FileA3D::getNumIndexEntries() const { 204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex.size(); 205a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 206a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 207b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchoukconst FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const { 208afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index < mIndex.size()) { 209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex[index]; 210a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 212fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 213a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 214b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex SakhartchoukObjectBase *FileA3D::initializeFromEntry(size_t index) { 215afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index >= mIndex.size()) { 216b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 217b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 218b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 219b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D::A3DIndexEntry *entry = mIndex[index]; 220afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!entry) { 221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 222a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 223a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 224afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 225b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 226b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 227b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 228b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Seek to the beginning of object 230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream->reset(entry->mOffset); 231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk switch (entry->mType) { 232b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_UNKNOWN: 233fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 234b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_MESH: 235b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Mesh::createFromStream(mRSC, mReadStream); 236b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 237b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_TYPE: 238b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Type::createFromStream(mRSC, mReadStream); 239b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 240b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ELEMENT: 241b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Element::createFromStream(mRSC, mReadStream); 242b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 243b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ALLOCATION: 244b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Allocation::createFromStream(mRSC, mReadStream); 245b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 246b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_VERTEX: 247099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramVertex::createFromStream(mRSC, mReadStream); 248b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 249b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_RASTER: 250099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramRaster::createFromStream(mRSC, mReadStream); 251b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 252b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_FRAGMENT: 253099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramFragment::createFromStream(mRSC, mReadStream); 254b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 255b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_STORE: 256099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramStore::createFromStream(mRSC, mReadStream); 257b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 258b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SAMPLER: 259099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Sampler::createFromStream(mRSC, mReadStream); 260b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 261b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ANIMATION: 262099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Animation::createFromStream(mRSC, mReadStream); 263b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 264b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_1D: 265099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter1D::createFromStream(mRSC, mReadStream); 266b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 267b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_2D: 268099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter2D::createFromStream(mRSC, mReadStream); 269b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 270b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SCRIPT_C: 271099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk break; 272a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 273afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 274b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 275b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 276b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 277a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 278a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 279afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::writeFile(const char *filename) { 280afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 281af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 282fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 283a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 284afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream->getPos() == 0) { 285af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 286fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 287a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 288a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 289fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk FILE *writeHandle = fopen(filename, "wb"); 290afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!writeHandle) { 291af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't open the file for writing\n"); 292fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 293b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 294b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 295fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Open a new stream to make writing the header easier 296fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk OStream headerStream(5*1024, false); 297fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMajorVersion); 298fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMinorVersion); 299fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t is64Bit = 0; 300fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(is64Bit); 301fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 302fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t writeIndexSize = mWriteIndex.size(); 303fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(writeIndexSize); 304afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < writeIndexSize; i ++) { 305b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addString(&mWriteIndex[i]->mObjectName); 306fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32((uint32_t)mWriteIndex[i]->mType); 307afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 308fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mOffset); 309b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mLength); 310afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 311fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset; 312fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(offset); 313b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk offset = (uint32_t)mWriteIndex[i]->mLength; 314b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addU32(offset); 315b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 316a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 317a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 318fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write our magic string so we know we are reading the right file 319fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 magicString(A3D_MAGIC_KEY); 320fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(magicString.string(), sizeof(char), magicString.size(), writeHandle); 321a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 322fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the size of the header to make it easier to parse when we read it 323fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = headerStream.getPos(); 324fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&headerSize, sizeof(headerSize), 1, writeHandle); 325a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 326fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write our header 327fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle); 328a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 329fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the size of the data part of the file for easier parsing later 330fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t fileDataSize = mWriteStream->getPos(); 331fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle); 332a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 333fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle); 334b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 335fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk int status = fclose(writeHandle); 336a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 337afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (status != 0) { 338af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't close file\n"); 339fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 340fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 341a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 342fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 343fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 344fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 345fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid FileA3D::appendToFile(ObjectBase *obj) { 346afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!obj) { 347fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return; 348fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 349afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 350fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk const uint64_t initialStreamSize = 256*1024; 351fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = new OStream(initialStreamSize, false); 352a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 353fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DIndexEntry *indexEntry = new A3DIndexEntry(); 354b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mObjectName.setTo(obj->getName()); 355fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mType = obj->getClassId(); 356fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mOffset = mWriteStream->getPos(); 357b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mRsObj = obj; 358fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteIndex.push(indexEntry); 359fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk obj->serialize(mWriteStream); 360b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset; 361b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mWriteStream->align(4); 362a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 363a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 364afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) { 365dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 366afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 367af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load entry. No valid file"); 368dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return NULL; 369dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk } 370dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 371dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk ObjectBase *obj = fa3d->initializeFromEntry(index); 3726598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("Returning object with name %s", obj->getName()); 373dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 374dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return obj; 375dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 376dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 377dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 378afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file) { 379b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 380b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 381afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (fa3d) { 382b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = fa3d->getNumIndexEntries(); 383afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 384b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = 0; 385b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 386b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 387b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 388afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file) { 389b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 390b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 391afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 392af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load index entries. No valid file"); 393b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 394b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 395b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 396b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numFileEntries = fa3d->getNumIndexEntries(); 397afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numFileEntries != numEntries || numEntries == 0 || fileEntries == NULL) { 398af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Can't load index entries. Invalid number requested"); 399b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 400b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 401b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 402afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numFileEntries; i ++) { 403b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i); 404b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fileEntries[i].classID = entry->getType(); 405b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fileEntries[i].objectName = entry->getObjectName().string(); 406b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 407b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 408b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 4095224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) { 410b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if (data == NULL) { 411af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("File load failed. Asset stream is NULL"); 412b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 413b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 414b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 415dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk Context *rsc = static_cast<Context *>(con); 416b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 417b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fa3d->incUserRef(); 418b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 419dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk fa3d->load(data, len); 420b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return fa3d; 421b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 4225224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4235224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromAsset(RsContext con, void *_asset) { 4245224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Context *rsc = static_cast<Context *>(con); 4255224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Asset *asset = static_cast<Asset *>(_asset); 4265224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 4275224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->incUserRef(); 4285224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4295224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->load(asset); 4305224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return fa3d; 4315224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 4325224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4335224a27798f89093b13722b41143551a057ce550Alex SakhartchoukRsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) { 4345224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (path == NULL) { 435af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("File load failed. Path is NULL"); 4365224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return NULL; 4375224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 4385224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4395224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk Context *rsc = static_cast<Context *>(con); 4405224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FileA3D *fa3d = NULL; 4415224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4425224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk FILE *f = fopen(path, "rb"); 4435224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk if (f) { 4445224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d = new FileA3D(rsc); 4455224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->incUserRef(); 4465224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fa3d->load(f); 4475224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk fclose(f); 4485224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } else { 449af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Could not open file %s", path); 4505224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk } 4515224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 4525224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk return fa3d; 4535224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 454