blob: 7d78094b2e92c3fafca712482245d792dae0012e [file] [log] [blame]
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkBlendMode.h"
11#include "include/core/SkCanvas.h"
12#include "include/core/SkColor.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkColorFilter.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040014#include "include/core/SkFont.h"
15#include "include/core/SkImageFilter.h"
16#include "include/core/SkPaint.h"
17#include "include/core/SkRect.h"
18#include "include/core/SkRefCnt.h"
19#include "include/core/SkScalar.h"
20#include "include/core/SkTypeface.h"
21#include "include/core/SkTypes.h"
Michael Ludwig898bbfa2019-08-02 15:21:23 -040022#include "include/effects/SkImageFilters.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050023#include "include/utils/SkTextUtils.h"
24#include "tools/ToolUtils.h"
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000025
Ben Wagner7fde8e12019-05-01 17:28:53 -040026#include <utility>
27
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000028///////////////////////////////////////////////////////////////////////////////
29
robertphillipsc4169122016-04-06 08:40:59 -070030static void draw_paint(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000031 SkPaint paint;
robertphillipsc4169122016-04-06 08:40:59 -070032 paint.setImageFilter(std::move(imf));
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000033 paint.setColor(SK_ColorBLACK);
34 canvas->save();
35 canvas->clipRect(r);
36 canvas->drawPaint(paint);
37 canvas->restore();
38}
39
robertphillipsc4169122016-04-06 08:40:59 -070040static void draw_path(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000041 SkPaint paint;
42 paint.setColor(SK_ColorGREEN);
robertphillipsc4169122016-04-06 08:40:59 -070043 paint.setImageFilter(std::move(imf));
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000044 paint.setAntiAlias(true);
45 canvas->save();
46 canvas->clipRect(r);
47 canvas->drawCircle(r.centerX(), r.centerY(), r.width()/3, paint);
48 canvas->restore();
49}
50
robertphillipsc4169122016-04-06 08:40:59 -070051static void draw_text(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000052 SkPaint paint;
robertphillipsc4169122016-04-06 08:40:59 -070053 paint.setImageFilter(std::move(imf));
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000054 paint.setColor(SK_ColorGREEN);
55 paint.setAntiAlias(true);
Mike Reedb579f072019-01-03 15:45:53 -050056
Mike Kleinea3f0142019-03-20 11:12:10 -050057 SkFont font(ToolUtils::create_portable_typeface(), r.height() / 2);
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000058 canvas->save();
59 canvas->clipRect(r);
Mike Reedb579f072019-01-03 15:45:53 -050060 SkTextUtils::DrawString(canvas, "Text", r.centerX(), r.centerY(), font, paint, SkTextUtils::kCenter_Align);
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000061 canvas->restore();
62}
63
robertphillipsc4169122016-04-06 08:40:59 -070064static void draw_bitmap(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000065 SkPaint paint;
66
67 SkIRect bounds;
68 r.roundOut(&bounds);
69
70 SkBitmap bm;
reed@google.comeb9a46c2014-01-25 16:46:20 +000071 bm.allocN32Pixels(bounds.width(), bounds.height());
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000072 bm.eraseColor(SK_ColorTRANSPARENT);
73 SkCanvas c(bm);
halcanary96fcdcc2015-08-27 07:41:13 -070074 draw_path(&c, r, nullptr);
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000075
robertphillipsc4169122016-04-06 08:40:59 -070076 paint.setImageFilter(std::move(imf));
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000077 canvas->save();
78 canvas->clipRect(r);
79 canvas->drawBitmap(bm, 0, 0, &paint);
80 canvas->restore();
81}
82
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000083///////////////////////////////////////////////////////////////////////////////
84
Stephen White930f69e2017-01-12 17:15:50 -050085DEF_SIMPLE_GM(dropshadowimagefilter, canvas, 400, 656) {
86 void (*drawProc[])(SkCanvas*, const SkRect&, sk_sp<SkImageFilter>) = {
87 draw_bitmap, draw_path, draw_paint, draw_text
88 };
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000089
Mike Reedb286bc22019-04-08 16:23:20 -040090 sk_sp<SkColorFilter> cf(SkColorFilters::Blend(SK_ColorMAGENTA, SkBlendMode::kSrcIn));
Michael Ludwig898bbfa2019-08-02 15:21:23 -040091 sk_sp<SkImageFilter> cfif(SkImageFilters::ColorFilter(std::move(cf), nullptr));
92 SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 44, 44);
93 SkIRect bogusRect = SkIRect::MakeXYWH(-100, -100, 10, 10);
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +000094
Stephen White930f69e2017-01-12 17:15:50 -050095 sk_sp<SkImageFilter> filters[] = {
96 nullptr,
Michael Ludwig898bbfa2019-08-02 15:21:23 -040097 SkImageFilters::DropShadow(7.0f, 0.0f, 0.0f, 3.0f, SK_ColorBLUE, nullptr),
98 SkImageFilters::DropShadow(0.0f, 7.0f, 3.0f, 0.0f, SK_ColorBLUE, nullptr),
99 SkImageFilters::DropShadow(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, nullptr),
100 SkImageFilters::DropShadow(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, std::move(cfif)),
101 SkImageFilters::DropShadow(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, nullptr, &cropRect),
102 SkImageFilters::DropShadow(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, nullptr, &bogusRect),
103 SkImageFilters::DropShadowOnly(7.0f, 7.0f, 3.0f, 3.0f, SK_ColorBLUE, nullptr),
Stephen White930f69e2017-01-12 17:15:50 -0500104 };
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +0000105
Stephen White930f69e2017-01-12 17:15:50 -0500106 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
107 SkScalar MARGIN = SkIntToScalar(16);
108 SkScalar DX = r.width() + MARGIN;
109 SkScalar DY = r.height() + MARGIN;
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +0000110
Stephen White930f69e2017-01-12 17:15:50 -0500111 canvas->translate(MARGIN, MARGIN);
112 for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) {
113 canvas->save();
114 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
115 drawProc[j](canvas, r, filters[i]);
116 canvas->translate(0, DY);
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +0000117 }
Stephen White930f69e2017-01-12 17:15:50 -0500118 canvas->restore();
119 canvas->translate(DX, 0);
senorblanco@chromium.orgd8f82a42013-11-26 21:52:38 +0000120 }
Stephen White930f69e2017-01-12 17:15:50 -0500121}