1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkData.h" 11cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 12cb93a386Sopenharmony_ci#include "include/core/SkRRect.h" 13cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 14cb93a386Sopenharmony_ci#include "include/core/SkSurface.h" 15cb93a386Sopenharmony_ci#include "include/effects/SkPerlinNoiseShader.h" 16cb93a386Sopenharmony_ci#include "tests/Test.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cistatic void check_isaimage(skiatest::Reporter* reporter, SkShader* shader, 19cb93a386Sopenharmony_ci int expectedW, int expectedH, 20cb93a386Sopenharmony_ci SkTileMode expectedX, SkTileMode expectedY, 21cb93a386Sopenharmony_ci const SkMatrix& expectedM) { 22cb93a386Sopenharmony_ci SkTileMode tileModes[2]; 23cb93a386Sopenharmony_ci SkMatrix localM; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci // wack these so we don't get a false positive 26cb93a386Sopenharmony_ci localM.setScale(9999, -9999); 27cb93a386Sopenharmony_ci tileModes[0] = tileModes[1] = (SkTileMode)99; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci SkImage* image = shader->isAImage(&localM, tileModes); 30cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, image); 31cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, image->width() == expectedW); 32cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, image->height() == expectedH); 33cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, localM == expectedM); 34cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, tileModes[0] == expectedX); 35cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, tileModes[1] == expectedY); 36cb93a386Sopenharmony_ci} 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ciDEF_TEST(Shader_isAImage, reporter) { 39cb93a386Sopenharmony_ci const int W = 100; 40cb93a386Sopenharmony_ci const int H = 100; 41cb93a386Sopenharmony_ci SkBitmap bm; 42cb93a386Sopenharmony_ci bm.allocN32Pixels(W, H); 43cb93a386Sopenharmony_ci auto img = bm.asImage(); 44cb93a386Sopenharmony_ci const SkMatrix localM = SkMatrix::Scale(2, 3); 45cb93a386Sopenharmony_ci const SkTileMode tmx = SkTileMode::kRepeat; 46cb93a386Sopenharmony_ci const SkTileMode tmy = SkTileMode::kMirror; 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci auto shader0 = bm.makeShader(tmx, tmy, SkSamplingOptions(), localM); 49cb93a386Sopenharmony_ci auto shader1 = bm.asImage()->makeShader(tmx, tmy, SkSamplingOptions(), localM); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci check_isaimage(reporter, shader0.get(), W, H, tmx, tmy, localM); 52cb93a386Sopenharmony_ci check_isaimage(reporter, shader1.get(), W, H, tmx, tmy, localM); 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci// Make sure things are ok with just a single leg. 56cb93a386Sopenharmony_ciDEF_TEST(ComposeShaderSingle, reporter) { 57cb93a386Sopenharmony_ci SkBitmap srcBitmap; 58cb93a386Sopenharmony_ci srcBitmap.allocN32Pixels(10, 10); 59cb93a386Sopenharmony_ci srcBitmap.eraseColor(SK_ColorRED); 60cb93a386Sopenharmony_ci SkCanvas canvas(srcBitmap); 61cb93a386Sopenharmony_ci SkPaint p; 62cb93a386Sopenharmony_ci p.setShader( 63cb93a386Sopenharmony_ci SkShaders::Blend(SkBlendMode::kClear, 64cb93a386Sopenharmony_ci SkShaders::Empty(), 65cb93a386Sopenharmony_ci SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 2, 0.0f))); 66cb93a386Sopenharmony_ci SkRRect rr; 67cb93a386Sopenharmony_ci SkVector rd[] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; 68cb93a386Sopenharmony_ci rr.setRectRadii({0, 0, 0, 0}, rd); 69cb93a386Sopenharmony_ci canvas.drawRRect(rr, p); 70cb93a386Sopenharmony_ci} 71