summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-15 12:17:55 +0200
committerBad Diode <bd@badd10de.dev>2023-04-15 18:29:26 +0200
commit0175783460d9369a73b01d19d917f324f0c53a98 (patch)
tree6122640d555fd7f87b8ee513331b61bff904befe
parenta6859fa5c780878a92fbfcd1f12a815fcb1961d6 (diff)
downloadgba-link-cable-tester-0175783460d9369a73b01d19d917f324f0c53a98.tar.gz
gba-link-cable-tester-0175783460d9369a73b01d19d917f324f0c53a98.zip
Adapt TONC routine for line drawing
-rw-r--r--src/main.c8
-rw-r--r--src/renderer_m4.c62
2 files changed, 27 insertions, 43 deletions
diff --git a/src/main.c b/src/main.c
index d81a26a..1982992 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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}