Beispiel #1
0
	//! 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;
	}
Beispiel #2
0
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;
		}
	}
}
Beispiel #3
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;
	}
}