//! LoadFromBinPng void Texture::LoadFromBinPng(const std::string& path, int& channels, int& bpp) { int width; int height; File* pFile = File::Create(path.c_str(), File::M_ReadBinary); pFile->Open(); pFile->ReadData(&width, 1); pFile->ReadData(&height, 1); pFile->ReadData(&channels, 1); pFile->ReadData(&bpp, 1); auto size = width*height*bpp; if (File::GetUseDataFolder()) { auto data = snew uchar[size]; pFile->ReadData(data, size); m_pData = data; m_bOwnData = true; } else { m_pData = pFile->GetData(size); m_bOwnData = false; } m_vSize.Set(float(width), float(height)); pFile->Close(); delete pFile; }
void MemoryStream::Write(const void* data, size_t size) { //цикл копирования while(size) { File* file = files[files.size() - 1]; size_t lastFileSize = file->GetSize(); //если в последнем файле есть место if(lastDataSize < lastFileSize) { //скопировать данные size_t toCopy = std::min(size, lastFileSize - lastDataSize); memcpy((char*)file->GetData() + lastDataSize, data, toCopy); data = (char*)data + toCopy; size -= toCopy; dataSize += toCopy; lastDataSize += toCopy; } //иначе места нет else { //выделить новый файл files.push_back(NEW(MemoryFile(dataSize))); lastDataSize = 0; } } }
void MemoryStream::Compact() { //если файлов больше одного if(files.size() > 1) { //создать файл для всех данных ptr<File> file = NEW(MemoryFile(dataSize)); //скопировать в него данные всех файлов char* data = (char*)file->GetData(); for(size_t i = 0; i < files.size(); ++i) { File* file = &*files[i]; size_t size = (i < files.size() - 1) ? file->GetSize() : lastDataSize; memcpy(data, file->GetData(), size); data += size; } //заменить все файлы на один files.assign(1, file); //указать действительные размеры данных lastDataSize = dataSize; } }