SkGradientShaderPriv.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /*
  2. * Copyright 2012 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. #ifndef SkGradientShaderPriv_DEFINED
  8. #define SkGradientShaderPriv_DEFINED
  9. #include "include/effects/SkGradientShader.h"
  10. #include "include/core/SkMatrix.h"
  11. #include "include/private/SkTArray.h"
  12. #include "include/private/SkTemplates.h"
  13. #include "src/core/SkArenaAlloc.h"
  14. #include "src/shaders/SkShaderBase.h"
  15. class SkColorSpace;
  16. class SkRasterPipeline;
  17. class SkReadBuffer;
  18. class SkWriteBuffer;
  19. class SkGradientShaderBase : public SkShaderBase {
  20. public:
  21. struct Descriptor {
  22. Descriptor() {
  23. sk_bzero(this, sizeof(*this));
  24. fTileMode = SkTileMode::kClamp;
  25. }
  26. const SkMatrix* fLocalMatrix;
  27. const SkColor4f* fColors;
  28. sk_sp<SkColorSpace> fColorSpace;
  29. const SkScalar* fPos;
  30. int fCount;
  31. SkTileMode fTileMode;
  32. uint32_t fGradFlags;
  33. void flatten(SkWriteBuffer&) const;
  34. };
  35. class DescriptorScope : public Descriptor {
  36. public:
  37. DescriptorScope() {}
  38. bool unflatten(SkReadBuffer&);
  39. // fColors and fPos always point into local memory, so they can be safely mutated
  40. //
  41. SkColor4f* mutableColors() { return const_cast<SkColor4f*>(fColors); }
  42. SkScalar* mutablePos() { return const_cast<SkScalar*>(fPos); }
  43. private:
  44. SkSTArray<16, SkColor4f, true> fColorStorage;
  45. SkSTArray<16, SkScalar , true> fPosStorage;
  46. SkMatrix fLocalMatrixStorage;
  47. };
  48. SkGradientShaderBase(const Descriptor& desc, const SkMatrix& ptsToUnit);
  49. ~SkGradientShaderBase() override;
  50. bool isOpaque() const override;
  51. uint32_t getGradFlags() const { return fGradFlags; }
  52. const SkMatrix& getGradientMatrix() const { return fPtsToUnit; }
  53. protected:
  54. class GradientShaderBase4fContext;
  55. SkGradientShaderBase(SkReadBuffer& );
  56. void flatten(SkWriteBuffer&) const override;
  57. void commonAsAGradient(GradientInfo*) const;
  58. bool onAsLuminanceColor(SkColor*) const override;
  59. bool onAppendStages(const SkStageRec&) const override;
  60. virtual void appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* tPipeline,
  61. SkRasterPipeline* postPipeline) const = 0;
  62. template <typename T, typename... Args>
  63. static Context* CheckedMakeContext(SkArenaAlloc* alloc, Args&&... args) {
  64. auto* ctx = alloc->make<T>(std::forward<Args>(args)...);
  65. if (!ctx->isValid()) {
  66. return nullptr;
  67. }
  68. return ctx;
  69. }
  70. const SkMatrix fPtsToUnit;
  71. SkTileMode fTileMode;
  72. uint8_t fGradFlags;
  73. public:
  74. SkScalar getPos(int i) const {
  75. SkASSERT(i < fColorCount);
  76. return fOrigPos ? fOrigPos[i] : SkIntToScalar(i) / (fColorCount - 1);
  77. }
  78. SkColor getLegacyColor(int i) const {
  79. SkASSERT(i < fColorCount);
  80. return fOrigColors4f[i].toSkColor();
  81. }
  82. bool colorsCanConvertToSkColor() const {
  83. bool canConvert = true;
  84. for (int i = 0; i < fColorCount; ++i) {
  85. canConvert &= fOrigColors4f[i].fitsInBytes();
  86. }
  87. return canConvert;
  88. }
  89. SkColor4f* fOrigColors4f; // original colors, as floats
  90. SkScalar* fOrigPos; // original positions
  91. int fColorCount;
  92. sk_sp<SkColorSpace> fColorSpace; // color space of gradient stops
  93. bool colorsAreOpaque() const { return fColorsAreOpaque; }
  94. SkTileMode getTileMode() const { return fTileMode; }
  95. private:
  96. // Reserve inline space for up to 4 stops.
  97. static constexpr size_t kInlineStopCount = 4;
  98. static constexpr size_t kInlineStorageSize = (sizeof(SkColor4f) + sizeof(SkScalar))
  99. * kInlineStopCount;
  100. SkAutoSTMalloc<kInlineStorageSize, uint8_t> fStorage;
  101. bool fColorsAreOpaque;
  102. typedef SkShaderBase INHERITED;
  103. };
  104. ///////////////////////////////////////////////////////////////////////////////
  105. struct SkColor4fXformer {
  106. SkColor4fXformer(const SkColor4f* colors, int colorCount, SkColorSpace* src, SkColorSpace* dst);
  107. const SkColor4f* fColors;
  108. SkSTArray<4, SkColor4f, true> fStorage;
  109. };
  110. #endif