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