Mercurial > repos > blastem
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 |