Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / tests / ColorTest.cpp
1 /*
2  * Copyright 2011 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 "SkColor.h"
9 #include "SkColorPriv.h"
10 #include "SkMathPriv.h"
11 #include "SkRandom.h"
12 #include "SkUnPreMultiply.h"
13 #include "Test.h"
14
15 #define GetPackedR16As32(packed)    (SkGetPackedR16(dc) << (8 - SK_R16_BITS))
16 #define GetPackedG16As32(packed)    (SkGetPackedG16(dc) << (8 - SK_G16_BITS))
17 #define GetPackedB16As32(packed)    (SkGetPackedB16(dc) << (8 - SK_B16_BITS))
18
19 static inline void test_premul(skiatest::Reporter* reporter) {
20     for (int a = 0; a <= 255; a++) {
21         for (int x = 0; x <= 255; x++) {
22             SkColor c0 = SkColorSetARGB(a, x, x, x);
23             SkPMColor p0 = SkPreMultiplyColor(c0);
24
25             SkColor c1 = SkUnPreMultiply::PMColorToColor(p0);
26             SkPMColor p1 = SkPreMultiplyColor(c1);
27
28             // we can't promise that c0 == c1, since c0 -> p0 is a many to one
29             // function, however, we can promise that p0 -> c1 -> p1 : p0 == p1
30             REPORTER_ASSERT(reporter, p0 == p1);
31
32             {
33                 int ax = SkMulDiv255Ceiling(x, a);
34                 REPORTER_ASSERT(reporter, ax <= a);
35             }
36         }
37     }
38 }
39
40 /**
41   This test fails: SkFourByteInterp does *not* preserve opaque destinations.
42   SkAlpha255To256 implemented as (alpha + 1) is faster than
43   (alpha + (alpha >> 7)), but inaccurate, and Skia intends to phase it out.
44 */
45 /*
46 static void test_interp(skiatest::Reporter* reporter) {
47     SkRandom r;
48
49     U8CPU a0 = 0;
50     U8CPU a255 = 255;
51     for (int i = 0; i < 200; i++) {
52         SkColor colorSrc = r.nextU();
53         SkColor colorDst = r.nextU();
54         SkPMColor src = SkPreMultiplyColor(colorSrc);
55         SkPMColor dst = SkPreMultiplyColor(colorDst);
56
57         REPORTER_ASSERT(reporter, SkFourByteInterp(src, dst, a0) == dst);
58         REPORTER_ASSERT(reporter, SkFourByteInterp(src, dst, a255) == src);
59     }
60 }
61 */
62
63 static inline void test_fast_interp(skiatest::Reporter* reporter) {
64     SkRandom r;
65
66     U8CPU a0 = 0;
67     U8CPU a255 = 255;
68     for (int i = 0; i < 200; i++) {
69         SkColor colorSrc = r.nextU();
70         SkColor colorDst = r.nextU();
71         SkPMColor src = SkPreMultiplyColor(colorSrc);
72         SkPMColor dst = SkPreMultiplyColor(colorDst);
73
74         REPORTER_ASSERT(reporter, SkFastFourByteInterp(src, dst, a0) == dst);
75         REPORTER_ASSERT(reporter, SkFastFourByteInterp(src, dst, a255) == src);
76     }
77 }
78
79 DEF_TEST(Color, reporter) {
80     test_premul(reporter);
81     //test_interp(reporter);
82     test_fast_interp(reporter);
83     //test_565blend();
84 }