1ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee/*
2ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * Copyright (C) 2014 The Android Open Source Project
3ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee *
4ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * Licensed under the Apache License, Version 2.0 (the "License");
5ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * you may not use this file except in compliance with the License.
6ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * You may obtain a copy of the License at
7ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee *
8ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee *      http://www.apache.org/licenses/LICENSE-2.0
9ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee *
10ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * Unless required by applicable law or agreed to in writing, software
11ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * distributed under the License is distributed on an "AS IS" BASIS,
12ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * See the License for the specific language governing permissions and
14ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * limitations under the License.
15ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee */
16ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Leepackage android.support.v4.graphics;
17ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
18c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viveretteimport android.support.annotation.RequiresApi;
19ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Leeimport android.graphics.Bitmap;
20b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikasimport android.os.Build;
21ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
22ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee/**
23ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * Helper for accessing features in {@link android.graphics.Bitmap}
24ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee * introduced after API level 4 in a backwards compatible fashion.
25ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee */
26c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class BitmapCompat {
27b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static class BitmapCompatBaseImpl {
28ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public boolean hasMipMap(Bitmap bitmap) {
29ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee            return false;
30ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
31ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
32ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
33ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
34c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes
35c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        public int getAllocationByteCount(Bitmap bitmap) {
36b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            return bitmap.getByteCount();
37c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        }
38ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
39ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
40c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette    @RequiresApi(18)
41b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static class BitmapCompatApi18Impl extends BitmapCompatBaseImpl {
42ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        @Override
43ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public boolean hasMipMap(Bitmap bitmap){
44b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            return bitmap.hasMipMap();
45ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
46ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
47ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        @Override
48ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
49b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            bitmap.setHasMipMap(hasMipMap);
50ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
51ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
52ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
53c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette    @RequiresApi(19)
54b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static class BitmapCompatApi19Impl extends BitmapCompatApi18Impl {
55c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        @Override
56c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        public int getAllocationByteCount(Bitmap bitmap) {
57b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            return bitmap.getAllocationByteCount();
58c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        }
59c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    }
60c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes
61ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    /**
62ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee     * Select the correct implementation to use for the current platform.
63ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee     */
64b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static final BitmapCompatBaseImpl IMPL;
65ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    static {
66c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        if (Build.VERSION.SDK_INT >= 19) {
67b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            IMPL = new BitmapCompatApi19Impl();
68c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        } else if (Build.VERSION.SDK_INT >= 18) {
69b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            IMPL = new BitmapCompatApi18Impl();
70ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        } else {
71b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            IMPL = new BitmapCompatBaseImpl();
72ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
73ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
74ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
75ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    public static boolean hasMipMap(Bitmap bitmap) {
76ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        return IMPL.hasMipMap(bitmap);
77ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
78ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
79ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    public static void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
80ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        IMPL.setHasMipMap(bitmap, hasMipMap);
81ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
82c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes
83c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    /**
84c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     * Returns the size of the allocated memory used to store this bitmap's pixels in a backwards
85c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     * compatible way.
86c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     *
8744ece5ceaaee232f9139ccbde40ac4a5e642bdeeChristophe Beyls     * @param bitmap the bitmap in which to return its allocation size
88c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     * @return the allocation size in bytes
89c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     */
90c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    public static int getAllocationByteCount(Bitmap bitmap) {
91c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        return IMPL.getAllocationByteCount(bitmap);
92c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    }
93c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes
94c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes    private BitmapCompat() {}
95ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee}