123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- /*
- * Copyright 2012 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #ifndef SkGradientShaderPriv_DEFINED
- #define SkGradientShaderPriv_DEFINED
- #include "include/effects/SkGradientShader.h"
- #include "include/core/SkMatrix.h"
- #include "include/private/SkTArray.h"
- #include "include/private/SkTemplates.h"
- #include "src/core/SkArenaAlloc.h"
- #include "src/shaders/SkShaderBase.h"
- class SkColorSpace;
- class SkRasterPipeline;
- class SkReadBuffer;
- class SkWriteBuffer;
- class SkGradientShaderBase : public SkShaderBase {
- public:
- struct Descriptor {
- Descriptor() {
- sk_bzero(this, sizeof(*this));
- fTileMode = SkTileMode::kClamp;
- }
- const SkMatrix* fLocalMatrix;
- const SkColor4f* fColors;
- sk_sp<SkColorSpace> fColorSpace;
- const SkScalar* fPos;
- int fCount;
- SkTileMode fTileMode;
- uint32_t fGradFlags;
- void flatten(SkWriteBuffer&) const;
- };
- class DescriptorScope : public Descriptor {
- public:
- DescriptorScope() {}
- bool unflatten(SkReadBuffer&);
- // fColors and fPos always point into local memory, so they can be safely mutated
- //
- SkColor4f* mutableColors() { return const_cast<SkColor4f*>(fColors); }
- SkScalar* mutablePos() { return const_cast<SkScalar*>(fPos); }
- private:
- SkSTArray<16, SkColor4f, true> fColorStorage;
- SkSTArray<16, SkScalar , true> fPosStorage;
- SkMatrix fLocalMatrixStorage;
- };
- SkGradientShaderBase(const Descriptor& desc, const SkMatrix& ptsToUnit);
- ~SkGradientShaderBase() override;
- bool isOpaque() const override;
- uint32_t getGradFlags() const { return fGradFlags; }
- const SkMatrix& getGradientMatrix() const { return fPtsToUnit; }
- protected:
- class GradientShaderBase4fContext;
- SkGradientShaderBase(SkReadBuffer& );
- void flatten(SkWriteBuffer&) const override;
- void commonAsAGradient(GradientInfo*) const;
- bool onAsLuminanceColor(SkColor*) const override;
- bool onAppendStages(const SkStageRec&) const override;
- virtual void appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* tPipeline,
- SkRasterPipeline* postPipeline) const = 0;
- template <typename T, typename... Args>
- static Context* CheckedMakeContext(SkArenaAlloc* alloc, Args&&... args) {
- auto* ctx = alloc->make<T>(std::forward<Args>(args)...);
- if (!ctx->isValid()) {
- return nullptr;
- }
- return ctx;
- }
- const SkMatrix fPtsToUnit;
- SkTileMode fTileMode;
- uint8_t fGradFlags;
- public:
- SkScalar getPos(int i) const {
- SkASSERT(i < fColorCount);
- return fOrigPos ? fOrigPos[i] : SkIntToScalar(i) / (fColorCount - 1);
- }
- SkColor getLegacyColor(int i) const {
- SkASSERT(i < fColorCount);
- return fOrigColors4f[i].toSkColor();
- }
- bool colorsCanConvertToSkColor() const {
- bool canConvert = true;
- for (int i = 0; i < fColorCount; ++i) {
- canConvert &= fOrigColors4f[i].fitsInBytes();
- }
- return canConvert;
- }
- SkColor4f* fOrigColors4f; // original colors, as floats
- SkScalar* fOrigPos; // original positions
- int fColorCount;
- sk_sp<SkColorSpace> fColorSpace; // color space of gradient stops
- bool colorsAreOpaque() const { return fColorsAreOpaque; }
- SkTileMode getTileMode() const { return fTileMode; }
- private:
- // Reserve inline space for up to 4 stops.
- static constexpr size_t kInlineStopCount = 4;
- static constexpr size_t kInlineStorageSize = (sizeof(SkColor4f) + sizeof(SkScalar))
- * kInlineStopCount;
- SkAutoSTMalloc<kInlineStorageSize, uint8_t> fStorage;
- bool fColorsAreOpaque;
- typedef SkShaderBase INHERITED;
- };
- ///////////////////////////////////////////////////////////////////////////////
- struct SkColor4fXformer {
- SkColor4fXformer(const SkColor4f* colors, int colorCount, SkColorSpace* src, SkColorSpace* dst);
- const SkColor4f* fColors;
- SkSTArray<4, SkColor4f, true> fStorage;
- };
- #endif
|