Speedup api_circle, api_tri.
This commit is contained in:
		@@ -92,6 +92,7 @@ typedef struct
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	void (*setpix)(tic_mem* memory, s32 x, s32 y, u8 color);
 | 
						void (*setpix)(tic_mem* memory, s32 x, s32 y, u8 color);
 | 
				
			||||||
	u8 (*getpix)(tic_mem* memory, s32 x, s32 y);
 | 
						u8 (*getpix)(tic_mem* memory, s32 x, s32 y);
 | 
				
			||||||
 | 
						void (*drawhline)(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	u32 synced;
 | 
						u32 synced;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										66
									
								
								src/tic.c
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								src/tic.c
									
									
									
									
									
								
							@@ -40,7 +40,8 @@
 | 
				
			|||||||
#define BASE_NOTE_POS 49
 | 
					#define BASE_NOTE_POS 49
 | 
				
			||||||
#define ENVELOPE_FREQ_SCALE 2
 | 
					#define ENVELOPE_FREQ_SCALE 2
 | 
				
			||||||
#define NOTES_PER_MUNUTE (TIC_FRAMERATE / NOTES_PER_BEET * 60)
 | 
					#define NOTES_PER_MUNUTE (TIC_FRAMERATE / NOTES_PER_BEET * 60)
 | 
				
			||||||
#define min(a,b) (a < b ? a : b)
 | 
					#define min(a,b) ((a) < (b) ? (a) : (b))
 | 
				
			||||||
 | 
					#define max(a,b) ((a) > (b) ? (a) : (b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum
 | 
					typedef enum
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -212,15 +213,39 @@ static u8 getPixel(tic_machine* machine, s32 x, s32 y)
 | 
				
			|||||||
	return machine->state.getpix(&machine->memory, x, y);
 | 
						return machine->state.getpix(&machine->memory, x, y);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drawHLineDma(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						color = color << 4 | color;
 | 
				
			||||||
 | 
						if (xl >= xr) return;
 | 
				
			||||||
 | 
						if (xl & 1) {
 | 
				
			||||||
 | 
							tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xl, color);
 | 
				
			||||||
 | 
							xl++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						s32 count = (xr - xl) >> 1;
 | 
				
			||||||
 | 
						u8 *screen = memory->ram.vram.screen.data + ((y * TIC80_WIDTH + xl) >> 1);
 | 
				
			||||||
 | 
						for(s32 i = 0; i < count; i++) *screen++ = color;
 | 
				
			||||||
 | 
						if (xr & 1) {
 | 
				
			||||||
 | 
							tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xr - 1, color);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drawHLineOvr(tic_mem* tic, s32 x1, s32 x2, s32 y, u8 color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						tic_machine* machine = (tic_machine*)tic;
 | 
				
			||||||
 | 
						u32 final_color = *(machine->state.ovr.palette + color);
 | 
				
			||||||
 | 
						for(s32 x = x1; x < x2; ++x) {
 | 
				
			||||||
 | 
							*getOvrAddr(tic, x, y) = final_color;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawHLine(tic_machine* machine, s32 x, s32 y, s32 width, u8 color)
 | 
					static void drawHLine(tic_machine* machine, s32 x, s32 y, s32 width, u8 color)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if(y < 0 || y >= TIC80_HEIGHT) return;
 | 
						if(y < machine->state.clip.t || machine->state.clip.b <= y) return;
 | 
				
			||||||
 | 
						u8 final_color = mapColor(&machine->memory, color);
 | 
				
			||||||
	s32 xl = x < 0 ? 0 : x;
 | 
						s32 xl = max(x, machine->state.clip.l);
 | 
				
			||||||
	s32 xr = x + width >= TIC80_WIDTH ? TIC80_WIDTH : x + width;
 | 
						s32 xr = min(x + width, machine->state.clip.r);
 | 
				
			||||||
 | 
						machine->state.drawhline(&machine->memory, xl, xr, y, final_color);
 | 
				
			||||||
	for(s32 i = xl; i < xr; ++i)
 | 
					 | 
				
			||||||
		setPixel(machine, i, y, color);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawVLine(tic_machine* machine, s32 x, s32 y, s32 height, u8 color)
 | 
					static void drawVLine(tic_machine* machine, s32 x, s32 y, s32 height, u8 color)
 | 
				
			||||||
@@ -499,6 +524,7 @@ static void api_reset(tic_mem* memory)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	machine->state.setpix = setPixelDma;
 | 
						machine->state.setpix = setPixelDma;
 | 
				
			||||||
	machine->state.getpix = getPixelDma;
 | 
						machine->state.getpix = getPixelDma;
 | 
				
			||||||
 | 
						machine->state.drawhline = drawHLineDma;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	updateSaveid(memory);
 | 
						updateSaveid(memory);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -839,9 +865,14 @@ static void api_circle(tic_mem* memory, s32 xm, s32 ym, u32 radius, u8 color)
 | 
				
			|||||||
		if (r > x || err > y) err += ++x*2+1;
 | 
							if (r > x || err > y) err += ++x*2+1;
 | 
				
			||||||
	} while (x < 0);
 | 
						} while (x < 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(s32 y = 0; y < TIC80_HEIGHT; y++)
 | 
						s32 yt = max(machine->state.clip.t, ym-r);
 | 
				
			||||||
		for(s32 x = SidesBuffer.Left[y]; x <= SidesBuffer.Right[y]; ++x)
 | 
						s32 yb = min(machine->state.clip.b, ym+r+1);
 | 
				
			||||||
			setPixel(machine, x, y, color);
 | 
						u8 final_color = mapColor(&machine->memory, color);
 | 
				
			||||||
 | 
						for(s32 y = yt; y < yb; y++) {
 | 
				
			||||||
 | 
							s32 xl = max(SidesBuffer.Left[y], machine->state.clip.l);
 | 
				
			||||||
 | 
							s32 xr = min(SidesBuffer.Right[y]+1, machine->state.clip.r);
 | 
				
			||||||
 | 
							machine->state.drawhline(&machine->memory, xl, xr, y, final_color);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void api_circle_border(tic_mem* memory, s32 xm, s32 ym, u32 radius, u8 color)
 | 
					static void api_circle_border(tic_mem* memory, s32 xm, s32 ym, u32 radius, u8 color)
 | 
				
			||||||
@@ -891,9 +922,14 @@ static void api_tri(tic_mem* memory, s32 x1, s32 y1, s32 x2, s32 y2, s32 x3, s32
 | 
				
			|||||||
	ticLine(memory, x2, y2, x3, y3, color, triPixelFunc);
 | 
						ticLine(memory, x2, y2, x3, y3, color, triPixelFunc);
 | 
				
			||||||
	ticLine(memory, x3, y3, x1, y1, color, triPixelFunc);
 | 
						ticLine(memory, x3, y3, x1, y1, color, triPixelFunc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for(s32 y = 0; y < TIC80_HEIGHT; y++)
 | 
						u8 final_color = mapColor(&machine->memory, color);
 | 
				
			||||||
		for(s32 x = SidesBuffer.Left[y]; x <= SidesBuffer.Right[y]; ++x)
 | 
						s32 yt = max(0, min(y1, min(y2, y3)));
 | 
				
			||||||
			setPixel(machine, x, y, color);
 | 
						s32 yb = min(TIC80_HEIGHT, max(y1, max(y2, y3)) + 1);
 | 
				
			||||||
 | 
						for(s32 y = yt; y < yb; y++) {
 | 
				
			||||||
 | 
							s32 xl = max(SidesBuffer.Left[y], machine->state.clip.l);
 | 
				
			||||||
 | 
							s32 xr = min(SidesBuffer.Right[y]+1, machine->state.clip.r);
 | 
				
			||||||
 | 
							machine->state.drawhline(&machine->memory, xl, xr, y, final_color);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1237,6 +1273,7 @@ static void api_tick_start(tic_mem* memory, const tic_sfx* sfxsrc, const tic_mus
 | 
				
			|||||||
	machine->state.setpix = setPixelDma;
 | 
						machine->state.setpix = setPixelDma;
 | 
				
			||||||
	machine->state.getpix = getPixelDma;
 | 
						machine->state.getpix = getPixelDma;
 | 
				
			||||||
	machine->state.synced = 0;
 | 
						machine->state.synced = 0;
 | 
				
			||||||
 | 
						machine->state.drawhline = drawHLineDma;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void api_tick_end(tic_mem* memory)
 | 
					static void api_tick_end(tic_mem* memory)
 | 
				
			||||||
@@ -1263,6 +1300,7 @@ static void api_tick_end(tic_mem* memory)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	machine->state.setpix = setPixelOvr;
 | 
						machine->state.setpix = setPixelOvr;
 | 
				
			||||||
	machine->state.getpix = getPixelOvr;
 | 
						machine->state.getpix = getPixelOvr;
 | 
				
			||||||
 | 
						machine->state.drawhline = drawHLineOvr;
 | 
				
			||||||
	memcpy(machine->state.ovr.palette, tic_palette_blit(&memory->cart.palette), sizeof machine->state.ovr.palette);
 | 
						memcpy(machine->state.ovr.palette, tic_palette_blit(&memory->cart.palette), sizeof machine->state.ovr.palette);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user