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