112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com/*
212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com * Copyright 2013 Google Inc.
312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com *
412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com * Use of this source code is governed by a BSD-style license that can be
512fa9bad910413cc489d4c1dc92304182b016e27reed@google.com * found in the LICENSE file.
612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com */
712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com#include "gm.h"
912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com#include "SkCanvas.h"
1012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com#include "SkBlurImageFilter.h"
1112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
1212fa9bad910413cc489d4c1dc92304182b016e27reed@google.comstatic void make_bm(SkBitmap* bm) {
13eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bm->allocN32Pixels(100, 100);
1412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    bm->eraseColor(SK_ColorBLUE);
1512fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
1612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    SkCanvas canvas(*bm);
1712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    SkPaint paint;
1812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    paint.setAntiAlias(true);
1912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    paint.setColor(SK_ColorRED);
2012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    canvas.drawCircle(50, 50, 50, paint);
2112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com}
2212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
2312fa9bad910413cc489d4c1dc92304182b016e27reed@google.comstatic void draw_2_bitmaps(SkCanvas* canvas, const SkBitmap& bm, bool doClip,
2412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com                           int dx, int dy, SkImageFilter* filter = NULL) {
2512fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    SkAutoCanvasRestore acr(canvas, true);
2612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    SkPaint paint;
2712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
284d28d9889b033777afc1950474296d37887ef71bskia.committer@gmail.com    SkRect clipR = SkRect::MakeXYWH(SkIntToScalar(dx),
29914a2f282318b60da05c243793056ae0664f574erobertphillips@google.com                                    SkIntToScalar(dy),
301c711cabae03025f6732a82b28de0a51cda63a79reed@google.com                                    SkIntToScalar(bm.width()),
311c711cabae03025f6732a82b28de0a51cda63a79reed@google.com                                    SkIntToScalar(bm.height()));
3212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
3312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    paint.setImageFilter(filter);
3412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    clipR.inset(5, 5);
3512fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
3612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    if (doClip) {
3712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        canvas->save();
3812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        canvas->clipRect(clipR);
3912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    }
4012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    canvas->drawSprite(bm, dx, dy, &paint);
4112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    if (doClip) {
4212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        canvas->restore();
4312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    }
4412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
451c711cabae03025f6732a82b28de0a51cda63a79reed@google.com    canvas->translate(SkIntToScalar(bm.width() + 20), 0);
4612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
4712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    if (doClip) {
4812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        canvas->save();
4912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        canvas->clipRect(clipR);
5012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    }
511c711cabae03025f6732a82b28de0a51cda63a79reed@google.com    canvas->drawBitmap(bm, SkIntToScalar(dx), SkIntToScalar(dy), &paint);
5212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    if (doClip) {
5312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        canvas->restore();
5412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    }
5512fa9bad910413cc489d4c1dc92304182b016e27reed@google.com}
5612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
5712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com/**
5812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com *  Compare output of drawSprite and drawBitmap (esp. clipping and imagefilters)
5912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com */
6012fa9bad910413cc489d4c1dc92304182b016e27reed@google.comclass SpriteBitmapGM : public skiagm::GM {
6112fa9bad910413cc489d4c1dc92304182b016e27reed@google.compublic:
6212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    SpriteBitmapGM() {}
6312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
6412fa9bad910413cc489d4c1dc92304182b016e27reed@google.comprotected:
65a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
66a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
67a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
68a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
6912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    virtual SkString onShortName() {
7012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        return SkString("spritebitmap");
7112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    }
7212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
7312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    virtual SkISize onISize() {
7412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        return SkISize::Make(640, 480);
7512fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    }
7612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
7712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    virtual void onDraw(SkCanvas* canvas) {
7812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        SkBitmap bm;
7912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        make_bm(&bm);
8012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
8112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        int dx = 10;
8212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        int dy = 10;
8312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
8412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        SkScalar sigma = 8;
85cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        SkAutoTUnref<SkImageFilter> filter(SkBlurImageFilter::Create(sigma, sigma));
8612fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
8712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        draw_2_bitmaps(canvas, bm, false, dx, dy);
8812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        dy += bm.height() + 20;
8912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        draw_2_bitmaps(canvas, bm, false, dx, dy, filter);
9012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        dy += bm.height() + 20;
9112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        draw_2_bitmaps(canvas, bm, true, dx, dy);
9212fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        dy += bm.height() + 20;
9312fa9bad910413cc489d4c1dc92304182b016e27reed@google.com        draw_2_bitmaps(canvas, bm, true, dx, dy, filter);
9412fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    }
9512fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
9612fa9bad910413cc489d4c1dc92304182b016e27reed@google.comprivate:
9712fa9bad910413cc489d4c1dc92304182b016e27reed@google.com    typedef GM INHERITED;
9812fa9bad910413cc489d4c1dc92304182b016e27reed@google.com};
9912fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
10012fa9bad910413cc489d4c1dc92304182b016e27reed@google.com//////////////////////////////////////////////////////////////////////////////
10112fa9bad910413cc489d4c1dc92304182b016e27reed@google.com
10212fa9bad910413cc489d4c1dc92304182b016e27reed@google.comDEF_GM( return new SpriteBitmapGM; )
103