anchor.diff:    void dispose() {
       _animationController.stop();
       _animationController.dispose();
  +    if (_fragmentShaderInitialized) {
  +      _fragmentShader.dispose();
  +    }
       super.dispose();
     }
   
  
positive.code:   final double d2 = (size.topRight(Offset.zero) - size.bottomLeft(Offset.zero)).distance;
    return math.max(d1, d2) / 2.0;
  }
  
  // The code below is generated by the package: fragment_shader_manager.
  // It is hand modified to update for flutter/flutter style and asset loading.
  
  /// A generated class for managing [FragmentProgram] that includes a
  /// pre-transpiled shader program into SPIR-V.
  ///
  /// See:
  /// - https://github.com/material-components/material-components-flutter-experimental/tree/fragment-shader-manager/fragment_shader_manager
  ///
  /// GLSL source for this shader is under `shaders/ink_sparkle.frag`.
  class FragmentShaderManager {
    FragmentShaderManager._();
  
    static late ui.FragmentProgram _program;
  
    /// Creates an [FragmentShaderManager] with an [InkSparkle] effect.
    static Future<FragmentShaderManager> inkSparkle() async {
      final FragmentShaderManager manager = FragmentShaderManager._();
      _program = await ui.FragmentProgram.fromAsset(
        'shaders/ink_sparkle.frag',
      );
      return manager;
    }
  
    /// Creates a shader with the original program and optional uniforms.
    ///
    /// A new shader must be made whenever the uniforms are updated.
    Shader shader({
      Vector4? uColor,
      double? uAlpha,
      Vector4? uSparkleColor,
      double? uSparkleAlpha,
      double? uBlur,
      Vector2? uCenter,
      double? uRadiusScale,
      double? uMaxRadius,
      Vector2? uResolutionScale,
      Vector2? uNoiseScale,
      double? uNoisePhase,
      double? uTurbulencePhase,
      Vector2? uCircle1,
      Vector2? uCircle2,
      Vector2? uCircle3,
      Vector2? uRotation1,
      Vector2? uRotation2,
      Vector2? uRotation3,
    }) {
      return _program.shader(
        floatUniforms: Float32List.fromList(<double>[
          ...uColor != null ? uColor.storage : <double>[0, 0, 0, 0],
          ...uAlpha != null ? <double>[uAlpha] : <double>[0],
          ...uSparkleColor != null ? uSparkleColor.storage : <double>[0, 0, 0, 0],
          ...uSparkleAlpha != null ? <double>[uSparkleAlpha] : <double>[0],
          ...uBlur != null ? <double>[uBlur] : <double>[0],
          ...uCenter != null ? uCenter.storage : <double>[0, 0],
          ...uRadiusScale != null ? <double>[uRadiusScale] : <double>[0],
          ...uMaxRadius != null ? <double>[uMaxRadius] : <double>[0],
          ...uResolutionScale != null ? uResolutionScale.storage : <double>[0, 0],
          ...uNoiseScale != null ? uNoiseScale.storage : <double>[0, 0],
          ...uNoisePhase != null ? <double>[uNoisePhase] : <double>[0],
          ...uCircle1 != null ? uCircle1.storage : <double>[0, 0],
          ...uCircle2 != null ? uCircle2.storage : <double>[0, 0],
          ...uCircle3 != null ? uCircle3.storage : <double>[0, 0],
          ...uRotation1 != null ? uRotation1.storage : <double>[0, 0],
          ...uRotation2 != null ? uRotation2.storage : <double>[0, 0],
          ...uRotation3 != null ? uRotation3.storage : <double>[0, 0],
        ]),
      );
    }
  }
  
negative.code: 
    const _InkSparkleFactory.constantTurbulenceSeed() : turbulenceSeed = 1337.0;
  
    static void initializeShader() {
      if (!_initCalled) {
        ui.FragmentProgram.fromAsset('shaders/ink_sparkle.frag').then(
          (ui.FragmentProgram program) {
            _program = program;
          },
        );
        _initCalled = true;
      }
    }
  
    static bool _initCalled = false;
    static ui.FragmentProgram? _program;
  
    final double? turbulenceSeed;
  
  