SampleHairCurves.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright 2011 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 "include/utils/SkRandom.h"
  10. #include "samplecode/Sample.h"
  11. class HairCurvesView : public Sample {
  12. public:
  13. HairCurvesView() {
  14. }
  15. protected:
  16. SkString name() override { return SkString("HairCurves"); }
  17. void onDrawContent(SkCanvas* canvas) override {
  18. SkPaint paint;
  19. paint.setAntiAlias(true);
  20. paint.setStyle(SkPaint::kStroke_Style);
  21. paint.setStrokeWidth(0);
  22. canvas->save();
  23. canvas->scale(1000 * SK_Scalar1, 1000 * SK_Scalar1);
  24. SkRandom rand;
  25. SkRandom randW;
  26. SkPath curves;
  27. SkPath hulls;
  28. SkPath ctrlPts;
  29. for (int i = 0; i < 100; ++i) {
  30. SkScalar pts[] = {
  31. rand.nextUScalar1(), rand.nextUScalar1(),
  32. rand.nextUScalar1(), rand.nextUScalar1(),
  33. rand.nextUScalar1(), rand.nextUScalar1(),
  34. rand.nextUScalar1(), rand.nextUScalar1()
  35. };
  36. curves.moveTo(pts[0], pts[1]);
  37. curves.cubicTo(pts[2], pts[3],
  38. pts[4], pts[5],
  39. pts[6], pts[7]);
  40. hulls.moveTo(pts[0], pts[1]);
  41. hulls.lineTo(pts[2], pts[3]);
  42. hulls.lineTo(pts[4], pts[5]);
  43. hulls.lineTo(pts[6], pts[7]);
  44. ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
  45. ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
  46. ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
  47. ctrlPts.addCircle(pts[6], pts[7], SK_Scalar1 / 200);
  48. }
  49. for (int i = 0; i < 100; ++i) {
  50. SkScalar pts[] = {
  51. rand.nextUScalar1(), rand.nextUScalar1(),
  52. rand.nextUScalar1(), rand.nextUScalar1(),
  53. rand.nextUScalar1(), rand.nextUScalar1(),
  54. };
  55. curves.moveTo(pts[0], pts[1]);
  56. curves.quadTo(pts[2], pts[3],
  57. pts[4], pts[5]);
  58. hulls.moveTo(pts[0], pts[1]);
  59. hulls.lineTo(pts[2], pts[3]);
  60. hulls.lineTo(pts[4], pts[5]);
  61. ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
  62. ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
  63. ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
  64. }
  65. for (int i = 0; i < 100; ++i) {
  66. SkScalar pts[] = {
  67. rand.nextUScalar1(), rand.nextUScalar1(),
  68. rand.nextUScalar1(), rand.nextUScalar1(),
  69. rand.nextUScalar1(), rand.nextUScalar1(),
  70. };
  71. SkScalar weight = randW.nextUScalar1() * 2.0f;
  72. curves.moveTo(pts[0], pts[1]);
  73. curves.conicTo(pts[2], pts[3],
  74. pts[4], pts[5],
  75. weight);
  76. hulls.moveTo(pts[0], pts[1]);
  77. hulls.lineTo(pts[2], pts[3]);
  78. hulls.lineTo(pts[4], pts[5]);
  79. ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
  80. ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
  81. ctrlPts.addCircle(pts[4], pts[5], SK_Scalar1 / 200);
  82. }
  83. for (int i = 0; i < 100; ++i) {
  84. SkScalar pts[] = {
  85. rand.nextUScalar1(), rand.nextUScalar1(),
  86. rand.nextUScalar1(), rand.nextUScalar1(),
  87. };
  88. curves.moveTo(pts[0], pts[1]);
  89. curves.lineTo(pts[2], pts[3]);
  90. ctrlPts.addCircle(pts[0], pts[1], SK_Scalar1 / 200);
  91. ctrlPts.addCircle(pts[2], pts[3], SK_Scalar1 / 200);
  92. }
  93. paint.setColor(SK_ColorBLACK);
  94. canvas->drawPath(curves, paint);
  95. paint.setColor(SK_ColorRED);
  96. //canvas->drawPath(hulls, paint);
  97. paint.setStyle(SkPaint::kFill_Style);
  98. paint.setColor(SK_ColorBLUE);
  99. //canvas->drawPath(ctrlPts, paint);
  100. canvas->restore();
  101. }
  102. private:
  103. typedef Sample INHERITED;
  104. };
  105. //////////////////////////////////////////////////////////////////////////////
  106. DEF_SAMPLE( return new HairCurvesView(); )