diff options
author | Bad Diode <bd@badd10de.dev> | 2023-04-15 12:17:55 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-04-15 18:29:26 +0200 |
commit | 0175783460d9369a73b01d19d917f324f0c53a98 (patch) | |
tree | 6122640d555fd7f87b8ee513331b61bff904befe | |
parent | a6859fa5c780878a92fbfcd1f12a815fcb1961d6 (diff) | |
download | gba-renderers-0175783460d9369a73b01d19d917f324f0c53a98.tar.gz gba-renderers-0175783460d9369a73b01d19d917f324f0c53a98.zip |
Adapt TONC routine for line drawing
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/renderer_m4.c | 62 |
2 files changed, 27 insertions, 43 deletions
@@ -135,6 +135,14 @@ int main(void) { | |||
135 | // draw_line(100, 0, 0, 50, 1); | 135 | // draw_line(100, 0, 0, 50, 1); |
136 | // // draw_line(100, 0, 0, 100, 2); | 136 | // // draw_line(100, 0, 0, 100, 2); |
137 | // // draw_line(50, 0, 0, 100, 3); | 137 | // // draw_line(50, 0, 0, 100, 3); |
138 | // draw_line(0, 0, 50, 159, 1); | ||
139 | // draw_line(0, 0, 50, 159, 1); | ||
140 | // draw_line(1, 1, 50, 159, 2); | ||
141 | // draw_line(2, 2, 50, 159, 1); | ||
142 | // draw_line(3, 3, 50, 159, 2); | ||
143 | // draw_line(4, 4, 50, 159, 1); | ||
144 | // draw_line(5, 5, 50, 159, 2); | ||
145 | // draw_line(50, 159, 0, 0, 1); | ||
138 | // txt_render(); | 146 | // txt_render(); |
139 | // txt_clear(); | 147 | // txt_clear(); |
140 | // txt_printf("dx: %d\n", dx); | 148 | // txt_printf("dx: %d\n", dx); |
diff --git a/src/renderer_m4.c b/src/renderer_m4.c index c950763..28fdd1f 100644 --- a/src/renderer_m4.c +++ b/src/renderer_m4.c | |||
@@ -146,67 +146,43 @@ draw_line(size_t x0, size_t y0, size_t x1, size_t y1, u8 clr) { | |||
146 | MAYBE_SWAP(y0, y1); | 146 | MAYBE_SWAP(y0, y1); |
147 | draw_vline(x0, y0, y1, clr); | 147 | draw_vline(x0, y0, y1, clr); |
148 | } else { | 148 | } else { |
149 | #if 1 | ||
150 | // Diagonal line. | 149 | // Diagonal line. |
151 | if (x0 > x1) { | 150 | int dx = x0 > x1 ? x0 - x1 : x1 - x0; |
152 | SWAP(x0, x1); | 151 | int dy = y0 > y1 ? y0 - y1 : y1 - y0; |
153 | SWAP(y0, y1); | 152 | int x_step = x0 > x1 ? -1 : 1; |
154 | } | 153 | int y_step = y0 > y1 ? -SCREEN_WIDTH : SCREEN_WIDTH; |
155 | int dx = x1 - x0; | 154 | |
156 | int dy = y0 > y1 ? y0 - y1 : y1 - y0; | 155 | u32 addr = (u32)((u32)backbuf + (y0 * SCREEN_WIDTH + x0)); |
157 | int x_step = 1; | 156 | u16 *dst = NULL; |
158 | int y_step = y0 > y1 ? -1 : 1; | 157 | u32 mask = x0 & 1 ? ~0xFF : 0xFF; |
159 | y_step *= SCREEN_WIDTH / 2; | 158 | u32 color = (clr & 0xFF) | ((clr & 0xFF) << 8); |
160 | |||
161 | // Mini-LUT for M4 byte decoding. | ||
162 | u16 mask[] = { ~0xFF, 0xFF }; | ||
163 | u16 color[] = { clr, (clr << 8) }; | ||
164 | u8 advance[] = { 0, x_step }; | ||
165 | u16 *dst = &backbuf[(x0 + y0 * SCREEN_WIDTH) / 2]; | ||
166 | if (dx >= dy) { | 159 | if (dx >= dy) { |
167 | int diff = 2 * dy - dx; | 160 | int diff = 2 * dy - dx; |
168 | for (int i = dx; i >= 0; i--) { | 161 | for (int i = dx; i >= 0; i--) { |
169 | *dst = (*dst & mask[x0 & 1]) | color[x0 & 1]; | 162 | dst = (u16 *)(addr - (mask >> 31)); |
163 | *dst = (*dst & ~mask) | (color & mask); | ||
170 | if (diff >= 0) { | 164 | if (diff >= 0) { |
171 | diff -= 2 * dx; | 165 | diff -= 2 * dx; |
172 | dst = dst + y_step; | 166 | addr += y_step; |
173 | } | 167 | } |
174 | diff += 2 * dy; | 168 | diff += 2 * dy; |
175 | dst = dst + advance[x0 & 1]; | 169 | addr += x_step; |
176 | x0 += x_step; | 170 | mask = ~mask; |
177 | } | 171 | } |
178 | } else { | 172 | } else { |
179 | int diff = 2 * dx - dy; | 173 | int diff = 2 * dx - dy; |
180 | for (int i = dy; i >= 0; i--) { | 174 | for (int i = dy; i >= 0; i--) { |
181 | *dst = (*dst & mask[x0 & 1]) | color[x0 & 1]; | 175 | dst = (u16 *)(addr - (mask >> 31)); |
176 | *dst = (*dst & ~mask) | (color & mask); | ||
182 | if (diff >= 0) { | 177 | if (diff >= 0) { |
183 | diff -= 2 * dy; | 178 | diff -= 2 * dy; |
184 | dst = dst + advance[x0 & 1]; | 179 | addr += x_step; |
185 | x0 += x_step; | 180 | mask = ~mask; |
186 | } | 181 | } |
187 | diff += 2 * dx; | 182 | diff += 2 * dx; |
188 | dst = dst + y_step; | 183 | addr += y_step; |
189 | } | ||
190 | } | ||
191 | #else | ||
192 | int dx = x0 > x1 ? x0 - x1 : x1 - x0; | ||
193 | int dy = y0 > y1 ? y1 - y0 : y0 - y1; | ||
194 | int x_step = x0 < x1 ? 1 : -1; | ||
195 | int y_step = y0 < y1 ? 1 : -1; | ||
196 | int err = dx + dy; | ||
197 | while (!(x0 == x1 && y0 == y1)) { | ||
198 | draw_pixel(x0, y0, clr); | ||
199 | int diff = 2 * err; | ||
200 | if (diff >= dy) { | ||
201 | err += dy; | ||
202 | x0 += x_step; | ||
203 | } | ||
204 | if (diff <= dx) { | ||
205 | err += dx; | ||
206 | y0 += y_step; | ||
207 | } | 184 | } |
208 | } | 185 | } |
209 | #endif | ||
210 | } | 186 | } |
211 | screen_updated = true; | 187 | screen_updated = true; |
212 | } | 188 | } |