1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SkBlenderBase_DEFINED 9cb93a386Sopenharmony_ci#define SkBlenderBase_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkBlender.h" 12cb93a386Sopenharmony_ci#include "include/core/SkColorSpace.h" 13cb93a386Sopenharmony_ci#include "include/private/SkTOptional.h" 14cb93a386Sopenharmony_ci#include "src/core/SkArenaAlloc.h" 15cb93a386Sopenharmony_ci#include "src/core/SkVM.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cistruct GrFPArgs; 18cb93a386Sopenharmony_ciclass GrFragmentProcessor; 19cb93a386Sopenharmony_ciclass SkRuntimeEffect; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci/** 22cb93a386Sopenharmony_ci * Encapsulates a blend function, including non-public APIs. 23cb93a386Sopenharmony_ci * Blends combine a source color (the result of our paint) and destination color (from the canvas) 24cb93a386Sopenharmony_ci * into a final color. 25cb93a386Sopenharmony_ci */ 26cb93a386Sopenharmony_ciclass SkBlenderBase : public SkBlender { 27cb93a386Sopenharmony_cipublic: 28cb93a386Sopenharmony_ci /** 29cb93a386Sopenharmony_ci * Returns true if this SkBlender represents any SkBlendMode, and returns the blender's 30cb93a386Sopenharmony_ci * SkBlendMode in `mode`. Returns false for other types of blends. 31cb93a386Sopenharmony_ci */ 32cb93a386Sopenharmony_ci virtual skstd::optional<SkBlendMode> asBlendMode() const { return {}; } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci /** Creates the blend program in SkVM. */ 35cb93a386Sopenharmony_ci SK_WARN_UNUSED_RESULT 36cb93a386Sopenharmony_ci skvm::Color program(skvm::Builder* p, skvm::Color src, skvm::Color dst, 37cb93a386Sopenharmony_ci const SkColorInfo& colorInfo, skvm::Uniforms* uniforms, 38cb93a386Sopenharmony_ci SkArenaAlloc* alloc) const { 39cb93a386Sopenharmony_ci return this->onProgram(p, src, dst, colorInfo, uniforms, alloc); 40cb93a386Sopenharmony_ci } 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU 43cb93a386Sopenharmony_ci /** 44cb93a386Sopenharmony_ci * Returns a GrFragmentProcessor that implements this blend for the GPU backend. 45cb93a386Sopenharmony_ci * The GrFragmentProcessor expects premultiplied inputs and returns a premultiplied output. 46cb93a386Sopenharmony_ci */ 47cb93a386Sopenharmony_ci virtual std::unique_ptr<GrFragmentProcessor> asFragmentProcessor( 48cb93a386Sopenharmony_ci std::unique_ptr<GrFragmentProcessor> srcFP, 49cb93a386Sopenharmony_ci std::unique_ptr<GrFragmentProcessor> dstFP, 50cb93a386Sopenharmony_ci const GrFPArgs& fpArgs) const = 0; 51cb93a386Sopenharmony_ci#endif 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci virtual SkRuntimeEffect* asRuntimeEffect() const { return nullptr; } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci static SkFlattenable::Type GetFlattenableType() { return kSkBlender_Type; } 56cb93a386Sopenharmony_ci Type getFlattenableType() const override { return GetFlattenableType(); } 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciprivate: 59cb93a386Sopenharmony_ci virtual skvm::Color onProgram(skvm::Builder* p, skvm::Color src, skvm::Color dst, 60cb93a386Sopenharmony_ci const SkColorInfo& colorInfo, skvm::Uniforms* uniforms, 61cb93a386Sopenharmony_ci SkArenaAlloc* alloc) const = 0; 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci using INHERITED = SkFlattenable; 64cb93a386Sopenharmony_ci}; 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ciinline SkBlenderBase* as_BB(SkBlender* blend) { 67cb93a386Sopenharmony_ci return static_cast<SkBlenderBase*>(blend); 68cb93a386Sopenharmony_ci} 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ciinline const SkBlenderBase* as_BB(const SkBlender* blend) { 71cb93a386Sopenharmony_ci return static_cast<const SkBlenderBase*>(blend); 72cb93a386Sopenharmony_ci} 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ciinline const SkBlenderBase* as_BB(const sk_sp<SkBlender>& blend) { 75cb93a386Sopenharmony_ci return static_cast<SkBlenderBase*>(blend.get()); 76cb93a386Sopenharmony_ci} 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci#endif // SkBlenderBase_DEFINED 79