| // Copyright 2013 The Flutter 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:async'; | |
| import 'dart:io'; | |
| import 'dart:typed_data'; | |
| import 'dart:ui'; | |
| import 'package:litetest/litetest.dart'; | |
| import 'package:path/path.dart' as path; | |
| void main() { | |
| bool assertsEnabled = false; | |
| assert(() { | |
| assertsEnabled = true; | |
| return true; | |
| }()); | |
| test('no resize by default', () async { | |
| final Uint8List bytes = await readFile('2x2.png'); | |
| final Codec codec = await instantiateImageCodec(bytes); | |
| final FrameInfo frame = await codec.getNextFrame(); | |
| final int codecHeight = frame.image.height; | |
| final int codecWidth = frame.image.width; | |
| expect(codecHeight, 2); | |
| expect(codecWidth, 2); | |
| }); | |
| test('resize width with constrained height', () async { | |
| final Uint8List bytes = await readFile('2x2.png'); | |
| final Codec codec = await instantiateImageCodec(bytes, targetHeight: 1); | |
| final FrameInfo frame = await codec.getNextFrame(); | |
| final int codecHeight = frame.image.height; | |
| final int codecWidth = frame.image.width; | |
| expect(codecHeight, 1); | |
| expect(codecWidth, 1); | |
| }); | |
| test('resize height with constrained width', () async { | |
| final Uint8List bytes = await readFile('2x2.png'); | |
| final Codec codec = await instantiateImageCodec(bytes, targetWidth: 1); | |
| final FrameInfo frame = await codec.getNextFrame(); | |
| final int codecHeight = frame.image.height; | |
| final int codecWidth = frame.image.width; | |
| expect(codecHeight, 1); | |
| expect(codecWidth, 1); | |
| }); | |
| test('upscale image by 5x', () async { | |
| final Uint8List bytes = await readFile('2x2.png'); | |
| final Codec codec = await instantiateImageCodec(bytes, targetWidth: 10); | |
| final FrameInfo frame = await codec.getNextFrame(); | |
| final int codecHeight = frame.image.height; | |
| final int codecWidth = frame.image.width; | |
| expect(codecHeight, 10); | |
| expect(codecWidth, 10); | |
| }); | |
| test('upscale image by 5x - no upscaling', () async { | |
| final Uint8List bytes = await readFile('2x2.png'); | |
| final Codec codec = await instantiateImageCodec(bytes, targetWidth: 10, allowUpscaling: false); | |
| final FrameInfo frame = await codec.getNextFrame(); | |
| final int codecHeight = frame.image.height; | |
| final int codecWidth = frame.image.width; | |
| expect(codecHeight, 2); | |
| expect(codecWidth, 2); | |
| }); | |
| test('upscale image varying width and height', () async { | |
| final Uint8List bytes = await readFile('2x2.png'); | |
| final Codec codec = | |
| await instantiateImageCodec(bytes, targetWidth: 10, targetHeight: 1); | |
| final FrameInfo frame = await codec.getNextFrame(); | |
| final int codecHeight = frame.image.height; | |
| final int codecWidth = frame.image.width; | |
| expect(codecHeight, 1); | |
| expect(codecWidth, 10); | |
| }); | |
| test('upscale image varying width and height - no upscaling', () async { | |
| final Uint8List bytes = await readFile('2x2.png'); | |
| final Codec codec = | |
| await instantiateImageCodec(bytes, targetWidth: 10, targetHeight: 1, allowUpscaling: false); | |
| final FrameInfo frame = await codec.getNextFrame(); | |
| final int codecHeight = frame.image.height; | |
| final int codecWidth = frame.image.width; | |
| expect(codecHeight, 1); | |
| expect(codecWidth, 2); | |
| }); | |
| test('pixels: no resize by default', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| final Image resized = await blackSquare.resize(); | |
| expect(resized.height, blackSquare.height); | |
| expect(resized.width, blackSquare.width); | |
| }); | |
| test('pixels: resize width with constrained height', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| final Image resized = await blackSquare.resize(targetHeight: 1); | |
| expect(resized.height, 1); | |
| expect(resized.width, 1); | |
| }); | |
| test('pixels: resize height with constrained width', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| final Image resized = await blackSquare.resize(targetWidth: 1); | |
| expect(resized.height, 1); | |
| expect(resized.width, 1); | |
| }); | |
| test('pixels: upscale image by 5x', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| final Image resized = await blackSquare.resize(targetWidth: 10, allowUpscaling: true); | |
| expect(resized.height, 10); | |
| expect(resized.width, 10); | |
| }); | |
| test('pixels: upscale image by 5x - no upscaling', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| bool threw = false; | |
| try { | |
| decodeImageFromPixels( | |
| blackSquare.pixels, | |
| blackSquare.width, | |
| blackSquare.height, | |
| PixelFormat.rgba8888, | |
| (Image image) {}, | |
| targetHeight: 10, | |
| allowUpscaling: false, | |
| ); | |
| } catch (e) { | |
| expect(e is AssertionError, true); | |
| threw = true; | |
| } | |
| expect(threw, true); | |
| }, skip: !assertsEnabled); | |
| test('pixels: upscale image varying width and height', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| final Image resized = | |
| await blackSquare.resize(targetHeight: 1, targetWidth: 10, allowUpscaling: true); | |
| expect(resized.height, 1); | |
| expect(resized.width, 10); | |
| }); | |
| test('pixels: upscale image varying width and height - no upscaling', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| bool threw = false; | |
| try { | |
| decodeImageFromPixels( | |
| blackSquare.pixels, | |
| blackSquare.width, | |
| blackSquare.height, | |
| PixelFormat.rgba8888, | |
| (Image image) {}, | |
| targetHeight: 10, | |
| targetWidth: 1, | |
| allowUpscaling: false, | |
| ); | |
| } catch (e) { | |
| expect(e is AssertionError, true); | |
| threw = true; | |
| } | |
| expect(threw, true); | |
| }, skip: !assertsEnabled); | |
| test('pixels: large negative dimensions', () async { | |
| final BlackSquare blackSquare = BlackSquare.create(); | |
| final Image resized = await blackSquare.resize(targetHeight: -100, targetWidth: -99999); | |
| expect(resized.height, 2); | |
| expect(resized.width, 2); | |
| }); | |
| } | |
| class BlackSquare { | |
| BlackSquare._(this.width, this.height, this.pixels); | |
| factory BlackSquare.create({int width = 2, int height = 2}) { | |
| final Uint8List pixels = | |
| Uint8List.fromList(List<int>.filled(width * height * 4, 0)); | |
| return BlackSquare._(width, height, pixels); | |
| } | |
| Future<Image> resize({int? targetWidth, int? targetHeight, bool allowUpscaling = false}) async { | |
| final Completer<Image> imageCompleter = Completer<Image>(); | |
| decodeImageFromPixels( | |
| pixels, | |
| width, | |
| height, | |
| PixelFormat.rgba8888, | |
| (Image image) => imageCompleter.complete(image), | |
| targetHeight: targetHeight, | |
| targetWidth: targetWidth, | |
| allowUpscaling: allowUpscaling, | |
| ); | |
| return imageCompleter.future; | |
| } | |
| final int width; | |
| final int height; | |
| final Uint8List pixels; | |
| } | |
| Future<Uint8List> readFile(String fileName) async { | |
| final File file = | |
| File(path.join('flutter', 'testing', 'resources', fileName)); | |
| return file.readAsBytes(); | |
| } |