29#ifndef RETROFLAT_VIEWPORT_TRACE_LVL
30# define RETROFLAT_VIEWPORT_TRACE_LVL 0
38#define RETROFLAT_VIEWPORT_FLAG_FULLSCREEN 0x01
126 int16_t world_tile_x;
127 int16_t world_tile_y;
128 int16_t world_tile_w;
129 int16_t world_tile_h;
130#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
131 MAUG_MHANDLE refresh_grid_h;
145# define retroflat_viewport_world_x_generic() \
146 (g_retroflat_state->viewport.world_x)
148# define retroflat_viewport_world_y_generic() \
149 (g_retroflat_state->viewport.world_y)
151# define retroflat_viewport_world_tile_x_generic() \
152 (g_retroflat_state->viewport.world_tile_x)
154# define retroflat_viewport_world_tile_y_generic() \
155 (g_retroflat_state->viewport.world_tile_y)
157# define retroflat_viewport_world_tile_w_generic() \
158 (g_retroflat_state->viewport.world_tile_w)
160# define retroflat_viewport_world_tile_h_generic() \
161 (g_retroflat_state->viewport.world_tile_h)
163# define retroflat_viewport_world_w_generic() \
164 (g_retroflat_state->viewport.world_w)
166# define retroflat_viewport_world_h_generic() \
167 (g_retroflat_state->viewport.world_h)
169# define retroflat_viewport_screen_tile_w_generic() \
170 (g_retroflat_state->viewport.screen_tile_w)
172# define retroflat_viewport_screen_tile_h_generic() \
173 (g_retroflat_state->viewport.screen_tile_h)
175# define retroflat_viewport_screen_w_generic() \
176 (g_retroflat_state->viewport.screen_w)
178# define retroflat_viewport_screen_h_generic() \
179 (g_retroflat_state->viewport.screen_h)
181# define retroflat_viewport_screen_w_remainder_generic() \
182 (g_retroflat_state->viewport.screen_w_remainder)
184# define retroflat_viewport_screen_h_remainder_generic() \
185 (g_retroflat_state->viewport.screen_h_remainder)
187# define retroflat_viewport_set_world_generic( w, h ) \
188 debug_printf( 1, "setting viewport world size to %d x %d...", \
189 (int16_t)(w), (int16_t)(h) ); \
190 (g_retroflat_state->viewport.world_w) = (w); \
191 (g_retroflat_state->viewport.world_h) = (h); \
192 (g_retroflat_state->viewport.world_tile_w) = (w) / RETROFLAT_TILE_W; \
193 (g_retroflat_state->viewport.world_tile_h) = (h) / RETROFLAT_TILE_H;
195# define retroflat_viewport_screen_x_generic( world_x ) \
196 (g_retroflat_state->viewport.screen_x + \
197 ((world_x) - retroflat_viewport_world_x()))
199# define retroflat_viewport_screen_y_generic( world_y ) \
200 (g_retroflat_state->viewport.screen_y + \
201 ((world_y) - retroflat_viewport_world_y()))
203# define retroflat_viewport_screen_get_x_generic() \
204 (g_retroflat_state->viewport.screen_x)
206# define retroflat_viewport_screen_get_y_generic() \
207 (g_retroflat_state->viewport.screen_y)
209#define retroflat_viewport_grid_tile( x_tile, y_tile ) \
210 (g_retroflat_state->viewport.refresh_grid[ \
211 ((y_tile) * (g_retroflat_state->viewport.screen_tile_w + 2)) + \
214void retroflat_viewport_set_world_pos_generic(
228# ifndef RETROFLAT_NO_VIEWPORT_REFRESH
229uint8_t retroflat_viewport_tile_is_stale(
260 struct RETROFLAT_BITMAP* bitmap,
287#ifdef RETROFLAT_VIEWPORT_TRACE_CONSTRAIN
289# define retroflat_viewport_constrain_px( x, y, bmp, retact ) \
291 x >= retroflat_bitmap_w( bmp ) || y >= retroflat_bitmap_h( bmp ) || \
294 error_printf( "attempted draw at %d, %d, out of bounds %d x %d", \
295 x, y, retroflat_bitmap_w( bmp ), retroflat_bitmap_h( bmp ) ); \
312# define retroflat_viewport_constrain_px( x, y, bmp, retact ) \
314 x >= retroflat_bitmap_w( bmp ) || y >= retroflat_bitmap_h( bmp ) || \
322#if defined( RETROFLAT_SOFT_VIEWPORT ) || defined( DOCUMENTATION )
324# define retroflat_viewport_world_tile_x() \
325 retroflat_viewport_world_tile_x_generic()
327# define retroflat_viewport_world_tile_y() \
328 retroflat_viewport_world_tile_y_generic()
330# define retroflat_viewport_world_tile_w() \
331 retroflat_viewport_world_tile_w_generic()
333# define retroflat_viewport_world_tile_h() \
334 retroflat_viewport_world_tile_h_generic()
339# define retroflat_viewport_world_x() retroflat_viewport_world_x_generic()
345# define retroflat_viewport_world_y() retroflat_viewport_world_y_generic()
351# define retroflat_viewport_world_w() \
352 retroflat_viewport_world_w_generic()
358# define retroflat_viewport_world_h() \
359 retroflat_viewport_world_h_generic()
365# define retroflat_viewport_screen_tile_w() \
366 retroflat_viewport_screen_tile_w_generic()
372# define retroflat_viewport_screen_tile_h() \
373 retroflat_viewport_screen_tile_h_generic()
379# define retroflat_viewport_screen_w() \
380 retroflat_viewport_screen_w_generic()
386# define retroflat_viewport_screen_h() \
387 retroflat_viewport_screen_h_generic()
394# define retroflat_viewport_screen_w_remainder() \
395 retroflat_viewport_screen_w_remainder_generic()
402# define retroflat_viewport_screen_h_remainder() \
403 retroflat_viewport_screen_h_remainder_generic()
412# define retroflat_viewport_set_world( w, h ) \
413 retroflat_viewport_set_world_generic( w, h )
419# define retroflat_viewport_set_world_pos( x, y ) \
420 retroflat_viewport_set_world_pos_generic( x, y )
427# define retroflat_viewport_set_pos_size( x_px, y_px, w_px, h_px ) \
428 retroflat_viewport_set_pos_size_generic( x_px, y_px, w_px, h_px )
435# define retroflat_viewport_screen_x( world_x ) \
436 retroflat_viewport_screen_x_generic( world_x )
443# define retroflat_viewport_screen_y( world_y ) \
444 retroflat_viewport_screen_y_generic( world_y )
450# define retroflat_viewport_screen_get_x() \
451 retroflat_viewport_screen_get_x_generic()
457# define retroflat_viewport_screen_get_y() \
458 retroflat_viewport_screen_get_y_generic()
468# define retroflat_viewport_move_x( x ) \
469 retroflat_viewport_move_x_generic( x )
479# define retroflat_viewport_move_y( y ) \
480 retroflat_viewport_move_y_generic( y )
482# define retroflat_viewport_hw_border_x() (0)
484# define retroflat_viewport_hw_border_y() (0)
488#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
497# define retroflat_viewport_lock_refresh() \
498 if( NULL == g_retroflat_state->viewport.refresh_grid ) { \
500 g_retroflat_state->viewport.refresh_grid_h, \
501 g_retroflat_state->viewport.refresh_grid ); \
502 maug_cleanup_if_null_lock( retroflat_tile_t*, \
503 g_retroflat_state->viewport.refresh_grid ); \
513# define retroflat_viewport_unlock_refresh() \
514 if( NULL != g_retroflat_state->viewport.refresh_grid ) { \
516 g_retroflat_state->viewport.refresh_grid_h, \
517 g_retroflat_state->viewport.refresh_grid ); \
531# define retroflat_viewport_set_refresh( x, y, tid ) \
532 retroflat_viewport_set_refresh_generic( x, y, tid )
540#elif defined( RETROVIW_C )
542void retroflat_viewport_set_world_pos_generic(
545 int x_tile = (x >> RETROFLAT_TILE_W_BITS);
546 int y_tile = (y >> RETROFLAT_TILE_H_BITS);
547#if RETROFLAT_VIEWPORT_TRACE_LVL > 0
549 RETROFLAT_VIEWPORT_TRACE_LVL,
550 "setting viewport world pos to %d, %d (tile %d, %d)...",
551 x, y, x_tile, y_tile );
553 g_retroflat_state->viewport.world_x = x;
554 g_retroflat_state->viewport.world_y = y;
555 g_retroflat_state->viewport.world_tile_x = x_tile;
556 g_retroflat_state->viewport.world_tile_y = y_tile;
561#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
570 x_tile = x_px / RETROFLAT_TILE_W;
571 y_tile = y_px / RETROFLAT_TILE_H;
574 RETROFLAT_STATE_FLAG_HWSCROLLING ==
575 (RETROFLAT_STATE_FLAG_HWSCROLLING & g_retroflat_state->retroflat_flags) &&
576 RETROFLAT_VIEWPORT_FLAG_FULLSCREEN ==
577 (RETROFLAT_VIEWPORT_FLAG_FULLSCREEN & g_retroflat_state->viewport.flags)
585#if RETROFLAT_VIEWPORT_GRID_TRACE_LVL > 0
586 debug_printf( RETROFLAT_VIEWPORT_GRID_TRACE_LVL,
587 "setting x_tile: %d, y_tile: %d (%d, %d) to: %d",
588 x_tile, y_tile, x_px, y_px, tid );
591 assert( NULL != g_retroflat_state->viewport.refresh_grid );
594 0 > x_tile || 0 > y_tile ||
595 g_retroflat_state->viewport.screen_tile_w + 2 <= x_tile ||
596 g_retroflat_state->viewport.screen_tile_h + 2 <= y_tile
598#if RETROFLAT_VIEWPORT_TRACE_LVL > 0
599 error_printf(
"invalid viewport refresh coord: %d, %d", x_tile, y_tile );
600 debug_printf( RETROFLAT_VIEWPORT_TRACE_LVL,
601 "viewport is %dx%d tiles!",
602 g_retroflat_state->viewport.screen_tile_w + 2,
603 g_retroflat_state->viewport.screen_tile_h + 2 );
608 retroflat_viewport_grid_tile( x_tile, y_tile ) = tid;
623 g_retroflat_state->viewport.world_w >= new_world_x +
624 g_retroflat_state->viewport.screen_w
626 g_retroflat_state->viewport.world_x += x;
627 g_retroflat_state->viewport.world_tile_x =
628 g_retroflat_state->viewport.world_x >> RETROFLAT_TILE_W_BITS;
643 g_retroflat_state->viewport.world_h >= new_world_y +
644 g_retroflat_state->viewport.screen_h
646 g_retroflat_state->viewport.world_y += y;
647 g_retroflat_state->viewport.world_tile_y =
648 g_retroflat_state->viewport.world_y >> RETROFLAT_TILE_H_BITS;
657uint8_t retroflat_viewport_focus(
666 new_pt = x1 - retroflat_viewport_world_x();
667 if( new_pt > (retroflat_screen_w() >> 1) + range ) {
668 new_moved = retroflat_viewport_move_x(
669 gc_retroflat_offsets8_x[RETROFLAT_DIR8_EAST] * speed );
670 if( !moved && new_moved ) {
673 }
else if( new_pt < (retroflat_screen_w() >> 1) - range ) {
674 new_moved = retroflat_viewport_move_x(
675 gc_retroflat_offsets8_x[RETROFLAT_DIR8_WEST] * speed );
676 if( !moved && new_moved ) {
682 new_pt = y1 - retroflat_viewport_world_y();
683 if( new_pt > (retroflat_screen_h() >> 1) + range ) {
684 new_moved = retroflat_viewport_move_y(
685 gc_retroflat_offsets8_y[RETROFLAT_DIR8_SOUTH] * speed );
686 if( !moved && new_moved ) {
689 }
else if( new_pt < (retroflat_screen_h() >> 1) - range ) {
690 new_moved = retroflat_viewport_move_y(
691 gc_retroflat_offsets8_y[RETROFLAT_DIR8_NORTH] * speed );
692 if( !moved && new_moved ) {
707 int x_tile = 0, y_tile = 0;
709 if( w_px == retroflat_screen_w() && h_px == retroflat_screen_h() ) {
710 debug_printf( 1,
"fullscreen viewport; hardware scrolling enabled!" );
711 g_retroflat_state->viewport.flags |= RETROFLAT_VIEWPORT_FLAG_FULLSCREEN;
713 g_retroflat_state->viewport.flags &= ~RETROFLAT_VIEWPORT_FLAG_FULLSCREEN;
720 RETROFLAT_STATE_FLAG_HWSCROLLING ==
721 (RETROFLAT_STATE_FLAG_HWSCROLLING & g_retroflat_state->retroflat_flags) &&
722 RETROFLAT_VIEWPORT_FLAG_FULLSCREEN ==
723 (RETROFLAT_VIEWPORT_FLAG_FULLSCREEN & g_retroflat_state->viewport.flags)
728 g_retroflat_state->viewport.screen_w = w_px;
729 g_retroflat_state->viewport.screen_h = h_px;
730 g_retroflat_state->viewport.screen_w_remainder = 0;
731 g_retroflat_state->viewport.screen_h_remainder = 0;
735 g_retroflat_state->viewport.screen_w =
736 ((w_px) / RETROFLAT_TILE_W) * RETROFLAT_TILE_W;
737 g_retroflat_state->viewport.screen_h =
738 ((h_px) / RETROFLAT_TILE_H) * RETROFLAT_TILE_H;
739 g_retroflat_state->viewport.screen_w_remainder =
740 (x_px) + (w_px) - g_retroflat_state->viewport.screen_w;
741 g_retroflat_state->viewport.screen_h_remainder =
742 (y_px) + (h_px) - g_retroflat_state->viewport.screen_h;
745 g_retroflat_state->viewport.screen_x = x_px;
746 g_retroflat_state->viewport.screen_y = y_px;
747 g_retroflat_state->viewport.screen_tile_w = w_px / RETROFLAT_TILE_W;
748 g_retroflat_state->viewport.screen_tile_h = h_px / RETROFLAT_TILE_H;
751 if( 0 != w_px % RETROFLAT_TILE_W ) {
752 g_retroflat_state->viewport.screen_tile_w++;
755 if( 0 != h_px % RETROFLAT_TILE_H ) {
756 g_retroflat_state->viewport.screen_tile_h++;
760 "setting viewport screen size to %d x %d (%d x %d tiles)...",
761 g_retroflat_state->viewport.screen_w,
762 g_retroflat_state->viewport.screen_h,
763 g_retroflat_state->viewport.screen_tile_w,
764 g_retroflat_state->viewport.screen_tile_h );
766#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
767 if( (MAUG_MHANDLE)NULL != g_retroflat_state->viewport.refresh_grid_h ) {
768 maug_mfree( g_retroflat_state->viewport.refresh_grid_h );
770 debug_printf( 1,
"allocating refresh grid (%d tiles, %d+2x%d+2...)",
771 (g_retroflat_state->viewport.screen_tile_w + 2) *
772 (g_retroflat_state->viewport.screen_tile_h + 2),
773 g_retroflat_state->viewport.screen_tile_w,
774 g_retroflat_state->viewport.screen_tile_h );
776 g_retroflat_state->viewport.refresh_grid_h,
777 (g_retroflat_state->viewport.screen_tile_w + 2) *
778 (g_retroflat_state->viewport.screen_tile_h + 2),
781 retroflat_viewport_lock_refresh();
783 y_tile = 0 ; retroflat_viewport_screen_tile_h() + 2 > y_tile ; y_tile++
786 x_tile = 0 ; retroflat_viewport_screen_tile_w() + 2 > x_tile ; x_tile++
788 retroflat_viewport_grid_tile( x_tile, y_tile ) = -1;
791 retroflat_viewport_unlock_refresh();
801#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
803uint8_t retroflat_viewport_tile_is_stale(
806 int row_tiles = g_retroflat_state->viewport.screen_tile_w + 2;
809 RETROFLAT_STATE_FLAG_HWSCROLLING ==
810 (RETROFLAT_STATE_FLAG_HWSCROLLING & g_retroflat_state->retroflat_flags) &&
811 RETROFLAT_VIEWPORT_FLAG_FULLSCREEN ==
812 (RETROFLAT_VIEWPORT_FLAG_FULLSCREEN & g_retroflat_state->viewport.flags)
819#if RETROFLAT_VIEWPORT_GRID_TRACE_LVL > 0
820 debug_printf( RETROFLAT_VIEWPORT_GRID_TRACE_LVL,
821 "stale check x_tile: %d, y_tile: %d, idx: %d (%dx%d, %d total): %d vs %d",
823 (y_tile * row_tiles) + x_tile,
824 g_retroflat_state->viewport.screen_tile_w + 2,
825 g_retroflat_state->viewport.screen_tile_h + 2,
826 (g_retroflat_state->viewport.screen_tile_w + 2) *
827 (g_retroflat_state->viewport.screen_tile_h + 2),
828 tile_id, retroflat_viewport_grid_tile( x_tile, y_tile ) );
831 return tile_id != retroflat_viewport_grid_tile( x_tile, y_tile );
839 struct RETROFLAT_BITMAP* bitmap,
854 retroflat_screen_buffer() == bitmap &&
858 RETROFLAT_VIEWPORT_FLAG_FULLSCREEN !=
859 (RETROFLAT_VIEWPORT_FLAG_FULLSCREEN &
860 g_retroflat_state->viewport.flags)
862 viewport_left = retroflat_viewport_screen_get_x();
863 viewport_top = retroflat_viewport_screen_get_y();
865 (retroflat_viewport_screen_get_y() + retroflat_viewport_screen_h());
867 (retroflat_viewport_screen_get_x() + retroflat_viewport_screen_w());
871 viewport_bottom = retroflat_bitmap_h( bitmap );
872 viewport_right = retroflat_bitmap_w( bitmap );
875 if( viewport_bottom < *d_y || trim_bottom < viewport_top ) {
876#ifdef RETROFLAT_TRACE_CONSTRAIN
877 error_printf(
"attempted to blit bitmap way out of bounds at %d, %d!",
882 }
else if( viewport_bottom <= trim_bottom ) {
883#ifdef RETROFLAT_TRACE_CONSTRAIN
885 "trimming " SIZE_T_FMT
" pixels to get " SIZE_T_FMT
" under "
887 trim_bottom - viewport_bottom, trim_bottom, viewport_bottom );
889 *h -= (trim_bottom - viewport_bottom);
891 }
else if( viewport_top > *d_y ) {
892#ifdef RETROFLAT_TRACE_CONSTRAIN
894 "trimming " SIZE_T_FMT
" pixels to get " SIZE_T_FMT
" under "
896 trim_bottom - viewport_bottom, trim_bottom, viewport_bottom );
898 *h -= (viewport_top - *d_y);
900 *s_y += (viewport_top - *d_y);
902 *d_y += (viewport_top - *d_y);
903 assert( viewport_top == *d_y );
906 if( viewport_right < *d_x || trim_right < viewport_left ) {
907#ifdef RETROFLAT_TRACE_CONSTRAIN
908 error_printf(
"attempted to blit bitmap way out of bounds at %d, %d!",
913 }
else if( viewport_right <= trim_right ) {
914#ifdef RETROFLAT_TRACE_CONSTRAIN
916 "trimming " SIZE_T_FMT
" pixels to get " SIZE_T_FMT
" under "
918 trim_right - viewport_right, trim_right, viewport_right );
920 *w -= (trim_right - viewport_right);
922 }
else if( viewport_left > *d_x ) {
923#ifdef RETROFLAT_TRACE_CONSTRAIN
925 "trimming " SIZE_T_FMT
" pixels to get " SIZE_T_FMT
" under "
927 trim_bottom - viewport_bottom, trim_bottom, viewport_bottom );
929 *w -= (viewport_left - *d_x);
931 *s_x += (viewport_left - *d_x);
933 *d_x += (viewport_left - *d_x);
934 assert( viewport_left == *d_x );
937 if( 0 == w && 0 == h ) {
946#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
952#if RETROTILE_TRACE_LVL > 0
954 "clearing " SIZE_T_FMT
" vertical viewport pixels (" SIZE_T_FMT
956 y_max, y_max / RETROFLAT_TILE_H );
959 retroflat_viewport_lock_refresh();
960 for( y = 0 ; y_max > y ; y += RETROFLAT_TILE_H ) {
962 x = 0 ; retroflat_viewport_screen_tile_w() > x ; x += RETROFLAT_TILE_W
964 retroflat_viewport_grid_tile( x, y ) = -1;
970 retroflat_viewport_unlock_refresh();
984 error_printf(
"null shift requested!" );
990 retroflat_viewport_lock_refresh();
993 (g_retroflat_state->viewport.screen_tile_h + 2) > y_tile;
1007 retroflat_viewport_grid_tile( 0, y_tile ) = -1;
1020 retroflat_viewport_grid_tile( 0, y_tile ) = -1;
1023 retroflat_viewport_unlock_refresh();
1038 retroflat_viewport_lock_refresh();
1042 y_tile = g_retroflat_state->viewport.screen_tile_h;
1060 &retroflat_viewport_grid_tile( 0, y_tile ),
1062 (g_retroflat_state->viewport.screen_tile_w + 2) *
1068 g_retroflat_state->viewport.screen_tile_h + 2 > y_tile;
1084 memset( &(g_retroflat_state->viewport.refresh_grid[0]), -1,
1085 (g_retroflat_state->viewport.screen_tile_w + 2) *
1088 retroflat_viewport_unlock_refresh();
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition merror.h:28
#define RETROFLAT_INSTANCE_NULL
Pass to retroflat_blit_bitmap() instance arg if this is not a sprite (i.e. if it is a background tile...
Definition retroflt.h:620
MERROR_RETVAL retroflat_viewport_trim_px(struct RETROFLAT_BITMAP *bitmap, int16_t instance, retroflat_pxxy_t *s_x, retroflat_pxxy_t *s_y, retroflat_pxxy_t *d_x, retroflat_pxxy_t *d_y, retroflat_pxxy_t *w, retroflat_pxxy_t *h)
Chop w/h down to fit inside viewport or just fail if it's impossible.
MERROR_RETVAL retroflat_viewport_shift_viewport_x(int8_t shift)
Shift the viewport refresh grid 1 tile in the given direction.
MERROR_RETVAL retroflat_viewport_shift_viewport_y(int8_t shift)
Shift the viewport refresh grid 1 tile in the given direction.
uint8_t retroflat_viewport_focus(retroflat_pxxy_t x1, retroflat_pxxy_t y1, retroflat_pxxy_t range, retroflat_pxxy_t speed)
Move the viewport in a direction or combination thereof so that it's focusing the given x1/y1 within ...
MERROR_RETVAL retroflat_viewport_clear_refresh(retroflat_pxxy_t y_max)
Set all viewport refresh tiles as dirty, starting from 0 and moving downwards until reaching y_max.
int16_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition retroflt.h:931
#define RETROTILE_TRACE_LVL
If defined, bring debug printf statements up to this level.
Definition retrotil.h:42
int16_t retroflat_tile_t
Value for an individual tile in a RETROTILE_LAYER.
Definition retroflt.h:19
The viewport data struct. There is generally only one of these, to which all helpers implicitly refer...
Definition retroviw.h:48
retroflat_pxxy_t world_x
The X offset, in pixels, of the viewport on the world tilemap. Should only be retrieved through retro...
Definition retroviw.h:67
retroflat_tile_t * refresh_grid
A grid of tile values representing the last-drawn values on-screen.
Definition retroviw.h:139
retroflat_pxxy_t screen_h
Viewport height in pixels. Should only be retrieved through retroflat_viewport_screen_w() and set thr...
Definition retroviw.h:97
retroflat_pxxy_t screen_h_remainder
Difference between viewport height and screen height in pixels. Should only be retrieved through retr...
Definition retroviw.h:111
retroflat_pxxy_t screen_y
Y position of the viewport in real screen memory in pixels. Should only be retrieved through retrofla...
Definition retroviw.h:61
retroflat_pxxy_t screen_x
X position of the viewport in real screen memory in pixels. Should only be retrieved through retrofla...
Definition retroviw.h:55
int16_t screen_tile_w
The number of tiles across that fit in the viewport. Should only be retrieved through retroflat_viewp...
Definition retroviw.h:118
retroflat_pxxy_t world_w
The width of the entire world tilemap in pixels. Should only be retrieved through retroflat_viewport_...
Definition retroviw.h:79
retroflat_pxxy_t world_y
The Y offset, in pixels, of the viewport on the world tilemap. Should only be retrieved through retro...
Definition retroviw.h:73
retroflat_pxxy_t screen_w_remainder
Difference between viewport width and screen width in pixels. Should only be retrieved through retrof...
Definition retroviw.h:104
retroflat_pxxy_t screen_w
Viewport width in pixels. Should only be retrieved through retroflat_viewport_screen_w() and set thro...
Definition retroviw.h:91
int16_t screen_tile_h
The number of tiles high that fit in the viewport. Should only be retrieved through retroflat_viewpor...
Definition retroviw.h:125
retroflat_pxxy_t world_h
The height of the entire world tilemap in pixels. Should only be retrieved through retroflat_viewport...
Definition retroviw.h:85