Skip to content

Commit 804c3c3

Browse files
committed
Revert "Go back to just integers and no multiplication"
This reverts commit 3869a08.
1 parent 3869a08 commit 804c3c3

File tree

1 file changed

+136
-134
lines changed

1 file changed

+136
-134
lines changed

debug-tools/examples/thick-line-mul-256.rs

Lines changed: 136 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -50,41 +50,39 @@ fn thickline(
5050
let seed_is_y_major =
5151
non_mul_perpendicular_delta.y.abs() >= non_mul_perpendicular_delta.x.abs();
5252

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+
}
6565

66-
// line
67-
// };
68-
let mul_line = line;
66+
line
67+
};
6968

70-
let parallel_delta = line.delta();
69+
let parallel_delta = mul_line.delta();
7170

7271
let mul_delta = mul_line.delta();
7372

74-
// let mul_seed = {
75-
// let mut line = seed_line;
73+
let mul_seed = {
74+
let mut line = seed_line;
7675

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+
}
8483

85-
// line
86-
// };
87-
let mul_seed = seed_line;
84+
line
85+
};
8886

8987
let mul_seed_delta = mul_seed.delta();
9088

@@ -97,27 +95,23 @@ fn thickline(
9795
(
9896
MajorMinor::new(non_mul_perpendicular_delta.y, non_mul_perpendicular_delta.x),
9997
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),
107103
)
108104
}
109105
// X-major line (i.e. X delta is longer than Y)
110106
else {
111107
(
112108
MajorMinor::new(non_mul_perpendicular_delta.x, non_mul_perpendicular_delta.y),
113109
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),
121115
)
122116
};
123117

@@ -131,22 +125,20 @@ fn thickline(
131125
let (parallel_delta, parallel_step, parallel_step_full) = if parallel_is_y_major {
132126
(
133127
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),
140133
)
141134
} else {
142135
(
143136
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),
150142
)
151143
};
152144

@@ -165,7 +157,6 @@ fn thickline(
165157
let e_minor = -2 * dx;
166158
let e_major = 2 * dy;
167159
let mut seed_line_error = 2 * dy - dx;
168-
let mut parallel_error = 0;
169160

170161
// Subtract 1 if using AA so 1px wide lines are _only_ drawn with AA - no solid fill
171162
let thickness_threshold =
@@ -184,92 +175,94 @@ fn thickline(
184175

185176
let swap_aa_direction = parallel_step_full.minor.x < 0 || parallel_step_full.minor.y < 0;
186177

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;
189179
let mut seed_point = mul_seed.start;
190180

181+
dbg!(seed_point, seed_step, seed_is_y_major);
182+
191183
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+
);
206196

207197
let background = Rgb888::BLACK;
208198
let c = Rgb888::RED;
209199

210200
Pixel(p, c).draw(display)?;
211201

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)?;
252231

253232
// Move seed line in minor direction
254233
if seed_line_error > 0 {
255234
seed_line_error += e_minor;
256235

257-
seed_point += seed_step.minor;
258236
mul_point += parallel_step_full.major;
237+
seed_point += seed_step.minor;
259238

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+
// )?;
263248

264249
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+
// )?;
266260
}
267261

268262
seed_line_error += e_major;
269263
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;
273266
}
274267

275268
// if extra {
@@ -432,7 +425,6 @@ fn parallel_line_2(
432425
c: Rgb888,
433426
display: &mut impl DrawTarget<Color = Rgb888, Error = std::convert::Infallible>,
434427
extra: bool,
435-
initial_error: i32,
436428
) -> Result<(), std::convert::Infallible> {
437429
let mut point = start;
438430

@@ -443,27 +435,37 @@ fn parallel_line_2(
443435
let e_major = 2 * dy;
444436
let length = dx;
445437
// 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;
448439

449440
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+
);
451453

452454
Pixel(p, c).draw(display)?;
453455

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;
459461

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+
);
464466

465-
// Pixel(p, c).draw(display)?;
466-
// }
467+
Pixel(p, c).draw(display)?;
468+
}
467469

468470
if error > 0 {
469471
point += step.minor;

0 commit comments

Comments
 (0)