aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-03-15 20:48:02 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-03-15 20:48:02 +0000
commit9f8f48e9e4a75f2b15bd5d6f8cac728f5e0af0ce (patch)
tree9e29185c8e0fc3b0b0b7a7aef448cba461434562
parent370eeeb03291db7e93d98d437f39fe8053b8c6fd (diff)
update blitrow test to exercise different widths for blitrow
git-svn-id: http://skia.googlecode.com/svn/trunk@530 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--tests/BlitRowTest.cpp116
1 files changed, 113 insertions, 3 deletions
diff --git a/tests/BlitRowTest.cpp b/tests/BlitRowTest.cpp
index 3442b6bbea..91d6b94e75 100644
--- a/tests/BlitRowTest.cpp
+++ b/tests/BlitRowTest.cpp
@@ -2,6 +2,7 @@
#include "SkBitmap.h"
#include "SkCanvas.h"
#include "SkColorPriv.h"
+#include "SkGradientShader.h"
#include "SkRect.h"
static inline const char* boolStr(bool value) {
@@ -94,7 +95,8 @@ static bool check_color(const SkBitmap& bm, SkPMColor expect32,
return true;
}
-static void TestBlitRow(skiatest::Reporter* reporter) {
+// Make sure our blits always map src==0 to a noop, and src==FF to full opaque
+static void test_00_FF(skiatest::Reporter* reporter) {
static const int W = 256;
static const SkBitmap::Config gDstConfig[] = {
@@ -118,12 +120,11 @@ static void TestBlitRow(skiatest::Reporter* reporter) {
};
SkPaint paint;
- paint.setDither(true);
SkBitmap srcBM;
srcBM.setConfig(SkBitmap::kARGB_8888_Config, W, 1);
srcBM.allocPixels();
-
+
for (size_t i = 0; i < SK_ARRAY_COUNT(gDstConfig); i++) {
SkBitmap dstBM;
dstBM.setConfig(gDstConfig[i], W, 1);
@@ -154,5 +155,114 @@ static void TestBlitRow(skiatest::Reporter* reporter) {
}
}
+///////////////////////////////////////////////////////////////////////////////
+
+struct Mesh {
+ SkPoint fPts[4];
+ uint16_t fIndices[6];
+
+ Mesh(const SkBitmap& bm, SkPaint* paint) {
+ const SkScalar w = SkIntToScalar(bm.width());
+ const SkScalar h = SkIntToScalar(bm.height());
+ fPts[0].set(0, 0);
+ fPts[1].set(w, 0);
+ fPts[2].set(w, h);
+ fPts[3].set(0, h);
+ SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode,
+ SkShader::kClamp_TileMode);
+ paint->setShader(s)->unref();
+
+ }
+
+ void draw(SkCanvas* canvas, SkPaint* paint) {
+ canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, fPts, fPts,
+ NULL, NULL, NULL, 0, *paint);
+ }
+};
+
+#include "SkImageEncoder.h"
+static void save_bm(const SkBitmap& bm, const char name[]) {
+ SkImageEncoder::EncodeFile(name, bm, SkImageEncoder::kPNG_Type, 100);
+}
+
+static bool gOnce;
+
+// Make sure our blits are invariant with the width of the blit (i.e. that
+// special case for 8 at a time have the same results as narrower blits)
+static void test_diagonal(skiatest::Reporter* reporter) {
+ static const int W = 64;
+ static const int H = W;
+
+ static const SkBitmap::Config gDstConfig[] = {
+ SkBitmap::kARGB_8888_Config,
+ SkBitmap::kRGB_565_Config,
+ // SkBitmap::kARGB_4444_Config,
+ // SkBitmap::kA8_Config,
+ };
+
+ static const SkColor gDstBG[] = { 0, 0xFFFFFFFF };
+
+ SkPaint paint;
+
+ SkBitmap srcBM;
+ srcBM.setConfig(SkBitmap::kARGB_8888_Config, W, H);
+ srcBM.allocPixels();
+ SkRect srcR = { 0, 0, srcBM.width(), srcBM.height() };
+
+ // cons up a mesh to draw the bitmap with
+ Mesh mesh(srcBM, &paint);
+
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gDstConfig); i++) {
+ SkBitmap dstBM0, dstBM1;
+ dstBM0.setConfig(gDstConfig[i], W, H);
+ dstBM1.setConfig(gDstConfig[i], W, H);
+ dstBM0.allocPixels();
+ dstBM1.allocPixels();
+
+ SkCanvas canvas0(dstBM0);
+ SkCanvas canvas1(dstBM1);
+ SkColor bgColor;
+
+ for (size_t j = 0; j < SK_ARRAY_COUNT(gDstBG); j++) {
+ bgColor = gDstBG[j];
+
+ for (int c = 0; c <= 0xFF; c++) {
+ srcBM.eraseARGB(0xFF, c, c, c);
+
+ for (int k = 0; k < 4; k++) {
+ bool dither = (k & 1) != 0;
+ uint8_t alpha = (k & 2) ? 0x80 : 0xFF;
+ paint.setDither(dither);
+ paint.setAlpha(alpha);
+
+ dstBM0.eraseColor(bgColor);
+ dstBM1.eraseColor(bgColor);
+
+ canvas0.drawRect(srcR, paint);
+ mesh.draw(&canvas1, &paint);
+
+ if (!gOnce && false) {
+ save_bm(dstBM0, "drawBitmap.png");
+ save_bm(dstBM1, "drawMesh.png");
+ gOnce = true;
+ }
+
+ if (memcmp(dstBM0.getPixels(), dstBM1.getPixels(), dstBM0.getSize())) {
+ SkString str;
+ str.printf("Diagonal config=%s bg=0x%x dither=%d alpha=0x%x src=0x%x",
+ gConfigName[gDstConfig[i]], bgColor, dither, alpha, c);
+ reporter->reportFailed(str);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void TestBlitRow(skiatest::Reporter* reporter) {
+ test_00_FF(reporter);
+ test_diagonal(reporter);
+}
+
#include "TestClassDef.h"
DEFINE_TESTCLASS("BlitRow", TestBlitRowClass, TestBlitRow)