Visitar URL original
Wire up SVG theme related properties to compiler (#142) · flutter/packages@e8f278c · GitHub
Skip to content

Commit e8f278c

Browse files
authored
Wire up SVG theme related properties to compiler (#142)
1 parent bcc8966 commit e8f278c

6 files changed

Lines changed: 76 additions & 6 deletions

File tree

‎packages/vector_graphics_compiler/bin/vector_graphics_compiler.dart‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,30 @@
55
import 'dart:io';
66

77
import 'package:args/args.dart';
8+
import 'package:vector_graphics_compiler/src/svg/colors.dart';
9+
import 'package:vector_graphics_compiler/vector_graphics_compiler.dart';
810
import 'package:vector_graphics_compiler/src/isolate_processor.dart';
911

1012
final ArgParser argParser = ArgParser()
13+
..addOption(
14+
'current-color',
15+
help: 'The value (in ARGB format or a named SVG color) of the '
16+
'"currentColor" attribute.',
17+
valueHelp: '0xFF000000',
18+
defaultsTo: '0xFF000000',
19+
)
20+
..addOption(
21+
'font-size',
22+
help: 'The basis for font size based values (i.e. em, ex).',
23+
valueHelp: '14',
24+
defaultsTo: '14',
25+
)
26+
..addOption(
27+
'x-height',
28+
help: 'The x-height or corpus size of the font. If unspecified, defaults '
29+
'to half of font-size.',
30+
valueHelp: '7',
31+
)
1132
..addOption(
1233
'libtessellator',
1334
help: 'The path to a libtessellator dynamic library',
@@ -80,6 +101,21 @@ void validateOptions(ArgResults results) {
80101
}
81102
}
82103

104+
SvgTheme _parseTheme(ArgResults results) {
105+
Color? currentColor = namedColors[results['current-color']];
106+
if (currentColor == null) {
107+
final int? argbValue = int.tryParse(results['current-color'] as String);
108+
currentColor = Color(argbValue ?? 0xFF000000);
109+
}
110+
return SvgTheme(
111+
currentColor: currentColor,
112+
fontSize: double.tryParse(results['font-size'] as String) ?? 14,
113+
xHeight: results.wasParsed('x-height')
114+
? double.tryParse(results['x-height'] as String)
115+
: null,
116+
);
117+
}
118+
83119
Future<void> main(List<String> args) async {
84120
final ArgResults results;
85121
try {
@@ -132,6 +168,7 @@ Future<void> main(List<String> args) async {
132168
);
133169
if (!await processor.process(
134170
pairs,
171+
theme: _parseTheme(results),
135172
maskingOptimizerEnabled: maskingOptimizerEnabled,
136173
clippingOptimizerEnabled: clippingOptimizerEnabled,
137174
overdrawOptimizerEnabled: overdrawOptimizerEnabled,

‎packages/vector_graphics_compiler/lib/src/isolate_processor.dart‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class IsolateProcessor {
2929
/// Returns whether all requests were successful.
3030
Future<bool> process(
3131
List<Pair> pairs, {
32+
SvgTheme theme = const SvgTheme(),
3233
required bool maskingOptimizerEnabled,
3334
required bool clippingOptimizerEnabled,
3435
required bool overdrawOptimizerEnabled,
@@ -42,6 +43,7 @@ class IsolateProcessor {
4243
for (Pair pair in pairs)
4344
_process(
4445
pair,
46+
theme: theme,
4547
maskingOptimizerEnabled: maskingOptimizerEnabled,
4648
clippingOptimizerEnabled: clippingOptimizerEnabled,
4749
overdrawOptimizerEnabled: overdrawOptimizerEnabled,
@@ -87,6 +89,7 @@ class IsolateProcessor {
8789
required bool dumpDebug,
8890
required String? libpathops,
8991
required String? libtessellator,
92+
SvgTheme theme = const SvgTheme(),
9093
}) async {
9194
PoolResource? resource;
9295
try {
@@ -104,6 +107,7 @@ class IsolateProcessor {
104107
final Uint8List bytes = await encodeSvg(
105108
xml: File(pair.inputPath).readAsStringSync(),
106109
debugName: pair.inputPath,
110+
theme: theme,
107111
enableMaskingOptimizer: maskingOptimizerEnabled,
108112
enableClippingOptimizer: clippingOptimizerEnabled,
109113
enableOverdrawOptimizer: overdrawOptimizerEnabled,

‎packages/vector_graphics_compiler/lib/src/svg/parser.dart‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,7 @@ class SvgParser {
12401240
}
12411241

12421242
/// Converts a SVG Color String (either a # prefixed color string or a named color) to a [Color].
1243-
Color? parseColor(String? colorString) {
1243+
Color? parseColor(String? colorString, {Color? currentColor}) {
12441244
if (colorString == null || colorString.isEmpty) {
12451245
return null;
12461246
}
@@ -1250,7 +1250,7 @@ class SvgParser {
12501250
}
12511251

12521252
if (colorString.toLowerCase() == 'currentcolor') {
1253-
return null;
1253+
return currentColor ?? theme.currentColor;
12541254
}
12551255

12561256
// handle hex colors e.g. #fff or #ffffff. This supports #RRGGBBAA

‎packages/vector_graphics_compiler/lib/vector_graphics_compiler.dart‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'src/paint.dart';
1414
import 'src/svg/theme.dart';
1515
import 'src/svg/parser.dart';
1616
import 'src/vector_instructions.dart';
17+
1718
export 'src/geometry/basic_types.dart';
1819
export 'src/geometry/matrix.dart';
1920
export 'src/geometry/path.dart';
@@ -101,6 +102,7 @@ void _encodeShader(
101102
Future<Uint8List> encodeSvg({
102103
required String xml,
103104
required String debugName,
105+
SvgTheme theme = const SvgTheme(),
104106
bool enableMaskingOptimizer = true,
105107
bool enableClippingOptimizer = true,
106108
bool enableOverdrawOptimizer = true,
@@ -110,6 +112,7 @@ Future<Uint8List> encodeSvg({
110112
final VectorInstructions instructions = await parse(
111113
xml,
112114
key: debugName,
115+
theme: theme,
113116
enableMaskingOptimizer: enableMaskingOptimizer,
114117
enableClippingOptimizer: enableClippingOptimizer,
115118
enableOverdrawOptimizer: enableOverdrawOptimizer,

‎packages/vector_graphics_compiler/test/cli_test.dart‎

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,38 @@ import 'dart:io';
66

77
import 'package:test/test.dart';
88
import 'package:vector_graphics_compiler/src/isolate_processor.dart';
9+
import '../bin/vector_graphics_compiler.dart' as cli;
910

1011
void main() {
12+
final File output = File('test_data/example.vec');
13+
final File outputDebug = File('test_data/example.vec.debug');
14+
15+
test('currentColor/font-size works', () async {
16+
try {
17+
await cli.main(<String>[
18+
'-i',
19+
'test_data/example.svg',
20+
'-o',
21+
output.path,
22+
'--current-color',
23+
'red',
24+
'--font-size',
25+
'12',
26+
'--dump-debug',
27+
]);
28+
expect(output.existsSync(), true);
29+
expect(outputDebug.existsSync(), true);
30+
} finally {
31+
if (output.existsSync()) {
32+
output.deleteSync();
33+
}
34+
if (outputDebug.existsSync()) {
35+
outputDebug.deleteSync();
36+
}
37+
}
38+
});
39+
1140
test('Can run with isolate processor', () async {
12-
final File output = File('test_data/example.vec');
1341
try {
1442
final IsolateProcessor processor = IsolateProcessor(null, null, 4);
1543
final bool result = await processor.process(
@@ -32,8 +60,6 @@ void main() {
3260
});
3361

3462
test('Can dump debug format with isolate processor', () async {
35-
final File output = File('test_data/example.vec');
36-
final File outputDebug = File('test_data/example.vec.debug');
3763
try {
3864
final IsolateProcessor processor = IsolateProcessor(null, null, 4);
3965
final bool result = await processor.process(
Lines changed: 1 addition & 1 deletion
Loading

0 commit comments

Comments
 (0)