16d3cef930ad19b0f55543ca40f7a07030f4fe508reed/*
26d3cef930ad19b0f55543ca40f7a07030f4fe508reed * Copyright 2016 Google Inc.
36d3cef930ad19b0f55543ca40f7a07030f4fe508reed *
46d3cef930ad19b0f55543ca40f7a07030f4fe508reed * Use of this source code is governed by a BSD-style license that can be
56d3cef930ad19b0f55543ca40f7a07030f4fe508reed * found in the LICENSE file.
66d3cef930ad19b0f55543ca40f7a07030f4fe508reed */
76d3cef930ad19b0f55543ca40f7a07030f4fe508reed
842da45d399d73fe3521d9c18c483fb540ad0723cherb#include "SkBitmapProcShader.h"
96d3cef930ad19b0f55543ca40f7a07030f4fe508reed#include "SkColor.h"
105f34e8ed82e6cbf29401bda5d423a50a2ab6db74reed#include "SkColorMatrixFilter.h"
117f225cf32e63e565b5ba584241672f58b48a9acbreed#include "SkGradientShader.h"
127f225cf32e63e565b5ba584241672f58b48a9acbreed#include "SkImage.h"
13dd9ffea9ce051a49dbc6544e6aa3cb68fe987f47reed#include "SkPM4f.h"
147f225cf32e63e565b5ba584241672f58b48a9acbreed#include "SkShader.h"
157f225cf32e63e565b5ba584241672f58b48a9acbreed
166d3cef930ad19b0f55543ca40f7a07030f4fe508reed#include "Test.h"
176d3cef930ad19b0f55543ca40f7a07030f4fe508reed#include "SkRandom.h"
186d3cef930ad19b0f55543ca40f7a07030f4fe508reed
197f225cf32e63e565b5ba584241672f58b48a9acbreedconst float kTolerance = 1.0f / (1 << 20);
207f225cf32e63e565b5ba584241672f58b48a9acbreed
217f225cf32e63e565b5ba584241672f58b48a9acbreedstatic bool nearly_equal(float a, float b, float tol = kTolerance) {
227f225cf32e63e565b5ba584241672f58b48a9acbreed    SkASSERT(tol >= 0);
237f225cf32e63e565b5ba584241672f58b48a9acbreed    return fabsf(a - b) <= tol;
247f225cf32e63e565b5ba584241672f58b48a9acbreed}
257f225cf32e63e565b5ba584241672f58b48a9acbreed
266d3cef930ad19b0f55543ca40f7a07030f4fe508reedDEF_TEST(SkColor4f_FromColor, reporter) {
276d3cef930ad19b0f55543ca40f7a07030f4fe508reed    const struct {
286d3cef930ad19b0f55543ca40f7a07030f4fe508reed        SkColor     fC;
296d3cef930ad19b0f55543ca40f7a07030f4fe508reed        SkColor4f   fC4;
306d3cef930ad19b0f55543ca40f7a07030f4fe508reed    } recs[] = {
31e074d1fa6ace83dd77971b971c07166bedeb28efbrianosman        { SK_ColorBLACK, { 0, 0, 0, 1 } },
326d3cef930ad19b0f55543ca40f7a07030f4fe508reed        { SK_ColorWHITE, { 1, 1, 1, 1 } },
33e074d1fa6ace83dd77971b971c07166bedeb28efbrianosman        { SK_ColorRED,   { 1, 0, 0, 1 } },
34e074d1fa6ace83dd77971b971c07166bedeb28efbrianosman        { SK_ColorGREEN, { 0, 1, 0, 1 } },
35e074d1fa6ace83dd77971b971c07166bedeb28efbrianosman        { SK_ColorBLUE,  { 0, 0, 1, 1 } },
366d3cef930ad19b0f55543ca40f7a07030f4fe508reed        { 0,             { 0, 0, 0, 0 } },
376d3cef930ad19b0f55543ca40f7a07030f4fe508reed    };
386d3cef930ad19b0f55543ca40f7a07030f4fe508reed
396d3cef930ad19b0f55543ca40f7a07030f4fe508reed    for (const auto& r : recs) {
406d3cef930ad19b0f55543ca40f7a07030f4fe508reed        SkColor4f c4 = SkColor4f::FromColor(r.fC);
416d3cef930ad19b0f55543ca40f7a07030f4fe508reed        REPORTER_ASSERT(reporter, c4 == r.fC4);
426d3cef930ad19b0f55543ca40f7a07030f4fe508reed    }
436d3cef930ad19b0f55543ca40f7a07030f4fe508reed}
446d3cef930ad19b0f55543ca40f7a07030f4fe508reed
457f225cf32e63e565b5ba584241672f58b48a9acbreedDEF_TEST(Color4f_premul, reporter) {
466d3cef930ad19b0f55543ca40f7a07030f4fe508reed    SkRandom rand;
476d3cef930ad19b0f55543ca40f7a07030f4fe508reed
486d3cef930ad19b0f55543ca40f7a07030f4fe508reed    for (int i = 0; i < 1000000; ++i) {
496d3cef930ad19b0f55543ca40f7a07030f4fe508reed        // First just test opaque colors, so that the premul should be exact
506d3cef930ad19b0f55543ca40f7a07030f4fe508reed        SkColor4f c4 {
51e074d1fa6ace83dd77971b971c07166bedeb28efbrianosman            rand.nextUScalar1(), rand.nextUScalar1(), rand.nextUScalar1(), 1
526d3cef930ad19b0f55543ca40f7a07030f4fe508reed        };
536d3cef930ad19b0f55543ca40f7a07030f4fe508reed        SkPM4f pm4 = c4.premul();
5493bb080503eec5df5674a1bcfe4baaceced799ffreed        REPORTER_ASSERT(reporter, pm4.a() == c4.fA);
5593bb080503eec5df5674a1bcfe4baaceced799ffreed        REPORTER_ASSERT(reporter, pm4.r() == c4.fA * c4.fR);
5693bb080503eec5df5674a1bcfe4baaceced799ffreed        REPORTER_ASSERT(reporter, pm4.g() == c4.fA * c4.fG);
5793bb080503eec5df5674a1bcfe4baaceced799ffreed        REPORTER_ASSERT(reporter, pm4.b() == c4.fA * c4.fB);
586d3cef930ad19b0f55543ca40f7a07030f4fe508reed
596d3cef930ad19b0f55543ca40f7a07030f4fe508reed        // We compare with a tolerance, in case our premul multiply is implemented at slightly
606d3cef930ad19b0f55543ca40f7a07030f4fe508reed        // different precision than the test code.
616d3cef930ad19b0f55543ca40f7a07030f4fe508reed        c4.fA = rand.nextUScalar1();
626d3cef930ad19b0f55543ca40f7a07030f4fe508reed        pm4 = c4.premul();
636d3cef930ad19b0f55543ca40f7a07030f4fe508reed        REPORTER_ASSERT(reporter, pm4.fVec[SK_A_INDEX] == c4.fA);
6493bb080503eec5df5674a1bcfe4baaceced799ffreed        REPORTER_ASSERT(reporter, nearly_equal(pm4.r(), c4.fA * c4.fR));
6593bb080503eec5df5674a1bcfe4baaceced799ffreed        REPORTER_ASSERT(reporter, nearly_equal(pm4.g(), c4.fA * c4.fG));
6693bb080503eec5df5674a1bcfe4baaceced799ffreed        REPORTER_ASSERT(reporter, nearly_equal(pm4.b(), c4.fA * c4.fB));
676d3cef930ad19b0f55543ca40f7a07030f4fe508reed    }
686d3cef930ad19b0f55543ca40f7a07030f4fe508reed}
69