441a005810
https://codereview.appspot.com/6948047/ git-svn-id: http://skia.googlecode.com/svn/trunk@6820 2bbb7eff-a529-9590-31e7-b0007b416f81
98 lines
4.3 KiB
C++
98 lines
4.3 KiB
C++
|
|
/*
|
|
* 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);
|
|
}
|