Video: Aspect ratio now takes overscan settings into account to give an accurate pixel aspect ratio, no matter the overscan
This commit is contained in:
parent
c023a87dd9
commit
cad8995696
6 changed files with 12 additions and 7 deletions
|
@ -4,6 +4,7 @@
|
||||||
#define _USE_MATH_DEFINES
|
#define _USE_MATH_DEFINES
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include "PPU.h"
|
||||||
|
|
||||||
DefaultVideoFilter::DefaultVideoFilter()
|
DefaultVideoFilter::DefaultVideoFilter()
|
||||||
{
|
{
|
||||||
|
@ -38,7 +39,7 @@ void DefaultVideoFilter::InitConversionMatrix(double hueShift, double saturation
|
||||||
FrameInfo DefaultVideoFilter::GetFrameInfo()
|
FrameInfo DefaultVideoFilter::GetFrameInfo()
|
||||||
{
|
{
|
||||||
OverscanDimensions overscan = GetOverscan();
|
OverscanDimensions overscan = GetOverscan();
|
||||||
return { overscan.GetScreenWidth(), overscan.GetScreenHeight(), 4 };
|
return { overscan.GetScreenWidth(), overscan.GetScreenHeight(), PPU::ScreenWidth, PPU::ScreenHeight, 4 };
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefaultVideoFilter::OnBeforeApplyFilter()
|
void DefaultVideoFilter::OnBeforeApplyFilter()
|
||||||
|
|
|
@ -5,5 +5,7 @@ struct FrameInfo
|
||||||
{
|
{
|
||||||
uint32_t Width;
|
uint32_t Width;
|
||||||
uint32_t Height;
|
uint32_t Height;
|
||||||
|
uint32_t OriginalWidth;
|
||||||
|
uint32_t OriginalHeight;
|
||||||
uint32_t BitsPerPixel;
|
uint32_t BitsPerPixel;
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,7 +12,7 @@ FrameInfo HdVideoFilter::GetFrameInfo()
|
||||||
OverscanDimensions overscan = GetOverscan();
|
OverscanDimensions overscan = GetOverscan();
|
||||||
uint32_t hdScale = _hdNesPack->GetScale();
|
uint32_t hdScale = _hdNesPack->GetScale();
|
||||||
|
|
||||||
return { overscan.GetScreenWidth() * hdScale, overscan.GetScreenHeight() * hdScale, 4 };
|
return { overscan.GetScreenWidth() * hdScale, overscan.GetScreenHeight() * hdScale, PPU::ScreenWidth*hdScale, PPU::ScreenHeight*hdScale, 4 };
|
||||||
}
|
}
|
||||||
|
|
||||||
void HdVideoFilter::SetHdScreenTiles(HdPpuPixelInfo *screenTiles)
|
void HdVideoFilter::SetHdScreenTiles(HdPpuPixelInfo *screenTiles)
|
||||||
|
|
|
@ -15,7 +15,7 @@ FrameInfo NtscFilter::GetFrameInfo()
|
||||||
OverscanDimensions overscan = GetOverscan();
|
OverscanDimensions overscan = GetOverscan();
|
||||||
int overscanLeft = overscan.Left > 0 ? NES_NTSC_OUT_WIDTH(overscan.Left) : 0;
|
int overscanLeft = overscan.Left > 0 ? NES_NTSC_OUT_WIDTH(overscan.Left) : 0;
|
||||||
int overscanRight = overscan.Right > 0 ? NES_NTSC_OUT_WIDTH(overscan.Right) : 0;
|
int overscanRight = overscan.Right > 0 ? NES_NTSC_OUT_WIDTH(overscan.Right) : 0;
|
||||||
return { NES_NTSC_OUT_WIDTH(PPU::ScreenWidth) - overscanLeft - overscanRight, (PPU::ScreenHeight - overscan.Top - overscan.Bottom) * 2, 4 };
|
return { NES_NTSC_OUT_WIDTH(PPU::ScreenWidth) - overscanLeft - overscanRight, (PPU::ScreenHeight - overscan.Top - overscan.Bottom) * 2, NES_NTSC_OUT_WIDTH(PPU::ScreenWidth), PPU::ScreenHeight * 2, 4 };
|
||||||
}
|
}
|
||||||
|
|
||||||
void NtscFilter::OnBeforeApplyFilter()
|
void NtscFilter::OnBeforeApplyFilter()
|
||||||
|
|
|
@ -28,7 +28,7 @@ ScaleFilter::~ScaleFilter()
|
||||||
FrameInfo ScaleFilter::GetFrameInfo()
|
FrameInfo ScaleFilter::GetFrameInfo()
|
||||||
{
|
{
|
||||||
OverscanDimensions overscan = GetOverscan();
|
OverscanDimensions overscan = GetOverscan();
|
||||||
return{ overscan.GetScreenWidth()*_filterScale, overscan.GetScreenHeight()*_filterScale, 4 };
|
return{ overscan.GetScreenWidth()*_filterScale, overscan.GetScreenHeight()*_filterScale, PPU::ScreenWidth*_filterScale, PPU::ScreenHeight*_filterScale, 4 };
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScaleFilter::ApplyPrescaleFilter()
|
void ScaleFilter::ApplyPrescaleFilter()
|
||||||
|
|
|
@ -31,11 +31,13 @@ VideoDecoder::~VideoDecoder()
|
||||||
void VideoDecoder::GetScreenSize(ScreenSize &size, bool ignoreScale)
|
void VideoDecoder::GetScreenSize(ScreenSize &size, bool ignoreScale)
|
||||||
{
|
{
|
||||||
if(_videoFilter) {
|
if(_videoFilter) {
|
||||||
|
FrameInfo frameInfo = _videoFilter->GetFrameInfo();
|
||||||
double aspectRatio = EmulationSettings::GetAspectRatio();
|
double aspectRatio = EmulationSettings::GetAspectRatio();
|
||||||
size.Width = (int32_t)(_videoFilter->GetFrameInfo().Width * (ignoreScale ? 1 : EmulationSettings::GetVideoScale()));
|
double scale = (ignoreScale ? 1 : EmulationSettings::GetVideoScale());
|
||||||
size.Height = (int32_t)(_videoFilter->GetFrameInfo().Height * (ignoreScale ? 1 : EmulationSettings::GetVideoScale()));
|
size.Width = (int32_t)(frameInfo.Width * scale);
|
||||||
|
size.Height = (int32_t)(frameInfo.Height * scale);
|
||||||
if(aspectRatio != 0.0) {
|
if(aspectRatio != 0.0) {
|
||||||
size.Width = (uint32_t)(size.Height * aspectRatio);
|
size.Width = (uint32_t)(frameInfo.OriginalHeight * scale * aspectRatio * ((double)frameInfo.Width / frameInfo.OriginalWidth));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue