SampleGradients.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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/effects/SkGradientShader.h"
  9. #include "samplecode/Sample.h"
  10. static sk_sp<SkShader> setgrad(const SkRect& r, SkColor c0, SkColor c1) {
  11. SkColor colors[] = { c0, c1 };
  12. SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } };
  13. return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
  14. }
  15. static void test_alphagradients(SkCanvas* canvas) {
  16. SkRect r;
  17. r.set(SkIntToScalar(10), SkIntToScalar(10),
  18. SkIntToScalar(410), SkIntToScalar(30));
  19. SkPaint p, p2;
  20. p2.setStyle(SkPaint::kStroke_Style);
  21. p.setShader(setgrad(r, 0xFF00FF00, 0x0000FF00));
  22. canvas->drawRect(r, p);
  23. canvas->drawRect(r, p2);
  24. r.offset(0, r.height() + SkIntToScalar(4));
  25. p.setShader(setgrad(r, 0xFF00FF00, 0x00000000));
  26. canvas->drawRect(r, p);
  27. canvas->drawRect(r, p2);
  28. r.offset(0, r.height() + SkIntToScalar(4));
  29. p.setShader(setgrad(r, 0xFF00FF00, 0x00FF0000));
  30. canvas->drawRect(r, p);
  31. canvas->drawRect(r, p2);
  32. }
  33. ///////////////////////////////////////////////////////////////////////////////
  34. struct GradData {
  35. int fCount;
  36. const SkColor* fColors;
  37. const SkScalar* fPos;
  38. };
  39. static const SkColor gColors[] = {
  40. SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
  41. };
  42. static const SkScalar gPos0[] = { 0, SK_Scalar1 };
  43. static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
  44. static const SkScalar gPos2[] = {
  45. 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
  46. };
  47. static const GradData gGradData[] = {
  48. { 2, gColors, nullptr },
  49. { 2, gColors, gPos0 },
  50. { 2, gColors, gPos1 },
  51. { 5, gColors, nullptr },
  52. { 5, gColors, gPos2 }
  53. };
  54. static sk_sp<SkShader> MakeLinear(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
  55. return SkGradientShader::MakeLinear(pts, data.fColors, data.fPos, data.fCount, tm);
  56. }
  57. static sk_sp<SkShader> MakeRadial(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
  58. SkPoint center;
  59. center.set(SkScalarAve(pts[0].fX, pts[1].fX),
  60. SkScalarAve(pts[0].fY, pts[1].fY));
  61. return SkGradientShader::MakeRadial(center, center.fX, data.fColors,
  62. data.fPos, data.fCount, tm);
  63. }
  64. static sk_sp<SkShader> MakeSweep(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
  65. SkPoint center;
  66. center.set(SkScalarAve(pts[0].fX, pts[1].fX),
  67. SkScalarAve(pts[0].fY, pts[1].fY));
  68. return SkGradientShader::MakeSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
  69. }
  70. static sk_sp<SkShader> Make2Conical(const SkPoint pts[2], const GradData& data, SkTileMode tm) {
  71. SkPoint center0, center1;
  72. center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
  73. SkScalarAve(pts[0].fY, pts[1].fY));
  74. center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
  75. SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
  76. return SkGradientShader::MakeTwoPointConical(
  77. center1, (pts[1].fX - pts[0].fX) / 7,
  78. center0, (pts[1].fX - pts[0].fX) / 2,
  79. data.fColors, data.fPos, data.fCount, tm);
  80. }
  81. static sk_sp<SkShader> Make2ConicalConcentric(const SkPoint pts[2], const GradData& data,
  82. SkTileMode tm) {
  83. SkPoint center;
  84. center.set(SkScalarAve(pts[0].fX, pts[1].fX),
  85. SkScalarAve(pts[0].fY, pts[1].fY));
  86. return SkGradientShader::MakeTwoPointConical(
  87. center, (pts[1].fX - pts[0].fX) / 7,
  88. center, (pts[1].fX - pts[0].fX) / 2,
  89. data.fColors, data.fPos, data.fCount, tm);
  90. }
  91. typedef sk_sp<SkShader> (*GradMaker)(const SkPoint pts[2], const GradData& data, SkTileMode tm);
  92. static const GradMaker gGradMakers[] = {
  93. MakeLinear, MakeRadial, MakeSweep, Make2Conical, Make2ConicalConcentric
  94. };
  95. ///////////////////////////////////////////////////////////////////////////////
  96. class GradientsView : public Sample {
  97. public:
  98. GradientsView() {
  99. this->setBGColor(0xFFDDDDDD);
  100. }
  101. protected:
  102. SkString name() override { return SkString("Gradients"); }
  103. void onDrawContent(SkCanvas* canvas) override {
  104. SkPoint pts[2] = {
  105. { 0, 0 },
  106. { SkIntToScalar(100), SkIntToScalar(100) }
  107. };
  108. SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
  109. SkPaint paint;
  110. paint.setDither(true);
  111. canvas->save();
  112. canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
  113. for (int tm = 0; tm < kSkTileModeCount; ++tm) {
  114. canvas->save();
  115. for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
  116. canvas->save();
  117. for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
  118. paint.setShader(gGradMakers[j](pts, gGradData[i], (SkTileMode)tm));
  119. canvas->drawRect(r, paint);
  120. canvas->translate(0, SkIntToScalar(120));
  121. }
  122. canvas->restore();
  123. canvas->translate(SkIntToScalar(120), 0);
  124. }
  125. canvas->restore();
  126. canvas->translate(SK_ARRAY_COUNT(gGradData)*SkIntToScalar(120), 0);
  127. }
  128. canvas->restore();
  129. canvas->translate(0, SkIntToScalar(370));
  130. if (false) { // avoid bit rot, suppress warning
  131. test_alphagradients(canvas);
  132. }
  133. }
  134. private:
  135. typedef Sample INHERITED;
  136. };
  137. ///////////////////////////////////////////////////////////////////////////////
  138. DEF_SAMPLE( return new GradientsView(); )