diff --git a/gtk3/main.c b/gtk3/main.c index 8ca119d..28ae6e4 100644 --- a/gtk3/main.c +++ b/gtk3/main.c @@ -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 double clock_mutliplier = 1.0; 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 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_translate(cr, rect.x, rect.y); - cairo_scale(cr, rect.w / screen_width, rect.h / screen_height); + cairo_translate(cr, viewport.x, viewport.y); + cairo_scale(cr, viewport.w / screen_width, viewport.h / screen_height); cairo_set_source_surface(cr, surface, 0, 0); cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST); 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); gtk_render_background(context, cr, 0, 0, width, height); - + cairo_surface_t *surface = cairo_image_surface_create_for_data( (unsigned char *) tilemap_buffer, CAIRO_FORMAT_RGB24, @@ -790,6 +791,29 @@ static gboolean on_draw_vram_viewer_tilemap(GtkWidget *widget, cairo_t *cr, gpoi 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; } @@ -889,7 +913,7 @@ static void render_texture(void *pixels, void *previous) { glClearColor(0, 0, 0, 1); 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) { @@ -918,14 +942,14 @@ static void update_viewport(void) { unsigned new_width = x_factor * GB_get_screen_width(&gb); unsigned new_height = y_factor * GB_get_screen_height(&gb); - rect = (Rect){ + viewport = (Rect){ (win_width - new_width) / 2, (win_height - new_height) / 2, new_width, 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() { @@ -990,6 +1014,12 @@ static void vblank(GB_gameboy_t *gb) { 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); + 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 gtk_widget_queue_draw(GTK_WIDGET(vram_viewer)); } diff --git a/gtk3/resources/ui/window.ui b/gtk3/resources/ui/window.ui index dc36a65..c61da64 100644 --- a/gtk3/resources/ui/window.ui +++ b/gtk3/resources/ui/window.ui @@ -1353,7 +1353,7 @@ Maximilian Mader https://github.com/max-m - + Scrolling True True @@ -1401,6 +1401,10 @@ Maximilian Mader https://github.com/max-m True True False + start + start + False + False True