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