1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org
883acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com#include "SkColor.h"
913e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com#include "SkColorPriv.h"
104b163ed2c22facbe8891616874ae07ba7827d9c9reed@google.com#include "SkMathPriv.h"
1113e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com#include "SkRandom.h"
1283acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com#include "SkUnPreMultiply.h"
138f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
1483acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com
15223d81d8821bffa9b0c9fe608737952ac5c68c32reed@google.com#define GetPackedR16As32(packed)    (SkGetPackedR16(dc) << (8 - SK_R16_BITS))
16223d81d8821bffa9b0c9fe608737952ac5c68c32reed@google.com#define GetPackedG16As32(packed)    (SkGetPackedG16(dc) << (8 - SK_G16_BITS))
17223d81d8821bffa9b0c9fe608737952ac5c68c32reed@google.com#define GetPackedB16As32(packed)    (SkGetPackedB16(dc) << (8 - SK_B16_BITS))
18223d81d8821bffa9b0c9fe608737952ac5c68c32reed@google.com
1905af1afd429808913683da75644e48bece12e820humper@google.comstatic inline void test_premul(skiatest::Reporter* reporter) {
2083acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com    for (int a = 0; a <= 255; a++) {
2183acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com        for (int x = 0; x <= 255; x++) {
2283acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com            SkColor c0 = SkColorSetARGB(a, x, x, x);
2383acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com            SkPMColor p0 = SkPreMultiplyColor(c0);
2483acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com
2583acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com            SkColor c1 = SkUnPreMultiply::PMColorToColor(p0);
2683acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com            SkPMColor p1 = SkPreMultiplyColor(c1);
2783acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com
2883acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com            // we can't promise that c0 == c1, since c0 -> p0 is a many to one
2983acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com            // function, however, we can promise that p0 -> c1 -> p1 : p0 == p1
3083acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com            REPORTER_ASSERT(reporter, p0 == p1);
3175595d939230506b5819f9ceed4a8b22a5661921reed@google.com
3275595d939230506b5819f9ceed4a8b22a5661921reed@google.com            {
3375595d939230506b5819f9ceed4a8b22a5661921reed@google.com                int ax = SkMulDiv255Ceiling(x, a);
3475595d939230506b5819f9ceed4a8b22a5661921reed@google.com                REPORTER_ASSERT(reporter, ax <= a);
3575595d939230506b5819f9ceed4a8b22a5661921reed@google.com            }
3683acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com        }
3783acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com    }
3883acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com}
3983acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com
4013e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com/**
4113e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com  This test fails: SkFourByteInterp does *not* preserve opaque destinations.
4213e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com  SkAlpha255To256 implemented as (alpha + 1) is faster than
4313e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com  (alpha + (alpha >> 7)), but inaccurate, and Skia intends to phase it out.
4413e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com*/
4513e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com/*
4613e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.comstatic void test_interp(skiatest::Reporter* reporter) {
47e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom r;
4813e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com
4913e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    U8CPU a0 = 0;
5013e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    U8CPU a255 = 255;
5113e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    for (int i = 0; i < 200; i++) {
5213e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkColor colorSrc = r.nextU();
5313e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkColor colorDst = r.nextU();
5413e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkPMColor src = SkPreMultiplyColor(colorSrc);
5513e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkPMColor dst = SkPreMultiplyColor(colorDst);
5613e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com
5713e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        REPORTER_ASSERT(reporter, SkFourByteInterp(src, dst, a0) == dst);
5813e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        REPORTER_ASSERT(reporter, SkFourByteInterp(src, dst, a255) == src);
5913e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    }
6013e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com}
6113e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com*/
6213e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com
6305af1afd429808913683da75644e48bece12e820humper@google.comstatic inline void test_fast_interp(skiatest::Reporter* reporter) {
64e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom r;
6513e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com
6613e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    U8CPU a0 = 0;
6713e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    U8CPU a255 = 255;
6813e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    for (int i = 0; i < 200; i++) {
6913e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkColor colorSrc = r.nextU();
7013e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkColor colorDst = r.nextU();
7113e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkPMColor src = SkPreMultiplyColor(colorSrc);
7213e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        SkPMColor dst = SkPreMultiplyColor(colorDst);
7313e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com
7413e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        REPORTER_ASSERT(reporter, SkFastFourByteInterp(src, dst, a0) == dst);
7513e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com        REPORTER_ASSERT(reporter, SkFastFourByteInterp(src, dst, a255) == src);
7613e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    }
7713e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com}
7883acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com
79e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Color, reporter) {
8083acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com    test_premul(reporter);
8113e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    //test_interp(reporter);
8213e812c69a9e2b2550871573786fc72b17bdd766tomhudson@google.com    test_fast_interp(reporter);
83e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org    //test_565blend();
8483acbe0a789fe045f6a8053f0c533e6de8df9e58reed@google.com}
85