PixelFormat.cpp revision 0a91775c4df380d6a5b7f3ccad5127388ac01306
1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <ui/PixelFormat.h> 18#include <pixelflinger/format.h> 19#include <hardware/hardware.h> 20 21namespace android { 22 23static const int COMPONENT_YUV = 0xFF; 24 25size_t PixelFormatInfo::getScanlineSize(unsigned int width) const 26{ 27 size_t size; 28 if (components == COMPONENT_YUV) { 29 // YCbCr formats are different. 30 size = (width * bitsPerPixel)>>3; 31 } else { 32 size = width * bytesPerPixel; 33 } 34 return size; 35} 36 37ssize_t bytesPerPixel(PixelFormat format) 38{ 39 PixelFormatInfo info; 40 status_t err = getPixelFormatInfo(format, &info); 41 return (err < 0) ? err : info.bytesPerPixel; 42} 43 44ssize_t bitsPerPixel(PixelFormat format) 45{ 46 PixelFormatInfo info; 47 status_t err = getPixelFormatInfo(format, &info); 48 return (err < 0) ? err : info.bitsPerPixel; 49} 50 51status_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info) 52{ 53 if (format < 0) 54 return BAD_VALUE; 55 56 if (info->version != sizeof(PixelFormatInfo)) 57 return INVALID_OPERATION; 58 59 // YUV format from the HAL are handled here 60 switch (format) { 61 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 62 case HAL_PIXEL_FORMAT_YCrCb_422_SP: 63 case HAL_PIXEL_FORMAT_YCbCr_422_P: 64 case HAL_PIXEL_FORMAT_YCbCr_422_I: 65 case HAL_PIXEL_FORMAT_CbYCrY_422_I: 66 info->bitsPerPixel = 16; 67 goto done; 68 case HAL_PIXEL_FORMAT_YCbCr_420_SP: 69 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 70 case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 71 case HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED: 72 case HAL_PIXEL_FORMAT_YCbCr_420_P: 73 info->bitsPerPixel = 12; 74 done: 75 info->format = format; 76 info->components = COMPONENT_YUV; 77 info->bytesPerPixel = 1; 78 info->h_alpha = 0; 79 info->l_alpha = 0; 80 info->h_red = info->h_green = info->h_blue = 8; 81 info->l_red = info->l_green = info->l_blue = 0; 82 return NO_ERROR; 83 } 84 85 size_t numEntries; 86 const GGLFormat *i = gglGetPixelFormatTable(&numEntries) + format; 87 bool valid = uint32_t(format) < numEntries; 88 if (!valid) { 89 return BAD_INDEX; 90 } 91 92 #define COMPONENT(name) \ 93 case GGL_##name: info->components = PixelFormatInfo::name; break; 94 95 switch (i->components) { 96 COMPONENT(ALPHA) 97 COMPONENT(RGB) 98 COMPONENT(RGBA) 99 COMPONENT(LUMINANCE) 100 COMPONENT(LUMINANCE_ALPHA) 101 default: 102 return BAD_INDEX; 103 } 104 105 #undef COMPONENT 106 107 info->format = format; 108 info->bytesPerPixel = i->size; 109 info->bitsPerPixel = i->bitsPerPixel; 110 info->h_alpha = i->ah; 111 info->l_alpha = i->al; 112 info->h_red = i->rh; 113 info->l_red = i->rl; 114 info->h_green = i->gh; 115 info->l_green = i->gl; 116 info->h_blue = i->bh; 117 info->l_blue = i->bl; 118 119 return NO_ERROR; 120} 121 122}; // namespace android 123 124