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