summaryrefslogtreecommitdiff
path: root/chromium/third_party/skia/gm/drawimageset.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/gm/drawimageset.cpp')
-rw-r--r--chromium/third_party/skia/gm/drawimageset.cpp65
1 files changed, 63 insertions, 2 deletions
diff --git a/chromium/third_party/skia/gm/drawimageset.cpp b/chromium/third_party/skia/gm/drawimageset.cpp
index 345b5a9238b..870da11ec9f 100644
--- a/chromium/third_party/skia/gm/drawimageset.cpp
+++ b/chromium/third_party/skia/gm/drawimageset.cpp
@@ -34,12 +34,12 @@
// Makes a set of m x n tiled images to be drawn with SkCanvas::experimental_drawImageSetV1().
static void make_image_tiles(int tileW, int tileH, int m, int n, const SkColor colors[4],
- SkCanvas::ImageSetEntry set[]) {
+ SkCanvas::ImageSetEntry set[], const SkColor bgColor=SK_ColorLTGRAY) {
const int w = tileW * m;
const int h = tileH * n;
auto surf = SkSurface::MakeRaster(
SkImageInfo::Make(w, h, kRGBA_8888_SkColorType, kPremul_SkAlphaType));
- surf->getCanvas()->clear(SK_ColorLTGRAY);
+ surf->getCanvas()->clear(bgColor);
static constexpr SkScalar kStripeW = 10;
static constexpr SkScalar kStripeSpacing = 30;
@@ -288,7 +288,68 @@ private:
SkCanvas::ImageSetEntry fSet[kM * kN];
};
+// This GM exercises alpha-only and color textures being combined correctly with the paint's color.
+class DrawImageSetAlphaOnlyGM : public GM {
+private:
+ SkString onShortName() override { return SkString("draw_image_set_alpha_only"); }
+ SkISize onISize() override { return {kM*kTileW, 2*kN*kTileH}; }
+ void onOnceBeforeDraw() override {
+ static constexpr SkColor kColors[] = {SK_ColorBLUE, SK_ColorTRANSPARENT,
+ SK_ColorRED, SK_ColorTRANSPARENT};
+ static constexpr SkColor kBGColor = SkColorSetARGB(128, 128, 128, 128);
+ make_image_tiles(kTileW, kTileH, kM, kN, kColors, fSet, kBGColor);
+
+ // Modify the alpha of the entries, decreasing by column, and convert even rows to
+ // alpha-only textures.
+ sk_sp<SkColorSpace> alphaSpace = SkColorSpace::MakeSRGB();
+ for (int y = 0; y < kN; ++y) {
+ for (int x = 0; x < kM; ++x) {
+ int i = y * kM + x;
+ fSet[i].fAlpha = (kM - x) / (float) kM;
+ if (y % 2 == 0) {
+ fSet[i].fImage = fSet[i].fImage->makeColorTypeAndColorSpace(
+ kAlpha_8_SkColorType, alphaSpace);
+ }
+ }
+ }
+
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ ToolUtils::draw_checkerboard(canvas, SK_ColorGRAY, SK_ColorDKGRAY, 25);
+
+ SkPaint paint;
+ paint.setFilterQuality(kLow_SkFilterQuality);
+ paint.setBlendMode(SkBlendMode::kSrcOver);
+ paint.setColor4f({0.2f, 0.8f, 0.4f, 1.f}); // colorizes even rows, no effect on odd rows
+
+ // Top rows use experimental edge set API
+ canvas->experimental_DrawEdgeAAImageSet(fSet, kM * kN, nullptr, nullptr, &paint,
+ SkCanvas::kFast_SrcRectConstraint);
+
+ canvas->translate(0.f, kN * kTileH);
+
+ // Bottom rows draw each image from the set using the regular API
+ for (int y = 0; y < kN; ++y) {
+ for (int x = 0; x < kM; ++x) {
+ int i = y * kM + x;
+ SkPaint entryPaint = paint;
+ entryPaint.setAlphaf(fSet[i].fAlpha * paint.getAlphaf());
+ canvas->drawImageRect(fSet[i].fImage.get(), fSet[i].fSrcRect, fSet[i].fDstRect,
+ &entryPaint, SkCanvas::kFast_SrcRectConstraint);
+ }
+ }
+ }
+
+ static constexpr int kM = 4;
+ static constexpr int kN = 4;
+ static constexpr int kTileW = 50;
+ static constexpr int kTileH = 50;
+ SkCanvas::ImageSetEntry fSet[kM * kN];
+};
+
DEF_GM(return new DrawImageSetGM();)
DEF_GM(return new DrawImageSetRectToRectGM();)
+DEF_GM(return new DrawImageSetAlphaOnlyGM();)
} // namespace skiagm