1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageSource.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm {
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This GM reproduces the issue in crbug.com/472795. The SkImageSource image
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// is shifted for high quality mode between cpu and gpu.
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ImageSourceGM : public GM {
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ImageSourceGM(const char* suffix, SkFilterQuality filter) : fSuffix(suffix), fFilter(filter) {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setBGColor(0xFFFFFFFF);
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override {
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkString name("imagesrc2_");
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name.append(fSuffix);
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return name;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override { return SkISize::Make(256, 256); }
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Create an image with high frequency vertical stripes
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onOnceBeforeDraw() override {
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        constexpr SkPMColor gColors[] = {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorRED,     SK_ColorGRAY,
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorGREEN,   SK_ColorGRAY,
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorBLUE,    SK_ColorGRAY,
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorCYAN,    SK_ColorGRAY,
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorMAGENTA, SK_ColorGRAY,
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorYELLOW,  SK_ColorGRAY,
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ColorWHITE,   SK_ColorGRAY,
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        auto surface(SkSurface::MakeRasterN32Premul(kImageSize, kImageSize));
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkCanvas* canvas = surface->getCanvas();
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int curColor = 0;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int x = 0; x < kImageSize; x += 3) {
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(0),
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                        SkIntToScalar(3), SkIntToScalar(kImageSize));
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint p;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setColor(gColors[curColor]);
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawRect(r, p);
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            curColor = (curColor+1) % SK_ARRAY_COUNT(gColors);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fImage = surface->makeImageSnapshot();
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkRect srcRect = SkRect::MakeLTRB(0, 0,
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                SkIntToScalar(kImageSize),
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                SkIntToScalar(kImageSize));
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkRect dstRect = SkRect::MakeLTRB(0.75f, 0.75f, 225.75f, 225.75f);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint p;
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setImageFilter(SkImageSource::Make(fImage, srcRect, dstRect, fFilter));
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->saveLayer(nullptr, &p);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static constexpr int kImageSize = 503;
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString fSuffix;
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkFilterQuality fFilter;
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkImage>  fImage;
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GM INHERITED;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new ImageSourceGM("none", kNone_SkFilterQuality);)
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new ImageSourceGM("low", kLow_SkFilterQuality);)
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new ImageSourceGM("med", kMedium_SkFilterQuality);)
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new ImageSourceGM("high", kHigh_SkFilterQuality);)
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
92