192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org/*
292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org * Copyright 2013 Google Inc.
392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org *
492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org * found in the LICENSE file.
692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org */
792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org#include "gm.h"
992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org#include "SkCanvas.h"
1092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org#include "SkPath.h"
1192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
1292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgnamespace skiagm {
1392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
1492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_square(SkScalar cx, SkScalar cy, SkScalar w) {
1592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    SkRect rect = SkRect::MakeXYWH(cx - w / 2, cy - w / 2, w, w);
1692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    SkPath path;
1792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    path.addRect(rect);
1892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    return path;
1992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}
2092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
2192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_rect_line(SkScalar cx, SkScalar cy, SkScalar l) {
2292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    SkRect rect = SkRect::MakeXYWH(cx - l / 2, cy, l, 0);
2392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    SkPath path;
2492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    path.addRect(rect);
2592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    return path;
2692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}
2792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
2892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_circle(SkScalar cx, SkScalar cy, SkScalar d) {
2992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    SkPath path;
3092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    path.addCircle(cx, cy, d/2, SkPath::kCW_Direction);
3192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    return path;
3292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}
3392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
3492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_line(SkScalar cx, SkScalar cy, SkScalar l) {
3592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    SkPath path;
3692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    path.moveTo(cx - l / 2, cy);
3792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    path.lineTo(cx + l / 2, cy);
3892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    return path;
3992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}
4092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
4192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkPaint::Style styles[] = {
4292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkPaint::kStroke_Style,
4392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkPaint::kStrokeAndFill_Style,
4492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkPaint::kFill_Style
4592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org};
4692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkScalar pathSizes[] = {
4792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        40,
4892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        10,
4992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        0
5092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org};
5192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkScalar strokeWidths[] = {
5292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        10,
5392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        0
5492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org};
5592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkPath ((*paths[])(SkScalar, SkScalar, SkScalar)) = {
5692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        generate_square,
5792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        generate_rect_line,
5892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        generate_circle,
5992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        generate_line
6092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org};
6192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
6292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgconst SkScalar slideWidth = 90, slideHeight = 90;
6392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgconst SkScalar slideBoundary = 5;
6492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
6592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
6692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgclass InversePathsGM : public GM {
6792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgpublic:
6892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    InversePathsGM() {
6992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
7092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    }
7192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
7292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgprotected:
73a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
74a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
75a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
76a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
7792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    virtual SkString onShortName() {
7892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        return SkString("inverse_paths");
7992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    }
8092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
8192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    virtual SkISize onISize() {
82f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(800, 900);
8392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    }
8492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
8592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
8692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkScalar cx = slideWidth / 2 + slideBoundary;
8792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkScalar cy = slideHeight / 2 + slideBoundary;
8892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkScalar dx = slideWidth + 2 * slideBoundary;
8992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkScalar dy = slideHeight + 2 * slideBoundary;
9092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
9192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkRect clipRect = SkRect::MakeLTRB(slideBoundary, slideBoundary,
9292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                                           slideBoundary + slideWidth,
9392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                                           slideBoundary + slideHeight);
9492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkPaint clipPaint;
9592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        clipPaint.setStyle(SkPaint::kStroke_Style);
9692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        clipPaint.setStrokeWidth(SkIntToScalar(2));
9792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
9892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        SkPaint outlinePaint;
9992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        outlinePaint.setColor(0x40000000);
10092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        outlinePaint.setStyle(SkPaint::kStroke_Style);
10192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        outlinePaint.setStrokeWidth(SkIntToScalar(0));
10292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
10392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        for (size_t styleIndex = 0; styleIndex < SK_ARRAY_COUNT(styles);
10492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                styleIndex++) {
10592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org            for (size_t sizeIndex = 0; sizeIndex < SK_ARRAY_COUNT(pathSizes);
10692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                    sizeIndex++) {
10792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                SkScalar size = pathSizes[sizeIndex];
10892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
10992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                canvas->save();
11092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
11192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                for (size_t widthIndex = 0;
11292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        widthIndex < SK_ARRAY_COUNT(strokeWidths);
11392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        widthIndex++) {
11492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                    SkPaint paint;
11592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                    paint.setColor(0xff007000);
11692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                    paint.setStrokeWidth(strokeWidths[widthIndex]);
11792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                    paint.setStyle(styles[styleIndex]);
11892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
11992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                    for (size_t pathIndex = 0;
12092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                            pathIndex < SK_ARRAY_COUNT(paths);
12192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                            pathIndex++) {
12292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        canvas->drawRect(clipRect, clipPaint);
12392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
12492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        canvas->save();
12592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        canvas->clipRect(clipRect);
12692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
12792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        SkPath path = paths[pathIndex](cx, cy, size);
12892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        path.setFillType(SkPath::kInverseWinding_FillType);
12992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        canvas->drawPath(path, paint);
13092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
13192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        path.setFillType(SkPath::kWinding_FillType);
13292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        canvas->drawPath(path, outlinePaint);
13392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
13492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        canvas->restore();
13592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                        canvas->translate(dx, 0);
13692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                    }
13792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                }
13892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
13992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                canvas->restore();
14092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org                canvas->translate(0, dy);
14192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org            }
14292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org        }
14392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    }
14492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
14592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgprivate:
14692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org    typedef GM INHERITED;
14792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org};
14892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org
14992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgDEF_GM( return new InversePathsGM; )
15092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}
151