13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _TCUSURFACE_HPP 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _TCUSURFACE_HPP 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------- 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief RGBA8888 surface class. 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuDefs.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRGBA.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTexture.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 308a8b627a608a48a729ed37c9b51ef88aff4ba3ddMika Isojärvi#include "deArrayBuffer.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*! 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief RGBA8888 surface 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Surface provides basic pixel storage functionality. Only single format 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * (RGBA8888) is supported. 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * PixelBufferAccess (see tcuTexture.h) provides much more flexible API 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * for handling various pixel formats. This is mainly a convinience class. 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Surface 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Surface (void); 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Surface (int width, int height); 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~Surface (void); 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setSize (int width, int height); 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int getWidth (void) const { return m_width; } 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int getHeight (void) const { return m_height; } 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setPixel (int x, int y, RGBA col); 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RGBA getPixel (int x, int y) const; 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ConstPixelBufferAccess getAccess (void) const; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry PixelBufferAccess getAccess (void); 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note Copy constructor and assignment operators are public and auto-generated 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 658a8b627a608a48a729ed37c9b51ef88aff4ba3ddMika Isojärvi int m_width; 66a15e7d7f566d93c76ca90171eb728e3d1cd82378Pyry Haulos int m_height; 678a8b627a608a48a729ed37c9b51ef88aff4ba3ddMika Isojärvi de::ArrayBuffer<deUint32> m_pixels; 6893df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE; 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void Surface::setPixel (int x, int y, RGBA col) 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::inBounds(x, 0, m_width) && de::inBounds(y, 0, m_height)); 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int pixOffset = y*m_width + x; 758a8b627a608a48a729ed37c9b51ef88aff4ba3ddMika Isojärvi deUint32* pixAddr = m_pixels.getElementPtr(pixOffset); 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN) 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *pixAddr = col.getPacked(); 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#else 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *((deUint8*)pixAddr + 0) = (deUint8)col.getRed(); 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *((deUint8*)pixAddr + 1) = (deUint8)col.getGreen(); 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *((deUint8*)pixAddr + 2) = (deUint8)col.getBlue(); 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *((deUint8*)pixAddr + 3) = (deUint8)col.getAlpha(); 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline RGBA Surface::getPixel (int x, int y) const 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::inBounds(x, 0, m_width) && de::inBounds(y, 0, m_height)); 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int pixOffset = y*m_width + x; 928a8b627a608a48a729ed37c9b51ef88aff4ba3ddMika Isojärvi const deUint32* pixAddr = m_pixels.getElementPtr(pixOffset); 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(RGBA::RED_SHIFT == 0 && RGBA::GREEN_SHIFT == 8 && RGBA::BLUE_SHIFT == 16 && RGBA::ALPHA_SHIFT == 24); 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN) 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return RGBA(*pixAddr); 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#else 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint8* byteAddr = (const deUint8*)pixAddr; 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return RGBA(byteAddr[0], byteAddr[1], byteAddr[2], byteAddr[3]); 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/** Get pixel buffer access from surface. */ 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline ConstPixelBufferAccess Surface::getAccess (void) const 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1078a8b627a608a48a729ed37c9b51ef88aff4ba3ddMika Isojärvi return ConstPixelBufferAccess(TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT8), m_width, m_height, 1, m_pixels.empty() ? DE_NULL : m_pixels.getPtr()); 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/** Get pixel buffer access from surface. */ 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline PixelBufferAccess Surface::getAccess (void) 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1138a8b627a608a48a729ed37c9b51ef88aff4ba3ddMika Isojärvi return PixelBufferAccess(TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT8), m_width, m_height, 1, m_pixels.empty() ? DE_NULL : m_pixels.getPtr()); 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _TCUSURFACE_HPP 119