1535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 2535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper/* 3535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * Copyright 2014 Google Inc. 4535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * 5535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * Use of this source code is governed by a BSD-style license that can be 6535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * found in the LICENSE file. 7535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper */ 8535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper#include "gm.h" 9535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 10535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper#include "Resources.h" 11535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper#include "SkBitmap.h" 12535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper#include "SkImageDecoder.h" 13535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper#include "SkPaint.h" 14535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper#include "SkShader.h" 15535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper#include "SkStream.h" 16535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 17535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 18535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper /*** 19535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * 20535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * This GM reproduces Skia bug 2904, in which a tiled bitmap shader was failing to draw correctly 21535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * when fractional image scaling was ignored by the high quality bitmap scaler. 22535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper * 23535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper ***/ 24535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 25535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumpernamespace skiagm { 26535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 27535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumperclass TiledScaledBitmapGM : public GM { 28535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumperpublic: 29535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 30535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper TiledScaledBitmapGM() { 31535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper } 32535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 33535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumperprotected: 3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 35535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper return SkString("tiledscaledbitmap"); 36535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper } 37535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 3836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 39535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper return SkISize::Make(1016, 616); 40535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper } 41535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 42752e7eb157f8a18c26b88b7b85eecdbd5549d52etfarina static SkBitmap make_bm(int width, int height) { 43535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkBitmap bm; 44535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper bm.allocN32Pixels(width, height); 45535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper bm.eraseColor(SK_ColorTRANSPARENT); 46535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkCanvas canvas(bm); 47535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkPaint paint; 48535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper paint.setAntiAlias(true); 49535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper canvas.drawCircle(width/2.f, height/2.f, width/4.f, paint); 50752e7eb157f8a18c26b88b7b85eecdbd5549d52etfarina return bm; 51535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper } 52535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 5336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onOnceBeforeDraw() override { 54535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper fBitmap = make_bm(360, 288); 55535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper } 56535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 5736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 58535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkPaint paint; 59535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 60535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper paint.setAntiAlias(true); 6193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed paint.setFilterQuality(kHigh_SkFilterQuality); 62535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 63535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkMatrix mat; 64535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper mat.setScale(121.f/360.f, 93.f/288.f); 65535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper mat.postTranslate(-72, -72); 66535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 67535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkShader *shader = SkShader::CreateBitmapShader(fBitmap, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, &mat); 68535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper paint.setShader(shader); 69535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 70535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkSafeUnref(shader); 71535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper canvas->drawRectCoords(8,8,1008, 608, paint); 72535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper } 73535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 74535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumperprivate: 75535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper SkBitmap fBitmap; 76535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 77535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper typedef GM INHERITED; 78535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper}; 79535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 80535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper////////////////////////////////////////////////////////////////////////////// 81535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 82535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumperDEF_GM(return SkNEW(TiledScaledBitmapGM);) 83535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper 84535e3b2025d3244c2ca48982d14d1d31f1d23c1fhumper} 85