1b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org/*
2b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org * Copyright 2011 Google Inc.
3b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org *
4b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org * Use of this source code is governed by a BSD-style license that can be
5b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org * found in the LICENSE file.
6b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org */
7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org
8b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org#include "SkColorShader.h"
98f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkGradientShader.h"
108f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkShader.h"
118f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
12b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
13b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.orgstatic void test_bitmap(skiatest::Reporter* reporter) {
14deee496cd30070e52556dcb538c2e5eb39b66b81mike@reedtribe.org    SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
15deee496cd30070e52556dcb538c2e5eb39b66b81mike@reedtribe.org
16b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkBitmap bmp;
17a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org    bmp.setInfo(info);
18d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
19b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 1: bitmap without pixel data
20d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    SkShader* shader = SkShader::CreateBitmapShader(bmp,
21b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org        SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
22b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, shader);
23b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !shader->isOpaque());
24b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    shader->unref();
25b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
26b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // From this point on, we have pixels
27deee496cd30070e52556dcb538c2e5eb39b66b81mike@reedtribe.org    bmp.allocPixels(info);
28b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
29b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 2: not opaque by default
30d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    shader = SkShader::CreateBitmapShader(bmp,
31b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org        SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
32b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, shader);
33b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !shader->isOpaque());
34b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    shader->unref();
35b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
36b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 3: explicitly opaque
37383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com    bmp.setAlphaType(kOpaque_SkAlphaType);
38d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    shader = SkShader::CreateBitmapShader(bmp,
39b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org        SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
40b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, shader);
41b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, shader->isOpaque());
42b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    shader->unref();
43b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
44b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 4: explicitly not opaque
45383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com    bmp.setAlphaType(kPremul_SkAlphaType);
46d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    shader = SkShader::CreateBitmapShader(bmp,
47b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org        SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
48b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, shader);
49b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !shader->isOpaque());
50b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    shader->unref();
51b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
52b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org}
53b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
54b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.orgstatic void test_gradient(skiatest::Reporter* reporter)
55b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org{
56b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkPoint pts[2];
57b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    pts[0].iset(0, 0);
58b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    pts[1].iset(1, 0);
59b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkColor colors[2];
60b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkScalar pos[2] = {SkIntToScalar(0), SkIntToScalar(1)};
61b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    int count = 2;
62b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkShader::TileMode mode = SkShader::kClamp_TileMode;
63b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
64b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 1: all opaque
65b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[0] = SkColorSetARGB(0xFF, 0, 0, 0);
66b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[1] = SkColorSetARGB(0xFF, 0, 0, 0);
67b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkShader* grad = SkGradientShader::CreateLinear(pts, colors, pos, count,
68b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org                                                    mode);
69b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, grad);
70b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, grad->isOpaque());
71b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    grad->unref();
72b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
73b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 2: all 0 alpha
74b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[0] = SkColorSetARGB(0, 0, 0, 0);
75b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[1] = SkColorSetARGB(0, 0, 0, 0);
76b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode);
77b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, grad);
78b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !grad->isOpaque());
79b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    grad->unref();
80b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
81b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 3: one opaque, one transparent
82b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[0] = SkColorSetARGB(0xFF, 0, 0, 0);
83b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[1] = SkColorSetARGB(0x40, 0, 0, 0);
84b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode);
85b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, grad);
86b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !grad->isOpaque());
87b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    grad->unref();
88b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
89b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    // test 4: test 3, swapped
90b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[0] = SkColorSetARGB(0x40, 0, 0, 0);
91b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    colors[1] = SkColorSetARGB(0xFF, 0, 0, 0);
92b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode);
93b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, grad);
94b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !grad->isOpaque());
95b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    grad->unref();
96b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org}
97b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
98b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.orgstatic void test_color(skiatest::Reporter* reporter)
99b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org{
100b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkColorShader colorShader1(SkColorSetARGB(0,0,0,0));
101b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !colorShader1.isOpaque());
102b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkColorShader colorShader2(SkColorSetARGB(0xFF,0,0,0));
103b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, colorShader2.isOpaque());
104b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    SkColorShader colorShader3(SkColorSetARGB(0x7F,0,0,0));
105b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    REPORTER_ASSERT(reporter, !colorShader3.isOpaque());
106b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org}
107b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
108e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(ShaderOpacity, reporter) {
109b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    test_gradient(reporter);
110b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    test_color(reporter);
111b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    test_bitmap(reporter);
112b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org}
113