blob: a9753ae178b770239ede105bfcc996d0b3cf37ce [file] [log] [blame]
// 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:io';
import 'package:args/args.dart';
import 'package:engine_repo_tools/engine_repo_tools.dart';
import 'package:git_repo_tools/git_repo_tools.dart';
import 'package:path/path.dart' as path;
/// Takes the images in `source_images`, writes text on them (i.e. git hash)
/// and saves them in `e2e_fixtures`. By default, no arguments are needed but
/// ImageMagick must be installed.
void main(List<String> args) async {
final Engine? engine = Engine.tryFindWithin();
final ArgParser parser = ArgParser()
..addFlag(
'help',
abbr: 'h',
help: 'Prints usage information.',
negatable: false,
)
..addOption(
'image-magick-convert-bin',
help: 'The path to the ImageMagick `convert` executable.',
defaultsTo: 'convert',
hide: true,
)
..addOption(
'annotation',
abbr: 'a',
help: 'The text to write on the images.',
defaultsTo: engine == null
? null
: await GitRepo.fromRoot(engine.flutterDir).headSha(short: true),
)
..addOption(
'source',
abbr: 's',
help: 'The directory containing the images to be modified.',
defaultsTo: engine == null
? null
: path.join(
engine.flutterDir.path,
'testing',
'skia_gold_client',
'tool',
'source_images',
),
)
..addOption(
'output',
abbr: 'o',
help: 'The directory to save the modified images in.',
defaultsTo: engine == null
? null
: path.join(
engine.flutterDir.path,
'testing',
'skia_gold_client',
'tool',
'e2e_fixtures',
),
);
final ArgResults results = parser.parse(args);
if (results['help'] as bool) {
print(parser.usage);
return;
}
final String relativeDir = engine?.flutterDir.path ?? '';
final String imageMagickConvertBin = results['image-magick-convert-bin'] as String;
final String annotation = results['annotation'] as String;
final String source = results['source'] as String;
final String output = results['output'] as String;
print(
'Writing annotation "$annotation" on images in '
'${path.relative(source, from: relativeDir)} and saving them in '
'${path.relative(output, from: relativeDir)}.',
);
final List<String> sourceImages = Directory(source)
.listSync()
.whereType<File>()
.map((File file) => file.path)
.toList();
// For each source image, write the annotation and save it in the output directory.
for (final String sourceImage in sourceImages) {
final String outputImage = path.join(
output,
'${path.basenameWithoutExtension(sourceImage)}.png',
);
print('Writing to ${path.relative(outputImage, from: relativeDir)}');
await Process.run(
imageMagickConvertBin,
<String>[
sourceImage,
'-fill',
'white',
'-undercolor',
'black',
'-gravity',
'SouthEast',
'-pointsize',
'24',
'-annotate',
'+10+10',
annotation,
outputImage,
],
);
}
print('Done: wrote ${sourceImages.length} image.');
}