comparison render_sdl.c @ 2644:c5c9498ff279

Implement integer scaling
author Michael Pavone <pavone@retrodev.com>
date Fri, 28 Feb 2025 22:40:18 -0800
parents c30e5548154f
children 568c1c22f3e3
comparison
equal deleted inserted replaced
2643:57345f6e18f3 2644:c5c9498ff279
618 #endif 618 #endif
619 main_clip.w = main_width; 619 main_clip.w = main_width;
620 main_clip.h = main_height; 620 main_clip.h = main_height;
621 main_clip.x = main_clip.y = 0; 621 main_clip.x = main_clip.y = 0;
622 if (config_aspect() > 0.0f) { 622 if (config_aspect() > 0.0f) {
623 char *integer_scaling_str = tern_find_path_default(config, "video\0integer_scaling\0", (tern_val){.ptrval = "off"}, TVAL_PTR).ptrval;
624 uint8_t integer_scaling = !strcmp(integer_scaling_str, "on");
623 float aspect = (float)main_width / main_height; 625 float aspect = (float)main_width / main_height;
624 if (fabs(aspect - config_aspect()) < 0.01f) { 626 if (!integer_scaling && fabs(aspect - config_aspect()) < 0.01f) {
625 //close enough for government work 627 //close enough for government work
626 return; 628 return;
627 } 629 }
630 uint32_t height, scale;
631 if (integer_scaling) {
632 height = render_emulated_height();
633 if (aspect >= config_aspect()) {
634 scale = main_height / height;
635 } else {
636 uint32_t aspect_height = 0.5f + (float)main_width / config_aspect();
637 scale = aspect_height / height;
638 }
639 }
628 #ifndef DISABLE_OPENGL 640 #ifndef DISABLE_OPENGL
629 if (render_gl) { 641 if (render_gl) {
630 for (int i = 0; i < 4; i++) 642 if (integer_scaling) {
631 { 643 float vscale = ((float)(scale * height)) / (float)main_height;
632 if (aspect > config_aspect()) { 644 float hscale = (config_aspect() * (float)(scale * height)) / (float)main_width;
633 vertex_data[i*2] *= config_aspect()/aspect; 645 for (int i = 0; i < 4; i++)
634 } else { 646 {
635 vertex_data[i*2+1] *= aspect/config_aspect(); 647 vertex_data[i*2] *= hscale;
648 vertex_data[i*2+1] *= vscale;
636 } 649 }
650 } else {
651 for (int i = 0; i < 4; i++)
652 {
653 if (aspect > config_aspect()) {
654 vertex_data[i*2] *= config_aspect()/aspect;
655 } else {
656 vertex_data[i*2+1] *= aspect/config_aspect();
657 }
658 }
637 } 659 }
638 } else { 660 } else {
639 #endif 661 #endif
640 main_clip.w = aspect > config_aspect() ? config_aspect() * (float)main_height : main_width; 662 if (integer_scaling) {
641 main_clip.h = aspect > config_aspect() ? main_height : main_width / config_aspect(); 663 main_clip.h = height * scale;
664 main_clip.w = main_clip.h * config_aspect();
665 } else {
666 main_clip.w = aspect > config_aspect() ? config_aspect() * (float)main_height : main_width;
667 main_clip.h = aspect > config_aspect() ? main_height : main_width / config_aspect();
668 }
642 main_clip.x = (main_width - main_clip.w) / 2; 669 main_clip.x = (main_width - main_clip.w) / 2;
643 main_clip.y = (main_height - main_clip.h) / 2; 670 main_clip.y = (main_height - main_clip.h) / 2;
644 #ifndef DISABLE_OPENGL 671 #ifndef DISABLE_OPENGL
645 } 672 }
646 #endif 673 #endif