/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /** * Tests for SkBitmapTransformer.h and SkBitmapTransformer.cpp */ #include "Test.h" #include "SkBitmap.h" #include "SkBitmapTransformer.h" namespace skiatest { class BitmapTransformerTestClass : public Test { public: static Test* Factory(void*) {return SkNEW(BitmapTransformerTestClass); } protected: virtual void onGetName(SkString* name) { name->set("BitmapTransformer"); } virtual void onRun(Reporter* reporter) { this->fReporter = reporter; RunTest(); } private: void RunTest() { SkBitmap bitmap; SkBitmap::Config supportedConfig = SkBitmap::kARGB_8888_Config; SkBitmap::Config unsupportedConfig = SkBitmap::kARGB_4444_Config; SkBitmapTransformer::PixelFormat supportedPixelFormat = SkBitmapTransformer::kARGB_8888_Premul_PixelFormat; const int kWidth = 55; const int kHeight = 333; // Transformations that we know are unsupported: { bitmap.setConfig(unsupportedConfig, kWidth, kHeight); SkBitmapTransformer transformer = SkBitmapTransformer(bitmap, supportedPixelFormat); REPORTER_ASSERT(fReporter, !transformer.isValid()); } // Valid transformations: { // Bytes we expect to get: const int kWidth = 3; const int kHeight = 5; const unsigned char comparisonBuffer[] = { // kHeight rows, each with kWidth pixels, premultiplied ARGB for each pixel 0xff,0xff,0x00,0x00, 0xff,0xff,0x00,0x00, 0xff,0xff,0x00,0x00, // red 0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00, // green 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue }; // A bitmap that should generate the above bytes: bitmap.setConfig(supportedConfig, kWidth, kHeight); REPORTER_ASSERT(fReporter, bitmap.allocPixels()); bitmap.setIsOpaque(true); bitmap.eraseColor(SK_ColorBLUE); bitmap.lockPixels(); // Change rows [0,1] from blue to [red,green]. SkColor oldColor = SK_ColorBLUE; SkColor newColors[] = {SK_ColorRED, SK_ColorGREEN}; for (int y = 0; y <= 1; y++) { for (int x = 0; x < kWidth; x++) { REPORTER_ASSERT(fReporter, bitmap.getColor(x, y) == oldColor); SkPMColor* pixel = static_cast<SkPMColor *>(bitmap.getAddr(x, y)); *pixel = SkPreMultiplyColor(newColors[y]); REPORTER_ASSERT(fReporter, bitmap.getColor(x, y) == newColors[y]); } } bitmap.unlockPixels(); // Transform the bitmap and confirm we got the expected results. SkBitmapTransformer transformer = SkBitmapTransformer(bitmap, supportedPixelFormat); REPORTER_ASSERT(fReporter, transformer.isValid()); REPORTER_ASSERT(fReporter, transformer.bytesNeededPerRow() == kWidth * 4); REPORTER_ASSERT(fReporter, transformer.bytesNeededTotal() == kWidth * kHeight * 4); int bufferSize = transformer.bytesNeededTotal(); SkAutoMalloc pixelBufferManager(bufferSize); char *pixelBuffer = static_cast<char *>(pixelBufferManager.get()); REPORTER_ASSERT(fReporter, transformer.copyBitmapToPixelBuffer(pixelBuffer, bufferSize)); REPORTER_ASSERT(fReporter, bufferSize == sizeof(comparisonBuffer)); REPORTER_ASSERT(fReporter, memcmp(pixelBuffer, comparisonBuffer, bufferSize) == 0); } } Reporter* fReporter; }; static TestRegistry gReg(BitmapTransformerTestClass::Factory); }