11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "Test.h" 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkShader.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorShader.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void test_bitmap(skiatest::Reporter* reporter) { 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkBitmap bmp; 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bmp.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 1: bitmap without pixel data 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader* shader = SkShader::CreateBitmapShader(bmp, 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, shader); 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !shader->isOpaque()); 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger shader->unref(); 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // From this point on, we have pixels 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bmp.allocPixels(); 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 2: not opaque by default 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger shader = SkShader::CreateBitmapShader(bmp, 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, shader); 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !shader->isOpaque()); 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger shader->unref(); 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 3: explicitly opaque 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bmp.setIsOpaque(true); 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger shader = SkShader::CreateBitmapShader(bmp, 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, shader); 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, shader->isOpaque()); 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger shader->unref(); 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 4: explicitly not opaque 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bmp.setIsOpaque(false); 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger shader = SkShader::CreateBitmapShader(bmp, 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, shader); 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !shader->isOpaque()); 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger shader->unref(); 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void test_gradient(skiatest::Reporter* reporter) 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger{ 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPoint pts[2]; 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger pts[0].iset(0, 0); 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger pts[1].iset(1, 0); 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor colors[2]; 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar pos[2] = {SkIntToScalar(0), SkIntToScalar(1)}; 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int count = 2; 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader::TileMode mode = SkShader::kClamp_TileMode; 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 1: all opaque 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[0] = SkColorSetARGB(0xFF, 0, 0, 0); 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[1] = SkColorSetARGB(0xFF, 0, 0, 0); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkShader* grad = SkGradientShader::CreateLinear(pts, colors, pos, count, 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger mode); 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, grad); 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, grad->isOpaque()); 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger grad->unref(); 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 2: all 0 alpha 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[0] = SkColorSetARGB(0, 0, 0, 0); 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[1] = SkColorSetARGB(0, 0, 0, 0); 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, grad); 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !grad->isOpaque()); 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger grad->unref(); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 3: one opaque, one transparent 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[0] = SkColorSetARGB(0xFF, 0, 0, 0); 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[1] = SkColorSetARGB(0x40, 0, 0, 0); 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, grad); 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !grad->isOpaque()); 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger grad->unref(); 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // test 4: test 3, swapped 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[0] = SkColorSetARGB(0x40, 0, 0, 0); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger colors[1] = SkColorSetARGB(0xFF, 0, 0, 0); 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, grad); 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !grad->isOpaque()); 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger grad->unref(); 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void test_color(skiatest::Reporter* reporter) 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger{ 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColorShader colorShader1(SkColorSetARGB(0,0,0,0)); 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !colorShader1.isOpaque()); 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColorShader colorShader2(SkColorSetARGB(0xFF,0,0,0)); 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, colorShader2.isOpaque()); 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColorShader colorShader3(SkColorSetARGB(0x7F,0,0,0)); 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, !colorShader3.isOpaque()); 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // with inherrited color, shader must declare itself as opaque, 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // since lack of opacity will depend solely on the paint 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColorShader colorShader4; 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger REPORTER_ASSERT(reporter, colorShader4.isOpaque()); 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void test_shader_opacity(skiatest::Reporter* reporter) 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger{ 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger test_gradient(reporter); 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger test_color(reporter); 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger test_bitmap(reporter); 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "TestClassDef.h" 1191cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerDEFINE_TESTCLASS("ShaderOpacity", ShaderOpacityTestClass, test_shader_opacity) 120