| // 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(); |
| } |