Home | History | Annotate | Download | only in tests
      1 
      2 /*
      3  * Copyright 2012 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 /**
     10  * Tests for SkBitmapTransformer.h and SkBitmapTransformer.cpp
     11  */
     12 
     13 #include "Test.h"
     14 #include "SkBitmap.h"
     15 #include "SkBitmapTransformer.h"
     16 
     17 namespace skiatest {
     18     class BitmapTransformerTestClass : public Test {
     19     public:
     20         static Test* Factory(void*) {return SkNEW(BitmapTransformerTestClass); }
     21     protected:
     22         virtual void onGetName(SkString* name) { name->set("BitmapTransformer"); }
     23         virtual void onRun(Reporter* reporter) {
     24             this->fReporter = reporter;
     25             RunTest();
     26         }
     27     private:
     28         void RunTest() {
     29             SkBitmap bitmap;
     30             SkBitmap::Config supportedConfig = SkBitmap::kARGB_8888_Config;
     31             SkBitmap::Config unsupportedConfig = SkBitmap::kARGB_4444_Config;
     32             SkBitmapTransformer::PixelFormat supportedPixelFormat =
     33                 SkBitmapTransformer::kARGB_8888_Premul_PixelFormat;
     34             const int kWidth = 55;
     35             const int kHeight = 333;
     36 
     37             // Transformations that we know are unsupported:
     38             {
     39                 bitmap.setConfig(unsupportedConfig, kWidth, kHeight);
     40                 SkBitmapTransformer transformer = SkBitmapTransformer(bitmap, supportedPixelFormat);
     41                 REPORTER_ASSERT(fReporter, !transformer.isValid());
     42             }
     43 
     44             // Valid transformations:
     45             {
     46                 // Bytes we expect to get:
     47                 const int kWidth = 3;
     48                 const int kHeight = 5;
     49                 const unsigned char comparisonBuffer[] = {
     50                     // kHeight rows, each with kWidth pixels, premultiplied ARGB for each pixel
     51                     0xff,0xff,0x00,0x00, 0xff,0xff,0x00,0x00, 0xff,0xff,0x00,0x00, // red
     52                     0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00, // green
     53                     0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue
     54                     0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue
     55                     0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue
     56                 };
     57 
     58                 // A bitmap that should generate the above bytes:
     59                 bitmap.setConfig(supportedConfig, kWidth, kHeight);
     60                 REPORTER_ASSERT(fReporter, bitmap.allocPixels());
     61                 bitmap.setIsOpaque(true);
     62                 bitmap.eraseColor(SK_ColorBLUE);
     63                 bitmap.lockPixels();
     64                 // Change rows [0,1] from blue to [red,green].
     65                 SkColor oldColor = SK_ColorBLUE;
     66                 SkColor newColors[] = {SK_ColorRED, SK_ColorGREEN};
     67                 for (int y = 0; y <= 1; y++) {
     68                     for (int x = 0; x < kWidth; x++) {
     69                         REPORTER_ASSERT(fReporter, bitmap.getColor(x, y) == oldColor);
     70                         SkPMColor* pixel = static_cast<SkPMColor *>(bitmap.getAddr(x, y));
     71                         *pixel = SkPreMultiplyColor(newColors[y]);
     72                         REPORTER_ASSERT(fReporter, bitmap.getColor(x, y) == newColors[y]);
     73                     }
     74                 }
     75                 bitmap.unlockPixels();
     76 
     77                 // Transform the bitmap and confirm we got the expected results.
     78                 SkBitmapTransformer transformer = SkBitmapTransformer(bitmap, supportedPixelFormat);
     79                 REPORTER_ASSERT(fReporter, transformer.isValid());
     80                 REPORTER_ASSERT(fReporter, transformer.bytesNeededPerRow() == kWidth * 4);
     81                 REPORTER_ASSERT(fReporter, transformer.bytesNeededTotal() == kWidth * kHeight * 4);
     82                 int bufferSize = transformer.bytesNeededTotal();
     83                 SkAutoMalloc pixelBufferManager(bufferSize);
     84                 char *pixelBuffer = static_cast<char *>(pixelBufferManager.get());
     85                 REPORTER_ASSERT(fReporter,
     86                                 transformer.copyBitmapToPixelBuffer(pixelBuffer, bufferSize));
     87                 REPORTER_ASSERT(fReporter, bufferSize == sizeof(comparisonBuffer));
     88                 REPORTER_ASSERT(fReporter, memcmp(pixelBuffer, comparisonBuffer, bufferSize) == 0);
     89             }
     90 
     91         }
     92 
     93         Reporter* fReporter;
     94     };
     95 
     96     static TestRegistry gReg(BitmapTransformerTestClass::Factory);
     97 }
     98