| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/core/SkBitmap.h" |
| #include "include/core/SkBlendMode.h" |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkColor.h" |
| #include "include/core/SkImage.h" |
| #include "include/core/SkMatrix.h" |
| #include "include/core/SkPaint.h" |
| #include "include/core/SkPoint.h" |
| #include "include/core/SkRRect.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/core/SkSamplingOptions.h" |
| #include "include/core/SkShader.h" |
| #include "include/core/SkTileMode.h" |
| #include "include/effects/SkPerlinNoiseShader.h" |
| #include "tests/Test.h" |
| |
| static void check_isaimage(skiatest::Reporter* reporter, SkShader* shader, |
| int expectedW, int expectedH, |
| SkTileMode expectedX, SkTileMode expectedY, |
| const SkMatrix& expectedM) { |
| SkTileMode tileModes[2]; |
| SkMatrix localM; |
| |
| // wack these so we don't get a false positive |
| localM.setScale(9999, -9999); |
| tileModes[0] = tileModes[1] = (SkTileMode)99; |
| |
| SkImage* image = shader->isAImage(&localM, tileModes); |
| REPORTER_ASSERT(reporter, image); |
| REPORTER_ASSERT(reporter, image->width() == expectedW); |
| REPORTER_ASSERT(reporter, image->height() == expectedH); |
| REPORTER_ASSERT(reporter, localM == expectedM); |
| REPORTER_ASSERT(reporter, tileModes[0] == expectedX); |
| REPORTER_ASSERT(reporter, tileModes[1] == expectedY); |
| } |
| |
| DEF_TEST(Shader_isAImage, reporter) { |
| const int W = 100; |
| const int H = 100; |
| SkBitmap bm; |
| bm.allocN32Pixels(W, H); |
| auto img = bm.asImage(); |
| const SkMatrix localM = SkMatrix::Scale(2, 3); |
| const SkTileMode tmx = SkTileMode::kRepeat; |
| const SkTileMode tmy = SkTileMode::kMirror; |
| |
| auto shader0 = bm.makeShader(tmx, tmy, SkSamplingOptions(), localM); |
| auto shader1 = bm.asImage()->makeShader(tmx, tmy, SkSamplingOptions(), localM); |
| |
| check_isaimage(reporter, shader0.get(), W, H, tmx, tmy, localM); |
| check_isaimage(reporter, shader1.get(), W, H, tmx, tmy, localM); |
| } |
| |
| // Make sure things are ok with just a single leg. |
| DEF_TEST(ComposeShaderSingle, reporter) { |
| SkBitmap srcBitmap; |
| srcBitmap.allocN32Pixels(10, 10); |
| srcBitmap.eraseColor(SK_ColorRED); |
| SkCanvas canvas(srcBitmap); |
| SkPaint p; |
| p.setShader( |
| SkShaders::Blend(SkBlendMode::kClear, |
| SkShaders::Empty(), |
| SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 2, 0.0f))); |
| SkRRect rr; |
| SkVector rd[] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; |
| rr.setRectRadii({0, 0, 0, 0}, rd); |
| canvas.drawRRect(rr, p); |
| } |