blob: 01596ad85f749d4b583e5abd743925616eee4bd6 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:typed_data' show Uint8List;
import 'dart:ui' as ui show instantiateImageCodec, Codec;
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart' show ServicesBinding;
import 'image_cache.dart';
const double _kDefaultDecodedCacheRatioCap = 0.0;
/// Binding for the painting library.
///
/// Hooks into the cache eviction logic to clear the image cache.
///
/// Requires the [ServicesBinding] to be mixed in earlier.
mixin PaintingBinding on BindingBase, ServicesBinding {
@override
void initInstances() {
super.initInstances();
_instance = this;
_imageCache = createImageCache();
}
/// The current [PaintingBinding], if one has been created.
static PaintingBinding get instance => _instance;
static PaintingBinding _instance;
/// The singleton that implements the Flutter framework's image cache.
///
/// The cache is used internally by [ImageProvider] and should generally not
/// be accessed directly.
///
/// The image cache is created during startup by the [createImageCache]
/// method.
ImageCache get imageCache => _imageCache;
ImageCache _imageCache;
/// Creates the [ImageCache] singleton (accessible via [imageCache]).
///
/// This method can be overridden to provide a custom image cache.
@protected
ImageCache createImageCache() => ImageCache();
/// The maximum multiple of the compressed image size used when caching an
/// animated image.
///
/// Individual frames of animated images can be cached into memory to avoid
/// using CPU to re-decode them for every loop in the animation. This behavior
/// will result in out-of-memory crashes when decoding large (or large numbers
/// of) animated images so is disabled by default. Set this value to control
/// how much memory each animated image is allowed to use for caching decoded
/// frames compared to its compressed size. For example, setting this to `2.0`
/// means that a 400KB GIF would be allowed at most to use 800KB of memory
/// caching unessential decoded frames. A setting of `1.0` or less disables
/// all caching of unessential decoded frames. See
/// [_kDefaultDecodedCacheRatioCap] for the default value.
///
/// @deprecated The in-memory cache of decoded frames causes issues with
/// memory consumption. Soon this API and the in-memory cache will be removed.
/// See
/// [flutter/flutter#26081](https://github.com/flutter/flutter/issues/26081)
/// for more context.
@deprecated
double get decodedCacheRatioCap => _kDecodedCacheRatioCap;
double _kDecodedCacheRatioCap = _kDefaultDecodedCacheRatioCap;
/// Changes the maximum multiple of compressed image size used when caching an
/// animated image.
///
/// Changing this value only affects new images, not images that have already
/// been decoded.
///
/// @deprecated The in-memory cache of decoded frames causes issues with
/// memory consumption. Soon this API and the in-memory cache will be removed.
/// See
/// [flutter/flutter#26081](https://github.com/flutter/flutter/issues/26081)
/// for more context.
@deprecated
set decodedCacheRatioCap(double value) {
assert (value != null);
assert (value >= 0.0);
_kDecodedCacheRatioCap = value;
}
// ignore: deprecated_member_use_from_same_package
/// Calls through to [dart:ui] with [decodedCacheRatioCap] from [ImageCache].
Future<ui.Codec> instantiateImageCodec(Uint8List list) {
return ui.instantiateImageCodec(list, decodedCacheRatioCap: decodedCacheRatioCap); // ignore: deprecated_member_use_from_same_package
}
@override
void evict(String asset) {
super.evict(asset);
imageCache.clear();
}
}
/// The singleton that implements the Flutter framework's image cache.
///
/// The cache is used internally by [ImageProvider] and should generally not be
/// accessed directly.
///
/// The image cache is created during startup by the [PaintingBinding]'s
/// [PaintingBinding.createImageCache] method.
ImageCache get imageCache => PaintingBinding.instance.imageCache;