• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "SkBitmapProcShader.h"
9 #include "SkColor.h"
10 #include "SkColorMatrixFilter.h"
11 #include "SkGradientShader.h"
12 #include "SkImage.h"
13 #include "SkPM4f.h"
14 #include "SkShader.h"
15 
16 #include "Test.h"
17 #include "SkRandom.h"
18 
19 const float kTolerance = 1.0f / (1 << 20);
20 
nearly_equal(float a,float b,float tol=kTolerance)21 static bool nearly_equal(float a, float b, float tol = kTolerance) {
22     SkASSERT(tol >= 0);
23     return fabsf(a - b) <= tol;
24 }
25 
DEF_TEST(SkColor4f_FromColor,reporter)26 DEF_TEST(SkColor4f_FromColor, reporter) {
27     const struct {
28         SkColor     fC;
29         SkColor4f   fC4;
30     } recs[] = {
31         { SK_ColorBLACK, { 0, 0, 0, 1 } },
32         { SK_ColorWHITE, { 1, 1, 1, 1 } },
33         { SK_ColorRED,   { 1, 0, 0, 1 } },
34         { SK_ColorGREEN, { 0, 1, 0, 1 } },
35         { SK_ColorBLUE,  { 0, 0, 1, 1 } },
36         { 0,             { 0, 0, 0, 0 } },
37     };
38 
39     for (const auto& r : recs) {
40         SkColor4f c4 = SkColor4f::FromColor(r.fC);
41         REPORTER_ASSERT(reporter, c4 == r.fC4);
42     }
43 }
44 
DEF_TEST(Color4f_premul,reporter)45 DEF_TEST(Color4f_premul, reporter) {
46     SkRandom rand;
47 
48     for (int i = 0; i < 1000000; ++i) {
49         // First just test opaque colors, so that the premul should be exact
50         SkColor4f c4 {
51             rand.nextUScalar1(), rand.nextUScalar1(), rand.nextUScalar1(), 1
52         };
53         SkPM4f pm4 = c4.premul();
54         REPORTER_ASSERT(reporter, pm4.a() == c4.fA);
55         REPORTER_ASSERT(reporter, pm4.r() == c4.fA * c4.fR);
56         REPORTER_ASSERT(reporter, pm4.g() == c4.fA * c4.fG);
57         REPORTER_ASSERT(reporter, pm4.b() == c4.fA * c4.fB);
58 
59         // We compare with a tolerance, in case our premul multiply is implemented at slightly
60         // different precision than the test code.
61         c4.fA = rand.nextUScalar1();
62         pm4 = c4.premul();
63         REPORTER_ASSERT(reporter, pm4.fVec[SK_A_INDEX] == c4.fA);
64         REPORTER_ASSERT(reporter, nearly_equal(pm4.r(), c4.fA * c4.fR));
65         REPORTER_ASSERT(reporter, nearly_equal(pm4.g(), c4.fA * c4.fG));
66         REPORTER_ASSERT(reporter, nearly_equal(pm4.b(), c4.fA * c4.fB));
67     }
68 }
69