1fea7763140ba74b78f2c30028452e250140b6f21ethannicholas/*
2fea7763140ba74b78f2c30028452e250140b6f21ethannicholas * Copyright 2015 Google Inc.
3fea7763140ba74b78f2c30028452e250140b6f21ethannicholas *
4fea7763140ba74b78f2c30028452e250140b6f21ethannicholas * Use of this source code is governed by a BSD-style license that can be
5fea7763140ba74b78f2c30028452e250140b6f21ethannicholas * found in the LICENSE file.
6fea7763140ba74b78f2c30028452e250140b6f21ethannicholas */
7fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
8fea7763140ba74b78f2c30028452e250140b6f21ethannicholas#include "gm.h"
9fea7763140ba74b78f2c30028452e250140b6f21ethannicholas#include "SkCanvas.h"
10fea7763140ba74b78f2c30028452e250140b6f21ethannicholas#include "SkRRect.h"
11fea7763140ba74b78f2c30028452e250140b6f21ethannicholas#include "SkPath.h"
12fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
13fea7763140ba74b78f2c30028452e250140b6f21ethannicholasclass ScaledStrokesGM : public skiagm::GM {
14fea7763140ba74b78f2c30028452e250140b6f21ethannicholaspublic:
15fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    ScaledStrokesGM() {}
16fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
17fea7763140ba74b78f2c30028452e250140b6f21ethannicholasprotected:
18fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
19fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    SkString onShortName() override {
20fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        return SkString("scaledstrokes");
21fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    }
22fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
23fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    SkISize onISize() override {
24fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        return SkISize::Make(640, 320);
25fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    }
26fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
27fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    static void draw_path(SkScalar size, SkCanvas* canvas, SkPaint paint) {
28fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        SkScalar c = 0.551915024494f * size;
29fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        SkPath path;
30fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        path.moveTo(0.0f, size);
31fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        path.cubicTo(c, size, size, c, size, 0.0f);
32fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        path.cubicTo(size, -c, c, -size, 0.0f, -size);
33fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        path.cubicTo(-c, -size, -size, -c, -size, 0.0f);
34fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        path.cubicTo(-size, c, -c, size, 0.0f, size);
35fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        canvas->drawPath(path, paint);
36fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    }
37fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
38fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    void onDraw(SkCanvas* canvas) override {
39fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        SkPaint paint;
40fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        SkPath path;
41fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        paint.setStyle(SkPaint::Style::kStroke_Style);
42fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        canvas->translate(5.0f, 5.0f);
43fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        const SkScalar size = 60.0f;
44fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        for (int i = 0; i < 2; i++) {
45fea7763140ba74b78f2c30028452e250140b6f21ethannicholas            paint.setAntiAlias(i == 1);
46fea7763140ba74b78f2c30028452e250140b6f21ethannicholas            for (int j = 0; j < 4; j++) {
47fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                SkScalar scale = 4.0f - j;
48fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                paint.setStrokeWidth(4.0f / scale);
49fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->save();
50fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->translate(size / 2.0f, size / 2.0f);
51fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->scale(scale, scale);
52fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                draw_path(size / 2.0f / scale, canvas, paint);
53fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->restore();
54fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
55fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->save();
56fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->translate(size / 2.0f, 80.0f + size / 2.0f);
57fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->scale(scale, scale);
58fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->drawCircle(0.0f, 0.0f, size / 2.0f / scale, paint);
59fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->restore();
60fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
61fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->save();
62fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->translate(0.0f, 160.0f);
63fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->scale(scale, scale);
64fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->drawRect(SkRect::MakeXYWH(0.0f, 0.0f, size / scale, size / scale), paint);
65fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->restore();
66fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
67fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->save();
68fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->translate(0.0f, 240.0f);
69fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->scale(scale, scale);
70fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->drawLine(0.0f, 0.0f, size / scale, size / scale, paint);
71fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->restore();
72fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
73fea7763140ba74b78f2c30028452e250140b6f21ethannicholas                canvas->translate(80.0f, 0.0f);
74fea7763140ba74b78f2c30028452e250140b6f21ethannicholas            }
75fea7763140ba74b78f2c30028452e250140b6f21ethannicholas        }
76fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
77fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    }
78fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
79fea7763140ba74b78f2c30028452e250140b6f21ethannicholasprivate:
80fea7763140ba74b78f2c30028452e250140b6f21ethannicholas    typedef GM INHERITED;
81fea7763140ba74b78f2c30028452e250140b6f21ethannicholas};
82fea7763140ba74b78f2c30028452e250140b6f21ethannicholas
83fea7763140ba74b78f2c30028452e250140b6f21ethannicholasDEF_GM( return new ScaledStrokesGM; )
84