143c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org/*
243c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org * Copyright 2011 Google Inc.
343c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org *
443c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be
543c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org * found in the LICENSE file.
643c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org */
743c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org
843c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org#include "gm.h"
943c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org#include "SkCanvas.h"
1043c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org#include "SkCullPoints.h"
1143c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org#include "SkRandom.h"
1243c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org
13bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.orgstatic void test_hittest(SkCanvas* canvas, const SkPath& path) {
1443c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    SkPaint paint;
1543c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    SkRect r = path.getBounds();
16d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1743c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    paint.setColor(SK_ColorRED);
1843c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    canvas->drawPath(path, paint);
19d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
20dbc5d28979bef1c92aa79e0dc1b5d27a41de5c9areed@google.com    const SkScalar MARGIN = SkIntToScalar(4);
21d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2243c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    paint.setColor(0x800000FF);
23dbc5d28979bef1c92aa79e0dc1b5d27a41de5c9areed@google.com    for (SkScalar y = r.fTop + SK_ScalarHalf - MARGIN; y < r.fBottom + MARGIN; y += SK_Scalar1) {
24dbc5d28979bef1c92aa79e0dc1b5d27a41de5c9areed@google.com        for (SkScalar x = r.fLeft + SK_ScalarHalf - MARGIN; x < r.fRight + MARGIN; x += SK_Scalar1) {
25bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org            if (path.contains(x, y)) {
26bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org                canvas->drawPoint(x, y, paint);
2743c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org            }
2843c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        }
2943c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    }
3043c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org}
3143c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org
3243c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgclass HitTestPathGM : public skiagm::GM {
3343c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgpublic:
3443c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    HitTestPathGM () {}
35d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3643c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgprotected:
37a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
3836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
3943c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        return SkString("hittestpath");
4043c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    }
41d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
4236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override { return SkISize::Make(700, 460); }
43d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
4436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
4543c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        SkPath path;
46f9d610179d7d4198b57b12d06f8d1ca09f580df3scroggo        SkRandom rand;
47d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
48bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        int scale = 300;
49bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        for (int i = 0; i < 4; ++i) {
50bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org            path.lineTo(rand.nextUScalar1() * scale, rand.nextUScalar1() * scale);
51bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org            path.quadTo(rand.nextUScalar1() * scale, rand.nextUScalar1() * scale,
52bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org                        rand.nextUScalar1() * scale, rand.nextUScalar1() * scale);
53bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org            path.cubicTo(rand.nextUScalar1() * scale, rand.nextUScalar1() * scale,
54bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org                         rand.nextUScalar1() * scale, rand.nextUScalar1() * scale,
55bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org                         rand.nextUScalar1() * scale, rand.nextUScalar1() * scale);
5643c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        }
57d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
5843c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        path.setFillType(SkPath::kEvenOdd_FillType);
59dbc5d28979bef1c92aa79e0dc1b5d27a41de5c9areed@google.com        path.offset(SkIntToScalar(20), SkIntToScalar(20));
60d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
61bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        test_hittest(canvas, path);
62bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org
63bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        canvas->translate(SkIntToScalar(scale), 0);
6443c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        path.setFillType(SkPath::kWinding_FillType);
65d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
66bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        test_hittest(canvas, path);
6743c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    }
68d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
6943c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgprivate:
7043c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    typedef GM INHERITED;
7143c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org};
7243c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org
7343c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
7443c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org
7543c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgstatic skiagm::GM* MyFactory(void*) { return new HitTestPathGM; }
7643c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgstatic skiagm::GMRegistry reg(MyFactory);
77