blob: 9808bd8122356927c04e9d23fa9597101cd7ef11 [file] [log] [blame]
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
halcanaryb0cce2c2015-01-26 12:49:00 -08008#include "sk_tool_utils.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +00009#include "SkBitmapSource.h"
halcanary878fa022015-01-26 11:24:32 -080010#include "SkOffsetImageFilter.h"
11#include "gm.h"
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000012
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000013#define WIDTH 600
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000014#define HEIGHT 100
15#define MARGIN 12
16
17namespace skiagm {
18
19class OffsetImageFilterGM : public GM {
20public:
21 OffsetImageFilterGM() : fInitialized(false) {
22 this->setBGColor(0xFF000000);
23 }
24
25protected:
26 virtual SkString onShortName() {
27 return SkString("offsetimagefilter");
28 }
29
30 void make_bitmap() {
reed@google.comeb9a46c2014-01-25 16:46:20 +000031 fBitmap.allocN32Pixels(80, 80);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000032 SkCanvas canvas(fBitmap);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000033 canvas.clear(0x00000000);
34 SkPaint paint;
35 paint.setAntiAlias(true);
Cary Clark992c7b02014-07-31 08:58:44 -040036 sk_tool_utils::set_portable_typeface(&paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000037 paint.setColor(0xD000D000);
38 paint.setTextSize(SkIntToScalar(96));
39 const char* str = "e";
40 canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint);
41 }
42
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000043 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070044 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000045 }
46
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000047 void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint, SkScalar scale, const SkIRect& cropRect) {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000048 canvas->save();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000049 SkRect clipRect = SkRect::MakeWH(
50 SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height()));
51 canvas->clipRect(clipRect);
52 canvas->scale(scale, scale);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000053 canvas->drawBitmap(bitmap, 0, 0, &paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000054 canvas->restore();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000055 SkPaint strokePaint;
56 strokePaint.setStyle(SkPaint::kStroke_Style);
57 strokePaint.setColor(SK_ColorRED);
58
59 // Draw a boundary rect around the intersection of the clip rect
60 // and crop rect.
61 SkMatrix scaleMatrix;
62 scaleMatrix.setScale(scale, scale);
63 SkRect cropRectFloat;
64 scaleMatrix.mapRect(&cropRectFloat, SkRect::Make(cropRect));
robertphillipsf4e59952015-01-07 12:16:10 -080065 if (clipRect.intersect(cropRectFloat)) {
66 canvas->drawRect(clipRect, strokePaint);
67 }
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000068 }
69
70 virtual void onDraw(SkCanvas* canvas) {
71 if (!fInitialized) {
72 make_bitmap();
halcanary878fa022015-01-26 11:24:32 -080073
74 fCheckerboard.allocN32Pixels(80, 80);
75 SkCanvas checkerboardCanvas(fCheckerboard);
halcanaryb0cce2c2015-01-26 12:49:00 -080076 sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8);
halcanary878fa022015-01-26 11:24:32 -080077
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000078 fInitialized = true;
79 }
senorblanco16b254a2015-04-09 11:13:24 -070080 canvas->clear(SK_ColorBLACK);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000081 SkPaint paint;
82
reed@google.com7fa2a652014-01-27 13:42:58 +000083 for (int i = 0; i < 4; i++) {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000084 SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap;
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000085 SkIRect cropRect = SkIRect::MakeXYWH(i * 12,
86 i * 8,
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000087 bitmap->width() - i * 8,
88 bitmap->height() - i * 12);
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +000089 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000090 SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap));
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000091 SkScalar dx = SkIntToScalar(i*5);
92 SkScalar dy = SkIntToScalar(i*10);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +000093 SkAutoTUnref<SkImageFilter> filter(
94 SkOffsetImageFilter::Create(dx, dy, tileInput, &rect));
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000095 paint.setImageFilter(filter);
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000096 drawClippedBitmap(canvas, *bitmap, paint, SK_Scalar1, cropRect);
97 canvas->translate(SkIntToScalar(bitmap->width() + MARGIN), 0);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000098 }
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000099
100 SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100);
101 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000102 SkAutoTUnref<SkImageFilter> filter(
103 SkOffsetImageFilter::Create(SkIntToScalar(-5), SkIntToScalar(-10), NULL, &rect));
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +0000104 paint.setImageFilter(filter);
105 drawClippedBitmap(canvas, fBitmap, paint, SkIntToScalar(2), cropRect);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000106 }
107private:
108 typedef GM INHERITED;
109 SkBitmap fBitmap, fCheckerboard;
110 bool fInitialized;
111};
112
113//////////////////////////////////////////////////////////////////////////////
114
115static GM* MyFactory(void*) { return new OffsetImageFilterGM; }
116static GMRegistry reg(MyFactory);
117
118}