// Common, groups Output and Encoding
// Copyright Alexander Liss

#include "color2.h"
#include "datacoder.h"


	// Tint

int pack(CommBuffer& d, const Tint& z)
{
	int g=0;
	DataCoder coder;
	coder.use(d);

			g=coder.put(z.x1);
	if(!g)	g=coder.put(z.x2);
	if(!g)	g=coder.put(z.x3);

	return g;
}

int unpack(Tint& z,const CommBuffer& s,ReadControl& c)
{
	int g=0;
	DataCoder coder;
	coder.use(s,c);

			g=coder.get(z.x1);
	if(!g)	g=coder.get(z.x2);
	if(!g)	g=coder.get(z.x3);

	return g;
}


	// Color

int pack(CommBuffer& d,const Color& z)
{
	int g=0;
	DataCoder coder;
	coder.use(d);

			g=pack(d,static_cast<Tint>(z));
	if(!g)	g=coder.put(z.x4);

	return g;
}

int unpack(Color& z,const CommBuffer& s,ReadControl& c)
{
	int g=0;
	DataCoder coder;
	coder.use(s,c);

			g=unpack(static_cast<Tint>(z),s,c);
	if(!g)	g=coder.get(z.x4);

	return g;
}


	// Stain

int pack(CommBuffer& d,const Stain& z)
{
	int g=0;
	DataCoder coder;
	coder.use(d);

			g=coder.put(z.x1);
	if(!g)	g=coder.put(z.x2);
	if(!g)	g=coder.put(z.x3);


	return g;
}

int unpack(Stain& z,const CommBuffer& s,ReadControl& c)
{
	int g=0;
	DataCoder coder;
	coder.use(s,c);

			g=coder.get(z.x1);
	if(!g)	g=coder.get(z.x2);
	if(!g)	g=coder.get(z.x3);

	return g;
}

	// RandomColor

int pack(CommBuffer& d, const RandomColor& z)
{
	int g=0;
	DataCoder coder;
	coder.use(d);

	g=pack(d,z.sum);

	if(!g) g=pack(d,z.units.size());

	for(int i=0;i<z.units.size();++i)
	{
		if(!g) g=pack(d,z.units[i].c);
		if(!g) g=pack(d,z.units[i].p);
	}

	return g;
}

int unpack(RandomColor& z,const CommBuffer& s,ReadControl& c)
{
	int g=0;
	DataCoder coder;
	coder.use(s,c);
	z.clear();

	g=unpack(z.sum,s,c);

	int size=0;
	g=unpack(size,s,c);

	z.units.set_size(size);

	for(int i=0;i<size;++i)
	{
		if(!g) g=unpack(z.units[i].c,s,c);
		if(!g) g=unpack(z.units[i].p,s,c);
	}

	return g;
}