14ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com/* 24ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com * Copyright 2013 Google Inc. 34ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com * 44ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com * Use of this source code is governed by a BSD-style license that can be 54ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com * found in the LICENSE file. 64ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com */ 74ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 84ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com#include "gm.h" 94ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com#include "SkCanvas.h" 104ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com#include "SkPath.h" 114ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 124ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// Reproduces https://code.google.com/p/chromium/issues/detail?id=279014 134ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 14eb95d6a59176e350777a991d4fa9073f6c774b40jvanverth@google.comstatic const int kWidth = 640; 15eb95d6a59176e350777a991d4fa9073f6c774b40jvanverth@google.comstatic const int kHeight = 480; 164ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comstatic const SkScalar kAngle = 0.305f; 174ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 184ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// Renders a string art shape. 194ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com// The particular shape rendered can be controlled by adjusting kAngle, from 0 to 1 204ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 214ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comclass StringArtGM : public skiagm::GM { 224ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.compublic: 234ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com StringArtGM() {} 244ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 254ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comprotected: 26a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 27a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 304ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com virtual SkString onShortName() { 314ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com return SkString("stringart"); 324ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com } 334ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 344ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com virtual SkISize onISize() { 354ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com return SkISize::Make(kWidth, kHeight); 364ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com } 374ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 384ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com virtual void onDraw(SkCanvas* canvas) { 394ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com SkScalar angle = kAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI); 40eb95d6a59176e350777a991d4fa9073f6c774b40jvanverth@google.com SkScalar size = SkIntToScalar(SkMin32(kWidth, kHeight)); 414ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com SkPoint center = SkPoint::Make(SkScalarHalf(kWidth), SkScalarHalf(kHeight)); 424ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com SkScalar length = 5; 434ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com SkScalar step = angle; 444ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 454ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com SkPath path; 464ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com path.moveTo(center); 474ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 484ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com while (length < (SkScalarHalf(size) - 10.f)) 494ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com { 504ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX, 514ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com length*SkScalarSin(step) + center.fY); 524ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com path.lineTo(rp); 534ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com length += SkScalarDiv(angle, SkScalarHalf(SK_ScalarPI)); 544ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com step += angle; 554ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com } 564ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com path.close(); 574ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 584ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com SkPaint paint; 594ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com paint.setAntiAlias(true); 604ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com paint.setStyle(SkPaint::kStroke_Style); 614ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com paint.setColor(0xFF007700); 624ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 634ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com canvas->drawPath(path, paint); 644ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com } 654ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 664ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comprivate: 674ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com typedef GM INHERITED; 684ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com}; 694ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.com 704ea2878f076cd41da803e6fcdcfb884b18a5b00cjvanverth@google.comDEF_GM( return new StringArtGM; ) 71