19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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 Projectpackage android.graphics;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport android.annotation.IntDef;
20b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
21b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport java.lang.annotation.Retention;
22b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport java.lang.annotation.RetentionPolicy;
23b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
24b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverettepublic class PixelFormat {
25b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
26b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    /** @hide */
27b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @IntDef({UNKNOWN, TRANSLUCENT, TRANSPARENT, OPAQUE})
28b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    @Retention(RetentionPolicy.SOURCE)
29b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette    public @interface Opacity {}
30b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette
31a696f5d667227365da732481770767dcb330dd23Mathias Agopian    /* these constants need to match those in hardware/hardware.h */
325d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int UNKNOWN     = 0;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** System chooses a format that supports translucency (many alpha bits) */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TRANSLUCENT = -3;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
385d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * System chooses a format that supports transparency
405d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden     * (at least 1 alpha bit)
415d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TRANSPARENT = -2;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** System chooses an opaque format (no alpha bits required) */
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int OPAQUE      = -1;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RGBA_8888   = 1;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RGBX_8888   = 2;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RGB_888     = 3;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RGB_565     = 4;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52e9d4c71f47f74ee9a4a490f62769ad010a17d19bMathias Agopian    @Deprecated
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RGBA_5551   = 6;
54e9d4c71f47f74ee9a4a490f62769ad010a17d19bMathias Agopian    @Deprecated
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RGBA_4444   = 7;
562ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian    @Deprecated
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int A_8         = 8;
582ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian    @Deprecated
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int L_8         = 9;
60e9d4c71f47f74ee9a4a490f62769ad010a17d19bMathias Agopian    @Deprecated
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int LA_88       = 0xA;
62e9d4c71f47f74ee9a4a490f62769ad010a17d19bMathias Agopian    @Deprecated
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RGB_332     = 0xB;
64a696f5d667227365da732481770767dcb330dd23Mathias Agopian
65a696f5d667227365da732481770767dcb330dd23Mathias Agopian
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
675d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden     * @deprecated use {@link android.graphics.ImageFormat#NV16
68a696f5d667227365da732481770767dcb330dd23Mathias Agopian     * ImageFormat.NV16} instead.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
70a696f5d667227365da732481770767dcb330dd23Mathias Agopian    @Deprecated
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int YCbCr_422_SP= 0x10;
72df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main
73a696f5d667227365da732481770767dcb330dd23Mathias Agopian    /**
745d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden     * @deprecated use {@link android.graphics.ImageFormat#NV21
75a696f5d667227365da732481770767dcb330dd23Mathias Agopian     * ImageFormat.NV21} instead.
76df4578e8ab7008a7e528d5af2ae761b33cf2bdf4Scott Main     */
77a696f5d667227365da732481770767dcb330dd23Mathias Agopian    @Deprecated
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int YCbCr_420_SP= 0x11;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80a696f5d667227365da732481770767dcb330dd23Mathias Agopian    /**
815d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden     * @deprecated use {@link android.graphics.ImageFormat#YUY2
82a696f5d667227365da732481770767dcb330dd23Mathias Agopian     * ImageFormat.YUY2} instead.
83eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang     */
84a696f5d667227365da732481770767dcb330dd23Mathias Agopian    @Deprecated
85eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang    public static final int YCbCr_422_I = 0x14;
86eb68c46a40c773eb56ef7bcf8e7ece5c6a5a8d23Chih-Chung Chang
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
885d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden     * @deprecated use {@link android.graphics.ImageFormat#JPEG
89a696f5d667227365da732481770767dcb330dd23Mathias Agopian     * ImageFormat.JPEG} instead.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
91a696f5d667227365da732481770767dcb330dd23Mathias Agopian    @Deprecated
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int JPEG        = 0x100;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
942ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian    public static void getPixelFormatInfo(int format, PixelFormat info) {
952ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian        switch (format) {
962ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case RGBA_8888:
972ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case RGBX_8888:
982ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bitsPerPixel = 32;
992ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bytesPerPixel = 4;
1002ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                break;
1012ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case RGB_888:
1022ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bitsPerPixel = 24;
1032ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bytesPerPixel = 3;
1042ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                break;
1052ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case RGB_565:
1062ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case RGBA_5551:
1072ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case RGBA_4444:
1085d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden            case LA_88:
1092ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bitsPerPixel = 16;
1102ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bytesPerPixel = 2;
1112ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                break;
1122ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case A_8:
1132ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case L_8:
1142ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case RGB_332:
1152ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bitsPerPixel = 8;
1162ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bytesPerPixel = 1;
1172ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                break;
1182ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case YCbCr_422_SP:
1192ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case YCbCr_422_I:
1202ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bitsPerPixel = 16;
1212ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bytesPerPixel = 1;
1222ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                break;
1232ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            case YCbCr_420_SP:
1242ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bitsPerPixel = 12;
1252ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                info.bytesPerPixel = 1;
1262ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian                break;
1272ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian            default:
12894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin                throw new IllegalArgumentException("unknown pixel format " + format);
1292ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian        }
1302ca204e4c0ba805c8fa0db79eeac9608d01cf5b4Mathias Agopian    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean formatHasAlpha(int format) {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (format) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PixelFormat.A_8:
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PixelFormat.LA_88:
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PixelFormat.RGBA_4444:
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PixelFormat.RGBA_5551:
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PixelFormat.RGBA_8888:
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PixelFormat.TRANSLUCENT:
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PixelFormat.TRANSPARENT:
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1455d2cace4c5445915c9ea040518c59d85cfcd6b4bAndy McFadden
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int  bytesPerPixel;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int  bitsPerPixel;
14894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
14994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    /**
15094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * Determine whether or not this is a public-visible and non-deprecated {@code format}.
15194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
15294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * <p>In particular, {@code @hide} formats will return {@code false}.</p>
15394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
15494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * <p>Any other indirect formats (such as {@code TRANSPARENT} or {@code TRANSLUCENT})
15594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * will return {@code false}.</p>
15694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
15794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @param format an integer format
15894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @return a boolean
15994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     *
16094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     * @hide
16194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin     */
16294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    public static boolean isPublicFormat(int format) {
16394814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        switch (format) {
16494814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            case RGBA_8888:
16594814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            case RGBX_8888:
16694814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            case RGB_888:
16794814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin            case RGB_565:
16894814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin                return true;
16994814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        }
17094814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin
17194814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin        return false;
17294814218d2313a989a5a8969f633e3fc33e43071Igor Murashkin    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
174