Advertisement
Clownacy

Sexy VDP renderer macro

Aug 15th, 2020
1,796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.93 KB | None | 0 0
  1. #define DRAW_TILE_A(start, end, index) \
  2. { \
  3.     VDP_ArtTile *plane_entry = &plane_row[(start_x + (index)) & plane_width_mask]; \
  4.     const uint8_t pixel_high_bits = plane_entry->pixel_high; \
  5.  \
  6.     const uint8_t *tile_pixels = &vdp_tile_buffer[plane_entry->tile_index][plane_entry->y_flip ? 8 - raw_y - 1 : raw_y][plane_entry->x_flip ? 8 - (start) - 1 : (start)]; \
  7.  \
  8.     if ((start) == 0 && (end) == 8) /* Hopefully this gets optimised-out by the compiler */ \
  9.     { \
  10.         if (plane_entry->x_flip) \
  11.         { \
  12.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  13.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  14.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  15.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  16.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  17.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  18.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  19.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  20.         } \
  21.         else \
  22.         { \
  23.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  24.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  25.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  26.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  27.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  28.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  29.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  30.             *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  31.         } \
  32.     } \
  33.     else \
  34.     { \
  35.         const unsigned int length = (end) - (start); \
  36.  \
  37.         if (plane_entry->x_flip) \
  38.         { \
  39.             switch (length) \
  40.             { \
  41.                 case 8: \
  42.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  43.                     /* Fallthrough */ \
  44.                 case 7: \
  45.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  46.                     /* Fallthrough */ \
  47.                 case 6: \
  48.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  49.                     /* Fallthrough */ \
  50.                 case 5: \
  51.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  52.                     /* Fallthrough */ \
  53.                 case 4: \
  54.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  55.                     /* Fallthrough */ \
  56.                 case 3: \
  57.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  58.                     /* Fallthrough */ \
  59.                 case 2: \
  60.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  61.                     /* Fallthrough */ \
  62.                 case 1: \
  63.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels--]; ++indexed_framebuffer_pointer; \
  64.                     break; \
  65.             } \
  66.         } \
  67.         else \
  68.         { \
  69.             switch (length) \
  70.             { \
  71.                 case 8: \
  72.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  73.                     /* Fallthrough */ \
  74.                 case 7: \
  75.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  76.                     /* Fallthrough */ \
  77.                 case 6: \
  78.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  79.                     /* Fallthrough */ \
  80.                 case 5: \
  81.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  82.                     /* Fallthrough */ \
  83.                 case 4: \
  84.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  85.                     /* Fallthrough */ \
  86.                 case 3: \
  87.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  88.                     /* Fallthrough */ \
  89.                 case 2: \
  90.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  91.                     /* Fallthrough */ \
  92.                 case 1: \
  93.                     *indexed_framebuffer_pointer = blit_lookup[*indexed_framebuffer_pointer][pixel_high_bits | *tile_pixels++]; ++indexed_framebuffer_pointer; \
  94.                     break; \
  95.             } \
  96.         } \
  97.     } \
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement