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