GrConstColorProcessor.fp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. enum class InputMode {
  8. kIgnore,
  9. kModulateRGBA,
  10. kModulateA,
  11. kLast = kModulateA
  12. };
  13. layout(ctype=SkPMColor4f, tracked) in uniform half4 color;
  14. layout(key) in InputMode mode;
  15. @optimizationFlags {
  16. OptFlags(color, mode)
  17. }
  18. void main() {
  19. @switch (mode) {
  20. case InputMode::kIgnore:
  21. sk_OutColor = color;
  22. break;
  23. case InputMode::kModulateRGBA:
  24. sk_OutColor = sk_InColor * color;
  25. break;
  26. case InputMode::kModulateA:
  27. sk_OutColor = sk_InColor.a * color;
  28. break;
  29. }
  30. }
  31. @class {
  32. static const int kInputModeCnt = (int) InputMode::kLast + 1;
  33. static OptimizationFlags OptFlags(const SkPMColor4f& color, InputMode mode) {
  34. OptimizationFlags flags = kConstantOutputForConstantInput_OptimizationFlag;
  35. if (mode != InputMode::kIgnore) {
  36. flags |= kCompatibleWithCoverageAsAlpha_OptimizationFlag;
  37. }
  38. if (color.isOpaque()) {
  39. flags |= kPreservesOpaqueInput_OptimizationFlag;
  40. }
  41. return flags;
  42. }
  43. SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& input) const override {
  44. switch (mode) {
  45. case InputMode::kIgnore:
  46. return color;
  47. case InputMode::kModulateA:
  48. return color * input.fA;
  49. case InputMode::kModulateRGBA:
  50. return color * input;
  51. }
  52. SK_ABORT("Unexpected mode");
  53. return SK_PMColor4fTRANSPARENT;
  54. }
  55. }
  56. @test(d) {
  57. SkPMColor4f color;
  58. int colorPicker = d->fRandom->nextULessThan(3);
  59. switch (colorPicker) {
  60. case 0: {
  61. uint32_t a = d->fRandom->nextULessThan(0x100);
  62. uint32_t r = d->fRandom->nextULessThan(a+1);
  63. uint32_t g = d->fRandom->nextULessThan(a+1);
  64. uint32_t b = d->fRandom->nextULessThan(a+1);
  65. color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(r, g, b, a));
  66. break;
  67. }
  68. case 1:
  69. color = SK_PMColor4fTRANSPARENT;
  70. break;
  71. case 2:
  72. uint32_t c = d->fRandom->nextULessThan(0x100);
  73. color = SkPMColor4f::FromBytes_RGBA(c | (c << 8) | (c << 16) | (c << 24));
  74. break;
  75. }
  76. InputMode mode = static_cast<InputMode>(d->fRandom->nextULessThan(kInputModeCnt));
  77. return GrConstColorProcessor::Make(color, mode);
  78. }