SampleShaders.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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/SkShader.h"
  9. #include "include/effects/SkGradientShader.h"
  10. #include "samplecode/DecodeFile.h"
  11. #include "tools/Resources.h"
  12. #include "samplecode/Sample.h"
  13. namespace {
  14. static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
  15. SkPoint pts[2] = {
  16. {0, 0},
  17. {0, (float)bm.height()},
  18. };
  19. SkColor colors[2] = {
  20. SkColorSetARGB(255, 0, 0, 0),
  21. SkColorSetARGB(0, 0, 0, 0),
  22. };
  23. return SkShaders::Blend(SkBlendMode::kDstIn,
  24. bm.makeShader(),
  25. SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
  26. SkTileMode::kClamp));
  27. }
  28. static sk_sp<SkShader> make_blend_shader() {
  29. SkPoint pts[2];
  30. SkColor colors[2];
  31. pts[0].set(0, 0);
  32. pts[1].set(SkIntToScalar(100), 0);
  33. colors[0] = SK_ColorRED;
  34. colors[1] = SK_ColorBLUE;
  35. auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
  36. pts[0].set(0, 0);
  37. pts[1].set(0, SkIntToScalar(100));
  38. colors[0] = SK_ColorBLACK;
  39. colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
  40. auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp);
  41. return SkShaders::Blend(SkBlendMode::kDstIn, std::move(shaderA), std::move(shaderB));
  42. }
  43. struct ShaderView : public Sample {
  44. sk_sp<SkShader> fShader;
  45. sk_sp<SkShader> fShaderFade;
  46. SkBitmap fBitmap;
  47. void onOnceBeforeDraw() override {
  48. decode_file(GetResourceAsData("images/dog.jpg"), &fBitmap);
  49. fShader = make_blend_shader();
  50. fShaderFade = make_bitmapfade(fBitmap);
  51. }
  52. SkString name() override { return SkString("Shaders"); }
  53. void onDrawContent(SkCanvas* canvas) override {
  54. canvas->drawBitmap(fBitmap, 0, 0);
  55. canvas->translate(20, 120);
  56. SkPaint paint;
  57. paint.setColor(SK_ColorGREEN);
  58. canvas->drawRect(SkRect{0, 0, 100, 100}, paint);
  59. paint.setShader(fShader);
  60. canvas->drawRect(SkRect{0, 0, 100, 100}, paint);
  61. canvas->translate(SkIntToScalar(110), 0);
  62. paint.setShader(nullptr);
  63. canvas->drawRect(SkRect{0, 0, 120, 80}, paint);
  64. paint.setShader(fShaderFade);
  65. canvas->drawRect(SkRect{0, 0, 120, 80}, paint);
  66. }
  67. };
  68. } // namespace
  69. DEF_SAMPLE( return new ShaderView(); )