1#ifndef _TCUPIXELFORMAT_HPP
2#define _TCUPIXELFORMAT_HPP
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program Tester Core
5 * ----------------------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file
23 * \brief Pixel format descriptor.
24 *//*--------------------------------------------------------------------*/
25
26#include "tcuDefs.hpp"
27#include "tcuRGBA.hpp"
28
29namespace tcu
30{
31
32/*--------------------------------------------------------------------*//*!
33 * \brief Fixed-point render target pixel format
34 *//*--------------------------------------------------------------------*/
35struct PixelFormat
36{
37	int redBits;
38	int greenBits;
39	int blueBits;
40	int alphaBits;
41
42	PixelFormat (int red, int green, int blue, int alpha)
43		: redBits(red)
44		, greenBits(green)
45		, blueBits(blue)
46		, alphaBits(alpha)
47	{
48	}
49
50	PixelFormat (void)
51		: redBits(0)
52		, greenBits(0)
53		, blueBits(0)
54		, alphaBits(0)
55	{
56	}
57
58	/*--------------------------------------------------------------------*//*!
59	 * \brief Get default threshold for per-pixel comparison for this format
60	 *
61	 * Per-channel threshold is 2^(8-bits). If alpha channel bits are zero,
62	 * threshold for that channel is 0.
63	 *//*--------------------------------------------------------------------*/
64	inline RGBA getColorThreshold (void) const
65	{
66		return RGBA(
67			1 << (8 - redBits),
68			1 << (8 - greenBits),
69			1 << (8 - blueBits),
70			(alphaBits > 0) ? (1 << (8 - alphaBits)) : 0);
71	}
72
73	static inline int convertChannel (int val, int bits)
74	{
75		if (bits == 1)
76			return (val & 0x80) ? 0xff : 0;
77		else
78		{
79			DE_ASSERT(deInRange32(bits, 4, 8));
80			int c = val >> (8-bits);
81			return (c << (8-bits)) | (c >> (2*bits-8));
82		}
83	}
84
85	/*--------------------------------------------------------------------*//*!
86	 * \brief Emulate reduced bit depth
87	 *
88	 * The color value bit depth is reduced and converted back. The lowest
89	 * bits are filled by replicating the upper bits.
90	 *//*--------------------------------------------------------------------*/
91	inline RGBA convertColor (const RGBA& col) const
92	{
93		return RGBA(convertChannel(col.getRed(),	redBits),
94					convertChannel(col.getGreen(),	greenBits),
95					convertChannel(col.getBlue(),	blueBits),
96					alphaBits ? convertChannel(col.getAlpha(), alphaBits) : 0xff);
97	}
98
99	inline bool operator== (const PixelFormat& other) const
100	{
101		return redBits		== other.redBits	&&
102			   greenBits	== other.greenBits	&&
103			   blueBits		== other.blueBits	&&
104			   alphaBits	== other.alphaBits;
105	}
106
107	inline bool operator!= (const PixelFormat& other) const
108	{
109		return !(*this == other);
110	}
111};
112
113} // namespace tcu
114
115#endif // _TCUPIXELFORMAT_HPP
116