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> 183db21640519541141137166ce55627cf76e1974bMathias Agopian#include <hardware/hardware.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2042e2458144778596281ea2c4a98ad671053234e0Mathias Agopian// ---------------------------------------------------------------------------- 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 2242e2458144778596281ea2c4a98ad671053234e0Mathias Agopian// ---------------------------------------------------------------------------- 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 243db21640519541141137166ce55627cf76e1974bMathias Agopianstatic const int COMPONENT_YUV = 0xFF; 253db21640519541141137166ce55627cf76e1974bMathias Agopian 2642e2458144778596281ea2c4a98ad671053234e0Mathias Agopianstruct Info { 2742e2458144778596281ea2c4a98ad671053234e0Mathias Agopian size_t size; 2842e2458144778596281ea2c4a98ad671053234e0Mathias Agopian size_t bitsPerPixel; 2942e2458144778596281ea2c4a98ad671053234e0Mathias Agopian struct { 3042e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t ah; 3142e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t al; 3242e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t rh; 3342e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t rl; 3442e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t gh; 3542e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t gl; 3642e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t bh; 3742e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t bl; 3842e2458144778596281ea2c4a98ad671053234e0Mathias Agopian }; 3942e2458144778596281ea2c4a98ad671053234e0Mathias Agopian uint8_t components; 4042e2458144778596281ea2c4a98ad671053234e0Mathias Agopian}; 4142e2458144778596281ea2c4a98ad671053234e0Mathias Agopian 4242e2458144778596281ea2c4a98ad671053234e0Mathias Agopianstatic Info const sPixelFormatInfos[] = { 4342e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, 4442e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 4, 32, {32,24, 8, 0, 16, 8, 24,16 }, PixelFormatInfo::RGBA }, 4542e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 4, 24, { 0, 0, 8, 0, 16, 8, 24,16 }, PixelFormatInfo::RGB }, 4642e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 3, 24, { 0, 0, 8, 0, 16, 8, 24,16 }, PixelFormatInfo::RGB }, 4742e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 2, 16, { 0, 0, 16,11, 11, 5, 5, 0 }, PixelFormatInfo::RGB }, 4842e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 4, 32, {32,24, 24,16, 16, 8, 8, 0 }, PixelFormatInfo::RGBA }, 4942e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 2, 16, { 1, 0, 16,11, 11, 6, 6, 1 }, PixelFormatInfo::RGBA }, 5042e2458144778596281ea2c4a98ad671053234e0Mathias Agopian { 2, 16, { 4, 0, 16,12, 12, 8, 8, 4 }, PixelFormatInfo::RGBA }, 51ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian { 1, 8, { 8, 0, 0, 0, 0, 0, 0, 0 }, PixelFormatInfo::ALPHA}, 52ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian { 1, 8, { 0, 0, 8, 0, 8, 0, 8, 0 }, PixelFormatInfo::L }, 53ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian { 2, 16, {16, 8, 8, 0, 8, 0, 8, 0 }, PixelFormatInfo::LA }, 54ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian { 1, 8, { 0, 0, 8, 5, 5, 2, 2, 0 }, PixelFormatInfo::RGB }, 5542e2458144778596281ea2c4a98ad671053234e0Mathias Agopian}; 5642e2458144778596281ea2c4a98ad671053234e0Mathias Agopian 5742e2458144778596281ea2c4a98ad671053234e0Mathias Agopianstatic const Info* gGetPixelFormatTable(size_t* numEntries) { 5842e2458144778596281ea2c4a98ad671053234e0Mathias Agopian if (numEntries) { 5942e2458144778596281ea2c4a98ad671053234e0Mathias Agopian *numEntries = sizeof(sPixelFormatInfos)/sizeof(Info); 6042e2458144778596281ea2c4a98ad671053234e0Mathias Agopian } 6142e2458144778596281ea2c4a98ad671053234e0Mathias Agopian return sPixelFormatInfos; 6242e2458144778596281ea2c4a98ad671053234e0Mathias Agopian} 6342e2458144778596281ea2c4a98ad671053234e0Mathias Agopian 6442e2458144778596281ea2c4a98ad671053234e0Mathias Agopian// ---------------------------------------------------------------------------- 6542e2458144778596281ea2c4a98ad671053234e0Mathias Agopian 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsize_t PixelFormatInfo::getScanlineSize(unsigned int width) const 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size; 693db21640519541141137166ce55627cf76e1974bMathias Agopian if (components == COMPONENT_YUV) { 703db21640519541141137166ce55627cf76e1974bMathias Agopian // YCbCr formats are different. 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size = (width * bitsPerPixel)>>3; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size = width * bytesPerPixel; 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return size; 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t bytesPerPixel(PixelFormat format) 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormatInfo info; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = getPixelFormatInfo(format, &info); 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (err < 0) ? err : info.bytesPerPixel; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t bitsPerPixel(PixelFormat format) 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormatInfo info; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = getPixelFormatInfo(format, &info); 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (err < 0) ? err : info.bitsPerPixel; 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info) 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 946b8bef64f7ed94a45c1b03f65f4bffb9eba86889Mathias Agopian if (format <= 0) 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_VALUE; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (info->version != sizeof(PixelFormatInfo)) 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return INVALID_OPERATION; 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1003db21640519541141137166ce55627cf76e1974bMathias Agopian // YUV format from the HAL are handled here 1013db21640519541141137166ce55627cf76e1974bMathias Agopian switch (format) { 1023db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 1033db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_I: 1043db21640519541141137166ce55627cf76e1974bMathias Agopian info->bitsPerPixel = 16; 1053db21640519541141137166ce55627cf76e1974bMathias Agopian goto done; 1063db21640519541141137166ce55627cf76e1974bMathias Agopian case HAL_PIXEL_FORMAT_YCrCb_420_SP: 1071764c73b5532c86648f01f0b2275410e78753b5aMathias Agopian case HAL_PIXEL_FORMAT_YV12: 1083db21640519541141137166ce55627cf76e1974bMathias Agopian info->bitsPerPixel = 12; 1093db21640519541141137166ce55627cf76e1974bMathias Agopian done: 1103db21640519541141137166ce55627cf76e1974bMathias Agopian info->format = format; 1113db21640519541141137166ce55627cf76e1974bMathias Agopian info->components = COMPONENT_YUV; 1123db21640519541141137166ce55627cf76e1974bMathias Agopian info->bytesPerPixel = 1; 1133db21640519541141137166ce55627cf76e1974bMathias Agopian info->h_alpha = 0; 1143db21640519541141137166ce55627cf76e1974bMathias Agopian info->l_alpha = 0; 1153db21640519541141137166ce55627cf76e1974bMathias Agopian info->h_red = info->h_green = info->h_blue = 8; 1163db21640519541141137166ce55627cf76e1974bMathias Agopian info->l_red = info->l_green = info->l_blue = 0; 1173db21640519541141137166ce55627cf76e1974bMathias Agopian return NO_ERROR; 1183db21640519541141137166ce55627cf76e1974bMathias Agopian } 1193db21640519541141137166ce55627cf76e1974bMathias Agopian 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numEntries; 12142e2458144778596281ea2c4a98ad671053234e0Mathias Agopian const Info *i = gGetPixelFormatTable(&numEntries) + format; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool valid = uint32_t(format) < numEntries; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!valid) { 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_INDEX; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1263db21640519541141137166ce55627cf76e1974bMathias Agopian 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->format = format; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->bytesPerPixel = i->size; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->bitsPerPixel = i->bitsPerPixel; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_alpha = i->ah; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_alpha = i->al; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_red = i->rh; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_red = i->rl; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_green = i->gh; 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_green = i->gl; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->h_blue = i->bh; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project info->l_blue = i->bl; 13842e2458144778596281ea2c4a98ad671053234e0Mathias Agopian info->components = i->components; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14342e2458144778596281ea2c4a98ad671053234e0Mathias Agopian// ---------------------------------------------------------------------------- 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 14542e2458144778596281ea2c4a98ad671053234e0Mathias Agopian// ---------------------------------------------------------------------------- 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 147