projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/draw: Add validation for line drawing
[fw/altos]
/
src
/
draw
/
ao_line.c
diff --git
a/src/draw/ao_line.c
b/src/draw/ao_line.c
index c6b49ee0d6cb1fd71ffe83f3b1369cedeeb15896..832a916c76aed9dbe1042f7a024febe071ae93c6 100644
(file)
--- a/
src/draw/ao_line.c
+++ b/
src/draw/ao_line.c
@@
-54,8
+54,9
@@
* adjust_x = e / e1;
*/
* adjust_x = e / e1;
*/
-
-
+#ifdef VALIDATE
+#include <stdio.h>
+#endif
static void
ao_bres(const struct ao_bitmap *dst_bitmap,
static void
ao_bres(const struct ao_bitmap *dst_bitmap,
@@
-88,9
+89,22
@@
ao_bres(const struct ao_bitmap *dst_bitmap,
while (len--) {
/* clip each point */
while (len--) {
/* clip each point */
+#ifdef VALIDATE
+ if (x1 < 0 || dst_bitmap->width <= x1) {
+ printf("bad line x %d\n", x1);
+ return;
+ }
+ if (y1 < 0 || dst_bitmap->height <= y1) {
+ printf("bad line y %d\n", y1);
+ return;
+ }
+#endif
*dst = ao_do_mask_rrop(*dst, and, xor, mask);
if (axis == X_AXIS) {
*dst = ao_do_mask_rrop(*dst, and, xor, mask);
if (axis == X_AXIS) {
+#ifdef VALIDATE
+ x1 += signdx;
+#endif
if (signdx < 0)
mask = ao_left(mask, 1);
else
if (signdx < 0)
mask = ao_left(mask, 1);
else
@@
-101,13
+115,22
@@
ao_bres(const struct ao_bitmap *dst_bitmap,
}
e += e1;
if (e >= 0) {
}
e += e1;
if (e >= 0) {
+#ifdef VALIDATE
+ y1 += signdy;
+#endif
dst += stride;
e += e3;
}
} else {
dst += stride;
e += e3;
}
} else {
+#ifdef VALIDATE
+ y1 += signdy;
+#endif
dst += stride;
e += e1;
if (e >= 0) {
dst += stride;
e += e1;
if (e >= 0) {
+#ifdef VALIDATE
+ x1 += signdx;
+#endif
if (signdx < 0)
mask = ao_left(mask, 1);
else
if (signdx < 0)
mask = ao_left(mask, 1);
else