| /* | |
| * Copyright 2015 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "gm/gm.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkColor.h" | |
| #include "include/core/SkImage.h" | |
| #include "include/core/SkImageFilter.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkRect.h" | |
| #include "include/core/SkRefCnt.h" | |
| #include "include/core/SkScalar.h" | |
| #include "include/core/SkSize.h" | |
| #include "include/core/SkString.h" | |
| #include "include/core/SkSurface.h" | |
| #include "include/core/SkTypes.h" | |
| #include "include/effects/SkImageFilters.h" | |
| #include <array> | |
| namespace skiagm { | |
| // This GM reproduces the issue in crbug.com/472795. The SkImageSource image | |
| // is shifted for high quality mode between cpu and gpu. | |
| class ImageSourceGM : public GM { | |
| public: | |
| ImageSourceGM(const char* suffix, const SkSamplingOptions& sampling) | |
| : fSuffix(suffix), fSampling(sampling) { | |
| this->setBGColor(0xFFFFFFFF); | |
| } | |
| protected: | |
| SkString getName() const override { | |
| SkString name("imagesrc2_"); | |
| name.append(fSuffix); | |
| return name; | |
| } | |
| SkISize getISize() override { return SkISize::Make(256, 256); } | |
| // Create an image with high frequency vertical stripes | |
| void onOnceBeforeDraw() override { | |
| constexpr auto gColors = std::to_array<SkPMColor>({ | |
| SK_ColorRED, | |
| SK_ColorGRAY, | |
| SK_ColorGREEN, | |
| SK_ColorGRAY, | |
| SK_ColorBLUE, | |
| SK_ColorGRAY, | |
| SK_ColorCYAN, | |
| SK_ColorGRAY, | |
| SK_ColorMAGENTA, | |
| SK_ColorGRAY, | |
| SK_ColorYELLOW, | |
| SK_ColorGRAY, | |
| SK_ColorWHITE, | |
| SK_ColorGRAY, | |
| }); | |
| auto surface(SkSurfaces::Raster(SkImageInfo::MakeN32Premul(kImageSize, kImageSize))); | |
| SkCanvas* canvas = surface->getCanvas(); | |
| int curColor = 0; | |
| for (int x = 0; x < kImageSize; x += 3) { | |
| SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(0), | |
| SkIntToScalar(3), SkIntToScalar(kImageSize)); | |
| SkPaint p; | |
| p.setColor(gColors[curColor]); | |
| canvas->drawRect(r, p); | |
| curColor = (curColor+1) % std::size(gColors); | |
| } | |
| fImage = surface->makeImageSnapshot(); | |
| } | |
| void onDraw(SkCanvas* canvas) override { | |
| const SkRect srcRect = SkRect::MakeLTRB(0, 0, | |
| SkIntToScalar(kImageSize), | |
| SkIntToScalar(kImageSize)); | |
| const SkRect dstRect = SkRect::MakeLTRB(0.75f, 0.75f, 225.75f, 225.75f); | |
| SkPaint p; | |
| p.setImageFilter(SkImageFilters::Image(fImage, srcRect, dstRect, fSampling)); | |
| canvas->saveLayer(nullptr, &p); | |
| canvas->restore(); | |
| } | |
| private: | |
| inline static constexpr int kImageSize = 503; | |
| SkString fSuffix; | |
| SkSamplingOptions fSampling; | |
| sk_sp<SkImage> fImage; | |
| using INHERITED = GM; | |
| }; | |
| ////////////////////////////////////////////////////////////////////////////// | |
| DEF_GM(return new ImageSourceGM("none", SkSamplingOptions());) | |
| DEF_GM(return new ImageSourceGM("low", SkSamplingOptions(SkFilterMode::kLinear));) | |
| DEF_GM(return new ImageSourceGM("med", SkSamplingOptions(SkFilterMode::kLinear, | |
| SkMipmapMode::kLinear));) | |
| DEF_GM(return new ImageSourceGM("high", SkSamplingOptions({1/3.0f, 1/3.0f}));) | |
| } // namespace skiagm |