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