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    virtual uint32_t onGetFlags() const SK_OVERRIDE {
38a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
39a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
40a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
4143c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    virtual SkString onShortName() {
4243c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        return SkString("hittestpath");
4343c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    }
44d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
4543c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    virtual SkISize onISize() { return SkISize::Make(700, 460); }
46d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
4743c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
4843c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        SkPath path;
49e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkLCGRandom rand;
50d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
51bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        int scale = 300;
52bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        for (int i = 0; i < 4; ++i) {
53bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org            path.lineTo(rand.nextUScalar1() * scale, rand.nextUScalar1() * scale);
54bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org            path.quadTo(rand.nextUScalar1() * scale, rand.nextUScalar1() * scale,
55bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org                        rand.nextUScalar1() * scale, rand.nextUScalar1() * scale);
56bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org            path.cubicTo(rand.nextUScalar1() * scale, rand.nextUScalar1() * scale,
57bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org                         rand.nextUScalar1() * scale, rand.nextUScalar1() * scale,
58bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org                         rand.nextUScalar1() * scale, rand.nextUScalar1() * scale);
5943c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        }
60d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
6143c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        path.setFillType(SkPath::kEvenOdd_FillType);
62dbc5d28979bef1c92aa79e0dc1b5d27a41de5c9areed@google.com        path.offset(SkIntToScalar(20), SkIntToScalar(20));
63d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
64bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        test_hittest(canvas, path);
65bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org
66bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        canvas->translate(SkIntToScalar(scale), 0);
6743c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org        path.setFillType(SkPath::kWinding_FillType);
68d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
69bad1b2ff1d34ff86693b776f89d7b46995746127mike@reedtribe.org        test_hittest(canvas, path);
7043c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    }
71d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
7243c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgprivate:
7343c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org    typedef GM INHERITED;
7443c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org};
7543c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org
7643c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org//////////////////////////////////////////////////////////////////////////////
7743c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.org
7843c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgstatic skiagm::GM* MyFactory(void*) { return new HitTestPathGM; }
7943c62b11ece4dc89a93f4de07f23f46332e1f1fcmike@reedtribe.orgstatic skiagm::GMRegistry reg(MyFactory);
80