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
18ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Leeimport android.graphics.Bitmap;
19b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikasimport android.os.Build;
20645e5c8aa6b31961c5f73f3d30bb5261d5e04aebKirill Grouchnikovimport android.support.annotation.RequiresApi;
21ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
22ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee/**
23645e5c8aa6b31961c5f73f3d30bb5261d5e04aebKirill Grouchnikov * Helper for accessing features in {@link android.graphics.Bitmap}.
24ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee */
25c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class BitmapCompat {
26b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static class BitmapCompatBaseImpl {
27ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public boolean hasMipMap(Bitmap bitmap) {
28ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee            return false;
29ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
30ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
31ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
32ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
33c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes
34c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        public int getAllocationByteCount(Bitmap bitmap) {
35b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            return bitmap.getByteCount();
36c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        }
37ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
38ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
39c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette    @RequiresApi(18)
40b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static class BitmapCompatApi18Impl extends BitmapCompatBaseImpl {
41ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        @Override
42ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public boolean hasMipMap(Bitmap bitmap){
43b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            return bitmap.hasMipMap();
44ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
45ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
46ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        @Override
47ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        public void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
48b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            bitmap.setHasMipMap(hasMipMap);
49ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
50ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
51ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
52c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette    @RequiresApi(19)
53b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static class BitmapCompatApi19Impl extends BitmapCompatApi18Impl {
54c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        @Override
55c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        public int getAllocationByteCount(Bitmap bitmap) {
56b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            return bitmap.getAllocationByteCount();
57c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        }
58c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    }
59c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes
60ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    /**
61ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee     * Select the correct implementation to use for the current platform.
62ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee     */
63b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas    static final BitmapCompatBaseImpl IMPL;
64ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    static {
65c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        if (Build.VERSION.SDK_INT >= 19) {
66b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            IMPL = new BitmapCompatApi19Impl();
67c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        } else if (Build.VERSION.SDK_INT >= 18) {
68b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            IMPL = new BitmapCompatApi18Impl();
69ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        } else {
70b3187869ca1ed7a353bf1d6a4b356bc84ad7eadfAurimas Liutikas            IMPL = new BitmapCompatBaseImpl();
71ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        }
72ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
73ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
74ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    public static boolean hasMipMap(Bitmap bitmap) {
75ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        return IMPL.hasMipMap(bitmap);
76ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
77ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee
78ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    public static void setHasMipMap(Bitmap bitmap, boolean hasMipMap) {
79ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee        IMPL.setHasMipMap(bitmap, hasMipMap);
80ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee    }
81c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes
82c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    /**
83c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     * Returns the size of the allocated memory used to store this bitmap's pixels in a backwards
84c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     * compatible way.
85c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     *
8644ece5ceaaee232f9139ccbde40ac4a5e642bdeeChristophe Beyls     * @param bitmap the bitmap in which to return its allocation size
87c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     * @return the allocation size in bytes
88c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes     */
89c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    public static int getAllocationByteCount(Bitmap bitmap) {
90c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes        return IMPL.getAllocationByteCount(bitmap);
91c55f505d6e5cd8b701721f42431bfd742a1968f0Chris Banes    }
92c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes
93c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes    private BitmapCompat() {}
94ddb24f29a236175d3cda4c11bda98a6212ecf9e5Yorke Lee}