void atari_ntsc_blit_double( atari_ntsc_t const* ntsc, atari_ntsc_in_t const* atari_in1, atari_ntsc_in_t const* atari_in2, long in_row_width, int in_width, int in_height, void* rgb_out, long out_pitch ) { #define TO_DOUBLE(pixel1, pixel2) (((pixel1>>1)<<7)+(pixel2>>1)) int const chunk_count = (in_width - 1) / atari_ntsc_in_chunk; while ( in_height-- ) { atari_ntsc_in_t const* line_in1 = atari_in1; atari_ntsc_in_t const* line_in2 = atari_in2; ATARI_NTSC_BEGIN_ROW( ntsc, TO_DOUBLE(atari_ntsc_black, atari_ntsc_black), TO_DOUBLE(line_in1[0], line_in2[0]) ); atari_ntsc_out_t* restrict line_out = (atari_ntsc_out_t*) rgb_out; int n; ++line_in1; ++line_in2; for ( n = chunk_count; n; --n ) { /* order of input and output pixels must not be altered */ ATARI_NTSC_COLOR_IN( 0, ntsc, TO_DOUBLE(line_in1[0], line_in2[0]) ); ATARI_NTSC_RGB_OUT_8888( 0, line_out[0] ); ATARI_NTSC_RGB_OUT_8888( 1, line_out[1] ); ATARI_NTSC_RGB_OUT_8888( 2, line_out[2] ); ATARI_NTSC_RGB_OUT_8888( 3, line_out[3] ); ATARI_NTSC_COLOR_IN( 1, ntsc, TO_DOUBLE(line_in1[1], line_in2[1]) ); ATARI_NTSC_RGB_OUT_8888( 4, line_out[4] ); ATARI_NTSC_RGB_OUT_8888( 5, line_out[5] ); ATARI_NTSC_RGB_OUT_8888( 6, line_out[6] ); line_in1 += 2; line_in2 += 2; line_out += 7; } /* finish final pixels */ ATARI_NTSC_COLOR_IN( 0, ntsc, TO_DOUBLE(atari_ntsc_black, atari_ntsc_black) ); ATARI_NTSC_RGB_OUT_8888( 0, line_out[0] ); ATARI_NTSC_RGB_OUT_8888( 1, line_out[1] ); ATARI_NTSC_RGB_OUT_8888( 2, line_out[2] ); ATARI_NTSC_RGB_OUT_8888( 3, line_out[3] ); ATARI_NTSC_COLOR_IN( 1, ntsc, TO_DOUBLE(atari_ntsc_black, atari_ntsc_black) ); ATARI_NTSC_RGB_OUT_8888( 4, line_out[4] ); ATARI_NTSC_RGB_OUT_8888( 5, line_out[5] ); ATARI_NTSC_RGB_OUT_8888( 6, line_out[6] ); atari_in1 += in_row_width; atari_in2 += in_row_width; rgb_out = (char*) rgb_out + out_pitch; } }
/* Atari change: no alternating burst phases - remove burst_phase parameter. */ void atari_ntsc_blit( atari_ntsc_t const* ntsc, ATARI_NTSC_IN_T const* input, long in_row_width, int in_width, int in_height, void* rgb_out, long out_pitch ) { int chunk_count = (in_width - 1) / atari_ntsc_in_chunk; for ( ; in_height; --in_height ) { ATARI_NTSC_IN_T const* line_in = input; /* Atari change: no alternating burst phases - remove burst_phase parameter; adjust to 4/7 pixel ratio. */ ATARI_NTSC_BEGIN_ROW( ntsc, atari_ntsc_black, atari_ntsc_black, atari_ntsc_black, ATARI_NTSC_ADJ_IN( *line_in ) ); atari_ntsc_out_t* restrict line_out = (atari_ntsc_out_t*) rgb_out; int n; ++line_in; for ( n = chunk_count; n; --n ) { /* order of input and output pixels must not be altered */ ATARI_NTSC_COLOR_IN( 0, ATARI_NTSC_ADJ_IN( line_in [0] ) ); ATARI_NTSC_RGB_OUT( 0, line_out [0], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_RGB_OUT( 1, line_out [1], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_COLOR_IN( 1, ATARI_NTSC_ADJ_IN( line_in [1] ) ); ATARI_NTSC_RGB_OUT( 2, line_out [2], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_RGB_OUT( 3, line_out [3], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_COLOR_IN( 2, ATARI_NTSC_ADJ_IN( line_in [2] ) ); ATARI_NTSC_RGB_OUT( 4, line_out [4], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_RGB_OUT( 5, line_out [5], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_COLOR_IN( 3, ATARI_NTSC_ADJ_IN( line_in [3] ) ); ATARI_NTSC_RGB_OUT( 6, line_out [6], ATARI_NTSC_OUT_DEPTH ); line_in += 4; line_out += 7; } /* finish final pixels */ ATARI_NTSC_COLOR_IN( 0, atari_ntsc_black ); ATARI_NTSC_RGB_OUT( 0, line_out [0], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_RGB_OUT( 1, line_out [1], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_COLOR_IN( 1, atari_ntsc_black ); ATARI_NTSC_RGB_OUT( 2, line_out [2], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_RGB_OUT( 3, line_out [3], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_COLOR_IN( 2, atari_ntsc_black ); ATARI_NTSC_RGB_OUT( 4, line_out [4], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_RGB_OUT( 5, line_out [5], ATARI_NTSC_OUT_DEPTH ); ATARI_NTSC_COLOR_IN( 3, atari_ntsc_black ); ATARI_NTSC_RGB_OUT( 6, line_out [6], ATARI_NTSC_OUT_DEPTH ); input += in_row_width; rgb_out = (char*) rgb_out + out_pitch; } }