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