180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "Test.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkShader.h" 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkGradientShader.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkColorShader.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void test_bitmap(skiatest::Reporter* reporter) { 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBitmap bmp; 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bmp.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 1: bitmap without pixel data 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader* shader = SkShader::CreateBitmapShader(bmp, 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, shader); 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !shader->isOpaque()); 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shader->unref(); 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // From this point on, we have pixels 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bmp.allocPixels(); 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 2: not opaque by default 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shader = SkShader::CreateBitmapShader(bmp, 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, shader); 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !shader->isOpaque()); 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shader->unref(); 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 3: explicitly opaque 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bmp.setIsOpaque(true); 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shader = SkShader::CreateBitmapShader(bmp, 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, shader); 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, shader->isOpaque()); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shader->unref(); 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 4: explicitly not opaque 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bmp.setIsOpaque(false); 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shader = SkShader::CreateBitmapShader(bmp, 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader::kClamp_TileMode, SkShader::kClamp_TileMode); 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, shader); 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !shader->isOpaque()); 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru shader->unref(); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void test_gradient(skiatest::Reporter* reporter) 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint pts[2]; 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru pts[0].iset(0, 0); 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru pts[1].iset(1, 0); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor colors[2]; 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar pos[2] = {SkIntToScalar(0), SkIntToScalar(1)}; 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int count = 2; 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader::TileMode mode = SkShader::kClamp_TileMode; 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 1: all opaque 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[0] = SkColorSetARGB(0xFF, 0, 0, 0); 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[1] = SkColorSetARGB(0xFF, 0, 0, 0); 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader* grad = SkGradientShader::CreateLinear(pts, colors, pos, count, 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru mode); 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, grad); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, grad->isOpaque()); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru grad->unref(); 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 2: all 0 alpha 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[0] = SkColorSetARGB(0, 0, 0, 0); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[1] = SkColorSetARGB(0, 0, 0, 0); 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, grad); 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !grad->isOpaque()); 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru grad->unref(); 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 3: one opaque, one transparent 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[0] = SkColorSetARGB(0xFF, 0, 0, 0); 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[1] = SkColorSetARGB(0x40, 0, 0, 0); 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, grad); 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !grad->isOpaque()); 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru grad->unref(); 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // test 4: test 3, swapped 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[0] = SkColorSetARGB(0x40, 0, 0, 0); 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors[1] = SkColorSetARGB(0xFF, 0, 0, 0); 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru grad = SkGradientShader::CreateLinear(pts, colors, pos, count, mode); 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, grad); 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !grad->isOpaque()); 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru grad->unref(); 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void test_color(skiatest::Reporter* reporter) 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColorShader colorShader1(SkColorSetARGB(0,0,0,0)); 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !colorShader1.isOpaque()); 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColorShader colorShader2(SkColorSetARGB(0xFF,0,0,0)); 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, colorShader2.isOpaque()); 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColorShader colorShader3(SkColorSetARGB(0x7F,0,0,0)); 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, !colorShader3.isOpaque()); 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // with inherrited color, shader must declare itself as opaque, 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // since lack of opacity will depend solely on the paint 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColorShader colorShader4; 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru REPORTER_ASSERT(reporter, colorShader4.isOpaque()); 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void test_shader_opacity(skiatest::Reporter* reporter) 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru test_gradient(reporter); 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru test_color(reporter); 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru test_bitmap(reporter); 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "TestClassDef.h" 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_TESTCLASS("ShaderOpacity", ShaderOpacityTestClass, test_shader_opacity) 120