PixelFormat.cpp revision 3db21640519541141137166ce55627cf76e1974b
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 193db21640519541141137166ce55627cf76e1974bMathias Agopian#include <hardware/hardware.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 233db21640519541141137166ce55627cf76e1974bMathias Agopianstatic const int COMPONENT_YUV = 0xFF; 243db21640519541141137166ce55627cf76e1974bMathias Agopian 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsize_t PixelFormatInfo::getScanlineSize(unsigned int width) const 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size; 283db21640519541141137166ce55627cf76e1974bMathias Agopian if (components == COMPONENT_YUV) { 293db21640519541141137166ce55627cf76e1974bMathias Agopian // YCbCr formats are different. 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size = (width * bitsPerPixel)>>3; 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size = width * bytesPerPixel; 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return size; 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t bytesPerPixel(PixelFormat format) 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormatInfo info; 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = getPixelFormatInfo(format, &info); 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (err < 0) ? err : info.bytesPerPixel; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t bitsPerPixel(PixelFormat format) 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormatInfo info; 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = getPixelFormatInfo(format, &info); 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (err < 0) ? err : info.bitsPerPixel; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (format < 0) 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (info->version != sizeof(PixelFormatInfo)) 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return INVALID_OPERATION; 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 593db21640519541141137166ce55627cf76e1974bMathias Agopian // YUV format from the HAL are handled here 603db21640519541141137166ce55627cf76e1974bMathias Agopian switch (format) { 613db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 623db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCrCb_422_SP: 633db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_P: 643db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_I: 653db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_CbYCrY_422_I: 663db21640519541141137166ce55627cf76e1974bMathias Agopian info->bitsPerPixel = 16; 673db21640519541141137166ce55627cf76e1974bMathias Agopian goto done; 683db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP: 693db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCrCb_420_SP: 703db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 713db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED: 723db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_P: 733db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_I: 743db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_CbYCrY_420_I: 753db21640519541141137166ce55627cf76e1974bMathias Agopian info->bitsPerPixel = 12; 763db21640519541141137166ce55627cf76e1974bMathias Agopian done: 773db21640519541141137166ce55627cf76e1974bMathias Agopian info->format = format; 783db21640519541141137166ce55627cf76e1974bMathias Agopian info->components = COMPONENT_YUV; 793db21640519541141137166ce55627cf76e1974bMathias Agopian info->bytesPerPixel = 1; 803db21640519541141137166ce55627cf76e1974bMathias Agopian info->h_alpha = 0; 813db21640519541141137166ce55627cf76e1974bMathias Agopian info->l_alpha = 0; 823db21640519541141137166ce55627cf76e1974bMathias Agopian info->h_red = info->h_green = info->h_blue = 8; 833db21640519541141137166ce55627cf76e1974bMathias Agopian info->l_red = info->l_green = info->l_blue = 0; 843db21640519541141137166ce55627cf76e1974bMathias Agopian return NO_ERROR; 853db21640519541141137166ce55627cf76e1974bMathias Agopian } 863db21640519541141137166ce55627cf76e1974bMathias Agopian 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numEntries; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GGLFormat *i = gglGetPixelFormatTable(&numEntries) + format; 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool valid = uint32_t(format) < numEntries; 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!valid) { 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_INDEX; 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 933db21640519541141137166ce55627cf76e1974bMathias Agopian 943db21640519541141137166ce55627cf76e1974bMathias Agopian #define COMPONENT(name) \ 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_##name: info->components = PixelFormatInfo::name; break; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (i->components) { 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project COMPONENT(ALPHA) 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project COMPONENT(RGB) 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project COMPONENT(RGBA) 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project COMPONENT(LUMINANCE) 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project COMPONENT(LUMINANCE_ALPHA) 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_INDEX; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project #undef COMPONENT 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->format = format; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->bytesPerPixel = i->size; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->bitsPerPixel = i->bitsPerPixel; 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_alpha = i->ah; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_alpha = i->al; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_red = i->rh; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_red = i->rl; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_green = i->gh; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_green = i->gl; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_blue = i->bh; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_blue = i->bl; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 126