GrRadialGradientLayout.fp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright 2018 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. in half4x4 gradientMatrix;
  8. @coordTransform {
  9. gradientMatrix
  10. }
  11. void main() {
  12. half t = half(length(sk_TransformedCoords2D[0]));
  13. sk_OutColor = half4(t, 1, 0, 0); // y = 1 for always valid
  14. }
  15. //////////////////////////////////////////////////////////////////////////////
  16. @header {
  17. #include "src/gpu/gradients/GrGradientShader.h"
  18. #include "src/shaders/gradients/SkRadialGradient.h"
  19. }
  20. // The radial gradient never rejects a pixel so it doesn't change opacity
  21. @optimizationFlags {
  22. kPreservesOpaqueInput_OptimizationFlag
  23. }
  24. @make {
  25. static std::unique_ptr<GrFragmentProcessor> Make(const SkRadialGradient& gradient,
  26. const GrFPArgs& args);
  27. }
  28. @cppEnd {
  29. std::unique_ptr<GrFragmentProcessor> GrRadialGradientLayout::Make(
  30. const SkRadialGradient& grad, const GrFPArgs& args) {
  31. SkMatrix matrix;
  32. if (!grad.totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix)->invert(&matrix)) {
  33. return nullptr;
  34. }
  35. matrix.postConcat(grad.getGradientMatrix());
  36. return std::unique_ptr<GrFragmentProcessor>(new GrRadialGradientLayout(matrix));
  37. }
  38. }
  39. //////////////////////////////////////////////////////////////////////////////
  40. @test(d) {
  41. SkScalar scale = GrGradientShader::RandomParams::kGradientScale;
  42. std::unique_ptr<GrFragmentProcessor> fp;
  43. GrTest::TestAsFPArgs asFPArgs(d);
  44. do {
  45. GrGradientShader::RandomParams params(d->fRandom);
  46. SkPoint center = {d->fRandom->nextRangeScalar(0.0f, scale),
  47. d->fRandom->nextRangeScalar(0.0f, scale)};
  48. SkScalar radius = d->fRandom->nextRangeScalar(0.0f, scale);
  49. sk_sp<SkShader> shader = params.fUseColors4f
  50. ? SkGradientShader::MakeRadial(center, radius, params.fColors4f,
  51. params.fColorSpace, params.fStops,
  52. params.fColorCount, params.fTileMode)
  53. : SkGradientShader::MakeRadial(center, radius, params.fColors,
  54. params.fStops, params.fColorCount,
  55. params.fTileMode);
  56. // Degenerate params can create an Empty (non-null) shader, where fp will be nullptr
  57. fp = shader ? as_SB(shader)->asFragmentProcessor(asFPArgs.args()) : nullptr;
  58. } while (!fp);
  59. return fp;
  60. }