blob: 7fcbe0a04db973ec8355bdac280bef6fc92ab0e9 [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
8#include "gm.h"
9#include "SkOffsetImageFilter.h"
10#include "SkBitmapSource.h"
11
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000012#define WIDTH 600
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000013#define HEIGHT 100
14#define MARGIN 12
15
16namespace skiagm {
17
18class OffsetImageFilterGM : public GM {
19public:
20 OffsetImageFilterGM() : fInitialized(false) {
21 this->setBGColor(0xFF000000);
22 }
23
24protected:
25 virtual SkString onShortName() {
26 return SkString("offsetimagefilter");
27 }
28
29 void make_bitmap() {
reed@google.comeb9a46c2014-01-25 16:46:20 +000030 fBitmap.allocN32Pixels(80, 80);
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000031 SkCanvas canvas(fBitmap);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000032 canvas.clear(0x00000000);
33 SkPaint paint;
34 paint.setAntiAlias(true);
Cary Clark992c7b02014-07-31 08:58:44 -040035 sk_tool_utils::set_portable_typeface(&paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000036 paint.setColor(0xD000D000);
37 paint.setTextSize(SkIntToScalar(96));
38 const char* str = "e";
39 canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(65), paint);
40 }
41
42 void make_checkerboard() {
commit-bot@chromium.orgc3bd8af2014-02-13 17:14:46 +000043 fCheckerboard.allocN32Pixels(80, 80);
44 SkCanvas canvas(fCheckerboard);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000045 canvas.clear(0x00000000);
46 SkPaint darkPaint;
47 darkPaint.setColor(0xFF404040);
48 SkPaint lightPaint;
49 lightPaint.setColor(0xFFA0A0A0);
50 for (int y = 0; y < 80; y += 16) {
51 for (int x = 0; x < 80; x += 16) {
52 canvas.save();
53 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
54 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
55 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
56 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
57 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
58 canvas.restore();
59 }
60 }
61 }
62
63 virtual SkISize onISize() {
tfarinaf5393182014-06-09 23:59:03 -070064 return SkISize::Make(WIDTH, HEIGHT);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000065 }
66
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000067 void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint, SkScalar scale, const SkIRect& cropRect) {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000068 canvas->save();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000069 SkRect clipRect = SkRect::MakeWH(
70 SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height()));
71 canvas->clipRect(clipRect);
72 canvas->scale(scale, scale);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000073 canvas->drawBitmap(bitmap, 0, 0, &paint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000074 canvas->restore();
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +000075 SkPaint strokePaint;
76 strokePaint.setStyle(SkPaint::kStroke_Style);
77 strokePaint.setColor(SK_ColorRED);
78
79 // Draw a boundary rect around the intersection of the clip rect
80 // and crop rect.
81 SkMatrix scaleMatrix;
82 scaleMatrix.setScale(scale, scale);
83 SkRect cropRectFloat;
84 scaleMatrix.mapRect(&cropRectFloat, SkRect::Make(cropRect));
85 clipRect.intersect(cropRectFloat);
86 canvas->drawRect(clipRect, strokePaint);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000087 }
88
89 virtual void onDraw(SkCanvas* canvas) {
90 if (!fInitialized) {
91 make_bitmap();
92 make_checkerboard();
93 fInitialized = true;
94 }
95 canvas->clear(0x00000000);
96 SkPaint paint;
97
reed@google.com7fa2a652014-01-27 13:42:58 +000098 for (int i = 0; i < 4; i++) {
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +000099 SkBitmap* bitmap = (i & 0x01) ? &fCheckerboard : &fBitmap;
senorblanco@chromium.org6776b822014-01-03 21:48:22 +0000100 SkIRect cropRect = SkIRect::MakeXYWH(i * 12,
101 i * 8,
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000102 bitmap->width() - i * 8,
103 bitmap->height() - i * 12);
senorblanco@chromium.orgb295fb62013-10-10 13:51:19 +0000104 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000105 SkAutoTUnref<SkImageFilter> tileInput(SkBitmapSource::Create(*bitmap));
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000106 SkScalar dx = SkIntToScalar(i*5);
107 SkScalar dy = SkIntToScalar(i*10);
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000108 SkAutoTUnref<SkImageFilter> filter(
109 SkOffsetImageFilter::Create(dx, dy, tileInput, &rect));
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000110 paint.setImageFilter(filter);
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +0000111 drawClippedBitmap(canvas, *bitmap, paint, SK_Scalar1, cropRect);
112 canvas->translate(SkIntToScalar(bitmap->width() + MARGIN), 0);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000113 }
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +0000114
115 SkIRect cropRect = SkIRect::MakeXYWH(0, 0, 100, 100);
116 SkImageFilter::CropRect rect(SkRect::Make(cropRect));
commit-bot@chromium.orgcac5fd52014-03-10 10:51:58 +0000117 SkAutoTUnref<SkImageFilter> filter(
118 SkOffsetImageFilter::Create(SkIntToScalar(-5), SkIntToScalar(-10), NULL, &rect));
senorblanco@chromium.orge09244d2014-03-04 19:05:25 +0000119 paint.setImageFilter(filter);
120 drawClippedBitmap(canvas, fBitmap, paint, SkIntToScalar(2), cropRect);
commit-bot@chromium.org1a4fb702013-09-26 16:09:28 +0000121 }
122private:
123 typedef GM INHERITED;
124 SkBitmap fBitmap, fCheckerboard;
125 bool fInitialized;
126};
127
128//////////////////////////////////////////////////////////////////////////////
129
130static GM* MyFactory(void*) { return new OffsetImageFilterGM; }
131static GMRegistry reg(MyFactory);
132
133}