⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video.c

📁 psp上的GBA模拟器
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -