1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci* Copyright 2019 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 SkParticleBinding_DEFINED 9cb93a386Sopenharmony_ci#define SkParticleBinding_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkString.h" 12cb93a386Sopenharmony_ci#include "modules/particles/include/SkReflected.h" 13cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLExternalFunction.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#include <memory> 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciclass SkArenaAlloc; 18cb93a386Sopenharmony_ciclass SkParticleEffect; 19cb93a386Sopenharmony_ciclass SkParticleEffectParams; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cinamespace skresources { 22cb93a386Sopenharmony_ci class ResourceProvider; 23cb93a386Sopenharmony_ci} // namespace skresources 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_cinamespace SkSL { 26cb93a386Sopenharmony_ci class Compiler; 27cb93a386Sopenharmony_ci} // namespace SkSL 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cinamespace skvm { 30cb93a386Sopenharmony_ci struct Uniforms; 31cb93a386Sopenharmony_ci} // namespace skvm 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ciclass SkParticleExternalFunction : public SkSL::ExternalFunction { 34cb93a386Sopenharmony_cipublic: 35cb93a386Sopenharmony_ci SkParticleExternalFunction(const char* name, 36cb93a386Sopenharmony_ci SkSL::Compiler& compiler, 37cb93a386Sopenharmony_ci const SkSL::Type& type, 38cb93a386Sopenharmony_ci skvm::Uniforms* uniforms, 39cb93a386Sopenharmony_ci SkArenaAlloc* alloc) 40cb93a386Sopenharmony_ci : SkSL::ExternalFunction(name, type) 41cb93a386Sopenharmony_ci , fCompiler(compiler) 42cb93a386Sopenharmony_ci , fUniforms(uniforms) 43cb93a386Sopenharmony_ci , fAlloc(alloc) {} 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ciprotected: 46cb93a386Sopenharmony_ci SkSL::Compiler& fCompiler; 47cb93a386Sopenharmony_ci skvm::Uniforms* fUniforms; 48cb93a386Sopenharmony_ci SkArenaAlloc* fAlloc; 49cb93a386Sopenharmony_ci}; 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ciclass SkParticleBinding : public SkReflected { 52cb93a386Sopenharmony_cipublic: 53cb93a386Sopenharmony_ci SkParticleBinding(const char* name = "name") : fName(name) {} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci REFLECTED_ABSTRACT(SkParticleBinding, SkReflected) 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci void visitFields(SkFieldVisitor* v) override; 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci virtual std::unique_ptr<SkParticleExternalFunction> toFunction(SkSL::Compiler&, 60cb93a386Sopenharmony_ci skvm::Uniforms*, 61cb93a386Sopenharmony_ci SkArenaAlloc*) = 0; 62cb93a386Sopenharmony_ci virtual void prepare(const skresources::ResourceProvider*) = 0; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci static void RegisterBindingTypes(); 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci /* 67cb93a386Sopenharmony_ci * All SkParticleBinding objects expose a particular native object to an effect's SkSL code. 68cb93a386Sopenharmony_ci * In all cases, the 'name' is the symbol that will be used to access the object from the SkSL. 69cb93a386Sopenharmony_ci * Each binding is a callable object, so the SkSL name behaves like a function. The behavior of 70cb93a386Sopenharmony_ci * each kind of binding is described below. 71cb93a386Sopenharmony_ci */ 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci // float4 name(xy) -- Fetches RGBA data from an image. 'xy' are normalized image coordinates. 74cb93a386Sopenharmony_ci static sk_sp<SkParticleBinding> MakeImage(const char* name, 75cb93a386Sopenharmony_ci const char* imagePath, const char* imageName); 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci // float4 name(t) -- Fetches position and normal from an SkPath. 't' is the normalized distance 78cb93a386Sopenharmony_ci // along the path. The return value contains position in .xy and normal in .zw. 79cb93a386Sopenharmony_ci static sk_sp<SkParticleBinding> MakePath(const char* name, 80cb93a386Sopenharmony_ci const char* pathPath, const char* pathName); 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ciprotected: 83cb93a386Sopenharmony_ci SkString fName; 84cb93a386Sopenharmony_ci}; 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci#endif // SkParticleBinding_DEFINED 87