@@ -50,41 +50,39 @@ fn thickline(
50
50
let seed_is_y_major =
51
51
non_mul_perpendicular_delta. y . abs ( ) >= non_mul_perpendicular_delta. x . abs ( ) ;
52
52
53
- // // Using a block to isolate mutability
54
- // let mul_line = {
55
- // let mut line = line;
56
-
57
- // // Multiply minor direction by 256 so we get AA resolution in lower 8 bits
58
- // if parallel_is_y_major {
59
- // line.start.x *= 256;
60
- // line.end.x *= 256;
61
- // } else {
62
- // line.start.y *= 256;
63
- // line.end.y *= 256;
64
- // }
53
+ // Using a block to isolate mutability
54
+ let mul_line = {
55
+ let mut line = line;
56
+
57
+ // Multiply minor direction by 256 so we get AA resolution in lower 8 bits
58
+ if parallel_is_y_major {
59
+ line. start . x *= 256 ;
60
+ line. end . x *= 256 ;
61
+ } else {
62
+ line. start . y *= 256 ;
63
+ line. end . y *= 256 ;
64
+ }
65
65
66
- // line
67
- // };
68
- let mul_line = line;
66
+ line
67
+ } ;
69
68
70
- let parallel_delta = line . delta ( ) ;
69
+ let parallel_delta = mul_line . delta ( ) ;
71
70
72
71
let mul_delta = mul_line. delta ( ) ;
73
72
74
- // let mul_seed = {
75
- // let mut line = seed_line;
73
+ let mul_seed = {
74
+ let mut line = seed_line;
76
75
77
- // if seed_is_y_major {
78
- // line.start.x *= 256;
79
- // line.end.x *= 256;
80
- // } else {
81
- // line.start.y *= 256;
82
- // line.end.y *= 256;
83
- // }
76
+ if seed_is_y_major {
77
+ line. start . x *= 256 ;
78
+ line. end . x *= 256 ;
79
+ } else {
80
+ line. start . y *= 256 ;
81
+ line. end . y *= 256 ;
82
+ }
84
83
85
- // line
86
- // };
87
- let mul_seed = seed_line;
84
+ line
85
+ } ;
88
86
89
87
let mul_seed_delta = mul_seed. delta ( ) ;
90
88
@@ -97,27 +95,23 @@ fn thickline(
97
95
(
98
96
MajorMinor :: new ( non_mul_perpendicular_delta. y , non_mul_perpendicular_delta. x ) ,
99
97
MajorMinor :: new ( mul_seed_delta. y , mul_seed_delta. x ) ,
100
- // MajorMinor::new(
101
- // seed_step.y_axis(),
102
- // Point::new((mul_seed_delta.x / mul_seed_delta.y).abs(), 0).component_mul(seed_step),
103
- // ),
104
- MajorMinor :: new ( seed_step. y_axis ( ) , seed_step. x_axis ( ) ) ,
105
- // MajorMinor::new(seed_step.y_axis(), seed_step.x_axis() * 256),
106
- MajorMinor :: new ( seed_step. y_axis ( ) , seed_step. x_axis ( ) ) ,
98
+ MajorMinor :: new (
99
+ seed_step. y_axis ( ) ,
100
+ Point :: new ( ( mul_seed_delta. x / mul_seed_delta. y ) . abs ( ) , 0 ) . component_mul ( seed_step) ,
101
+ ) ,
102
+ MajorMinor :: new ( seed_step. y_axis ( ) , seed_step. x_axis ( ) * 256 ) ,
107
103
)
108
104
}
109
105
// X-major line (i.e. X delta is longer than Y)
110
106
else {
111
107
(
112
108
MajorMinor :: new ( non_mul_perpendicular_delta. x , non_mul_perpendicular_delta. y ) ,
113
109
MajorMinor :: new ( mul_seed_delta. x , mul_seed_delta. y ) ,
114
- // MajorMinor::new(
115
- // seed_step.x_axis(),
116
- // Point::new(0, (mul_seed_delta.y / mul_seed_delta.x).abs()).component_mul(seed_step),
117
- // ),
118
- MajorMinor :: new ( seed_step. x_axis ( ) , seed_step. y_axis ( ) ) ,
119
- // MajorMinor::new(seed_step.x_axis(), seed_step.y_axis() * 256),
120
- MajorMinor :: new ( seed_step. x_axis ( ) , seed_step. y_axis ( ) ) ,
110
+ MajorMinor :: new (
111
+ seed_step. x_axis ( ) ,
112
+ Point :: new ( 0 , ( mul_seed_delta. y / mul_seed_delta. x ) . abs ( ) ) . component_mul ( seed_step) ,
113
+ ) ,
114
+ MajorMinor :: new ( seed_step. x_axis ( ) , seed_step. y_axis ( ) * 256 ) ,
121
115
)
122
116
} ;
123
117
@@ -131,22 +125,20 @@ fn thickline(
131
125
let ( parallel_delta, parallel_step, parallel_step_full) = if parallel_is_y_major {
132
126
(
133
127
MajorMinor :: new ( parallel_delta. y . abs ( ) , parallel_delta. x . abs ( ) ) ,
134
- // MajorMinor::new(
135
- // parallel_step.y_axis(),
136
- // Point::new((mul_delta.x / mul_delta.y).abs(), 0).component_mul(parallel_step),
137
- // ),
138
- MajorMinor :: new ( parallel_step. y_axis ( ) , parallel_step. x_axis ( ) ) ,
139
- MajorMinor :: new ( parallel_step. y_axis ( ) , parallel_step. x_axis ( ) ) ,
128
+ MajorMinor :: new (
129
+ parallel_step. y_axis ( ) ,
130
+ Point :: new ( ( mul_delta. x / mul_delta. y ) . abs ( ) , 0 ) . component_mul ( parallel_step) ,
131
+ ) ,
132
+ MajorMinor :: new ( parallel_step. y_axis ( ) , parallel_step. x_axis ( ) * 256 ) ,
140
133
)
141
134
} else {
142
135
(
143
136
MajorMinor :: new ( parallel_delta. x . abs ( ) , parallel_delta. y . abs ( ) ) ,
144
- // MajorMinor::new(
145
- // parallel_step.x_axis(),
146
- // Point::new(0, (mul_delta.y / mul_delta.x).abs()).component_mul(parallel_step),
147
- // ),
148
- MajorMinor :: new ( parallel_step. x_axis ( ) , parallel_step. y_axis ( ) ) ,
149
- MajorMinor :: new ( parallel_step. x_axis ( ) , parallel_step. y_axis ( ) ) ,
137
+ MajorMinor :: new (
138
+ parallel_step. x_axis ( ) ,
139
+ Point :: new ( 0 , ( mul_delta. y / mul_delta. x ) . abs ( ) ) . component_mul ( parallel_step) ,
140
+ ) ,
141
+ MajorMinor :: new ( parallel_step. x_axis ( ) , parallel_step. y_axis ( ) * 256 ) ,
150
142
)
151
143
} ;
152
144
@@ -165,7 +157,6 @@ fn thickline(
165
157
let e_minor = -2 * dx;
166
158
let e_major = 2 * dy;
167
159
let mut seed_line_error = 2 * dy - dx;
168
- let mut parallel_error = 0 ;
169
160
170
161
// Subtract 1 if using AA so 1px wide lines are _only_ drawn with AA - no solid fill
171
162
let thickness_threshold =
@@ -184,92 +175,94 @@ fn thickline(
184
175
185
176
let swap_aa_direction = parallel_step_full. minor . x < 0 || parallel_step_full. minor . y < 0 ;
186
177
187
- // let mut mul_point = mul_line.start;
188
- let mut mul_point = non_mul_line. start ;
178
+ let mut mul_point = mul_line. start ;
189
179
let mut seed_point = mul_seed. start ;
190
180
181
+ dbg ! ( seed_point, seed_step, seed_is_y_major) ;
182
+
191
183
while thickness_accumulator. pow ( 2 ) <= thickness_threshold {
192
- // let p = Point::new(
193
- // if seed_is_y_major {
194
- // seed_point.x >> 8
195
- // } else {
196
- // seed_point.x
197
- // },
198
- // if seed_is_y_major {
199
- // seed_point.y
200
- // } else {
201
- // seed_point.y >> 8
202
- // },
203
- // );
204
-
205
- let p = seed_point;
184
+ let p = Point :: new (
185
+ if seed_is_y_major {
186
+ seed_point. x >> 8
187
+ } else {
188
+ seed_point. x
189
+ } ,
190
+ if seed_is_y_major {
191
+ seed_point. y
192
+ } else {
193
+ seed_point. y >> 8
194
+ } ,
195
+ ) ;
206
196
207
197
let background = Rgb888 :: BLACK ;
208
198
let c = Rgb888 :: RED ;
209
199
210
200
Pixel ( p, c) . draw ( display) ?;
211
201
212
- // let aa_c = {
213
- // let c = Rgb888::GREEN;
214
-
215
- // let mul = (if seed_is_y_major {
216
- // seed_point.x & 255
217
- // } else {
218
- // seed_point.y & 255
219
- // }) as u8;
220
-
221
- // // Some octants need the AA direction to go the other way
222
- // let mul = if swap_aa_direction { 255 - mul } else { mul };
223
-
224
- // Rgb888::new(
225
- // integer_lerp(c.r(), background.r(), mul),
226
- // integer_lerp(c.g(), background.g(), mul),
227
- // integer_lerp(c.b(), background.b(), mul),
228
- // )
229
- // };
230
-
231
- // let aa_p = {
232
- // let p = seed_point - seed_step_full.minor;
233
-
234
- // Point::new(
235
- // if seed_is_y_major { p.x >> 8 } else { p.x },
236
- // if seed_is_y_major { p.y } else { p.y >> 8 },
237
- // )
238
- // };
239
-
240
- // Pixel(aa_p, aa_c).draw(display)?;
241
-
242
- parallel_line_2 (
243
- p,
244
- parallel_is_y_major,
245
- parallel_step,
246
- parallel_delta,
247
- Rgb888 :: CSS_AQUAMARINE ,
248
- display,
249
- true ,
250
- parallel_error,
251
- ) ?;
202
+ let aa_c = {
203
+ let c = Rgb888 :: GREEN ;
204
+
205
+ let mul = ( if seed_is_y_major {
206
+ seed_point. x & 255
207
+ } else {
208
+ seed_point. y & 255
209
+ } ) as u8 ;
210
+
211
+ // Some octants need the AA direction to go the other way
212
+ let mul = if swap_aa_direction { 255 - mul } else { mul } ;
213
+
214
+ Rgb888 :: new (
215
+ integer_lerp ( c. r ( ) , background. r ( ) , mul) ,
216
+ integer_lerp ( c. g ( ) , background. g ( ) , mul) ,
217
+ integer_lerp ( c. b ( ) , background. b ( ) , mul) ,
218
+ )
219
+ } ;
220
+
221
+ let aa_p = {
222
+ let p = seed_point - seed_step_full. minor ;
223
+
224
+ Point :: new (
225
+ if seed_is_y_major { p. x >> 8 } else { p. x } ,
226
+ if seed_is_y_major { p. y } else { p. y >> 8 } ,
227
+ )
228
+ } ;
229
+
230
+ Pixel ( aa_p, aa_c) . draw ( display) ?;
252
231
253
232
// Move seed line in minor direction
254
233
if seed_line_error > 0 {
255
234
seed_line_error += e_minor;
256
235
257
- seed_point += seed_step. minor ;
258
236
mul_point += parallel_step_full. major ;
237
+ seed_point += seed_step. minor ;
259
238
260
- if parallel_error > 0 {
261
- parallel_error += e_minor;
262
- }
239
+ // parallel_line_2(
240
+ // mul_point,
241
+ // parallel_is_y_major,
242
+ // parallel_step,
243
+ // parallel_delta,
244
+ // Rgb888::CSS_AQUAMARINE,
245
+ // display,
246
+ // true,
247
+ // )?;
263
248
264
249
thickness_accumulator += 2 * thickness_dy;
265
- parallel_error += e_major;
250
+ } else {
251
+ // parallel_line_2(
252
+ // mul_point,
253
+ // parallel_is_y_major,
254
+ // parallel_step,
255
+ // parallel_delta,
256
+ // Rgb888::CSS_AQUAMARINE,
257
+ // display,
258
+ // false,
259
+ // )?;
266
260
}
267
261
268
262
seed_line_error += e_major;
269
263
thickness_accumulator += 2 * thickness_dx;
270
- seed_point += seed_step. major * 2 ;
271
- // FIXME: Why is this negative?
272
- mul_point += parallel_step_full. minor * -2 ;
264
+ seed_point += seed_step. major ;
265
+ mul_point += parallel_step_full. minor * -1 ;
273
266
}
274
267
275
268
// if extra {
@@ -432,7 +425,6 @@ fn parallel_line_2(
432
425
c : Rgb888 ,
433
426
display : & mut impl DrawTarget < Color = Rgb888 , Error = std:: convert:: Infallible > ,
434
427
extra : bool ,
435
- initial_error : i32 ,
436
428
) -> Result < ( ) , std:: convert:: Infallible > {
437
429
let mut point = start;
438
430
@@ -443,27 +435,37 @@ fn parallel_line_2(
443
435
let e_major = 2 * dy;
444
436
let length = dx;
445
437
// Setting this to zero causes the first segment before the minor step to be too long
446
- // let mut error = 2 * dy - dx;
447
- let mut error = initial_error;
438
+ let mut error = 2 * dy - dx;
448
439
449
440
for _i in 0 ..length {
450
- let p = point;
441
+ let p = Point :: new (
442
+ if line_is_y_major {
443
+ point. x >> 8
444
+ } else {
445
+ point. x
446
+ } ,
447
+ if line_is_y_major {
448
+ point. y
449
+ } else {
450
+ point. y >> 8
451
+ } ,
452
+ ) ;
451
453
452
454
Pixel ( p, c) . draw ( display) ?;
453
455
454
- // // Draws a pixel connecting a diagonal move into a solid stairstep-looking piece. This is
455
- // // required for the additional diagonal move lines that are drawn when stepping in both the
456
- // // major and minor directions in the seed line.
457
- // if extra {
458
- // let p = point + step.minor;
456
+ // Draws a pixel connecting a diagonal move into a solid stairstep-looking piece. This is
457
+ // required for the additional diagonal move lines that are drawn when stepping in both the
458
+ // major and minor directions in the seed line.
459
+ if extra {
460
+ let p = point + step. minor ;
459
461
460
- // let p = Point::new(
461
- // if line_is_y_major { p.x >> 8 } else { p.x },
462
- // if line_is_y_major { p.y } else { p.y >> 8 },
463
- // );
462
+ let p = Point :: new (
463
+ if line_is_y_major { p. x >> 8 } else { p. x } ,
464
+ if line_is_y_major { p. y } else { p. y >> 8 } ,
465
+ ) ;
464
466
465
- // Pixel(p, c).draw(display)?;
466
- // }
467
+ Pixel ( p, c) . draw ( display) ?;
468
+ }
467
469
468
470
if error > 0 {
469
471
point += step. minor ;
0 commit comments