ref: 48af8f2a6f60a3598a3186f16008848edf5f66e9
dir: /src/scopes/ft2_scopedraw.c/
#include "../ft2_video.h" #include "../ft2_palette.h" #include "ft2_scopes.h" #include "ft2_scopedraw.h" #include "ft2_scope_macros.h" #include "../ft2_cpu.h" static void scopeLine(int32_t x1, int32_t y1, int32_t y2); /* ----------------------------------------------------------------------- */ /* SCOPE DRAWING ROUTINES */ /* ----------------------------------------------------------------------- */ static void scopeDrawNoLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { SCOPE_REGS_NO_LOOP for (; x < width; x++) { SCOPE_GET_SMP8 SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_NO_LOOP } } static void scopeDrawLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { SCOPE_REGS_LOOP for (; x < width; x++) { SCOPE_GET_SMP8 SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_LOOP } } static void scopeDrawPingPong_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { SCOPE_REGS_PINGPONG for (; x < width; x++) { SCOPE_GET_SMP8 SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS_PINGPONG SCOPE_HANDLE_POS_PINGPONG } } static void scopeDrawNoLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { SCOPE_REGS_NO_LOOP for (; x < width; x++) { SCOPE_GET_SMP16 SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_NO_LOOP } } static void scopeDrawLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { SCOPE_REGS_LOOP for (; x < width; x++) { SCOPE_GET_SMP16 SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_LOOP } } static void scopeDrawPingPong_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { SCOPE_REGS_PINGPONG for (; x < width; x++) { SCOPE_GET_SMP16 SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS_PINGPONG SCOPE_HANDLE_POS_PINGPONG } } /* ----------------------------------------------------------------------- */ /* INTERPOLATED SCOPE DRAWING ROUTINES */ /* ----------------------------------------------------------------------- */ static void linedScopeDrawNoLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { LINED_SCOPE_REGS_NO_LOOP LINED_SCOPE_PREPARE_LERP_SMP8 SCOPE_HANDLE_POS_NO_LOOP for (; x < width; x++) { SCOPE_GET_LERP_SMP8 LINED_SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_NO_LOOP } } static void linedScopeDrawLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { LINED_SCOPE_REGS_LOOP LINED_SCOPE_PREPARE_LERP_SMP8 SCOPE_HANDLE_POS_LOOP for (; x < width; x++) { SCOPE_GET_LERP_SMP8 LINED_SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_LOOP } } static void linedScopeDrawPingPong_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { LINED_SCOPE_REGS_PINGPONG LINED_SCOPE_PREPARE_LERP_SMP8_BIDI SCOPE_HANDLE_POS_PINGPONG for (; x < width; x++) { SCOPE_GET_LERP_SMP8_BIDI LINED_SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS_PINGPONG SCOPE_HANDLE_POS_PINGPONG } } static void linedScopeDrawNoLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { LINED_SCOPE_REGS_NO_LOOP LINED_SCOPE_PREPARE_LERP_SMP16 SCOPE_HANDLE_POS_NO_LOOP for (; x < width; x++) { SCOPE_GET_LERP_SMP16 LINED_SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_NO_LOOP } } static void linedScopeDrawLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { LINED_SCOPE_REGS_LOOP LINED_SCOPE_PREPARE_LERP_SMP16 SCOPE_HANDLE_POS_LOOP for (; x < width; x++) { SCOPE_GET_LERP_SMP16 LINED_SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS SCOPE_HANDLE_POS_LOOP } } static void linedScopeDrawPingPong_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) { LINED_SCOPE_REGS_PINGPONG LINED_SCOPE_PREPARE_LERP_SMP16_BIDI SCOPE_HANDLE_POS_PINGPONG for (; x < width; x++) { SCOPE_GET_LERP_SMP16_BIDI LINED_SCOPE_DRAW_SMP SCOPE_UPDATE_DRAWPOS_PINGPONG SCOPE_HANDLE_POS_PINGPONG } } // ----------------------------------------------------------------------- static void scopeLine(int32_t x1, int32_t y1, int32_t y2) { const int32_t dy = y2 - y1; const int32_t sy = SGN(dy); const uint32_t color = video.palette[PAL_PATTEXT]; const int32_t pitch = sy * SCREEN_W; uint32_t *dst32 = &video.frameBuffer[(y1 * SCREEN_W) + x1]; *dst32 = color; // set first pixel int32_t ay = ABS(dy); if (ay <= 1) { if (ay != 0) dst32 += pitch; *++dst32 = color; return; } int32_t d = 1 - ay; ay <<= 1; while (y1 != y2) { if (d >= 0) { d -= ay; dst32++; } y1 += sy; d += 2; dst32 += pitch; *dst32 = color; } } // ----------------------------------------------------------------------- const scopeDrawRoutine scopeDrawRoutineTable[12] = { (scopeDrawRoutine)scopeDrawNoLoop_8bit, (scopeDrawRoutine)scopeDrawLoop_8bit, (scopeDrawRoutine)scopeDrawPingPong_8bit, (scopeDrawRoutine)scopeDrawNoLoop_16bit, (scopeDrawRoutine)scopeDrawLoop_16bit, (scopeDrawRoutine)scopeDrawPingPong_16bit, (scopeDrawRoutine)linedScopeDrawNoLoop_8bit, (scopeDrawRoutine)linedScopeDrawLoop_8bit, (scopeDrawRoutine)linedScopeDrawPingPong_8bit, (scopeDrawRoutine)linedScopeDrawNoLoop_16bit, (scopeDrawRoutine)linedScopeDrawLoop_16bit, (scopeDrawRoutine)linedScopeDrawPingPong_16bit };