blob: f19c372605bc5cf4876d0f63a7cd842a63e14595 [file] [log] [blame]
/*
* 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"
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 SkPMColor gColors[] = {
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