// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Textures; using osu.Framework.Graphics.Transforms; using osuTK; namespace osu.Game.Graphics.Backgrounds { /// /// A background which offers blurring via a on demand. /// public class Background : CompositeDrawable { public readonly Sprite Sprite; private readonly string textureName; private BufferedContainer bufferedContainer; public Background(string textureName = @"") { this.textureName = textureName; RelativeSizeAxes = Axes.Both; AddInternal(Sprite = new Sprite { RelativeSizeAxes = Axes.Both, Anchor = Anchor.Centre, Origin = Anchor.Centre, FillMode = FillMode.Fill, }); } [BackgroundDependencyLoader] private void load(LargeTextureStore textures) { if (!string.IsNullOrEmpty(textureName)) Sprite.Texture = textures.Get(textureName); } public Vector2 BlurSigma => bufferedContainer?.BlurSigma ?? Vector2.Zero; /// /// Smoothly adjusts over time. /// /// A to which further transforms can be added. public void BlurTo(Vector2 newBlurSigma, double duration = 0, Easing easing = Easing.None) { if (bufferedContainer == null && newBlurSigma != Vector2.Zero) { RemoveInternal(Sprite); AddInternal(bufferedContainer = new BufferedContainer { RelativeSizeAxes = Axes.Both, CacheDrawnFrameBuffer = true, RedrawOnScale = false, Child = Sprite }); } bufferedContainer?.BlurTo(newBlurSigma, duration, easing); } } }