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