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