📄 video.c
字号:
#define render_scanline_extra_variables_transparent_alpha(bg_type) \ u32 pixel_combine = color_combine_mask(layer); \ render_scanline_skip_alpha(bg_type, transparent) \#define render_scanline_extra_variables_transparent_color() \ u32 pixel_combine = color_combine_mask(layer) \#define render_scanline_extra_variables_base_color16(bg_type) \ render_scanline_extra_variables_base_color() \#define render_scanline_extra_variables_transparent_color16(bg_type) \ render_scanline_extra_variables_transparent_color() \#define render_scanline_extra_variables_base_color32(bg_type) \ render_scanline_extra_variables_base_color() \#define render_scanline_extra_variables_transparent_color32(bg_type) \ render_scanline_extra_variables_transparent_color() \// Map widths and heightsu32 map_widths[] = { 256, 512, 256, 512 };u32 map_heights[] = { 256, 256, 512, 512 };// Build text scanline rendering functions.#define render_scanline_text_builder(combine_op, alpha_op) \void render_scanline_text_##combine_op##_##alpha_op(u32 layer, \ u32 start, u32 end, void *scanline) \{ \ render_scanline_extra_variables_##combine_op##_##alpha_op(text); \ u32 bg_control = io_registers[REG_BG0CNT + layer]; \ u32 map_size = (bg_control >> 14) & 0x03; \ u32 map_width = map_widths[map_size]; \ u32 map_height = map_heights[map_size]; \ u32 horizontal_offset = \ (io_registers[REG_BG0HOFS + (layer * 2)] + start) % 512; \ u32 vertical_offset = (io_registers[REG_VCOUNT] + \ io_registers[REG_BG0VOFS + (layer * 2)]) % 512; \ u32 current_pixel; \ u32 current_pixels; \ u32 partial_tile_run = 0; \ u32 partial_tile_offset; \ u32 tile_run; \ u16 *palette = palette_ram_converted; \ u32 i; \ render_scanline_dest_##alpha_op *dest_ptr = \ ((render_scanline_dest_##alpha_op *)scanline) + start; \ \ u16 *map_base = (u16 *)(vram + ((bg_control >> 8) & 0x1F) * (1024 * 2)); \ u16 *map_ptr, *second_ptr; \ u8 *tile_ptr; \ \ end -= start; \ \ if((map_size & 0x02) && (vertical_offset >= 256)) \ { \ map_base += ((map_width / 8) * 32) + \ (((vertical_offset - 256) / 8) * 32); \ } \ else \ { \ map_base += (((vertical_offset % 256) / 8) * 32); \ } \ \ if(map_size & 0x01) \ { \ if(horizontal_offset >= 256) \ { \ horizontal_offset -= 256; \ map_ptr = map_base + (32 * 32) + (horizontal_offset / 8); \ second_ptr = map_base; \ } \ else \ { \ map_ptr = map_base + (horizontal_offset / 8); \ second_ptr = map_base + (32 * 32); \ } \ } \ else \ { \ horizontal_offset %= 256; \ map_ptr = map_base + (horizontal_offset / 8); \ second_ptr = map_base; \ } \ \ if(bg_control & 0x80) \ { \ tile_render(8bpp, combine_op, alpha_op); \ } \ else \ { \ tile_render(4bpp, combine_op, alpha_op); \ } \} \render_scanline_text_builder(base, normal);render_scanline_text_builder(transparent, normal);render_scanline_text_builder(base, color16);render_scanline_text_builder(transparent, color16);render_scanline_text_builder(base, color32);render_scanline_text_builder(transparent, color32);render_scanline_text_builder(base, alpha);render_scanline_text_builder(transparent, alpha);s32 affine_reference_x[2];s32 affine_reference_y[2];#define affine_render_bg_pixel_normal() \ current_pixel = palette_ram_converted[0] \#define affine_render_bg_pixel_alpha() \ current_pixel = bg_combine \#define affine_render_bg_pixel_color16() \ affine_render_bg_pixel_alpha() \#define affine_render_bg_pixel_color32() \ affine_render_bg_pixel_alpha() \#define affine_render_bg_pixel_base(alpha_op) \ affine_render_bg_pixel_##alpha_op() \#define affine_render_bg_pixel_transparent(alpha_op) \#define affine_render_bg_pixel_copy(alpha_op) \#define affine_render_bg_base(alpha_op) \ dest_ptr[0] = current_pixel#define affine_render_bg_transparent(alpha_op) \#define affine_render_bg_copy(alpha_op) \#define affine_render_bg_remainder_base(alpha_op) \ affine_render_bg_pixel_##alpha_op(); \ for(; i < end; i++) \ { \ affine_render_bg_base(alpha_op); \ advance_dest_ptr_base(1); \ } \#define affine_render_bg_remainder_transparent(alpha_op) \#define affine_render_bg_remainder_copy(alpha_op) \#define affine_render_next(combine_op) \ source_x += dx; \ source_y += dy; \ advance_dest_ptr_##combine_op(1) \#define affine_render_scale_offset() \ tile_base += ((pixel_y % 8) * 8); \ map_base += (pixel_y / 8) << map_pitch \#define affine_render_scale_pixel(combine_op, alpha_op) \ map_offset = (pixel_x / 8); \ if(map_offset != last_map_offset) \ { \ tile_ptr = tile_base + (map_base[map_offset] * 64); \ last_map_offset = map_offset; \ } \ tile_ptr = tile_base + (map_base[(pixel_x / 8)] * 64); \ current_pixel = tile_ptr[(pixel_x % 8)]; \ tile_8bpp_draw_##combine_op(0, none, 0, alpha_op); \ affine_render_next(combine_op) \#define affine_render_scale(combine_op, alpha_op) \{ \ pixel_y = source_y >> 8; \ u32 i = 0; \ affine_render_bg_pixel_##combine_op(alpha_op); \ if((u32)pixel_y < (u32)width_height) \ { \ affine_render_scale_offset(); \ for(; i < end; i++) \ { \ pixel_x = source_x >> 8; \ \ if((u32)pixel_x < (u32)width_height) \ { \ break; \ } \ \ affine_render_bg_##combine_op(alpha_op); \ affine_render_next(combine_op); \ } \ \ for(; i < end; i++) \ { \ pixel_x = source_x >> 8; \ \ if((u32)pixel_x >= (u32)width_height) \ break; \ \ affine_render_scale_pixel(combine_op, alpha_op); \ } \ } \ affine_render_bg_remainder_##combine_op(alpha_op); \} \#define affine_render_scale_wrap(combine_op, alpha_op) \{ \ u32 wrap_mask = width_height - 1; \ pixel_y = (source_y >> 8) & wrap_mask; \ if((u32)pixel_y < (u32)width_height) \ { \ affine_render_scale_offset(); \ for(i = 0; i < end; i++) \ { \ pixel_x = (source_x >> 8) & wrap_mask; \ affine_render_scale_pixel(combine_op, alpha_op); \ } \ } \} \#define affine_render_rotate_pixel(combine_op, alpha_op) \ map_offset = (pixel_x / 8) + ((pixel_y / 8) << map_pitch); \ if(map_offset != last_map_offset) \ { \ tile_ptr = tile_base + (map_base[map_offset] * 64); \ last_map_offset = map_offset; \ } \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -