blob: 463b6690e169c46fd4fb8d78e0b68b0c634fc97d [file] [log] [blame]
/*
* Copyright 2019 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkMixer.h"
#include "Test.h"
#include "SkColorData.h"
#include "SkMixerBase.h"
static void check_color(skiatest::Reporter* reporter,
const SkPMColor4f& result, const SkPMColor4f& expected) {
const float tol = 1/510.f; // made up
for (int i = 0; i < 4; ++i) {
REPORTER_ASSERT(reporter, SkScalarNearlyEqual(result[i], expected[i], tol));
}
}
static void check_mixer(skiatest::Reporter* reporter, sk_sp<SkMixer> mixer,
const SkPMColor4f& a, const SkPMColor4f& b, const SkPMColor4f& expected) {
SkPMColor4f result = as_MB(mixer)->test_mix(a, b);
check_color(reporter, result, expected);
auto data = mixer->serialize();
auto m2 = SkMixerBase::Deserialize(data->data(), data->size());
SkPMColor4f r2 = as_MB(m2)->test_mix(a, b);
REPORTER_ASSERT(reporter, result == r2);
}
DEF_TEST(Mixer, r) {
const SkPMColor4f transparent = {0, 0, 0, 0};
const SkPMColor4f red = {1, 0, 0, 1};
const SkPMColor4f magenta = {1, 0, 1, 1};
const SkPMColor4f blue = {0, 0, 1, 1};
auto first = SkMixer::MakeFirst();
auto second = SkMixer::MakeSecond();
check_mixer(r, first, red, blue, red);
check_mixer(r, second, red, blue, blue);
check_mixer(r, first->makeReverse(), red, blue, blue);
check_mixer(r, second->makeReverse(), red, blue, red);
check_mixer(r, SkMixer::MakeLerp(0), red, blue, red);
check_mixer(r, SkMixer::MakeLerp(0.0001f), red, blue, red);
check_mixer(r, SkMixer::MakeLerp(0.5f), red, blue, {0.5f, 0, 0.5f, 1});
check_mixer(r, SkMixer::MakeLerp(0.9999f), red, blue, blue);
check_mixer(r, SkMixer::MakeLerp(1), red, blue, blue);
check_mixer(r, SkMixer::MakeBlend(SkBlendMode::kClear), red, blue, transparent);
check_mixer(r, SkMixer::MakeBlend(SkBlendMode::kSrc), red, blue, blue);
check_mixer(r, SkMixer::MakeBlend(SkBlendMode::kDst), red, blue, red);
check_mixer(r, SkMixer::MakeBlend(SkBlendMode::kPlus), red, blue, magenta);
// mx should average the results of Plus and Clear
auto mx = SkMixer::MakeLerp(0.5f)->makeMerge(SkMixer::MakeBlend(SkBlendMode::kPlus),
SkMixer::MakeConst(0));
check_mixer(r, mx, red, blue, {0.5f, 0, 0.5f, 0.5f});
}