/* * 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 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}); }