/* * Copyright 2006 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkShader_DEFINED #define SkShader_DEFINED #include "include/core/SkBlendMode.h" #include "include/core/SkColor.h" #include "include/core/SkFlattenable.h" #include "include/core/SkImageInfo.h" #include "include/core/SkMatrix.h" #include "include/core/SkTileMode.h" class SkArenaAlloc; class SkBitmap; class SkBlender; class SkColorFilter; class SkColorSpace; class SkImage; class SkPath; class SkPicture; class SkRasterPipeline; class GrFragmentProcessor; /** \class SkShader * * Shaders specify the source color(s) for what is being drawn. If a paint * has no shader, then the paint's color is used. If the paint has a * shader, then the shader's color(s) are use instead, but they are * modulated by the paint's alpha. This makes it easy to create a shader * once (e.g. bitmap tiling or gradient) and then change its transparency * w/o having to modify the original shader... only the paint's alpha needs * to be modified. */ class SK_API SkShader : public SkFlattenable { public: /** * Returns true if the shader is guaranteed to produce only opaque * colors, subject to the SkPaint using the shader to apply an opaque * alpha value. Subclasses should override this to allow some * optimizations. */ virtual bool isOpaque() const { return false; } /** * Iff this shader is backed by a single SkImage, return its ptr (the caller must ref this * if they want to keep it longer than the lifetime of the shader). If not, return nullptr. */ SkImage* isAImage(SkMatrix* localMatrix, SkTileMode xy[2]) const; bool isAImage() const { return this->isAImage(nullptr, (SkTileMode*)nullptr) != nullptr; } ////////////////////////////////////////////////////////////////////////// // Methods to create combinations or variants of shaders /** * Return a shader that will apply the specified localMatrix to this shader. * The specified matrix will be applied before any matrix associated with this shader. */ sk_sp makeWithLocalMatrix(const SkMatrix&) const; /** * Create a new shader that produces the same colors as invoking this shader and then applying * the colorfilter. */ sk_sp makeWithColorFilter(sk_sp) const; private: SkShader() = default; friend class SkShaderBase; using INHERITED = SkFlattenable; }; class SK_API SkShaders { public: static sk_sp Empty(); static sk_sp Color(SkColor); static sk_sp Color(const SkColor4f&, sk_sp); static sk_sp Blend(SkBlendMode mode, sk_sp dst, sk_sp src); static sk_sp Blend(sk_sp, sk_sp dst, sk_sp src); static sk_sp CoordClamp(sk_sp, const SkRect& subset); private: SkShaders() = delete; }; #endif