Home | History | Annotate | Download | only in common
      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 
     29 namespace tcu
     30 {
     31 
     32 /*--------------------------------------------------------------------*//*!
     33  * \brief Fixed-point render target pixel format
     34  *//*--------------------------------------------------------------------*/
     35 struct 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