blob: 698d5442d8eea115ba1769c47e82fe3938bc2e33 [file] [log] [blame]
junov@chromium.orgb6e16192011-12-09 15:48:03 +00001/*
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 */
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +00007
junov@chromium.orgb6e16192011-12-09 15:48:03 +00008#include "SkColorShader.h"
tfarina@chromium.org8f6884a2014-01-24 20:56:26 +00009#include "SkGradientShader.h"
10#include "SkShader.h"
11#include "Test.h"
junov@chromium.orgb6e16192011-12-09 15:48:03 +000012
13static void test_bitmap(skiatest::Reporter* reporter) {
mike@reedtribe.orgdeee4962014-02-13 14:41:43 +000014 SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
15
junov@chromium.orgb6e16192011-12-09 15:48:03 +000016 SkBitmap bmp;
commit-bot@chromium.orga3264e52014-05-30 13:26:10 +000017 bmp.setInfo(info);
rmistry@google.comd6176b02012-08-23 18:14:13 +000018
junov@chromium.orgb6e16192011-12-09 15:48:03 +000019 // test 1: bitmap without pixel data
reed1a9b9642016-03-13 14:13:58 -070020 auto shader = SkShader::MakeBitmapShader(bmp,
junov@chromium.orgb6e16192011-12-09 15:48:03 +000021 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
22 REPORTER_ASSERT(reporter, shader);
23 REPORTER_ASSERT(reporter, !shader->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000024
25 // From this point on, we have pixels
mike@reedtribe.orgdeee4962014-02-13 14:41:43 +000026 bmp.allocPixels(info);
junov@chromium.orgb6e16192011-12-09 15:48:03 +000027
28 // test 2: not opaque by default
reed1a9b9642016-03-13 14:13:58 -070029 shader = SkShader::MakeBitmapShader(bmp,
junov@chromium.orgb6e16192011-12-09 15:48:03 +000030 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
31 REPORTER_ASSERT(reporter, shader);
32 REPORTER_ASSERT(reporter, !shader->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000033
34 // test 3: explicitly opaque
reed@google.com383a6972013-10-21 14:00:07 +000035 bmp.setAlphaType(kOpaque_SkAlphaType);
reed1a9b9642016-03-13 14:13:58 -070036 shader = SkShader::MakeBitmapShader(bmp,
junov@chromium.orgb6e16192011-12-09 15:48:03 +000037 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
38 REPORTER_ASSERT(reporter, shader);
39 REPORTER_ASSERT(reporter, shader->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000040
41 // test 4: explicitly not opaque
reed@google.com383a6972013-10-21 14:00:07 +000042 bmp.setAlphaType(kPremul_SkAlphaType);
reed1a9b9642016-03-13 14:13:58 -070043 shader = SkShader::MakeBitmapShader(bmp,
junov@chromium.orgb6e16192011-12-09 15:48:03 +000044 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
45 REPORTER_ASSERT(reporter, shader);
46 REPORTER_ASSERT(reporter, !shader->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000047}
48
reed1a9b9642016-03-13 14:13:58 -070049static void test_gradient(skiatest::Reporter* reporter) {
junov@chromium.orgb6e16192011-12-09 15:48:03 +000050 SkPoint pts[2];
51 pts[0].iset(0, 0);
52 pts[1].iset(1, 0);
53 SkColor colors[2];
54 SkScalar pos[2] = {SkIntToScalar(0), SkIntToScalar(1)};
55 int count = 2;
56 SkShader::TileMode mode = SkShader::kClamp_TileMode;
57
58 // test 1: all opaque
59 colors[0] = SkColorSetARGB(0xFF, 0, 0, 0);
60 colors[1] = SkColorSetARGB(0xFF, 0, 0, 0);
reed1a9b9642016-03-13 14:13:58 -070061 auto grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode);
junov@chromium.orgb6e16192011-12-09 15:48:03 +000062 REPORTER_ASSERT(reporter, grad);
63 REPORTER_ASSERT(reporter, grad->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000064
65 // test 2: all 0 alpha
66 colors[0] = SkColorSetARGB(0, 0, 0, 0);
67 colors[1] = SkColorSetARGB(0, 0, 0, 0);
reed1a9b9642016-03-13 14:13:58 -070068 grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode);
junov@chromium.orgb6e16192011-12-09 15:48:03 +000069 REPORTER_ASSERT(reporter, grad);
70 REPORTER_ASSERT(reporter, !grad->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000071
72 // test 3: one opaque, one transparent
73 colors[0] = SkColorSetARGB(0xFF, 0, 0, 0);
74 colors[1] = SkColorSetARGB(0x40, 0, 0, 0);
reed1a9b9642016-03-13 14:13:58 -070075 grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode);
junov@chromium.orgb6e16192011-12-09 15:48:03 +000076 REPORTER_ASSERT(reporter, grad);
77 REPORTER_ASSERT(reporter, !grad->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000078
79 // test 4: test 3, swapped
80 colors[0] = SkColorSetARGB(0x40, 0, 0, 0);
81 colors[1] = SkColorSetARGB(0xFF, 0, 0, 0);
reed1a9b9642016-03-13 14:13:58 -070082 grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode);
junov@chromium.orgb6e16192011-12-09 15:48:03 +000083 REPORTER_ASSERT(reporter, grad);
84 REPORTER_ASSERT(reporter, !grad->isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000085}
86
reed1a9b9642016-03-13 14:13:58 -070087static void test_color(skiatest::Reporter* reporter) {
junov@chromium.orgb6e16192011-12-09 15:48:03 +000088 SkColorShader colorShader1(SkColorSetARGB(0,0,0,0));
89 REPORTER_ASSERT(reporter, !colorShader1.isOpaque());
90 SkColorShader colorShader2(SkColorSetARGB(0xFF,0,0,0));
91 REPORTER_ASSERT(reporter, colorShader2.isOpaque());
92 SkColorShader colorShader3(SkColorSetARGB(0x7F,0,0,0));
93 REPORTER_ASSERT(reporter, !colorShader3.isOpaque());
junov@chromium.orgb6e16192011-12-09 15:48:03 +000094}
95
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +000096DEF_TEST(ShaderOpacity, reporter) {
junov@chromium.orgb6e16192011-12-09 15:48:03 +000097 test_gradient(reporter);
98 test_color(reporter);
99 test_bitmap(reporter);
100}