[GTK3] Implement tilemap scrolling rect

This commit is contained in:
Maximilian Mader 2019-10-03 03:10:48 +02:00
parent e7cbc71fd6
commit d9a9baae1b
Signed by: Max
GPG Key ID: F71D56A3151C4FB3
2 changed files with 42 additions and 8 deletions

View File

@ -26,7 +26,8 @@ static bool paused = false;
static bool underclock_down = false, rewind_down = false, do_rewind = false, rewind_paused = false, turbo_down = false; static bool underclock_down = false, rewind_down = false, do_rewind = false, rewind_paused = false, turbo_down = false;
static double clock_mutliplier = 1.0; static double clock_mutliplier = 1.0;
static char *battery_save_path_ptr; static char *battery_save_path_ptr;
static Rect rect; static Rect viewport = {0};
static Rect scrollRect = {0};
static bool vram_viewer_visible = false; static bool vram_viewer_visible = false;
static bool running = true; static bool running = true;
@ -673,8 +674,8 @@ static gboolean on_draw_fallback(GtkWidget *widget, cairo_t *cr, gpointer data)
cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, screen_width) cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, screen_width)
); );
cairo_translate(cr, rect.x, rect.y); cairo_translate(cr, viewport.x, viewport.y);
cairo_scale(cr, rect.w / screen_width, rect.h / screen_height); cairo_scale(cr, viewport.w / screen_width, viewport.h / screen_height);
cairo_set_source_surface(cr, surface, 0, 0); cairo_set_source_surface(cr, surface, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr); cairo_paint(cr);
@ -758,7 +759,7 @@ static gboolean on_draw_vram_viewer_tilemap(GtkWidget *widget, cairo_t *cr, gpoi
height = gtk_widget_get_allocated_height(widget); height = gtk_widget_get_allocated_height(widget);
gtk_render_background(context, cr, 0, 0, width, height); gtk_render_background(context, cr, 0, 0, width, height);
cairo_surface_t *surface = cairo_image_surface_create_for_data( cairo_surface_t *surface = cairo_image_surface_create_for_data(
(unsigned char *) tilemap_buffer, (unsigned char *) tilemap_buffer,
CAIRO_FORMAT_RGB24, CAIRO_FORMAT_RGB24,
@ -790,6 +791,29 @@ static gboolean on_draw_vram_viewer_tilemap(GtkWidget *widget, cairo_t *cr, gpoi
cairo_stroke(cr); cairo_stroke(cr);
} }
if (gtk_toggle_button_get_active(gtkget(GTK_TOGGLE_BUTTON, "vram_viewer_tilemap_toggle_scrolling_button"))) {
cairo_rectangle(cr, 0, 0, width, height);
for (unsigned x = 0; x < 2; x++) {
for (unsigned y = 0; y < 2; y++) {
Rect rect = scrollRect;
rect.x -= 256 * x;
rect.y += 256 * y;
cairo_rectangle(cr, rect.x, rect.y, rect.w, rect.h);
}
}
cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
cairo_set_line_width(cr, 2);
cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 0.5);
cairo_fill_preserve(cr);
cairo_clip_preserve(cr);
cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.6);
cairo_stroke(cr);
}
return FALSE; return FALSE;
} }
@ -889,7 +913,7 @@ static void render_texture(void *pixels, void *previous) {
glClearColor(0, 0, 0, 1); glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
render_bitmap_with_shader(&shader, _pixels, previous, GB_get_screen_width(&gb), GB_get_screen_height(&gb), rect.x, rect.y, rect.w, rect.h); render_bitmap_with_shader(&shader, _pixels, previous, GB_get_screen_width(&gb), GB_get_screen_height(&gb), viewport.x, viewport.y, viewport.w, viewport.h);
} }
static void update_viewport(void) { static void update_viewport(void) {
@ -918,14 +942,14 @@ static void update_viewport(void) {
unsigned new_width = x_factor * GB_get_screen_width(&gb); unsigned new_width = x_factor * GB_get_screen_width(&gb);
unsigned new_height = y_factor * GB_get_screen_height(&gb); unsigned new_height = y_factor * GB_get_screen_height(&gb);
rect = (Rect){ viewport = (Rect){
(win_width - new_width) / 2, (win_width - new_width) / 2,
(win_height - new_height) / 2, (win_height - new_height) / 2,
new_width, new_width,
new_height new_height
}; };
if (!fallback_canvas) glViewport(rect.x, rect.y, rect.w, rect.h); if (!fallback_canvas) glViewport(viewport.x, viewport.y, viewport.w, viewport.h);
} }
static void update_window_geometry() { static void update_window_geometry() {
@ -990,6 +1014,12 @@ static void vblank(GB_gameboy_t *gb) {
GB_draw_tileset(gb, tileset_buffer, GB_PALETTE_NONE, 0); GB_draw_tileset(gb, tileset_buffer, GB_PALETTE_NONE, 0);
GB_draw_tilemap(gb, tilemap_buffer, GB_PALETTE_AUTO, 0, GB_MAP_AUTO, GB_TILESET_AUTO); GB_draw_tilemap(gb, tilemap_buffer, GB_PALETTE_AUTO, 0, GB_MAP_AUTO, GB_TILESET_AUTO);
scrollRect = (Rect){
GB_read_memory(gb, 0xFF00 | GB_IO_SCX),
GB_read_memory(gb, 0xFF00 | GB_IO_SCY),
160, 144
};
// Queue a redraw of the VRAM viewer // Queue a redraw of the VRAM viewer
gtk_widget_queue_draw(GTK_WIDGET(vram_viewer)); gtk_widget_queue_draw(GTK_WIDGET(vram_viewer));
} }

View File

@ -1353,7 +1353,7 @@ Maximilian Mader https://github.com/max-m</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="vram_viewer_tilemap_toggle_scrolling"> <object class="GtkToggleButton" id="vram_viewer_tilemap_toggle_scrolling_button">
<property name="label" translatable="yes">Scrolling</property> <property name="label" translatable="yes">Scrolling</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
@ -1401,6 +1401,10 @@ Maximilian Mader https://github.com/max-m</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="app_paintable">True</property> <property name="app_paintable">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">start</property>
<property name="hexpand">False</property>
<property name="vexpand">False</property>
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>