1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 11cb93a386Sopenharmony_ci#include "include/core/SkSurface.h" 12cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 13cb93a386Sopenharmony_ci#include "src/shaders/SkColorShader.h" 14cb93a386Sopenharmony_ci#include "tests/Test.h" 15cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cistatic void test_bitmap(skiatest::Reporter* reporter) { 18cb93a386Sopenharmony_ci SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2); 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci SkBitmap bmp; 21cb93a386Sopenharmony_ci bmp.setInfo(info); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci // test 1: bitmap without pixel data 24cb93a386Sopenharmony_ci auto shader = bmp.makeShader(SkSamplingOptions()); 25cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, shader); 26cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !shader->isOpaque()); 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci // From this point on, we have pixels 29cb93a386Sopenharmony_ci bmp.allocPixels(info); 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci // test 2: not opaque by default 32cb93a386Sopenharmony_ci shader = bmp.makeShader(SkSamplingOptions()); 33cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, shader); 34cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !shader->isOpaque()); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci // test 3: explicitly opaque 37cb93a386Sopenharmony_ci bmp.setAlphaType(kOpaque_SkAlphaType); 38cb93a386Sopenharmony_ci shader = bmp.makeShader(SkSamplingOptions()); 39cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, shader); 40cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, shader->isOpaque()); 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci // test 4: explicitly not opaque 43cb93a386Sopenharmony_ci bmp.setAlphaType(kPremul_SkAlphaType); 44cb93a386Sopenharmony_ci shader = bmp.makeShader(SkSamplingOptions()); 45cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, shader); 46cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !shader->isOpaque()); 47cb93a386Sopenharmony_ci} 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_cistatic void test_gradient(skiatest::Reporter* reporter) { 50cb93a386Sopenharmony_ci SkPoint pts[2]; 51cb93a386Sopenharmony_ci pts[0].iset(0, 0); 52cb93a386Sopenharmony_ci pts[1].iset(1, 0); 53cb93a386Sopenharmony_ci SkColor colors[2]; 54cb93a386Sopenharmony_ci SkScalar pos[2] = {SkIntToScalar(0), SkIntToScalar(1)}; 55cb93a386Sopenharmony_ci int count = 2; 56cb93a386Sopenharmony_ci SkTileMode mode = SkTileMode::kClamp; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci // test 1: all opaque 59cb93a386Sopenharmony_ci colors[0] = SkColorSetARGB(0xFF, 0, 0, 0); 60cb93a386Sopenharmony_ci colors[1] = SkColorSetARGB(0xFF, 0, 0, 0); 61cb93a386Sopenharmony_ci auto grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode); 62cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, grad); 63cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, grad->isOpaque()); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci // test 2: all 0 alpha 66cb93a386Sopenharmony_ci colors[0] = SkColorSetARGB(0, 0, 0, 0); 67cb93a386Sopenharmony_ci colors[1] = SkColorSetARGB(0, 0, 0, 0); 68cb93a386Sopenharmony_ci grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode); 69cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, grad); 70cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !grad->isOpaque()); 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci // test 3: one opaque, one transparent 73cb93a386Sopenharmony_ci colors[0] = SkColorSetARGB(0xFF, 0, 0, 0); 74cb93a386Sopenharmony_ci colors[1] = SkColorSetARGB(0x40, 0, 0, 0); 75cb93a386Sopenharmony_ci grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode); 76cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, grad); 77cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !grad->isOpaque()); 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci // test 4: test 3, swapped 80cb93a386Sopenharmony_ci colors[0] = SkColorSetARGB(0x40, 0, 0, 0); 81cb93a386Sopenharmony_ci colors[1] = SkColorSetARGB(0xFF, 0, 0, 0); 82cb93a386Sopenharmony_ci grad = SkGradientShader::MakeLinear(pts, colors, pos, count, mode); 83cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, grad); 84cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !grad->isOpaque()); 85cb93a386Sopenharmony_ci} 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_cistatic void test_color(skiatest::Reporter* reporter) { 88cb93a386Sopenharmony_ci SkColorShader colorShader1(SkColorSetARGB(0,0,0,0)); 89cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !colorShader1.isOpaque()); 90cb93a386Sopenharmony_ci SkColorShader colorShader2(SkColorSetARGB(0xFF,0,0,0)); 91cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, colorShader2.isOpaque()); 92cb93a386Sopenharmony_ci SkColorShader colorShader3(SkColorSetARGB(0x7F,0,0,0)); 93cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, !colorShader3.isOpaque()); 94cb93a386Sopenharmony_ci} 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ciDEF_TEST(ShaderOpacity, reporter) { 97cb93a386Sopenharmony_ci test_gradient(reporter); 98cb93a386Sopenharmony_ci test_color(reporter); 99cb93a386Sopenharmony_ci test_bitmap(reporter); 100cb93a386Sopenharmony_ci} 101