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