Line data Source code
1 : import 'package:mrx_icon_font_gen/parser/path/model/arguments/coordinate_pair.dart';
2 : import 'package:mrx_icon_font_gen/parser/path/model/arguments/coordinate_pair_sequence.dart';
3 : import 'package:mrx_icon_font_gen/parser/path/model/arguments/coordinate_sequence.dart';
4 : import 'package:mrx_icon_font_gen/parser/path/model/command.dart';
5 : import 'package:mrx_icon_font_gen/parser/path/model/commands/line_to_command.dart';
6 : import 'package:vector_math/vector_math_64.dart';
7 :
8 : class HorizontalLineToCommand extends Command {
9 2 : @override
10 : String get absoluteCommandName => 'H';
11 :
12 2 : @override
13 : String get relativeCommandName => 'h';
14 :
15 2 : HorizontalLineToCommand({
16 : String? command,
17 : bool? isRelative,
18 : required CoordinateSequence commandArguments,
19 2 : }) : super(
20 : command: command,
21 : isRelative: isRelative,
22 : commandArguments: commandArguments,
23 : );
24 :
25 1 : @override
26 : List<Command> applyTransformation(
27 : Matrix3 transform,
28 : CoordinatePair startPoint,
29 : ) {
30 1 : return isAbsolute
31 1 : ? _absoluteLineTo(transform, startPoint)
32 1 : : _relativeLineTo(transform, startPoint);
33 : }
34 :
35 1 : List<Command> _relativeLineTo(Matrix3 transform, CoordinatePair startPoint) {
36 1 : final Matrix3 transformationMatrix = transform.clone()
37 2 : ..setColumn(2, Vector3(0.0, 0.0, 1.0));
38 : final CoordinatePairSequence transformedCommandArguments =
39 1 : CoordinatePairSequence(
40 : coordinatePairs:
41 4 : (commandArguments as CoordinateSequence).coordinates.map((c) {
42 : final Vector3 transformed =
43 2 : transformationMatrix.transform(Vector3(c, 0.0, 1.0));
44 1 : return CoordinatePair(
45 1 : x: transformed.x,
46 1 : y: transformed.y,
47 : );
48 1 : }).toList(),
49 : );
50 1 : return [
51 1 : LineToCommand(
52 : isRelative: true,
53 : commandArguments: transformedCommandArguments,
54 : ),
55 : ];
56 : }
57 :
58 1 : List<Command> _absoluteLineTo(Matrix3 transform, CoordinatePair startPoint) {
59 : final CoordinatePairSequence transformedCommandArguments =
60 1 : CoordinatePairSequence(
61 : coordinatePairs:
62 4 : (commandArguments as CoordinateSequence).coordinates.map((c) {
63 : final Vector3 transformed =
64 3 : transform.transform(Vector3(c, startPoint.y, 1.0));
65 1 : return CoordinatePair(
66 1 : x: transformed.x,
67 1 : y: transformed.y,
68 : );
69 1 : }).toList(),
70 : );
71 1 : return [
72 1 : LineToCommand(
73 : isRelative: false,
74 : commandArguments: transformedCommandArguments,
75 : ),
76 : ];
77 : }
78 :
79 1 : @override
80 : CoordinatePair getLastPoint(CoordinatePair startPoint) {
81 1 : if (isAbsolute) {
82 : final double x =
83 3 : (commandArguments as CoordinateSequence).coordinates.last;
84 1 : return CoordinatePair(
85 : x: x,
86 1 : y: startPoint.y,
87 : );
88 : }
89 1 : double x = startPoint.x;
90 : for (final double dx
91 3 : in (commandArguments as CoordinateSequence).coordinates) {
92 1 : x += dx;
93 : }
94 1 : return CoordinatePair(
95 : x: x,
96 1 : y: startPoint.y,
97 : );
98 : }
99 :
100 2 : @override
101 : bool operator ==(Object other) {
102 2 : if (other is! HorizontalLineToCommand) {
103 : return false;
104 : }
105 6 : return command == other.command &&
106 4 : commandArguments as CoordinateSequence ==
107 2 : other.commandArguments as CoordinateSequence;
108 : }
109 :
110 1 : @override
111 3 : int get hashCode => Object.hash(command, commandArguments);
112 : }
|