/* * 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 "Test.h" #include "SkBitmap.h" #include "SkCanvas.h" #include "SkImage.h" #include "SkPerlinNoiseShader.h" #include "SkRRect.h" #include "SkShader.h" #include "SkSurface.h" #include "SkData.h" static void check_isabitmap(skiatest::Reporter* reporter, SkShader* shader, int expectedW, int expectedH, SkShader::TileMode expectedX, SkShader::TileMode expectedY, const SkMatrix& expectedM) { SkShader::TileMode tileModes[2]; SkMatrix localM; #ifdef SK_SUPPORT_LEGACY_SHADER_ISABITMAP SkBitmap bm; REPORTER_ASSERT(reporter, shader->isABitmap(&bm, &localM, tileModes)); REPORTER_ASSERT(reporter, bm.width() == expectedW); REPORTER_ASSERT(reporter, bm.height() == expectedH); REPORTER_ASSERT(reporter, localM == expectedM); REPORTER_ASSERT(reporter, tileModes[0] == expectedX); REPORTER_ASSERT(reporter, tileModes[1] == expectedY); #endif // wack these so we don't get a false positive localM.setScale(9999, -9999); tileModes[0] = tileModes[1] = (SkShader::TileMode)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_isABitmap, reporter) { const int W = 100; const int H = 100; SkBitmap bm; bm.allocN32Pixels(W, H); auto img = SkImage::MakeFromBitmap(bm); const SkMatrix localM = SkMatrix::MakeScale(2, 3); const SkShader::TileMode tmx = SkShader::kRepeat_TileMode; const SkShader::TileMode tmy = SkShader::kMirror_TileMode; auto shader0 = SkShader::MakeBitmapShader(bm, tmx, tmy, &localM); auto shader1 = SkImage::MakeFromBitmap(bm)->makeShader(tmx, tmy, &localM); check_isabitmap(reporter, shader0.get(), W, H, tmx, tmy, localM); check_isabitmap(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( SkShader::MakeComposeShader( SkShader::MakeEmptyShader(), SkPerlinNoiseShader::MakeFractalNoise(1.0f, 1.0f, 2, 0.0f), SkBlendMode::kClear)); SkRRect rr; SkVector rd[] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; rr.setRectRadii({0, 0, 0, 0}, rd); canvas.drawRRect(rr, p); }