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