2011-07-28 14:26:00 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright 2011 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
2011-07-07 13:43:38 +00:00
|
|
|
#include "Test.h"
|
|
|
|
#include "SkBlurMaskFilter.h"
|
2011-09-02 15:06:44 +00:00
|
|
|
#include "SkCanvas.h"
|
|
|
|
#include "SkPaint.h"
|
2011-07-07 13:43:38 +00:00
|
|
|
#include "SkRandom.h"
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#define ILLEGAL_MODE ((SkXfermode::Mode)-1)
|
|
|
|
|
2011-09-02 15:06:44 +00:00
|
|
|
static const int outset = 100;
|
|
|
|
static const SkColor bgColor = SK_ColorWHITE;
|
|
|
|
static const int strokeWidth = 4;
|
|
|
|
|
|
|
|
static void create(SkBitmap* bm, SkIRect bound, SkBitmap::Config config) {
|
|
|
|
bm->setConfig(config, bound.width(), bound.height());
|
|
|
|
bm->allocPixels();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void drawBG(SkCanvas* canvas) {
|
|
|
|
canvas->drawColor(bgColor);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
struct BlurTest {
|
|
|
|
void (*addPath)(SkPath*);
|
|
|
|
int viewLen;
|
|
|
|
SkIRect views[9];
|
|
|
|
};
|
|
|
|
|
|
|
|
//Path Draw Procs
|
|
|
|
//Beware that paths themselves my draw differently depending on the clip.
|
|
|
|
static void draw50x50Rect(SkPath* path) {
|
|
|
|
path->addRect(0, 0, SkIntToScalar(50), SkIntToScalar(50));
|
|
|
|
}
|
|
|
|
|
|
|
|
//Tests
|
|
|
|
static BlurTest tests[] = {
|
|
|
|
{ draw50x50Rect, 3, {
|
|
|
|
//inner half of blur
|
|
|
|
{ 0, 0, 50, 50 },
|
|
|
|
//blur, but no path.
|
|
|
|
{ 50 + strokeWidth/2, 50 + strokeWidth/2, 100, 100 },
|
|
|
|
//just an edge
|
|
|
|
{ 40, strokeWidth, 60, 50 - strokeWidth },
|
|
|
|
}},
|
|
|
|
};
|
|
|
|
|
|
|
|
/** Assumes that the ref draw was completely inside ref canvas --
|
|
|
|
implies that everything outside is "bgColor".
|
|
|
|
Checks that all overlap is the same and that all non-overlap on the
|
|
|
|
ref is "bgColor".
|
|
|
|
*/
|
|
|
|
static bool compare(const SkBitmap& ref, const SkIRect& iref,
|
|
|
|
const SkBitmap& test, const SkIRect& itest)
|
|
|
|
{
|
|
|
|
const int xOff = itest.fLeft - iref.fLeft;
|
|
|
|
const int yOff = itest.fTop - iref.fTop;
|
|
|
|
|
|
|
|
SkAutoLockPixels alpRef(ref);
|
|
|
|
SkAutoLockPixels alpTest(test);
|
|
|
|
|
|
|
|
for (int y = 0; y < test.height(); ++y) {
|
|
|
|
for (int x = 0; x < test.width(); ++x) {
|
|
|
|
SkColor testColor = test.getColor(x, y);
|
|
|
|
int refX = x + xOff;
|
|
|
|
int refY = y + yOff;
|
|
|
|
SkColor refColor;
|
|
|
|
if (refX >= 0 && refX < ref.width() &&
|
|
|
|
refY >= 0 && refY < ref.height())
|
|
|
|
{
|
|
|
|
refColor = ref.getColor(refX, refY);
|
|
|
|
} else {
|
|
|
|
refColor = bgColor;
|
|
|
|
}
|
|
|
|
if (refColor != testColor) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-07-07 13:43:38 +00:00
|
|
|
static void test_blur(skiatest::Reporter* reporter) {
|
|
|
|
|
2011-09-02 15:06:44 +00:00
|
|
|
SkPaint paint;
|
|
|
|
paint.setColor(SK_ColorGRAY);
|
|
|
|
paint.setStyle(SkPaint::kStroke_Style);
|
|
|
|
paint.setStrokeWidth(SkIntToScalar(strokeWidth));
|
|
|
|
|
|
|
|
SkScalar radius = SkIntToScalar(5);
|
|
|
|
for (int style = 0; style < SkBlurMaskFilter::kBlurStyleCount; ++style) {
|
|
|
|
SkBlurMaskFilter::BlurStyle blurStyle =
|
|
|
|
static_cast<SkBlurMaskFilter::BlurStyle>(style);
|
|
|
|
|
|
|
|
const uint32_t flagPermutations = SkBlurMaskFilter::kAll_BlurFlag;
|
|
|
|
for (uint32_t flags = 0; flags < flagPermutations; ++flags) {
|
|
|
|
SkMaskFilter* filter;
|
|
|
|
filter = SkBlurMaskFilter::Create(radius, blurStyle, flags);
|
|
|
|
|
|
|
|
SkMaskFilter::BlurInfo info;
|
|
|
|
sk_bzero(&info, sizeof(info));
|
|
|
|
SkMaskFilter::BlurType type = filter->asABlur(&info);
|
|
|
|
|
|
|
|
REPORTER_ASSERT(reporter, type ==
|
|
|
|
static_cast<SkMaskFilter::BlurType>(style + 1));
|
|
|
|
REPORTER_ASSERT(reporter, info.fRadius == radius);
|
|
|
|
REPORTER_ASSERT(reporter, info.fIgnoreTransform ==
|
|
|
|
SkToBool(flags & SkBlurMaskFilter::kIgnoreTransform_BlurFlag));
|
|
|
|
REPORTER_ASSERT(reporter, info.fHighQuality ==
|
|
|
|
SkToBool(flags & SkBlurMaskFilter::kHighQuality_BlurFlag));
|
|
|
|
|
|
|
|
paint.setMaskFilter(filter);
|
|
|
|
filter->unref();
|
|
|
|
|
|
|
|
for (int test = 0; test < SK_ARRAY_COUNT(tests); ++test) {
|
|
|
|
SkPath path;
|
|
|
|
tests[test].addPath(&path);
|
|
|
|
SkRect refBound = path.getBounds();
|
|
|
|
refBound.outset(outset, outset);
|
|
|
|
SkIRect iref;
|
|
|
|
refBound.roundOut(&iref);
|
|
|
|
SkBitmap refBitmap;
|
|
|
|
create(&refBitmap, iref, SkBitmap::kARGB_8888_Config);
|
2011-07-07 13:43:38 +00:00
|
|
|
|
2011-09-02 15:06:44 +00:00
|
|
|
SkCanvas refCanvas(refBitmap);
|
|
|
|
refCanvas.translate(SkIntToScalar(-iref.fLeft),
|
|
|
|
SkIntToScalar(-iref.fTop));
|
|
|
|
drawBG(&refCanvas);
|
|
|
|
refCanvas.drawPath(path, paint);
|
2011-07-07 13:43:38 +00:00
|
|
|
|
2011-09-02 15:06:44 +00:00
|
|
|
for (int view = 0; view < tests[test].viewLen; ++view) {
|
|
|
|
SkIRect itest = tests[test].views[view];
|
|
|
|
SkBitmap testBitmap;
|
|
|
|
create(&testBitmap, itest, SkBitmap::kARGB_8888_Config);
|
2011-07-07 13:43:38 +00:00
|
|
|
|
2011-09-02 15:06:44 +00:00
|
|
|
SkCanvas testCanvas(testBitmap);
|
|
|
|
testCanvas.translate(SkIntToScalar(-itest.fLeft),
|
|
|
|
SkIntToScalar(-itest.fTop));
|
|
|
|
drawBG(&testCanvas);
|
|
|
|
testCanvas.drawPath(path, paint);
|
2011-07-07 13:43:38 +00:00
|
|
|
|
2011-09-02 15:06:44 +00:00
|
|
|
REPORTER_ASSERT(reporter,
|
|
|
|
compare(refBitmap, iref, testBitmap, itest));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-07-07 13:43:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "TestClassDef.h"
|
|
|
|
DEFINE_TESTCLASS("BlurMaskFilter", BlurTestClass, test_blur)
|