SampleStringArt.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright 2013 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/core/SkCanvas.h"
  8. #include "include/core/SkPath.h"
  9. #include "samplecode/Sample.h"
  10. // Reproduces https://code.google.com/p/chromium/issues/detail?id=279014
  11. // Renders a string art shape.
  12. // The particular shape rendered can be controlled by clicking horizontally, thereby
  13. // generating an angle from 0 to 1.
  14. class StringArtView : public Sample {
  15. public:
  16. StringArtView() : fAngle(0.305f) {}
  17. protected:
  18. SkString name() override { return SkString("StringArt"); }
  19. void onDrawContent(SkCanvas* canvas) override {
  20. SkScalar angle = fAngle*SK_ScalarPI + SkScalarHalf(SK_ScalarPI);
  21. SkPoint center = SkPoint::Make(SkScalarHalf(this->width()), SkScalarHalf(this->height()));
  22. SkScalar length = 5;
  23. SkScalar step = angle;
  24. SkPath path;
  25. path.moveTo(center);
  26. while (length < (SkScalarHalf(SkMinScalar(this->width(), this->height())) - 10.f))
  27. {
  28. SkPoint rp = SkPoint::Make(length*SkScalarCos(step) + center.fX,
  29. length*SkScalarSin(step) + center.fY);
  30. path.lineTo(rp);
  31. length += angle / SkScalarHalf(SK_ScalarPI);
  32. step += angle;
  33. }
  34. path.close();
  35. SkPaint paint;
  36. paint.setAntiAlias(true);
  37. paint.setStyle(SkPaint::kStroke_Style);
  38. paint.setColor(0xFF007700);
  39. canvas->drawPath(path, paint);
  40. }
  41. Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, ModifierKey) override {
  42. fAngle = x/width();
  43. return nullptr;
  44. }
  45. private:
  46. SkScalar fAngle;
  47. typedef Sample INHERITED;
  48. };
  49. //////////////////////////////////////////////////////////////////////////////
  50. DEF_SAMPLE( return new StringArtView(); )