| Index: tests/BlendTest.cpp
|
| diff --git a/tests/BlendTest.cpp b/tests/BlendTest.cpp
|
| index a0a84d7a7b0a69a1a6dba496ba5e1166f3bf9de5..d816b7225058573329aab7b88e8dee641a67ce2e 100644
|
| --- a/tests/BlendTest.cpp
|
| +++ b/tests/BlendTest.cpp
|
| @@ -1,5 +1,15 @@
|
| +/*
|
| + * Copyright 2015 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| #include "Test.h"
|
| #include "SkColor.h"
|
| +#include "SkColorPriv.h"
|
| +#include "SkTaskGroup.h"
|
| +#include "SkXfermode.h"
|
|
|
| #define ASSERT(x) REPORTER_ASSERT(r, x)
|
|
|
| @@ -256,3 +266,36 @@ DEF_TEST(Blend_dst_Exhaustive, r) {
|
| // all others
|
| //
|
| // Algorithms that make sense to use in Skia: blend_256_round, blend_256_round_alt, blend_perfect
|
| +
|
| +DEF_TEST(Blend_premul_begets_premul, r) {
|
| + // This test is quite slow, even if you have enough cores to run each mode in parallel.
|
| + if (!r->allowExtendedTest()) {
|
| + return;
|
| + }
|
| +
|
| + // No matter what xfermode we use, premul inputs should create premul outputs.
|
| + auto test_mode = [&](int m) {
|
| + SkXfermode::Mode mode = (SkXfermode::Mode)m;
|
| + if (mode == SkXfermode::kSrcOver_Mode) {
|
| + return; // TODO: can't create a SrcOver xfermode.
|
| + }
|
| + SkAutoTUnref<SkXfermode> xfermode(SkXfermode::Create(mode));
|
| + SkASSERT(xfermode);
|
| + // We'll test all alphas and legal color values, assuming all colors work the same.
|
| + // This is not true for non-separable blend modes, but this test still can't hurt.
|
| + for (int sa = 0; sa <= 255; sa++) {
|
| + for (int da = 0; da <= 255; da++) {
|
| + for (int s = 0; s <= sa; s++) {
|
| + for (int d = 0; d <= da; d++) {
|
| + SkPMColor src = SkPackARGB32(sa, s, s, s),
|
| + dst = SkPackARGB32(da, d, d, d);
|
| + xfermode->xfer32(&dst, &src, 1, nullptr); // To keep it simple, no AA.
|
| + if (!SkPMColorValid(dst)) {
|
| + ERRORF(r, "%08x is not premul using %s", dst, SkXfermode::ModeName(mode));
|
| + }
|
| + }}}}
|
| + };
|
| +
|
| + // Parallelism helps speed things up on my desktop from ~725s to ~50s.
|
| + sk_parallel_for(SkXfermode::kLastMode, test_mode);
|
| +}
|
|
|