10a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar/*
20a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * Copyright 2013 Google Inc.
30a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar *
40a248bf714f18b1cdcda5d7b811303c232d6e885Daniel Dunbar * Use of this source code is governed by a BSD-style license that can be
52a7d731828ab87bba42f7ecac8db509646cd2cddBob Wilson * found in the LICENSE file.
6ed094c32ff2683c07d8eec558ee9defa4f0c00f6Reid Kleckner */
7ed094c32ff2683c07d8eec558ee9defa4f0c00f6Reid Kleckner
89f23fe0ea51d781c1af2eb069a5f03c262243374Reid Kleckner#include "gm.h"
9ed094c32ff2683c07d8eec558ee9defa4f0c00f6Reid Kleckner#include "SkCanvas.h"
10874f021bc16aaf4619fd818da150f1b63e408c80Daniel Dunbar#include "SkPath.h"
118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen// Reproduces https://code.google.com/p/chromium/issues/detail?id=279014
13b405bbe6648d24b0cb5b03dc43c3997ac4f50a9bErick Tryzelaar
148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenstatic const int kWidth = 640;
158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenstatic const int kHeight = 480;
168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenstatic const SkScalar kAngle = 0.305f;
178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen// Renders a string art shape.
198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen// The particular shape rendered can be controlled by adjusting kAngle, from 0 to 1
208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
21344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksenclass StringArtGM : public skiagm::GM {
228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenpublic:
234468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen    StringArtGM() {}
244468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen
258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenprotected:
264468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen    virtual uint32_t onGetFlags() const SK_OVERRIDE {
275371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar        return kSkipTiled_Flag;
28b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar    }
29b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
30b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar    virtual SkString onShortName() {
31b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar        return SkString("stringart");
32b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar    }
33b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
34b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar    virtual SkISize onISize() {
35b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar        return SkISize::Make(kWidth, kHeight);
36b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar    }
378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen    virtual void onDraw(SkCanvas* canvas) {
394468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        SkScalar angle = kAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI);
408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen        SkScalar size = SkIntToScalar(SkMin32(kWidth, kHeight));
414468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        SkPoint center = SkPoint::Make(SkScalarHalf(kWidth), SkScalarHalf(kHeight));
424468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        SkScalar length = 5;
438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen        SkScalar step = angle;
448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen        SkPath path;
464468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        path.moveTo(center);
474468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen
484468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        while (length < (SkScalarHalf(size) - 10.f))
494468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        {
504468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen            SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX,
514468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen                                       length*SkScalarSin(step) + center.fY);
524468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen            path.lineTo(rp);
534468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen            length += SkScalarDiv(angle, SkScalarHalf(SK_ScalarPI));
544468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen            step += angle;
554468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        }
568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen        path.close();
578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
584468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        SkPaint paint;
594468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        paint.setAntiAlias(true);
604468440a2a92fecd57f002b1b9c0683d2b9c4aeaGordon Henriksen        paint.setStyle(SkPaint::kStroke_Style);
618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen        paint.setColor(0xFF007700);
628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen        canvas->drawPath(path, paint);
648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen    }
658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksenprivate:
675371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar    typedef GM INHERITED;
688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen};
698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
70ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter ZotovDEF_GM( return new StringArtGM; )
71ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov