/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief RGBA8888 color type.
 *//*--------------------------------------------------------------------*/

#include "tcuRGBA.hpp"
#include "tcuVector.hpp"

namespace tcu
{

const RGBA	RGBA::red		(0xFF, 0x0,  0x0,  0xFF);
const RGBA	RGBA::green		(0x0,  0xFF, 0x0,  0xFF);
const RGBA	RGBA::blue		(0x0,  0x0,  0xFF, 0xFF);
const RGBA	RGBA::gray		(0x80, 0x80, 0x80, 0xFF);
const RGBA	RGBA::white		(0xFF, 0xFF, 0xFF, 0xFF);
const RGBA	RGBA::black		(0x0,  0x0,	 0x0,  0xFF);

RGBA::RGBA (const Vec4& v)
{
	int r = deClamp32(int(v.x() * 255.0f + 0.5f), 0, 255);
	int g = deClamp32(int(v.y() * 255.0f + 0.5f), 0, 255);
	int b = deClamp32(int(v.z() * 255.0f + 0.5f), 0, 255);
	int a = deClamp32(int(v.w() * 255.0f + 0.5f), 0, 255);
	m_value = (a << ALPHA_SHIFT) | (r << RED_SHIFT) | (g << GREEN_SHIFT) | (b << BLUE_SHIFT);
}

Vec4 RGBA::toVec (void) const
{
	return Vec4(float(getRed())		/ 255.0f,
				float(getGreen())	/ 255.0f,
				float(getBlue())	/ 255.0f,
				float(getAlpha())	/ 255.0f);
}

IVec4 RGBA::toIVec (void) const
{
	return IVec4(getRed(), getGreen(), getBlue(), getAlpha());
}

RGBA computeAbsDiffMasked (RGBA a, RGBA b, deUint32 cmpMask)
{
	deUint32	aPacked = a.getPacked();
	deUint32	bPacked = b.getPacked();
	deUint8		rDiff	= 0;
	deUint8		gDiff	= 0;
	deUint8		bDiff	= 0;
	deUint8		aDiff	= 0;

	if (cmpMask & RGBA::RED_MASK)
	{
		int ra = (aPacked >> RGBA::RED_SHIFT) & 0xFF;
		int rb = (bPacked >> RGBA::RED_SHIFT) & 0xFF;

		rDiff = (deUint8)deAbs32(ra - rb);
	}

	if (cmpMask & RGBA::GREEN_MASK)
	{
		int ga = (aPacked >> RGBA::GREEN_SHIFT) & 0xFF;
		int gb = (bPacked >> RGBA::GREEN_SHIFT) & 0xFF;

		gDiff = (deUint8)deAbs32(ga - gb);
	}

	if (cmpMask & RGBA::BLUE_MASK)
	{
		int ba = (aPacked >> RGBA::BLUE_SHIFT) & 0xFF;
		int bb = (bPacked >> RGBA::BLUE_SHIFT) & 0xFF;

		bDiff = (deUint8)deAbs32(ba - bb);
	}

	if (cmpMask & RGBA::ALPHA_MASK)
	{
		int aa = (aPacked >> RGBA::ALPHA_SHIFT) & 0xFF;
		int ab = (bPacked >> RGBA::ALPHA_SHIFT) & 0xFF;

		aDiff = (deUint8)deAbs32(aa - ab);
	}

	return RGBA(rDiff,gDiff,bDiff,aDiff);
}

bool compareThresholdMasked	(RGBA a, RGBA b, RGBA threshold, deUint32 cmpMask)
{
	return computeAbsDiffMasked(a, b, cmpMask).isBelowThreshold(threshold);
}

} // tcu
