124 GridVisitor &visitor) {
125 const i16 FP_SHIFT = 8;
126 const i16 FP_ONE = 1 << FP_SHIFT;
130 i16 startX_fp =
static_cast<i16
>(start.
x * FP_ONE);
131 i16 startY_fp =
static_cast<i16
>(start.
y * FP_ONE);
132 i16 endX_fp =
static_cast<i16
>(
end.x * FP_ONE);
133 i16 endY_fp =
static_cast<i16
>(
end.y * FP_ONE);
135 i16 x0 = startX_fp >> FP_SHIFT;
136 i16 y0 = startY_fp >> FP_SHIFT;
137 i16 x1 = endX_fp >> FP_SHIFT;
138 i16 y1 = endY_fp >> FP_SHIFT;
140 i16 stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
141 i16 stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
143 i16 deltaX_fp = endX_fp - startX_fp;
144 i16 deltaY_fp = endY_fp - startY_fp;
147 (deltaX_fp != 0) ?
static_cast<u16
>(
148 ABS((i32(FP_ONE) << FP_SHIFT) / deltaX_fp))
151 (deltaY_fp != 0) ?
static_cast<u16
>(
152 ABS((i32(FP_ONE) << FP_SHIFT) / deltaY_fp))
155 i16 nextX_fp = (stepX > 0) ? ((x0 + 1) << FP_SHIFT) : (x0 << FP_SHIFT);
156 i16 nextY_fp = (stepY > 0) ? ((y0 + 1) << FP_SHIFT) : (y0 << FP_SHIFT);
161 ABS(i32(nextX_fp - startX_fp)) * absDeltaX_fp >> FP_SHIFT)
166 ABS(i32(nextY_fp - startY_fp)) * absDeltaY_fp >> FP_SHIFT)
169 const u16 maxT_fp = FP_ONE;
175 visitor.visit(currentX, currentY);
177 u16 t_fp = (tMaxX_fp < tMaxY_fp) ? tMaxX_fp : tMaxY_fp;
181 if (tMaxX_fp < tMaxY_fp) {
182 tMaxX_fp += absDeltaX_fp;
185 tMaxY_fp += absDeltaY_fp;
191 if (currentX != x1 || currentY != y1) {
192 visitor.visit(x1, y1);
204 GridVisitor &visitor) {
205 const i32 FP_SHIFT = 8;
206 const i32 FP_ONE = 1 << FP_SHIFT;
210 i32 startX_fp =
static_cast<i32
>(start.
x * FP_ONE);
211 i32 startY_fp =
static_cast<i32
>(start.
y * FP_ONE);
212 i32 endX_fp =
static_cast<i32
>(
end.x * FP_ONE);
213 i32 endY_fp =
static_cast<i32
>(
end.y * FP_ONE);
215 i32 x0 = startX_fp >> FP_SHIFT;
216 i32 y0 = startY_fp >> FP_SHIFT;
217 i32 x1 = endX_fp >> FP_SHIFT;
218 i32 y1 = endY_fp >> FP_SHIFT;
220 i32 stepX = (x1 > x0) ? 1 : (x1 < x0) ? -1 : 0;
221 i32 stepY = (y1 > y0) ? 1 : (y1 < y0) ? -1 : 0;
223 i32 deltaX_fp = endX_fp - startX_fp;
224 i32 deltaY_fp = endY_fp - startY_fp;
227 (deltaX_fp != 0) ?
static_cast<u32
>(
228 ABS((fl::i64(FP_ONE) << FP_SHIFT) / deltaX_fp))
231 (deltaY_fp != 0) ?
static_cast<u32
>(
232 ABS((fl::i64(FP_ONE) << FP_SHIFT) / deltaY_fp))
235 i32 nextX_fp = (stepX > 0) ? ((x0 + 1) << FP_SHIFT) : (x0 << FP_SHIFT);
236 i32 nextY_fp = (stepY > 0) ? ((y0 + 1) << FP_SHIFT) : (y0 << FP_SHIFT);
241 ABS(fl::i64(nextX_fp - startX_fp)) * absDeltaX_fp >> FP_SHIFT)
246 ABS(fl::i64(nextY_fp - startY_fp)) * absDeltaY_fp >> FP_SHIFT)
249 const u32 maxT_fp = FP_ONE;
255 visitor.visit(currentX, currentY);
257 u32 t_fp = (tMaxX_fp < tMaxY_fp) ? tMaxX_fp : tMaxY_fp;
261 if (tMaxX_fp < tMaxY_fp) {
262 tMaxX_fp += absDeltaX_fp;
265 tMaxY_fp += absDeltaY_fp;
270 if (currentX != x1 || currentY != y1) {
271 visitor.visit(x1, y1);