1/*-------------------------------------------------------------------------
2 * drawElements Quality Program Tester Core
3 * ----------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief RGBA8888 color type.
22 *//*--------------------------------------------------------------------*/
23
24#include "tcuRGBA.hpp"
25#include "tcuVector.hpp"
26#include "tcuTextureUtil.hpp"
27
28namespace tcu
29{
30
31RGBA::RGBA (const Vec4& v)
32{
33	const deUint32 r = (deUint32)floatToU8(v.x());
34	const deUint32 g = (deUint32)floatToU8(v.y());
35	const deUint32 b = (deUint32)floatToU8(v.z());
36	const deUint32 a = (deUint32)floatToU8(v.w());
37	m_value = (a << ALPHA_SHIFT) | (r << RED_SHIFT) | (g << GREEN_SHIFT) | (b << BLUE_SHIFT);
38}
39
40Vec4 RGBA::toVec (void) const
41{
42	return Vec4(float(getRed())		/ 255.0f,
43				float(getGreen())	/ 255.0f,
44				float(getBlue())	/ 255.0f,
45				float(getAlpha())	/ 255.0f);
46}
47
48IVec4 RGBA::toIVec (void) const
49{
50	return IVec4(getRed(), getGreen(), getBlue(), getAlpha());
51}
52
53RGBA computeAbsDiffMasked (RGBA a, RGBA b, deUint32 cmpMask)
54{
55	deUint32	aPacked = a.getPacked();
56	deUint32	bPacked = b.getPacked();
57	deUint8		rDiff	= 0;
58	deUint8		gDiff	= 0;
59	deUint8		bDiff	= 0;
60	deUint8		aDiff	= 0;
61
62	if (cmpMask & RGBA::RED_MASK)
63	{
64		int ra = (aPacked >> RGBA::RED_SHIFT) & 0xFF;
65		int rb = (bPacked >> RGBA::RED_SHIFT) & 0xFF;
66
67		rDiff = (deUint8)deAbs32(ra - rb);
68	}
69
70	if (cmpMask & RGBA::GREEN_MASK)
71	{
72		int ga = (aPacked >> RGBA::GREEN_SHIFT) & 0xFF;
73		int gb = (bPacked >> RGBA::GREEN_SHIFT) & 0xFF;
74
75		gDiff = (deUint8)deAbs32(ga - gb);
76	}
77
78	if (cmpMask & RGBA::BLUE_MASK)
79	{
80		int ba = (aPacked >> RGBA::BLUE_SHIFT) & 0xFF;
81		int bb = (bPacked >> RGBA::BLUE_SHIFT) & 0xFF;
82
83		bDiff = (deUint8)deAbs32(ba - bb);
84	}
85
86	if (cmpMask & RGBA::ALPHA_MASK)
87	{
88		int aa = (aPacked >> RGBA::ALPHA_SHIFT) & 0xFF;
89		int ab = (bPacked >> RGBA::ALPHA_SHIFT) & 0xFF;
90
91		aDiff = (deUint8)deAbs32(aa - ab);
92	}
93
94	return RGBA(rDiff,gDiff,bDiff,aDiff);
95}
96
97bool compareThresholdMasked	(RGBA a, RGBA b, RGBA threshold, deUint32 cmpMask)
98{
99	return computeAbsDiffMasked(a, b, cmpMask).isBelowThreshold(threshold);
100}
101
102} // tcu
103