1e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips/*
2e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips * Copyright 2015 Google Inc.
3e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips *
4e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips * Use of this source code is governed by a BSD-style license that can be
5e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips * found in the LICENSE file.
6e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips */
7e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
8e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips#include "gm.h"
95598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkImage.h"
105598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkImageSource.h"
115598b63cd2443a608a74a222d0206bb2455383b7fmalita#include "SkSurface.h"
12e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
13e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillipsnamespace skiagm {
14e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
155598b63cd2443a608a74a222d0206bb2455383b7fmalita// This GM reproduces the issue in crbug.com/472795. The SkImageSource image
16e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips// is shifted for high quality mode between cpu and gpu.
175598b63cd2443a608a74a222d0206bb2455383b7fmalitaclass ImageSourceGM : public GM {
18e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillipspublic:
195598b63cd2443a608a74a222d0206bb2455383b7fmalita    ImageSourceGM(const char* suffix, SkFilterQuality filter) : fSuffix(suffix), fFilter(filter) {
20e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        this->setBGColor(0xFFFFFFFF);
21e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    }
22e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
23e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillipsprotected:
24e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    SkString onShortName() override {
255598b63cd2443a608a74a222d0206bb2455383b7fmalita        SkString name("imagesrc2_");
26e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        name.append(fSuffix);
27e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        return name;
28e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    }
29e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
30e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    SkISize onISize() override { return SkISize::Make(256, 256); }
31e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
325598b63cd2443a608a74a222d0206bb2455383b7fmalita    // Create an image with high frequency vertical stripes
33e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    void onOnceBeforeDraw() override {
34dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr SkPMColor gColors[] = {
35e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SK_ColorRED,     SK_ColorGRAY,
36e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SK_ColorGREEN,   SK_ColorGRAY,
37e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SK_ColorBLUE,    SK_ColorGRAY,
38e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SK_ColorCYAN,    SK_ColorGRAY,
39e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SK_ColorMAGENTA, SK_ColorGRAY,
40e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SK_ColorYELLOW,  SK_ColorGRAY,
41e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SK_ColorWHITE,   SK_ColorGRAY,
42e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        };
43e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
44e8f3062a36d3682f4019309a32b5b84dc9eddf8creed        auto surface(SkSurface::MakeRasterN32Premul(kImageSize, kImageSize));
455598b63cd2443a608a74a222d0206bb2455383b7fmalita        SkCanvas* canvas = surface->getCanvas();
46e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
47e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        int curColor = 0;
48e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
49e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        for (int x = 0; x < kImageSize; x += 3) {
509d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary            SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(0),
51e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips                                        SkIntToScalar(3), SkIntToScalar(kImageSize));
52e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            SkPaint p;
53e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            p.setColor(gColors[curColor]);
545598b63cd2443a608a74a222d0206bb2455383b7fmalita            canvas->drawRect(r, p);
55e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
56e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips            curColor = (curColor+1) % SK_ARRAY_COUNT(gColors);
57e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        }
585598b63cd2443a608a74a222d0206bb2455383b7fmalita
599ce9d6772df650ceb0511f275e1a83dffa78ff72reed        fImage = surface->makeImageSnapshot();
60e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    }
61e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
62e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    void onDraw(SkCanvas* canvas) override {
63549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        const SkRect srcRect = SkRect::MakeLTRB(0, 0,
64549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips                                                SkIntToScalar(kImageSize),
65549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips                                                SkIntToScalar(kImageSize));
66549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        const SkRect dstRect = SkRect::MakeLTRB(0.75f, 0.75f, 225.75f, 225.75f);
67e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
68e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        SkPaint p;
69549c8991959333e5c0f53faebcbbd5d6bc8f6a56robertphillips        p.setImageFilter(SkImageSource::Make(fImage, srcRect, dstRect, fFilter));
70e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
7196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        canvas->saveLayer(nullptr, &p);
72e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips        canvas->restore();
73e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    }
74e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
75e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillipsprivate:
76dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kImageSize = 503;
77e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
78e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    SkString fSuffix;
79e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    SkFilterQuality fFilter;
809ce9d6772df650ceb0511f275e1a83dffa78ff72reed    sk_sp<SkImage>  fImage;
81e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
82e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips    typedef GM INHERITED;
83e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips};
84e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
85e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips//////////////////////////////////////////////////////////////////////////////
86e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips
875598b63cd2443a608a74a222d0206bb2455383b7fmalitaDEF_GM(return new ImageSourceGM("none", kNone_SkFilterQuality);)
885598b63cd2443a608a74a222d0206bb2455383b7fmalitaDEF_GM(return new ImageSourceGM("low", kLow_SkFilterQuality);)
895598b63cd2443a608a74a222d0206bb2455383b7fmalitaDEF_GM(return new ImageSourceGM("med", kMedium_SkFilterQuality);)
905598b63cd2443a608a74a222d0206bb2455383b7fmalitaDEF_GM(return new ImageSourceGM("high", kHigh_SkFilterQuality);)
91e275fdf812b1dc09beaa3b14570eb0b641a07e6arobertphillips}
92