1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageFilter.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkImageFilters.h" 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker // This GM reproduces the issue in crbug.com/472795. The SkImageSource image 26*c8dee2aaSAndroid Build Coastguard Worker // is shifted for high quality mode between cpu and gpu. 27*c8dee2aaSAndroid Build Coastguard Worker class ImageSourceGM : public GM { 28*c8dee2aaSAndroid Build Coastguard Worker public: ImageSourceGM(const char * suffix,const SkSamplingOptions & sampling)29*c8dee2aaSAndroid Build Coastguard Worker ImageSourceGM(const char* suffix, const SkSamplingOptions& sampling) 30*c8dee2aaSAndroid Build Coastguard Worker : fSuffix(suffix), fSampling(sampling) { 31*c8dee2aaSAndroid Build Coastguard Worker this->setBGColor(0xFFFFFFFF); 32*c8dee2aaSAndroid Build Coastguard Worker } 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const35*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { 36*c8dee2aaSAndroid Build Coastguard Worker SkString name("imagesrc2_"); 37*c8dee2aaSAndroid Build Coastguard Worker name.append(fSuffix); 38*c8dee2aaSAndroid Build Coastguard Worker return name; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker getISize()41*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(256, 256); } 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker // Create an image with high frequency vertical stripes onOnceBeforeDraw()44*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { 45*c8dee2aaSAndroid Build Coastguard Worker constexpr SkPMColor gColors[] = { 46*c8dee2aaSAndroid Build Coastguard Worker SK_ColorRED, SK_ColorGRAY, 47*c8dee2aaSAndroid Build Coastguard Worker SK_ColorGREEN, SK_ColorGRAY, 48*c8dee2aaSAndroid Build Coastguard Worker SK_ColorBLUE, SK_ColorGRAY, 49*c8dee2aaSAndroid Build Coastguard Worker SK_ColorCYAN, SK_ColorGRAY, 50*c8dee2aaSAndroid Build Coastguard Worker SK_ColorMAGENTA, SK_ColorGRAY, 51*c8dee2aaSAndroid Build Coastguard Worker SK_ColorYELLOW, SK_ColorGRAY, 52*c8dee2aaSAndroid Build Coastguard Worker SK_ColorWHITE, SK_ColorGRAY, 53*c8dee2aaSAndroid Build Coastguard Worker }; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker auto surface(SkSurfaces::Raster(SkImageInfo::MakeN32Premul(kImageSize, kImageSize))); 56*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = surface->getCanvas(); 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker int curColor = 0; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < kImageSize; x += 3) { 61*c8dee2aaSAndroid Build Coastguard Worker SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(0), 62*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(3), SkIntToScalar(kImageSize)); 63*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 64*c8dee2aaSAndroid Build Coastguard Worker p.setColor(gColors[curColor]); 65*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, p); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker curColor = (curColor+1) % std::size(gColors); 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker fImage = surface->makeImageSnapshot(); 71*c8dee2aaSAndroid Build Coastguard Worker } 72*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)73*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 74*c8dee2aaSAndroid Build Coastguard Worker const SkRect srcRect = SkRect::MakeLTRB(0, 0, 75*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(kImageSize), 76*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(kImageSize)); 77*c8dee2aaSAndroid Build Coastguard Worker const SkRect dstRect = SkRect::MakeLTRB(0.75f, 0.75f, 225.75f, 225.75f); 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 80*c8dee2aaSAndroid Build Coastguard Worker p.setImageFilter(SkImageFilters::Image(fImage, srcRect, dstRect, fSampling)); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker canvas->saveLayer(nullptr, &p); 83*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 84*c8dee2aaSAndroid Build Coastguard Worker } 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker private: 87*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kImageSize = 503; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker SkString fSuffix; 90*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions fSampling; 91*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fImage; 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 94*c8dee2aaSAndroid Build Coastguard Worker }; 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new ImageSourceGM("none", SkSamplingOptions());) 99*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new ImageSourceGM("low", SkSamplingOptions(SkFilterMode::kLinear));) 100*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new ImageSourceGM("med", SkSamplingOptions(SkFilterMode::kLinear, 101*c8dee2aaSAndroid Build Coastguard Worker SkMipmapMode::kLinear));) 102*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new ImageSourceGM("high", SkSamplingOptions({1/3.0f, 1/3.0f}));) 103*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 104