@@ -328,9 +328,45 @@ class SK_API SkRuntimeEffect : public SkRefCnt {
328328 uint32_t fFlags ; // Flags
329329};
330330
331- /* * Base class for SkRuntimeShaderBuilder, defined below. */
331+ /* *
332+ * SkRuntimeEffectBuilder is a utility to simplify creating SkShader, SkColorFilter, and SkBlender
333+ * objects from SkRuntimeEffects.
334+ *
335+ * NOTE: Like SkRuntimeEffect, this API is experimental and subject to change!
336+ *
337+ * Given an SkRuntimeEffect, the SkRuntimeEffectBuilder manages creating an input data block and
338+ * provides named access to the 'uniform' variables in that block, as well as named access
339+ * to a list of child shader slots. Usage:
340+ *
341+ * sk_sp<SkRuntimeEffect> effect = ...;
342+ * SkRuntimeEffectBuilder builder(effect);
343+ * builder.uniform("some_uniform_float") = 3.14f;
344+ * builder.uniform("some_uniform_matrix") = SkM44::Rotate(...);
345+ * builder.child("some_child_effect") = mySkImage->makeShader(...);
346+ * ...
347+ * sk_sp<SkShader> shader = builder.makeShader(nullptr, false);
348+ *
349+ * Upon calling makeShader, makeColorFilter, or makeBlender, the builder will check the validity
350+ * of the SkSL to see if the entry point is correct.
351+ *
352+ * Note that SkRuntimeEffectBuilder is built entirely on the public API of SkRuntimeEffect,
353+ * so can be used as-is or serve as inspiration for other interfaces or binding techniques.
354+ */
332355class SkRuntimeEffectBuilder {
333356public:
357+ explicit SkRuntimeEffectBuilder (sk_sp<SkRuntimeEffect> effect)
358+ : fEffect(std::move(effect))
359+ , fUniforms(SkData::MakeZeroInitialized(fEffect ->uniformSize ()))
360+ , fChildren(fEffect ->children ().size()) {}
361+ explicit SkRuntimeEffectBuilder (sk_sp<SkRuntimeEffect> effect, sk_sp<SkData> uniforms)
362+ : fEffect(std::move(effect))
363+ , fUniforms(std::move(uniforms))
364+ , fChildren(fEffect ->children ().size()) {}
365+
366+ // This is currently required by Android Framework but may go away if that dependency
367+ // can be removed.
368+ SkRuntimeEffectBuilder (const SkRuntimeEffectBuilder&) = default;
369+
334370 struct BuilderUniform {
335371 // Copy 'val' to this variable. No type conversion is performed - 'val' must be same
336372 // size as expected by the effect. Information about the variable can be queried by
@@ -419,19 +455,17 @@ class SkRuntimeEffectBuilder {
419455 sk_sp<const SkData> uniforms () const { return fUniforms ; }
420456 SkSpan<const SkRuntimeEffect::ChildPtr> children () const { return fChildren ; }
421457
458+ // Build methods, at this point checks are made to ensure the SkSL entry point `main` is correct
459+ sk_sp<SkShader> makeShader (const SkMatrix* localMatrix = nullptr ) const ;
460+ sk_sp<SkColorFilter> makeColorFilter () const ;
461+ sk_sp<SkBlender> makeBlender () const ;
462+
463+ ~SkRuntimeEffectBuilder () = default ;
464+
422465protected:
423466 SkRuntimeEffectBuilder () = delete;
424- explicit SkRuntimeEffectBuilder (sk_sp<SkRuntimeEffect> effect)
425- : fEffect(std::move(effect))
426- , fUniforms(SkData::MakeZeroInitialized(fEffect ->uniformSize ()))
427- , fChildren(fEffect ->children ().size()) {}
428- explicit SkRuntimeEffectBuilder (sk_sp<SkRuntimeEffect> effect, sk_sp<SkData> uniforms)
429- : fEffect(std::move(effect))
430- , fUniforms(std::move(uniforms))
431- , fChildren(fEffect ->children ().size()) {}
432467
433468 SkRuntimeEffectBuilder (SkRuntimeEffectBuilder&&) = default;
434- SkRuntimeEffectBuilder (const SkRuntimeEffectBuilder&) = default;
435469
436470 SkRuntimeEffectBuilder& operator =(SkRuntimeEffectBuilder&&) = delete;
437471 SkRuntimeEffectBuilder& operator =(const SkRuntimeEffectBuilder&) = delete;
@@ -447,71 +481,15 @@ class SkRuntimeEffectBuilder {
447481 sk_sp<SkRuntimeEffect> fEffect ;
448482 sk_sp<SkData> fUniforms ;
449483 std::vector<SkRuntimeEffect::ChildPtr> fChildren ;
450- };
451-
452- /* *
453- * SkRuntimeShaderBuilder is a utility to simplify creating SkShader objects from SkRuntimeEffects.
454- *
455- * NOTE: Like SkRuntimeEffect, this API is experimental and subject to change!
456- *
457- * Given an SkRuntimeEffect, the SkRuntimeShaderBuilder manages creating an input data block and
458- * provides named access to the 'uniform' variables in that block, as well as named access
459- * to a list of child shader slots. Usage:
460- *
461- * sk_sp<SkRuntimeEffect> effect = ...;
462- * SkRuntimeShaderBuilder builder(effect);
463- * builder.uniform("some_uniform_float") = 3.14f;
464- * builder.uniform("some_uniform_matrix") = SkM44::Rotate(...);
465- * builder.child("some_child_effect") = mySkImage->makeShader(...);
466- * ...
467- * sk_sp<SkShader> shader = builder.makeShader(nullptr, false);
468- *
469- * Note that SkRuntimeShaderBuilder is built entirely on the public API of SkRuntimeEffect,
470- * so can be used as-is or serve as inspiration for other interfaces or binding techniques.
471- */
472- class SK_API SkRuntimeShaderBuilder : public SkRuntimeEffectBuilder {
473- public:
474- explicit SkRuntimeShaderBuilder (sk_sp<SkRuntimeEffect>);
475- // This is currently required by Android Framework but may go away if that dependency
476- // can be removed.
477- SkRuntimeShaderBuilder (const SkRuntimeShaderBuilder&) = default ;
478- ~SkRuntimeShaderBuilder ();
479-
480- sk_sp<SkShader> makeShader (const SkMatrix* localMatrix = nullptr ) const ;
481-
482- private:
483- explicit SkRuntimeShaderBuilder (sk_sp<SkRuntimeEffect> effect, sk_sp<SkData> uniforms)
484- : SkRuntimeEffectBuilder(std::move(effect), std::move(uniforms)) {}
485484
486485 friend class SkRuntimeImageFilter ;
487486};
488487
489488/* *
490- * SkRuntimeColorFilterBuilder makes it easy to setup and assign uniforms to runtime color filters.
491- */
492- class SK_API SkRuntimeColorFilterBuilder : public SkRuntimeEffectBuilder {
493- public:
494- explicit SkRuntimeColorFilterBuilder (sk_sp<SkRuntimeEffect>);
495- ~SkRuntimeColorFilterBuilder ();
496-
497- SkRuntimeColorFilterBuilder (const SkRuntimeColorFilterBuilder&) = delete ;
498- SkRuntimeColorFilterBuilder& operator =(const SkRuntimeColorFilterBuilder&) = delete ;
499-
500- sk_sp<SkColorFilter> makeColorFilter () const ;
501- };
502-
503- /* *
504- * SkRuntimeBlendBuilder is a utility to simplify creation and uniform setup of runtime blenders.
489+ * DEPRECATED: Subclass logic has been moved to base class SkRuntimeEffectBuilder.
505490 */
506- class SK_API SkRuntimeBlendBuilder : public SkRuntimeEffectBuilder {
507- public:
508- explicit SkRuntimeBlendBuilder (sk_sp<SkRuntimeEffect>);
509- ~SkRuntimeBlendBuilder ();
510-
511- SkRuntimeBlendBuilder (const SkRuntimeBlendBuilder&) = delete ;
512- SkRuntimeBlendBuilder& operator =(const SkRuntimeBlendBuilder&) = delete ;
513-
514- sk_sp<SkBlender> makeBlender () const ;
515- };
491+ using SkRuntimeShaderBuilder = SkRuntimeEffectBuilder;
492+ using SkRuntimeColorFilterBuilder = SkRuntimeEffectBuilder;
493+ using SkRuntimeBlendBuilder = SkRuntimeEffectBuilder;
516494
517495#endif // SkRuntimeEffect_DEFINED
0 commit comments