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>
203d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett#include <SkBlurDrawLooper.h>
2120136f31941e3b036bf25537f1dac364a58483c9Chris Craik#include <SkColorMatrixFilter.h>
22253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy#include <SkColorSpace.h>
2362feb3a0b4690144a067080ab17beae160ea6320Matt Sarett#include <SkImagePriv.h>
24e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett#include <SkPathOps.h>
2562feb3a0b4690144a067080ab17beae160ea6320Matt Sarett#include <SkShader.h>
2607d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
2707d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craikusing namespace android;
2807d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craikusing namespace android::uirenderer;
2907d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
30c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyvSkBitmap createSkBitmap(int width, int height) {
31c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    SkBitmap bitmap;
32c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    SkImageInfo info = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);
33c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    bitmap.setInfo(info);
34c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    bitmap.allocPixels(info);
35c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    return bitmap;
36c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv}
37c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
3807d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik/**
3907d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * 1x1 bitmaps must not be optimized into solid color shaders, since HWUI can't
4007d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik * compose/render color shaders
4107d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik */
4207d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris CraikTEST(SkiaBehavior, CreateBitmapShader1x1) {
43c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    SkBitmap origBitmap = createSkBitmap(1, 1);
44c54b76e97d00497e4fea1aa08ae404bfd4ae875dMatt Sarett    sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(origBitmap, kNever_SkCopyPixelsMode);
45c54b76e97d00497e4fea1aa08ae404bfd4ae875dMatt Sarett    sk_sp<SkShader> s = image->makeShader(
4607d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik            SkShader::kClamp_TileMode,
4762feb3a0b4690144a067080ab17beae160ea6320Matt Sarett            SkShader::kRepeat_TileMode,
4862feb3a0b4690144a067080ab17beae160ea6320Matt Sarett            nullptr);
4907d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik
5007d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    SkBitmap bitmap;
5107d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    SkShader::TileMode xy[2];
5207d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    ASSERT_TRUE(s->isABitmap(&bitmap, nullptr, xy))
5307d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik        << "1x1 bitmap shader must query as bitmap shader";
5407d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik    EXPECT_EQ(origBitmap.pixelRef(), bitmap.pixelRef());
5507d8d59e21125fe7cba09b10e3dd7ecb9c49e8d8Chris Craik}
56bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik
57bee6092dbef81ff724624c4dd630efa8657817f8Chris CraikTEST(SkiaBehavior, genIds) {
58c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    SkBitmap bitmap = createSkBitmap(100, 100);
59bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik    uint32_t genId = bitmap.getGenerationID();
60bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik    bitmap.notifyPixelsChanged();
61bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik    EXPECT_NE(genId, bitmap.getGenerationID());
62bee6092dbef81ff724624c4dd630efa8657817f8Chris Craik}
6320136f31941e3b036bf25537f1dac364a58483c9Chris Craik
6420136f31941e3b036bf25537f1dac364a58483c9Chris CraikTEST(SkiaBehavior, lightingColorFilter_simplify) {
6536ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    {
66260ab726486317496bc12a57d599ea96dcde3284Mike Reed        sk_sp<SkColorFilter> filter(
67260ab726486317496bc12a57d599ea96dcde3284Mike Reed                SkColorMatrixFilter::MakeLightingFilter(0x11223344, 0));
6820136f31941e3b036bf25537f1dac364a58483c9Chris Craik
6936ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        SkColor observedColor;
70c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed        SkBlendMode observedMode;
7136ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        ASSERT_TRUE(filter->asColorMode(&observedColor, &observedMode));
7236ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        EXPECT_EQ(0xFF223344, observedColor);
73c2f31df8b3b9a237e9abffc59c61804ad8495073Mike Reed        EXPECT_EQ(SkBlendMode::kModulate, observedMode);
7436ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    }
7520136f31941e3b036bf25537f1dac364a58483c9Chris Craik
7636ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    {
77260ab726486317496bc12a57d599ea96dcde3284Mike Reed        sk_sp<SkColorFilter> failFilter(
78260ab726486317496bc12a57d599ea96dcde3284Mike Reed                SkColorMatrixFilter::MakeLightingFilter(0x11223344, 0x1));
7936ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik        EXPECT_FALSE(failFilter->asColorMode(nullptr, nullptr));
8036ce80d5301664b4839ebd2f4570f062cbabf862Chris Craik    }
8120136f31941e3b036bf25537f1dac364a58483c9Chris Craik}
825d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck
835d31a293ad0a832c7b8b445c1a67fb1800e5da32John ReckTEST(SkiaBehavior, porterDuffCreateIsCached) {
845d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck    SkPaint paint;
85260ab726486317496bc12a57d599ea96dcde3284Mike Reed    paint.setBlendMode(SkBlendMode::kOverlay);
86260ab726486317496bc12a57d599ea96dcde3284Mike Reed    auto expected = paint.getBlendMode();
87260ab726486317496bc12a57d599ea96dcde3284Mike Reed    paint.setBlendMode(SkBlendMode::kClear);
88260ab726486317496bc12a57d599ea96dcde3284Mike Reed    ASSERT_NE(expected, paint.getBlendMode());
89260ab726486317496bc12a57d599ea96dcde3284Mike Reed    paint.setBlendMode(SkBlendMode::kOverlay);
90260ab726486317496bc12a57d599ea96dcde3284Mike Reed    ASSERT_EQ(expected, paint.getBlendMode());
915d31a293ad0a832c7b8b445c1a67fb1800e5da32John Reck}
92253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy
93e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt SarettTEST(SkiaBehavior, pathIntersection) {
94e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett    SkPath p0, p1, result;
95e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett    p0.addRect(SkRect::MakeXYWH(-5.0f, 0.0f, 1080.0f, 242.0f));
96e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett    p1.addRect(SkRect::MakeXYWH(0.0f, 0.0f, 1080.0f, 242.0f));
97e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett    Op(p0, p1, kIntersect_SkPathOp, &result);
98e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett    SkRect resultRect;
99e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett    ASSERT_TRUE(result.isRect(&resultRect));
100e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett    ASSERT_EQ(SkRect::MakeXYWH(0.0f, 0.0f, 1075.0f, 242.0f), resultRect);
101e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett}
102e07a91a8dbcadd9898fdea0bc19ddb55014f3eebMatt Sarett
103253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain GuyTEST(SkiaBehavior, srgbColorSpaceIsSingleton) {
10489ddb1f1644e0b47de060d2c9aaf6d5387c38f2fMatt Sarett    sk_sp<SkColorSpace> sRGB1 = SkColorSpace::MakeSRGB();
10589ddb1f1644e0b47de060d2c9aaf6d5387c38f2fMatt Sarett    sk_sp<SkColorSpace> sRGB2 = SkColorSpace::MakeSRGB();
106253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy    ASSERT_EQ(sRGB1.get(), sRGB2.get());
107253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy}
1083d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett
1093d2135931cb05db77490e7f151d5badaa9337fa3Matt SarettTEST(SkiaBehavior, blurDrawLooper) {
1103d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    sk_sp<SkDrawLooper> looper = SkBlurDrawLooper::Make(SK_ColorRED, 5.0f, 3.0f, 4.0f);
1113d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett
1123d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    SkDrawLooper::BlurShadowRec blur;
1133d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    bool success = looper->asABlurShadow(&blur);
1143d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    ASSERT_TRUE(success);
1153d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett
1163d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    ASSERT_EQ(SK_ColorRED, blur.fColor);
1173d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    ASSERT_EQ(5.0f, blur.fSigma);
1183d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    ASSERT_EQ(3.0f, blur.fOffset.fX);
1193d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett    ASSERT_EQ(4.0f, blur.fOffset.fY);
1203d2135931cb05db77490e7f151d5badaa9337fa3Matt Sarett}
121