Esempio n. 1
0
	bool Serialize(GFile &f, bool Write)
	{
		if (Data && Write)
		{
			f.Write(Data->Data, Data->Len);
			return true;
		}

		return false;
	}
Esempio n. 2
0
/*
====================
Save
====================
*/
VOID EChunk::Save(GFile& file)
{
	GUARD(EChunk::Save);

	// write the chunk header
	U32 header = MAKEFOURCC('G','C','H','K');
	file.Write(&header, sizeof(U32));

	// write the number of layers
	U32 num_layer = mLayers.size();
	file.Write(&num_layer, sizeof(U32));

	// write all of the layers
	if(mLayers.size() == 1)
	{
		Layer& layer = mLayers[0];

		// write the texture
		U32 name_len = layer.name.size();
		file.Write(&name_len, sizeof(U32));
		file.Write(layer.name.c_str(), name_len*sizeof(CHAR));
		file.Write(layer.st.ptr(), 2*sizeof(F32));

		// write the alpha
		U32 width = 1;
		file.Write(&width, sizeof(U32));
		U32 height = 1;
		file.Write(&height, sizeof(U32));
		U8 alpha = 127;
		file.Write(&alpha, sizeof(U8));
	}
	else
	{
		for(I32 k = 0; k < mLayers.size(); k++)
		{
			Layer& layer = mLayers[k];

			// write the texture
			U32 name_len = layer.name.size();
			file.Write(&name_len, sizeof(U32));
			file.Write(layer.name.c_str(), name_len*sizeof(CHAR));
			file.Write(layer.st.ptr(), 2*sizeof(F32));

			// write the alpha
			U32 width = U2P(ALPHA_STRIDE);
			file.Write(&width, sizeof(U32));
			U32 height = U2P(ALPHA_STRIDE);
			file.Write(&height, sizeof(U32));
			if(k==0)
			{
				std::vector<U8>data(width*height);
				for(U32 j = 0; j < height; j++)
				{
					for( U32 i = 0; i < width; i++)
					{
						U8& alpha = layer.alpha[i+j*width];
						U8& mask = mMask[i+j*width];
						if(mask == 0) data[i+j*width] = (U8)(((F32)alpha)/255.0f*127.0f);
						else data[i+j*width] = (U8)(((F32)alpha)/255.0f*127.0f)+128;
					}
				}
				file.Write(&data[0], width*height*sizeof(U8));
			}
			else
			{
				file.Write(&layer.alpha[0], width*height*sizeof(U8));
			}
		}
	}	

	UNGUARD;
}