107d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik/*
207d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * Copyright (C) 2015 The Android Open Source Project
307d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik *
407d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
507d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * you may not use this file except in compliance with the License.
607d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * You may obtain a copy of the License at
707d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik *
807d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
907d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik *
1007d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * Unless required by applicable law or agreed to in writing, software
1107d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
1207d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1307d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * See the License for the specific language governing permissions and
1407d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * limitations under the License.
1507d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik */
1607d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
1707d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik#include "tests/common/TestUtils.h"
1807d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
1907d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik#include <gtest/gtest.h>
2007d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik#include <SkShader.h>
2120136f31941e3b036bf25537f1dac364a58483c9Chris Craik#include <SkColorMatrixFilter.h>
2207d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
2307d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craikusing namespace android;
2407d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craikusing namespace android::uirenderer;
2507d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
2607d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik/**
2707d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * 1x1 bitmaps must not be optimized into solid color shaders, since HWUI can't
2807d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * compose/render color shaders
2907d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik */
3007d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris CraikTEST(SkiaBehavior, CreateBitmapShader1x1) {
3107d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    SkBitmap origBitmap = TestUtils::createSkBitmap(1, 1);
3220136f31941e3b036bf25537f1dac364a58483c9Chris Craik    SkAutoTUnref<SkShader> s(SkShader::CreateBitmapShader(
3307d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik            origBitmap,
3407d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik            SkShader::kClamp_TileMode,
3507d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik            SkShader::kRepeat_TileMode));
3607d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
3707d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    SkBitmap bitmap;
3807d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    SkShader::TileMode xy[2];
3907d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    ASSERT_TRUE(s->isABitmap(&bitmap, nullptr, xy))
4007d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik        << "1x1 bitmap shader must query as bitmap shader";
4107d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    EXPECT_EQ(SkShader::kClamp_TileMode, xy[0]);
4207d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    EXPECT_EQ(SkShader::kRepeat_TileMode, xy[1]);
4307d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    EXPECT_EQ(origBitmap.pixelRef(), bitmap.pixelRef());
4407d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik}
45bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik
46bee6092dbef81ff724624c4dd630efa8657817f8Chris CraikTEST(SkiaBehavior, genIds) {
47bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik    SkBitmap bitmap = TestUtils::createSkBitmap(100, 100);
48bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik    uint32_t genId = bitmap.getGenerationID();
49bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik    bitmap.notifyPixelsChanged();
50bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik    EXPECT_NE(genId, bitmap.getGenerationID());
51bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik}
5220136f31941e3b036bf25537f1dac364a58483c9Chris Craik
5320136f31941e3b036bf25537f1dac364a58483c9Chris CraikTEST(SkiaBehavior, lightingColorFilter_simplify) {
5436ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    {
5536ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        SkAutoTUnref<SkColorFilter> filter(
5636ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik                SkColorMatrixFilter::CreateLightingFilter(0x11223344, 0));
5720136f31941e3b036bf25537f1dac364a58483c9Chris Craik
5836ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        SkColor observedColor;
5936ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        SkXfermode::Mode observedMode;
6036ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        ASSERT_TRUE(filter->asColorMode(&observedColor, &observedMode));
6136ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        EXPECT_EQ(0xFF223344, observedColor);
6236ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        EXPECT_EQ(SkXfermode::Mode::kModulate_Mode, observedMode);
6336ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    }
6420136f31941e3b036bf25537f1dac364a58483c9Chris Craik
6536ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    {
6636ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        SkAutoTUnref<SkColorFilter> failFilter(
6736ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik                SkColorMatrixFilter::CreateLightingFilter(0x11223344, 0x1));
6836ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        EXPECT_FALSE(failFilter->asColorMode(nullptr, nullptr));
6936ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    }
7020136f31941e3b036bf25537f1dac364a58483c9Chris Craik}
71