Home | History | Annotate | Download | only in graphics
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.graphics;
     18 
     19 import android.test.suitebuilder.annotation.SmallTest;
     20 import junit.framework.TestCase;
     21 
     22 
     23 public class BitmapTest extends TestCase {
     24 
     25     @SmallTest
     26     public void testBasic() throws Exception {
     27         Bitmap bm1 = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
     28         Bitmap bm2 = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565);
     29         Bitmap bm3 = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_4444);
     30 
     31         assertTrue("mutability", bm1.isMutable());
     32         assertTrue("mutability", bm2.isMutable());
     33         assertTrue("mutability", bm3.isMutable());
     34 
     35         assertEquals("width", 100, bm1.getWidth());
     36         assertEquals("width", 100, bm2.getWidth());
     37         assertEquals("width", 100, bm3.getWidth());
     38 
     39         assertEquals("rowbytes", 400, bm1.getRowBytes());
     40         assertEquals("rowbytes", 200, bm2.getRowBytes());
     41         assertEquals("rowbytes", 200, bm3.getRowBytes());
     42 
     43         assertEquals("byteCount", 80000, bm1.getByteCount());
     44         assertEquals("byteCount", 40000, bm2.getByteCount());
     45         assertEquals("byteCount", 40000, bm3.getByteCount());
     46 
     47         assertEquals("height", 200, bm1.getHeight());
     48         assertEquals("height", 200, bm2.getHeight());
     49         assertEquals("height", 200, bm3.getHeight());
     50 
     51         assertTrue("hasAlpha", bm1.hasAlpha());
     52         assertFalse("hasAlpha", bm2.hasAlpha());
     53         assertTrue("hasAlpha", bm3.hasAlpha());
     54 
     55         assertTrue("getConfig", bm1.getConfig() == Bitmap.Config.ARGB_8888);
     56         assertTrue("getConfig", bm2.getConfig() == Bitmap.Config.RGB_565);
     57         assertTrue("getConfig", bm3.getConfig() == Bitmap.Config.ARGB_4444);
     58     }
     59 
     60     @SmallTest
     61     public void testMutability() throws Exception {
     62         Bitmap bm1 = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
     63         Bitmap bm2 = Bitmap.createBitmap(new int[100 * 200], 100, 200,
     64                                          Bitmap.Config.ARGB_8888);
     65 
     66         assertTrue("mutability", bm1.isMutable());
     67         assertFalse("mutability", bm2.isMutable());
     68 
     69         bm1.eraseColor(0);
     70 
     71         try {
     72             bm2.eraseColor(0);
     73             fail("eraseColor should throw exception");
     74         } catch (IllegalStateException ex) {
     75             // safe to catch and ignore this
     76         }
     77     }
     78 
     79     @SmallTest
     80     public void testGetPixelsWithAlpha() throws Exception {
     81         int[] colors = new int[100];
     82         for (int i = 0; i < 100; i++) {
     83             colors[i] = (0xFF << 24) | (i << 16) | (i << 8) | i;
     84         }
     85 
     86         Bitmap bm = Bitmap.createBitmap(colors, 10, 10,
     87                                         Bitmap.Config.ARGB_8888);
     88 
     89         int[] pixels = new int[100];
     90         bm.getPixels(pixels, 0, 10, 0, 0, 10, 10);
     91         for (int i = 0; i < 100; i++) {
     92             int p = bm.getPixel(i % 10, i / 10);
     93             assertEquals("getPixels", p, pixels[i]);
     94         }
     95 
     96         for (int i = 0; i < 100; i++) {
     97             int p = bm.getPixel(i % 10, i / 10);
     98             assertEquals("getPixel", p, colors[i]);
     99             assertEquals("pixel value", p,
    100                          ((0xFF << 24) | (i << 16) | (i << 8) | i));
    101         }
    102 
    103     }
    104 
    105     @SmallTest
    106     public void testGetPixelsWithoutAlpha() throws Exception {
    107         int[] colors = new int[100];
    108         for (int i = 0; i < 100; i++) {
    109             colors[i] = (0xFF << 24) | (i << 16) | (i << 8) | i;
    110         }
    111 
    112         Bitmap bm = Bitmap.createBitmap(colors, 10, 10, Bitmap.Config.RGB_565);
    113 
    114         int[] pixels = new int[100];
    115         bm.getPixels(pixels, 0, 10, 0, 0, 10, 10);
    116         for (int i = 0; i < 100; i++) {
    117             int p = bm.getPixel(i % 10, i / 10);
    118             assertEquals("getPixels", p, pixels[i]);
    119         }
    120     }
    121 
    122     @SmallTest
    123     public void testSetPixelsWithAlpha() throws Exception {
    124         int[] colors = new int[100];
    125         for (int i = 0; i < 100; i++) {
    126             colors[i] = (0xFF << 24) | (i << 16) | (i << 8) | i;
    127         }
    128 
    129         Bitmap.Config config = Bitmap.Config.ARGB_8888;
    130         Bitmap bm1 = Bitmap.createBitmap(colors, 10, 10, config);
    131         Bitmap bm2 = Bitmap.createBitmap(10, 10, config);
    132 
    133         for (int i = 0; i < 100; i++) {
    134             bm2.setPixel(i % 10, i / 10, colors[i]);
    135         }
    136 
    137         for (int i = 0; i < 100; i++) {
    138             assertEquals("setPixel",
    139                     bm1.getPixel(i % 10, i / 10), bm2.getPixel(i % 10, i / 10));
    140         }
    141 
    142         for (int i = 0; i < 100; i++) {
    143             assertEquals("setPixel value",
    144                          bm1.getPixel(i % 10, i / 10), colors[i]);
    145         }
    146     }
    147 
    148     @SmallTest
    149     public void testSetPixelsWithoutAlpha() throws Exception {
    150         int[] colors = new int[100];
    151         for (int i = 0; i < 100; i++) {
    152             colors[i] = (0xFF << 24) | (i << 16) | (i << 8) | i;
    153         }
    154 
    155         Bitmap.Config config = Bitmap.Config.RGB_565;
    156         Bitmap bm1 = Bitmap.createBitmap(colors, 10, 10, config);
    157         Bitmap bm2 = Bitmap.createBitmap(10, 10, config);
    158 
    159         for (int i = 0; i < 100; i++) {
    160             bm2.setPixel(i % 10, i / 10, colors[i]);
    161         }
    162 
    163         for (int i = 0; i < 100; i++) {
    164             assertEquals("setPixel", bm1.getPixel(i % 10, i / 10),
    165                          bm2.getPixel(i % 10, i / 10));
    166         }
    167     }
    168 
    169     private static int computePrePostMul(int alpha, int comp) {
    170         if (alpha == 0) {
    171             return 0;
    172         }
    173         int premul = Math.round(alpha * comp / 255.f);
    174         int unpre = Math.round(255.0f * premul / alpha);
    175         return unpre;
    176     }
    177 
    178     @SmallTest
    179     public void testSetPixelsWithNonOpaqueAlpha() throws Exception {
    180         int[] colors = new int[256];
    181         for (int i = 0; i < 256; i++) {
    182             colors[i] = (i << 24) | (0xFF << 16) | (0x80 << 8) | 0;
    183         }
    184 
    185         Bitmap.Config config = Bitmap.Config.ARGB_8888;
    186 
    187         // create a bitmap with the color array specified
    188         Bitmap bm1 = Bitmap.createBitmap(colors, 16, 16, config);
    189 
    190         // create a bitmap with no colors, but then call setPixels
    191         Bitmap bm2 = Bitmap.createBitmap(16, 16, config);
    192         bm2.setPixels(colors, 0, 16, 0, 0, 16, 16);
    193 
    194         // now check that we did a good job returning the unpremultiplied alpha
    195         final int tolerance = 1;
    196         for (int i = 0; i < 256; i++) {
    197             int c0 = colors[i];
    198             int c1 = bm1.getPixel(i % 16, i / 16);
    199             int c2 = bm2.getPixel(i % 16, i / 16);
    200 
    201             // these two should always be identical
    202             assertEquals("getPixel", c1, c2);
    203 
    204             // comparing the original (c0) with the returned color is tricky,
    205             // since it gets premultiplied during the set(), and unpremultiplied
    206             // by the get().
    207             int a0 = Color.alpha(c0);
    208             int a1 = Color.alpha(c1);
    209             assertEquals("alpha", a0, a1);
    210 
    211             int r0 = Color.red(c0);
    212             int r1 = Color.red(c1);
    213             int rr = computePrePostMul(a0, r0);
    214             assertTrue("red", Math.abs(rr - r1) <= tolerance);
    215 
    216             int g0 = Color.green(c0);
    217             int g1 = Color.green(c1);
    218             int gg = computePrePostMul(a0, g0);
    219             assertTrue("green", Math.abs(gg - g1) <= tolerance);
    220 
    221             int b0 = Color.blue(c0);
    222             int b1 = Color.blue(c1);
    223             int bb = computePrePostMul(a0, b0);
    224             assertTrue("blue", Math.abs(bb - b1) <= tolerance);
    225 
    226             if (false) {
    227                 int cc = Color.argb(a0, rr, gg, bb);
    228                 android.util.Log.d("skia", "original " + Integer.toHexString(c0) +
    229                                 " set+get " + Integer.toHexString(c1) +
    230                                " local " + Integer.toHexString(cc));
    231             }
    232         }
    233     }
    234 }
    235