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 21 namespace android { 22 23 static const int COMPONENT_YUV = 0xFF; 24 25 size_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 37 ssize_t bytesPerPixel(PixelFormat format) 38 { 39 PixelFormatInfo info; 40 status_t err = getPixelFormatInfo(format, &info); 41 return (err < 0) ? err : info.bytesPerPixel; 42 } 43 44 ssize_t bitsPerPixel(PixelFormat format) 45 { 46 PixelFormatInfo info; 47 status_t err = getPixelFormatInfo(format, &info); 48 return (err < 0) ? err : info.bitsPerPixel; 49 } 50 51 status_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_YCbCr_422_I: 63 info->bitsPerPixel = 16; 64 goto done; 65 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 66 case HAL_PIXEL_FORMAT_YV12: 67 info->bitsPerPixel = 12; 68 done: 69 info->format = format; 70 info->components = COMPONENT_YUV; 71 info->bytesPerPixel = 1; 72 info->h_alpha = 0; 73 info->l_alpha = 0; 74 info->h_red = info->h_green = info->h_blue = 8; 75 info->l_red = info->l_green = info->l_blue = 0; 76 return NO_ERROR; 77 } 78 79 size_t numEntries; 80 const GGLFormat *i = gglGetPixelFormatTable(&numEntries) + format; 81 bool valid = uint32_t(format) < numEntries; 82 if (!valid) { 83 return BAD_INDEX; 84 } 85 86 #define COMPONENT(name) \ 87 case GGL_##name: info->components = PixelFormatInfo::name; break; 88 89 switch (i->components) { 90 COMPONENT(ALPHA) 91 COMPONENT(RGB) 92 COMPONENT(RGBA) 93 COMPONENT(LUMINANCE) 94 COMPONENT(LUMINANCE_ALPHA) 95 default: 96 return BAD_INDEX; 97 } 98 99 #undef COMPONENT 100 101 info->format = format; 102 info->bytesPerPixel = i->size; 103 info->bitsPerPixel = i->bitsPerPixel; 104 info->h_alpha = i->ah; 105 info->l_alpha = i->al; 106 info->h_red = i->rh; 107 info->l_red = i->rl; 108 info->h_green = i->gh; 109 info->l_green = i->gl; 110 info->h_blue = i->bh; 111 info->l_blue = i->bl; 112 113 return NO_ERROR; 114 } 115 116 }; // namespace android 117 118