1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2013 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 "sk_tool_utils.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageSource.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This GM exercises the SkImageSource ImageFilter class.
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void fill_rect_filtered(SkCanvas* canvas,
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                               const SkRect& clipRect,
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                               sk_sp<SkImageFilter> filter) {
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint paint;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    paint.setImageFilter(std::move(filter));
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->save();
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->clipRect(clipRect);
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->drawPaint(paint);
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->restore();
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ImageSourceGM : public skiagm::GM {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ImageSourceGM() { }
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkString("imagesource");
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override { return SkISize::Make(500, 150); }
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onOnceBeforeDraw() override {
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBitmap bm = sk_tool_utils::create_string_bitmap(100, 100, 0xFFFFFFFF, 20, 70, 96, "e");
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fImage = SkImage::MakeFromBitmap(bm);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->clear(SK_ColorBLACK);
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkRect bounds = SkRect::MakeIWH(fImage->width(), fImage->height());
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Draw an unscaled bitmap.
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> imageSource(SkImageSource::Make(fImage));
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fill_rect_filtered(canvas, clipRect, std::move(imageSource));
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(SkIntToScalar(100), 0);
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Draw an unscaled subset of the source bitmap (srcRect -> srcRect).
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> imageSourceSrcRect(
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkImageSource::Make(fImage, srcRect, srcRect, kHigh_SkFilterQuality));
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRect));
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(SkIntToScalar(100), 0);
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect).
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> imageSourceSrcRectDstRect(
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkImageSource::Make(fImage, srcRect, dstRect, kHigh_SkFilterQuality));
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fill_rect_filtered(canvas, clipRect, std::move(imageSourceSrcRectDstRect));
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(SkIntToScalar(100), 0);
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        {
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect).
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            sk_sp<SkImageFilter> imageSourceDstRectOnly(
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkImageSource::Make(fImage, bounds, dstRect, kHigh_SkFilterQuality));
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fill_rect_filtered(canvas, clipRect, std::move(imageSourceDstRectOnly));
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(SkIntToScalar(100), 0);
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkImage> fImage;
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; )
88