PixelFormat.h revision 1473f46cbc82aa6f0ba744cc896a36923823d55b
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Pixel formats used across the system. 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// These formats might not all be supported by all renderers, for instance 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// skia or SurfaceFlinger are not required to support all of these formats 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// (either as source or destination) 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// XXX: we should consolidate these formats and skia's 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef UI_PIXELFORMAT_H 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UI_PIXELFORMAT_H 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pixelflinger/format.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these constants need to match those 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // in graphics/PixelFormat.java & pixelflinger/format.h 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_UNKNOWN = 0, 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_NONE = 0, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // logical pixel formats used by the SurfaceFlinger ----------------------- 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_CUSTOM = -4, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Custom pixel-format described by a PixelFormatInfo structure 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_TRANSLUCENT = -3, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System chooses a format that supports translucency (many alpha bits) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_TRANSPARENT = -2, 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System chooses a format that supports transparency 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (at least 1 alpha bit) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_OPAQUE = -1, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System chooses an opaque format (no alpha bits required) 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // real pixel formats supported for rendering ----------------------------- 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGBA_8888 = GGL_PIXEL_FORMAT_RGBA_8888, // 4x8-bit RGBA 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGBX_8888 = GGL_PIXEL_FORMAT_RGBX_8888, // 4x8-bit RGB0 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGB_888 = GGL_PIXEL_FORMAT_RGB_888, // 3x8-bit RGB 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGB_565 = GGL_PIXEL_FORMAT_RGB_565, // 16-bit RGB 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_BGRA_8888 = GGL_PIXEL_FORMAT_BGRA_8888, // 4x8-bit BGRA 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGBA_5551 = GGL_PIXEL_FORMAT_RGBA_5551, // 16-bit ARGB 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGBA_4444 = GGL_PIXEL_FORMAT_RGBA_4444, // 16-bit ARGB 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_A_8 = GGL_PIXEL_FORMAT_A_8, // 8-bit A 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_L_8 = GGL_PIXEL_FORMAT_L_8, // 8-bit L (R=G=B=L) 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_LA_88 = GGL_PIXEL_FORMAT_LA_88, // 16-bit LA 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGB_332 = GGL_PIXEL_FORMAT_RGB_332, // 8-bit RGB 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_YCbCr_422_SP= GGL_PIXEL_FORMAT_YCbCr_422_SP, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_YCbCr_420_SP= GGL_PIXEL_FORMAT_YCbCr_420_SP, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_YCbCr_422_P = GGL_PIXEL_FORMAT_YCbCr_422_P, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_YCbCr_420_P = GGL_PIXEL_FORMAT_YCbCr_420_P, 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_YCbCr_422_I = GGL_PIXEL_FORMAT_YCbCr_422_I, 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_YCbCr_420_I = GGL_PIXEL_FORMAT_YCbCr_420_I, 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // New formats can be added if they're also defined in 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pixelflinger/format.h 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttypedef int32_t PixelFormat; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct PixelFormatInfo 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian enum { 881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian INDEX_ALPHA = 0, 891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian INDEX_RED = 1, 901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian INDEX_GREEN = 2, 911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian INDEX_BLUE = 3 921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian }; 931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { // components 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALPHA = 1, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RGB = 2, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RGBA = 3, 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LUMINANCE = 4, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LUMINANCE_ALPHA = 5, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Y_CB_CR_SP = 6, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Y_CB_CR_P = 7, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Y_CB_CR_I = 8, 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian struct szinfo { 1061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t h; 1071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t l; 1081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian }; 1091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inline PixelFormatInfo() : version(sizeof(PixelFormatInfo)) { } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t getScanlineSize(unsigned int width) const; 1121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian size_t getSize(size_t ci) const { 1131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian return (ci <= 3) ? (cinfo[ci].h - cinfo[ci].l) : 0; 1141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t version; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PixelFormat format; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t bytesPerPixel; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t bitsPerPixel; 1191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian union { 1201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian szinfo cinfo[4]; 1211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian struct { 1221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t h_alpha; 1231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t l_alpha; 1241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t h_red; 1251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t l_red; 1261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t h_green; 1271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t l_green; 1281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t h_blue; 1291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian uint8_t l_blue; 1301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian }; 1311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian }; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t components; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t reserved0[3]; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t reserved1; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Consider caching the results of these functions are they're not 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// guaranteed to be fast. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t bytesPerPixel(PixelFormat format); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectssize_t bitsPerPixel(PixelFormat format); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t getPixelFormatInfo(PixelFormat format, PixelFormatInfo* info); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // UI_PIXELFORMAT_H 146