Home | History | Annotate | Download | only in ui
      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