1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 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#include "SkBlurMaskFilter.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilter.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRRect.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm {
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This GM reproduces the precision artifacts seen in crbug.com/560651.
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// It draws a largish blurred circle with its center clipped out.
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass BlurredClippedCircleGM : public GM {
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    BlurredClippedCircleGM() {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC));
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkString("blurredclippedcircle");
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkISize::Make(kWidth, kHeight);
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint whitePaint;
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        whitePaint.setColor(SK_ColorWHITE);
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        whitePaint.setBlendMode(SkBlendMode::kSrc);
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        whitePaint.setAntiAlias(true);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // This scale exercises precision limits in the circle blur effect (crbug.com/560651)
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        constexpr float kScale = 2.0f;
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->scale(kScale, kScale);
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->save();
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRect clipRect1 = SkRect::MakeLTRB(0, 0,
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                SkIntToScalar(kWidth), SkIntToScalar(kHeight));
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->clipRect(clipRect1);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->save();
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->clipRect(clipRect1);
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawRect(clipRect1, whitePaint);
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->save();
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkRect clipRect2 = SkRect::MakeLTRB(8, 8, 288, 288);
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkRRect clipRRect = SkRRect::MakeOval(clipRect2);
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->clipRRect(clipRRect, kDifference_SkClipOp, true);
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkRect r = SkRect::MakeLTRB(4, 4, 292, 292);
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkRRect rr = SkRRect::MakeOval(r);
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPaint paint;
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    paint.setMaskFilter(SkBlurMaskFilter::Make(
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            kNormal_SkBlurStyle,
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            1.366025f,
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            SkBlurMaskFilter::kHighQuality_BlurFlag));
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    paint.setColorFilter(SkColorFilter::MakeModeFilter(
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             SK_ColorRED,
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             SkBlendMode::kSrcIn));
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    paint.setAntiAlias(true);
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawRRect(rr, paint);
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->restore();
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->restore();
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static constexpr int kWidth = 1164;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static constexpr int kHeight = 802;
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GM INHERITED;
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new BlurredClippedCircleGM;)
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
95