From fed00b7dab03880ea0227d8f162ef43480966a4d Mon Sep 17 00:00:00 2001 From: Persune Date: Sun, 20 Mar 2022 15:04:33 +0800 Subject: [PATCH 1/4] Revert "Merge pull request #77 from Gumball2415/feature-add-bisqwit-ntsc-smpte-C-colorimetry" This reverts commit ed1514fc9b262205da0ef22ecc4d1fa07f7ccda5, reversing changes made to 2472437af6d2b222658dcaef69c3aec2c4a9cab0. --- Core/BisqwitNtscFilter.cpp | 51 +++++++++----------------- Core/BisqwitNtscFilter.h | 11 +++--- Core/EmulationSettings.h | 3 -- Core/ScaleFilter.cpp | 3 -- Core/VideoDecoder.cpp | 9 ++--- GUI.NET/Forms/Config/frmVideoConfig.cs | 7 +--- GUI.NET/Forms/frmMain.Designer.cs | 30 --------------- GUI.NET/Forms/frmMain.Options.cs | 18 --------- GUI.NET/Forms/frmMain.cs | 3 -- GUI.NET/InteropEmu.cs | 3 -- 10 files changed, 26 insertions(+), 112 deletions(-) diff --git a/Core/BisqwitNtscFilter.cpp b/Core/BisqwitNtscFilter.cpp index e1846b218..b3a3f39fe 100644 --- a/Core/BisqwitNtscFilter.cpp +++ b/Core/BisqwitNtscFilter.cpp @@ -8,12 +8,11 @@ #include "EmulationSettings.h" #include "Console.h" -BisqwitNtscFilter::BisqwitNtscFilter(shared_ptr console, int resDivider, bool SMPTE_C) : BaseVideoFilter(console) +BisqwitNtscFilter::BisqwitNtscFilter(shared_ptr console, int resDivider) : BaseVideoFilter(console) { _resDivider = resDivider; _stopThread = false; _workDone = false; - _SMPTE_C = SMPTE_C; const int8_t signalLumaLow[4] = { -29, -15, 22, 71 }; const int8_t signalLumaHigh[4] = { 32, 66, 105, 105 }; @@ -50,7 +49,7 @@ BisqwitNtscFilter::BisqwitNtscFilter(shared_ptr console, int resDivider outputBuffer += GetOverscan().GetScreenWidth() * 64 / _resDivider / _resDivider * (120 - GetOverscan().Top); } - DecodeFrame(120, 239 - GetOverscan().Bottom, _ppuOutputBuffer, outputBuffer, (IsOddFrame() ? 8 : 0) + 327360, SMPTE_C); + DecodeFrame(120, 239 - GetOverscan().Bottom, _ppuOutputBuffer, outputBuffer, (IsOddFrame() ? 8 : 0) + 327360); _workDone = true; } @@ -70,7 +69,7 @@ void BisqwitNtscFilter::ApplyFilter(uint16_t *ppuOutputBuffer) _workDone = false; _waitWork.Signal(); - DecodeFrame(GetOverscan().Top, 120, ppuOutputBuffer, GetOutputBuffer(), (IsOddFrame() ? 8 : 0) + GetOverscan().Top*341*8, _SMPTE_C); + DecodeFrame(GetOverscan().Top, 120, ppuOutputBuffer, GetOutputBuffer(), (IsOddFrame() ? 8 : 0) + GetOverscan().Top*341*8); while(!_workDone) {} } @@ -104,30 +103,14 @@ void BisqwitNtscFilter::OnBeforeApplyFilter() _y = contrast / _yWidth; - // magic numbers is corresponding values from the YIQ to RGB formula - // but divided by 13,995 * [arbitrary value] -/* - _ir = (int)(( 0.95599 / (13995 * 34.2457747)) * contrast * saturation / _iWidth); - _ig = (int)((-0.27201 / (13995 * 212.3864250)) * contrast * saturation / _iWidth); - _ib = (int)((-1.10674 / (13995 * 78.0674723)) * contrast * saturation / _iWidth); - _qr = (int)(( 0.62082 / (13995 * 44.7370743)) * contrast * saturation / _qWidth); - _qg = (int)((-0.64720 / (13995 * 73.0015960)) * contrast * saturation / _qWidth); - _qb = (int)(( 1.70423 / (13995 * 73.0404051)) * contrast * saturation / _qWidth); -*/ - _ir = (int)(contrast * 1.994681e-6 * saturation / _iWidth); - _ig = (int)(contrast * 9.151351e-8 * saturation / _iWidth); - _ib = (int)(contrast * -1.012984e-6 * saturation / _iWidth); - _qr = (int)(contrast * 9.915742e-7 * saturation / _qWidth); - _qg = (int)(contrast * -6.334805e-7 * saturation / _qWidth); - _qb = (int)(contrast * 1.667217e-6 * saturation / _qWidth); - - // alternate values based on the SMPTE C color primaries - _irC = (int)((0.95599 / (13995 * 80)) * contrast * saturation / _iWidth); - _igC = (int)((-0.27201 / (13995 * 80)) * contrast * saturation / _iWidth); - _ibC = (int)((-1.10674 / (13995 * 80)) * contrast * saturation / _iWidth); - _qrC = (int)((0.62082 / (13995 * 80)) * contrast * saturation / _qWidth); - _qgC = (int)((-0.64720 / (13995 * 80)) * contrast * saturation / _qWidth); - _qbC = (int)((1.70423 / (13995 * 80)) * contrast * saturation / _qWidth); + _ir = (int)(contrast * 1.994681e-6 * saturation / _iWidth); + _qr = (int)(contrast * 9.915742e-7 * saturation / _qWidth); + + _ig = (int)(contrast * 9.151351e-8 * saturation / _iWidth); + _qg = (int)(contrast * -6.334805e-7 * saturation / _qWidth); + + _ib = (int)(contrast * -1.012984e-6 * saturation / _iWidth); + _qb = (int)(contrast * 1.667217e-6 * saturation / _qWidth); } void BisqwitNtscFilter::RecursiveBlend(int iterationCount, uint64_t *output, uint64_t *currentLine, uint64_t *nextLine, int pixelsPerCycle, bool verticalBlend) @@ -209,7 +192,7 @@ void BisqwitNtscFilter::GenerateNtscSignal(int8_t *ntscSignal, int &phase, int r phase += (341 - 256 - _paddingSize * 2) * _signalsPerPixel; } -void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase, bool SMPTE_C) +void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase) { int pixelsPerCycle = 8 / _resDivider; int phase = startPhase; @@ -229,7 +212,7 @@ void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutpu GenerateNtscSignal(rowSignal, phase, y); //Convert the NTSC signal to RGB - NtscDecodeLine(lineWidth * _signalsPerPixel, rowSignal, outputBuffer, (startCycle + 7) % 12, SMPTE_C); + NtscDecodeLine(lineWidth * _signalsPerPixel, rowSignal, outputBuffer, (startCycle + 7) % 12); outputBuffer += rowPixelGap; } @@ -281,7 +264,7 @@ void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutpu * In essence it conveys in one integer the same information that real NTSC signal * would convey in the colorburst period in the beginning of each scanline. */ -void BisqwitNtscFilter::NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0, bool SMPTE_C) +void BisqwitNtscFilter::NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0) { auto Read = [=](int pos) -> char { return pos >= 0 ? signal[pos] : 0; }; auto Cos = [=](int pos) -> char { return _sinetable[(pos + 36) % 12 + phase0]; }; @@ -299,9 +282,9 @@ void BisqwitNtscFilter::NtscDecodeLine(int width, const int8_t* signal, uint32_t qsum += Read(s) * Sin(s) - Read(s - _qWidth) * Sin(s - _qWidth); if(!(s % _resDivider) && s >= leftOverscan) { - int r = std::min(255, std::max(0, (ysum*_y + isum*(SMPTE_C ? _irC : _ir) + qsum*(SMPTE_C ? _qrC : _qr)) / 65536)); - int g = std::min(255, std::max(0, (ysum*_y + isum*(SMPTE_C ? _igC : _ig) + qsum*(SMPTE_C ? _qgC : _qg)) / 65536)); - int b = std::min(255, std::max(0, (ysum*_y + isum*(SMPTE_C ? _ibC : _ib) + qsum*(SMPTE_C ? _qbC : _qb)) / 65536)); + int r = std::min(255, std::max(0, (ysum*_y + isum*_ir + qsum*_qr) / 65536)); + int g = std::min(255, std::max(0, (ysum*_y + isum*_ig + qsum*_qg) / 65536)); + int b = std::min(255, std::max(0, (ysum*_y + isum*_ib + qsum*_qb) / 65536)); *target = 0xFF000000 | (r << 16) | (g << 8) | b; target++; diff --git a/Core/BisqwitNtscFilter.h b/Core/BisqwitNtscFilter.h index 3890fa9e6..4cf556b3d 100644 --- a/Core/BisqwitNtscFilter.h +++ b/Core/BisqwitNtscFilter.h @@ -20,7 +20,6 @@ class BisqwitNtscFilter : public BaseVideoFilter atomic _workDone; bool _keepVerticalRes = false; - bool _SMPTE_C = false; int _resDivider = 1; uint16_t *_ppuOutputBuffer = nullptr; @@ -34,8 +33,8 @@ class BisqwitNtscFilter : public BaseVideoFilter */ int _yWidth, _iWidth, _qWidth; int _y; - int _ir, _ig, _ib, _irC, _igC, _ibC; - int _qr, _qg, _qb, _qrC, _qgC, _qbC; + int _ir, _ig, _ib; + int _qr, _qg, _qb; //To finetune hue, you would have to recalculate sinetable[]. (Coarse changes can be made with Phase0.) int8_t _sinetable[27]; // 8*sin(x*2pi/12) @@ -44,14 +43,14 @@ class BisqwitNtscFilter : public BaseVideoFilter void RecursiveBlend(int iterationCount, uint64_t *output, uint64_t *currentLine, uint64_t *nextLine, int pixelsPerCycle, bool verticalBlend); - void NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0, bool SMPTE_C); + void NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0); void GenerateNtscSignal(int8_t *ntscSignal, int &phase, int rowNumber); - void DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase, bool SMPTE_C); + void DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase); void OnBeforeApplyFilter(); public: - BisqwitNtscFilter(shared_ptr console, int resDivider, bool SMPTE_C); + BisqwitNtscFilter(shared_ptr console, int resDivider); virtual ~BisqwitNtscFilter(); virtual void ApplyFilter(uint16_t *ppuOutputBuffer); diff --git a/Core/EmulationSettings.h b/Core/EmulationSettings.h index b83d5c422..a48506462 100644 --- a/Core/EmulationSettings.h +++ b/Core/EmulationSettings.h @@ -168,9 +168,6 @@ enum class VideoFilterType Prescale8x = 23, Prescale10x = 24, Raw = 25, - BisqwitNtscSMPTECQuarterRes = 26, - BisqwitNtscSMPTECHalfRes = 27, - BisqwitNtscSMPTEC = 28, HdPack = 999 }; diff --git a/Core/ScaleFilter.cpp b/Core/ScaleFilter.cpp index 5ff76ccb2..70230cbdd 100644 --- a/Core/ScaleFilter.cpp +++ b/Core/ScaleFilter.cpp @@ -107,9 +107,6 @@ shared_ptr ScaleFilter::GetScaleFilter(VideoFilterType filter) case VideoFilterType::BisqwitNtsc: case VideoFilterType::BisqwitNtscHalfRes: case VideoFilterType::BisqwitNtscQuarterRes: - case VideoFilterType::BisqwitNtscSMPTEC: - case VideoFilterType::BisqwitNtscSMPTECHalfRes: - case VideoFilterType::BisqwitNtscSMPTECQuarterRes: case VideoFilterType::NTSC: case VideoFilterType::HdPack: case VideoFilterType::Raw: diff --git a/Core/VideoDecoder.cpp b/Core/VideoDecoder.cpp index de0f5e734..ee4a94cb2 100644 --- a/Core/VideoDecoder.cpp +++ b/Core/VideoDecoder.cpp @@ -70,12 +70,9 @@ void VideoDecoder::UpdateVideoFilter() switch(_videoFilterType) { case VideoFilterType::None: break; case VideoFilterType::NTSC: _videoFilter.reset(new NtscFilter(_console)); break; - case VideoFilterType::BisqwitNtsc: _videoFilter.reset(new BisqwitNtscFilter(_console, 1, false)); break; - case VideoFilterType::BisqwitNtscHalfRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 2, false)); break; - case VideoFilterType::BisqwitNtscQuarterRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 4, false)); break; - case VideoFilterType::BisqwitNtscSMPTEC: _videoFilter.reset(new BisqwitNtscFilter(_console, 1, true)); break; - case VideoFilterType::BisqwitNtscSMPTECHalfRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 2, true)); break; - case VideoFilterType::BisqwitNtscSMPTECQuarterRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 4, true)); break; + case VideoFilterType::BisqwitNtsc: _videoFilter.reset(new BisqwitNtscFilter(_console, 1)); break; + case VideoFilterType::BisqwitNtscHalfRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 2)); break; + case VideoFilterType::BisqwitNtscQuarterRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 4)); break; case VideoFilterType::Raw: _videoFilter.reset(new RawVideoFilter(_console)); break; default: _scaleFilter = ScaleFilter::GetScaleFilter(_videoFilterType); break; } diff --git a/GUI.NET/Forms/Config/frmVideoConfig.cs b/GUI.NET/Forms/Config/frmVideoConfig.cs index 5ececd30d..f893e3b20 100644 --- a/GUI.NET/Forms/Config/frmVideoConfig.cs +++ b/GUI.NET/Forms/Config/frmVideoConfig.cs @@ -165,12 +165,7 @@ protected override bool ValidateInput() tlpNtscFilter2.Visible = false; chkMergeFields.Visible = true; grpNtscFilter.Visible = true; - } else if(filter == VideoFilterType.BisqwitNtsc || - filter == VideoFilterType.BisqwitNtscHalfRes || - filter == VideoFilterType.BisqwitNtscQuarterRes || - filter == VideoFilterType.BisqwitNtscSMPTEC || - filter == VideoFilterType.BisqwitNtscSMPTECHalfRes || - filter == VideoFilterType.BisqwitNtscSMPTECQuarterRes) { + } else if(filter == VideoFilterType.BisqwitNtsc || filter == VideoFilterType.BisqwitNtscHalfRes || filter == VideoFilterType.BisqwitNtscQuarterRes) { tlpNtscFilter1.Visible = true; tlpNtscFilter2.Visible = true; chkMergeFields.Visible = false; diff --git a/GUI.NET/Forms/frmMain.Designer.cs b/GUI.NET/Forms/frmMain.Designer.cs index 0651ddece..f810490f0 100644 --- a/GUI.NET/Forms/frmMain.Designer.cs +++ b/GUI.NET/Forms/frmMain.Designer.cs @@ -106,9 +106,6 @@ private void InitializeComponent() this.mnuNtscBisqwitQuarterFilter = new System.Windows.Forms.ToolStripMenuItem(); this.mnuNtscBisqwitHalfFilter = new System.Windows.Forms.ToolStripMenuItem(); this.mnuNtscBisqwitFullFilter = new System.Windows.Forms.ToolStripMenuItem(); - this.mnuNtscSMPTECBisqwitQuarterFilter = new System.Windows.Forms.ToolStripMenuItem(); - this.mnuNtscSMPTECBisqwitHalfFilter = new System.Windows.Forms.ToolStripMenuItem(); - this.mnuNtscSMPTECBisqwitFullFilter = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripSeparator(); this.mnuXBRZ2xFilter = new System.Windows.Forms.ToolStripMenuItem(); this.mnuXBRZ3xFilter = new System.Windows.Forms.ToolStripMenuItem(); @@ -834,9 +831,6 @@ private void InitializeComponent() this.mnuNtscBisqwitQuarterFilter, this.mnuNtscBisqwitHalfFilter, this.mnuNtscBisqwitFullFilter, - this.mnuNtscSMPTECBisqwitQuarterFilter, - this.mnuNtscSMPTECBisqwitHalfFilter, - this.mnuNtscSMPTECBisqwitFullFilter, this.toolStripMenuItem15, this.mnuXBRZ2xFilter, this.mnuXBRZ3xFilter, @@ -909,27 +903,6 @@ private void InitializeComponent() this.mnuNtscBisqwitFullFilter.Text = "NTSC 8x (Bisqwit)"; this.mnuNtscBisqwitFullFilter.Click += new System.EventHandler(this.mnuNtscBisqwitFullFilter_Click); // - // mnuNtscSMPTECBisqwitQuarterFilter - // - this.mnuNtscSMPTECBisqwitQuarterFilter.Name = "mnuNtscSMPTECBisqwitQuarterFilter"; - this.mnuNtscSMPTECBisqwitQuarterFilter.Size = new System.Drawing.Size(206, 22); - this.mnuNtscSMPTECBisqwitQuarterFilter.Text = "NTSC SMPTE C 2x (Bisqwit)"; - this.mnuNtscSMPTECBisqwitQuarterFilter.Click += new System.EventHandler(this.mnuNtscSMPTECBisqwitQuarterFilter_Click); - // - // mnuNtscSMPTECBisqwitHalfFilter - // - this.mnuNtscSMPTECBisqwitHalfFilter.Name = "mnuNtscSMPTECBisqwitHalfFilter"; - this.mnuNtscSMPTECBisqwitHalfFilter.Size = new System.Drawing.Size(206, 22); - this.mnuNtscSMPTECBisqwitHalfFilter.Text = "NTSC SMPTE C 4x (Bisqwit)"; - this.mnuNtscSMPTECBisqwitHalfFilter.Click += new System.EventHandler(this.mnuNtscSMPTECBisqwitHalfFilter_Click); - // - // mnuNtscSMPTECBisqwitFullFilter - // - this.mnuNtscSMPTECBisqwitFullFilter.Name = "mnuNtscSMPTECBisqwitFullFilter"; - this.mnuNtscSMPTECBisqwitFullFilter.Size = new System.Drawing.Size(206, 22); - this.mnuNtscSMPTECBisqwitFullFilter.Text = "NTSC SMPTE C 8x (Bisqwit)"; - this.mnuNtscSMPTECBisqwitFullFilter.Click += new System.EventHandler(this.mnuNtscSMPTECBisqwitFullFilter_Click); - // // toolStripMenuItem15 // this.toolStripMenuItem15.Name = "toolStripMenuItem15"; @@ -2004,9 +1977,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem mnuNtscBisqwitHalfFilter; private System.Windows.Forms.ToolStripMenuItem mnuNtscBisqwitFullFilter; private System.Windows.Forms.ToolStripMenuItem mnuNtscBisqwitQuarterFilter; - private System.Windows.Forms.ToolStripMenuItem mnuNtscSMPTECBisqwitHalfFilter; - private System.Windows.Forms.ToolStripMenuItem mnuNtscSMPTECBisqwitFullFilter; - private System.Windows.Forms.ToolStripMenuItem mnuNtscSMPTECBisqwitQuarterFilter; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem22; private System.Windows.Forms.ToolStripMenuItem mnuVideoRecorder; private System.Windows.Forms.ToolStripMenuItem mnuAviRecord; diff --git a/GUI.NET/Forms/frmMain.Options.cs b/GUI.NET/Forms/frmMain.Options.cs index d9e50843b..54bac9194 100644 --- a/GUI.NET/Forms/frmMain.Options.cs +++ b/GUI.NET/Forms/frmMain.Options.cs @@ -52,9 +52,6 @@ private void UpdateFilterMenu(VideoFilterType filterType) mnuNtscBisqwitFullFilter.Checked = (filterType == VideoFilterType.BisqwitNtsc); mnuNtscBisqwitHalfFilter.Checked = (filterType == VideoFilterType.BisqwitNtscHalfRes); mnuNtscBisqwitQuarterFilter.Checked = (filterType == VideoFilterType.BisqwitNtscQuarterRes); - mnuNtscSMPTECBisqwitFullFilter.Checked = (filterType == VideoFilterType.BisqwitNtscSMPTEC); - mnuNtscSMPTECBisqwitHalfFilter.Checked = (filterType == VideoFilterType.BisqwitNtscSMPTECHalfRes); - mnuNtscSMPTECBisqwitQuarterFilter.Checked = (filterType == VideoFilterType.BisqwitNtscSMPTECQuarterRes); mnuXBRZ2xFilter.Checked = (filterType == VideoFilterType.xBRZ2x); mnuXBRZ3xFilter.Checked = (filterType == VideoFilterType.xBRZ3x); @@ -373,20 +370,5 @@ private void mnuNtscBisqwitQuarterFilter_Click(object sender, EventArgs e) { SetVideoFilter(VideoFilterType.BisqwitNtscQuarterRes); } - - private void mnuNtscSMPTECBisqwitFullFilter_Click(object sender, EventArgs e) - { - SetVideoFilter(VideoFilterType.BisqwitNtscSMPTEC); - } - - private void mnuNtscSMPTECBisqwitHalfFilter_Click(object sender, EventArgs e) - { - SetVideoFilter(VideoFilterType.BisqwitNtscSMPTECHalfRes); - } - - private void mnuNtscSMPTECBisqwitQuarterFilter_Click(object sender, EventArgs e) - { - SetVideoFilter(VideoFilterType.BisqwitNtscSMPTECQuarterRes); - } } } diff --git a/GUI.NET/Forms/frmMain.cs b/GUI.NET/Forms/frmMain.cs index debd63139..b4e966244 100644 --- a/GUI.NET/Forms/frmMain.cs +++ b/GUI.NET/Forms/frmMain.cs @@ -1363,9 +1363,6 @@ private void UpdateMenus() mnuNtscBisqwitQuarterFilter.Enabled = !isHdPackLoader; mnuNtscBisqwitHalfFilter.Enabled = !isHdPackLoader; mnuNtscBisqwitFullFilter.Enabled = !isHdPackLoader; - mnuNtscSMPTECBisqwitQuarterFilter.Enabled = !isHdPackLoader; - mnuNtscSMPTECBisqwitHalfFilter.Enabled = !isHdPackLoader; - mnuNtscSMPTECBisqwitFullFilter.Enabled = !isHdPackLoader; } } catch { } } diff --git a/GUI.NET/InteropEmu.cs b/GUI.NET/InteropEmu.cs index 6de4bef94..80e04b60e 100644 --- a/GUI.NET/InteropEmu.cs +++ b/GUI.NET/InteropEmu.cs @@ -2360,9 +2360,6 @@ public enum VideoFilterType Prescale6x = 22, Prescale8x = 23, Prescale10x = 24, - BisqwitNtscSMPTECQuarterRes = 26, - BisqwitNtscSMPTECHalfRes = 27, - BisqwitNtscSMPTEC = 28, } public enum HDPackOuputTileType From b3fba5b72a7232f5b1fffd03d264739ceed64cee Mon Sep 17 00:00:00 2001 From: Persune Date: Sun, 20 Mar 2022 15:04:33 +0800 Subject: [PATCH 2/4] Revert "Merge pull request #77 from Gumball2415/feature-add-bisqwit-ntsc-smpte-C-colorimetry" This reverts commit ed1514fc9b262205da0ef22ecc4d1fa07f7ccda5, reversing changes made to 2472437af6d2b222658dcaef69c3aec2c4a9cab0. --- Core/BisqwitNtscFilter.cpp | 51 +++++++++----------------- Core/BisqwitNtscFilter.h | 11 +++--- Core/EmulationSettings.h | 3 -- Core/ScaleFilter.cpp | 3 -- Core/VideoDecoder.cpp | 9 ++--- GUI.NET/Forms/Config/frmVideoConfig.cs | 7 +--- GUI.NET/Forms/frmMain.Designer.cs | 30 --------------- GUI.NET/Forms/frmMain.Options.cs | 18 --------- GUI.NET/Forms/frmMain.cs | 3 -- GUI.NET/InteropEmu.cs | 3 -- 10 files changed, 26 insertions(+), 112 deletions(-) diff --git a/Core/BisqwitNtscFilter.cpp b/Core/BisqwitNtscFilter.cpp index e1846b218..b3a3f39fe 100644 --- a/Core/BisqwitNtscFilter.cpp +++ b/Core/BisqwitNtscFilter.cpp @@ -8,12 +8,11 @@ #include "EmulationSettings.h" #include "Console.h" -BisqwitNtscFilter::BisqwitNtscFilter(shared_ptr console, int resDivider, bool SMPTE_C) : BaseVideoFilter(console) +BisqwitNtscFilter::BisqwitNtscFilter(shared_ptr console, int resDivider) : BaseVideoFilter(console) { _resDivider = resDivider; _stopThread = false; _workDone = false; - _SMPTE_C = SMPTE_C; const int8_t signalLumaLow[4] = { -29, -15, 22, 71 }; const int8_t signalLumaHigh[4] = { 32, 66, 105, 105 }; @@ -50,7 +49,7 @@ BisqwitNtscFilter::BisqwitNtscFilter(shared_ptr console, int resDivider outputBuffer += GetOverscan().GetScreenWidth() * 64 / _resDivider / _resDivider * (120 - GetOverscan().Top); } - DecodeFrame(120, 239 - GetOverscan().Bottom, _ppuOutputBuffer, outputBuffer, (IsOddFrame() ? 8 : 0) + 327360, SMPTE_C); + DecodeFrame(120, 239 - GetOverscan().Bottom, _ppuOutputBuffer, outputBuffer, (IsOddFrame() ? 8 : 0) + 327360); _workDone = true; } @@ -70,7 +69,7 @@ void BisqwitNtscFilter::ApplyFilter(uint16_t *ppuOutputBuffer) _workDone = false; _waitWork.Signal(); - DecodeFrame(GetOverscan().Top, 120, ppuOutputBuffer, GetOutputBuffer(), (IsOddFrame() ? 8 : 0) + GetOverscan().Top*341*8, _SMPTE_C); + DecodeFrame(GetOverscan().Top, 120, ppuOutputBuffer, GetOutputBuffer(), (IsOddFrame() ? 8 : 0) + GetOverscan().Top*341*8); while(!_workDone) {} } @@ -104,30 +103,14 @@ void BisqwitNtscFilter::OnBeforeApplyFilter() _y = contrast / _yWidth; - // magic numbers is corresponding values from the YIQ to RGB formula - // but divided by 13,995 * [arbitrary value] -/* - _ir = (int)(( 0.95599 / (13995 * 34.2457747)) * contrast * saturation / _iWidth); - _ig = (int)((-0.27201 / (13995 * 212.3864250)) * contrast * saturation / _iWidth); - _ib = (int)((-1.10674 / (13995 * 78.0674723)) * contrast * saturation / _iWidth); - _qr = (int)(( 0.62082 / (13995 * 44.7370743)) * contrast * saturation / _qWidth); - _qg = (int)((-0.64720 / (13995 * 73.0015960)) * contrast * saturation / _qWidth); - _qb = (int)(( 1.70423 / (13995 * 73.0404051)) * contrast * saturation / _qWidth); -*/ - _ir = (int)(contrast * 1.994681e-6 * saturation / _iWidth); - _ig = (int)(contrast * 9.151351e-8 * saturation / _iWidth); - _ib = (int)(contrast * -1.012984e-6 * saturation / _iWidth); - _qr = (int)(contrast * 9.915742e-7 * saturation / _qWidth); - _qg = (int)(contrast * -6.334805e-7 * saturation / _qWidth); - _qb = (int)(contrast * 1.667217e-6 * saturation / _qWidth); - - // alternate values based on the SMPTE C color primaries - _irC = (int)((0.95599 / (13995 * 80)) * contrast * saturation / _iWidth); - _igC = (int)((-0.27201 / (13995 * 80)) * contrast * saturation / _iWidth); - _ibC = (int)((-1.10674 / (13995 * 80)) * contrast * saturation / _iWidth); - _qrC = (int)((0.62082 / (13995 * 80)) * contrast * saturation / _qWidth); - _qgC = (int)((-0.64720 / (13995 * 80)) * contrast * saturation / _qWidth); - _qbC = (int)((1.70423 / (13995 * 80)) * contrast * saturation / _qWidth); + _ir = (int)(contrast * 1.994681e-6 * saturation / _iWidth); + _qr = (int)(contrast * 9.915742e-7 * saturation / _qWidth); + + _ig = (int)(contrast * 9.151351e-8 * saturation / _iWidth); + _qg = (int)(contrast * -6.334805e-7 * saturation / _qWidth); + + _ib = (int)(contrast * -1.012984e-6 * saturation / _iWidth); + _qb = (int)(contrast * 1.667217e-6 * saturation / _qWidth); } void BisqwitNtscFilter::RecursiveBlend(int iterationCount, uint64_t *output, uint64_t *currentLine, uint64_t *nextLine, int pixelsPerCycle, bool verticalBlend) @@ -209,7 +192,7 @@ void BisqwitNtscFilter::GenerateNtscSignal(int8_t *ntscSignal, int &phase, int r phase += (341 - 256 - _paddingSize * 2) * _signalsPerPixel; } -void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase, bool SMPTE_C) +void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase) { int pixelsPerCycle = 8 / _resDivider; int phase = startPhase; @@ -229,7 +212,7 @@ void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutpu GenerateNtscSignal(rowSignal, phase, y); //Convert the NTSC signal to RGB - NtscDecodeLine(lineWidth * _signalsPerPixel, rowSignal, outputBuffer, (startCycle + 7) % 12, SMPTE_C); + NtscDecodeLine(lineWidth * _signalsPerPixel, rowSignal, outputBuffer, (startCycle + 7) % 12); outputBuffer += rowPixelGap; } @@ -281,7 +264,7 @@ void BisqwitNtscFilter::DecodeFrame(int startRow, int endRow, uint16_t *ppuOutpu * In essence it conveys in one integer the same information that real NTSC signal * would convey in the colorburst period in the beginning of each scanline. */ -void BisqwitNtscFilter::NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0, bool SMPTE_C) +void BisqwitNtscFilter::NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0) { auto Read = [=](int pos) -> char { return pos >= 0 ? signal[pos] : 0; }; auto Cos = [=](int pos) -> char { return _sinetable[(pos + 36) % 12 + phase0]; }; @@ -299,9 +282,9 @@ void BisqwitNtscFilter::NtscDecodeLine(int width, const int8_t* signal, uint32_t qsum += Read(s) * Sin(s) - Read(s - _qWidth) * Sin(s - _qWidth); if(!(s % _resDivider) && s >= leftOverscan) { - int r = std::min(255, std::max(0, (ysum*_y + isum*(SMPTE_C ? _irC : _ir) + qsum*(SMPTE_C ? _qrC : _qr)) / 65536)); - int g = std::min(255, std::max(0, (ysum*_y + isum*(SMPTE_C ? _igC : _ig) + qsum*(SMPTE_C ? _qgC : _qg)) / 65536)); - int b = std::min(255, std::max(0, (ysum*_y + isum*(SMPTE_C ? _ibC : _ib) + qsum*(SMPTE_C ? _qbC : _qb)) / 65536)); + int r = std::min(255, std::max(0, (ysum*_y + isum*_ir + qsum*_qr) / 65536)); + int g = std::min(255, std::max(0, (ysum*_y + isum*_ig + qsum*_qg) / 65536)); + int b = std::min(255, std::max(0, (ysum*_y + isum*_ib + qsum*_qb) / 65536)); *target = 0xFF000000 | (r << 16) | (g << 8) | b; target++; diff --git a/Core/BisqwitNtscFilter.h b/Core/BisqwitNtscFilter.h index 3890fa9e6..4cf556b3d 100644 --- a/Core/BisqwitNtscFilter.h +++ b/Core/BisqwitNtscFilter.h @@ -20,7 +20,6 @@ class BisqwitNtscFilter : public BaseVideoFilter atomic _workDone; bool _keepVerticalRes = false; - bool _SMPTE_C = false; int _resDivider = 1; uint16_t *_ppuOutputBuffer = nullptr; @@ -34,8 +33,8 @@ class BisqwitNtscFilter : public BaseVideoFilter */ int _yWidth, _iWidth, _qWidth; int _y; - int _ir, _ig, _ib, _irC, _igC, _ibC; - int _qr, _qg, _qb, _qrC, _qgC, _qbC; + int _ir, _ig, _ib; + int _qr, _qg, _qb; //To finetune hue, you would have to recalculate sinetable[]. (Coarse changes can be made with Phase0.) int8_t _sinetable[27]; // 8*sin(x*2pi/12) @@ -44,14 +43,14 @@ class BisqwitNtscFilter : public BaseVideoFilter void RecursiveBlend(int iterationCount, uint64_t *output, uint64_t *currentLine, uint64_t *nextLine, int pixelsPerCycle, bool verticalBlend); - void NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0, bool SMPTE_C); + void NtscDecodeLine(int width, const int8_t* signal, uint32_t* target, int phase0); void GenerateNtscSignal(int8_t *ntscSignal, int &phase, int rowNumber); - void DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase, bool SMPTE_C); + void DecodeFrame(int startRow, int endRow, uint16_t *ppuOutputBuffer, uint32_t* outputBuffer, int startPhase); void OnBeforeApplyFilter(); public: - BisqwitNtscFilter(shared_ptr console, int resDivider, bool SMPTE_C); + BisqwitNtscFilter(shared_ptr console, int resDivider); virtual ~BisqwitNtscFilter(); virtual void ApplyFilter(uint16_t *ppuOutputBuffer); diff --git a/Core/EmulationSettings.h b/Core/EmulationSettings.h index b83d5c422..a48506462 100644 --- a/Core/EmulationSettings.h +++ b/Core/EmulationSettings.h @@ -168,9 +168,6 @@ enum class VideoFilterType Prescale8x = 23, Prescale10x = 24, Raw = 25, - BisqwitNtscSMPTECQuarterRes = 26, - BisqwitNtscSMPTECHalfRes = 27, - BisqwitNtscSMPTEC = 28, HdPack = 999 }; diff --git a/Core/ScaleFilter.cpp b/Core/ScaleFilter.cpp index 5ff76ccb2..70230cbdd 100644 --- a/Core/ScaleFilter.cpp +++ b/Core/ScaleFilter.cpp @@ -107,9 +107,6 @@ shared_ptr ScaleFilter::GetScaleFilter(VideoFilterType filter) case VideoFilterType::BisqwitNtsc: case VideoFilterType::BisqwitNtscHalfRes: case VideoFilterType::BisqwitNtscQuarterRes: - case VideoFilterType::BisqwitNtscSMPTEC: - case VideoFilterType::BisqwitNtscSMPTECHalfRes: - case VideoFilterType::BisqwitNtscSMPTECQuarterRes: case VideoFilterType::NTSC: case VideoFilterType::HdPack: case VideoFilterType::Raw: diff --git a/Core/VideoDecoder.cpp b/Core/VideoDecoder.cpp index de0f5e734..ee4a94cb2 100644 --- a/Core/VideoDecoder.cpp +++ b/Core/VideoDecoder.cpp @@ -70,12 +70,9 @@ void VideoDecoder::UpdateVideoFilter() switch(_videoFilterType) { case VideoFilterType::None: break; case VideoFilterType::NTSC: _videoFilter.reset(new NtscFilter(_console)); break; - case VideoFilterType::BisqwitNtsc: _videoFilter.reset(new BisqwitNtscFilter(_console, 1, false)); break; - case VideoFilterType::BisqwitNtscHalfRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 2, false)); break; - case VideoFilterType::BisqwitNtscQuarterRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 4, false)); break; - case VideoFilterType::BisqwitNtscSMPTEC: _videoFilter.reset(new BisqwitNtscFilter(_console, 1, true)); break; - case VideoFilterType::BisqwitNtscSMPTECHalfRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 2, true)); break; - case VideoFilterType::BisqwitNtscSMPTECQuarterRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 4, true)); break; + case VideoFilterType::BisqwitNtsc: _videoFilter.reset(new BisqwitNtscFilter(_console, 1)); break; + case VideoFilterType::BisqwitNtscHalfRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 2)); break; + case VideoFilterType::BisqwitNtscQuarterRes: _videoFilter.reset(new BisqwitNtscFilter(_console, 4)); break; case VideoFilterType::Raw: _videoFilter.reset(new RawVideoFilter(_console)); break; default: _scaleFilter = ScaleFilter::GetScaleFilter(_videoFilterType); break; } diff --git a/GUI.NET/Forms/Config/frmVideoConfig.cs b/GUI.NET/Forms/Config/frmVideoConfig.cs index 5ececd30d..f893e3b20 100644 --- a/GUI.NET/Forms/Config/frmVideoConfig.cs +++ b/GUI.NET/Forms/Config/frmVideoConfig.cs @@ -165,12 +165,7 @@ protected override bool ValidateInput() tlpNtscFilter2.Visible = false; chkMergeFields.Visible = true; grpNtscFilter.Visible = true; - } else if(filter == VideoFilterType.BisqwitNtsc || - filter == VideoFilterType.BisqwitNtscHalfRes || - filter == VideoFilterType.BisqwitNtscQuarterRes || - filter == VideoFilterType.BisqwitNtscSMPTEC || - filter == VideoFilterType.BisqwitNtscSMPTECHalfRes || - filter == VideoFilterType.BisqwitNtscSMPTECQuarterRes) { + } else if(filter == VideoFilterType.BisqwitNtsc || filter == VideoFilterType.BisqwitNtscHalfRes || filter == VideoFilterType.BisqwitNtscQuarterRes) { tlpNtscFilter1.Visible = true; tlpNtscFilter2.Visible = true; chkMergeFields.Visible = false; diff --git a/GUI.NET/Forms/frmMain.Designer.cs b/GUI.NET/Forms/frmMain.Designer.cs index 0651ddece..f810490f0 100644 --- a/GUI.NET/Forms/frmMain.Designer.cs +++ b/GUI.NET/Forms/frmMain.Designer.cs @@ -106,9 +106,6 @@ private void InitializeComponent() this.mnuNtscBisqwitQuarterFilter = new System.Windows.Forms.ToolStripMenuItem(); this.mnuNtscBisqwitHalfFilter = new System.Windows.Forms.ToolStripMenuItem(); this.mnuNtscBisqwitFullFilter = new System.Windows.Forms.ToolStripMenuItem(); - this.mnuNtscSMPTECBisqwitQuarterFilter = new System.Windows.Forms.ToolStripMenuItem(); - this.mnuNtscSMPTECBisqwitHalfFilter = new System.Windows.Forms.ToolStripMenuItem(); - this.mnuNtscSMPTECBisqwitFullFilter = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripSeparator(); this.mnuXBRZ2xFilter = new System.Windows.Forms.ToolStripMenuItem(); this.mnuXBRZ3xFilter = new System.Windows.Forms.ToolStripMenuItem(); @@ -834,9 +831,6 @@ private void InitializeComponent() this.mnuNtscBisqwitQuarterFilter, this.mnuNtscBisqwitHalfFilter, this.mnuNtscBisqwitFullFilter, - this.mnuNtscSMPTECBisqwitQuarterFilter, - this.mnuNtscSMPTECBisqwitHalfFilter, - this.mnuNtscSMPTECBisqwitFullFilter, this.toolStripMenuItem15, this.mnuXBRZ2xFilter, this.mnuXBRZ3xFilter, @@ -909,27 +903,6 @@ private void InitializeComponent() this.mnuNtscBisqwitFullFilter.Text = "NTSC 8x (Bisqwit)"; this.mnuNtscBisqwitFullFilter.Click += new System.EventHandler(this.mnuNtscBisqwitFullFilter_Click); // - // mnuNtscSMPTECBisqwitQuarterFilter - // - this.mnuNtscSMPTECBisqwitQuarterFilter.Name = "mnuNtscSMPTECBisqwitQuarterFilter"; - this.mnuNtscSMPTECBisqwitQuarterFilter.Size = new System.Drawing.Size(206, 22); - this.mnuNtscSMPTECBisqwitQuarterFilter.Text = "NTSC SMPTE C 2x (Bisqwit)"; - this.mnuNtscSMPTECBisqwitQuarterFilter.Click += new System.EventHandler(this.mnuNtscSMPTECBisqwitQuarterFilter_Click); - // - // mnuNtscSMPTECBisqwitHalfFilter - // - this.mnuNtscSMPTECBisqwitHalfFilter.Name = "mnuNtscSMPTECBisqwitHalfFilter"; - this.mnuNtscSMPTECBisqwitHalfFilter.Size = new System.Drawing.Size(206, 22); - this.mnuNtscSMPTECBisqwitHalfFilter.Text = "NTSC SMPTE C 4x (Bisqwit)"; - this.mnuNtscSMPTECBisqwitHalfFilter.Click += new System.EventHandler(this.mnuNtscSMPTECBisqwitHalfFilter_Click); - // - // mnuNtscSMPTECBisqwitFullFilter - // - this.mnuNtscSMPTECBisqwitFullFilter.Name = "mnuNtscSMPTECBisqwitFullFilter"; - this.mnuNtscSMPTECBisqwitFullFilter.Size = new System.Drawing.Size(206, 22); - this.mnuNtscSMPTECBisqwitFullFilter.Text = "NTSC SMPTE C 8x (Bisqwit)"; - this.mnuNtscSMPTECBisqwitFullFilter.Click += new System.EventHandler(this.mnuNtscSMPTECBisqwitFullFilter_Click); - // // toolStripMenuItem15 // this.toolStripMenuItem15.Name = "toolStripMenuItem15"; @@ -2004,9 +1977,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem mnuNtscBisqwitHalfFilter; private System.Windows.Forms.ToolStripMenuItem mnuNtscBisqwitFullFilter; private System.Windows.Forms.ToolStripMenuItem mnuNtscBisqwitQuarterFilter; - private System.Windows.Forms.ToolStripMenuItem mnuNtscSMPTECBisqwitHalfFilter; - private System.Windows.Forms.ToolStripMenuItem mnuNtscSMPTECBisqwitFullFilter; - private System.Windows.Forms.ToolStripMenuItem mnuNtscSMPTECBisqwitQuarterFilter; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem22; private System.Windows.Forms.ToolStripMenuItem mnuVideoRecorder; private System.Windows.Forms.ToolStripMenuItem mnuAviRecord; diff --git a/GUI.NET/Forms/frmMain.Options.cs b/GUI.NET/Forms/frmMain.Options.cs index d9e50843b..54bac9194 100644 --- a/GUI.NET/Forms/frmMain.Options.cs +++ b/GUI.NET/Forms/frmMain.Options.cs @@ -52,9 +52,6 @@ private void UpdateFilterMenu(VideoFilterType filterType) mnuNtscBisqwitFullFilter.Checked = (filterType == VideoFilterType.BisqwitNtsc); mnuNtscBisqwitHalfFilter.Checked = (filterType == VideoFilterType.BisqwitNtscHalfRes); mnuNtscBisqwitQuarterFilter.Checked = (filterType == VideoFilterType.BisqwitNtscQuarterRes); - mnuNtscSMPTECBisqwitFullFilter.Checked = (filterType == VideoFilterType.BisqwitNtscSMPTEC); - mnuNtscSMPTECBisqwitHalfFilter.Checked = (filterType == VideoFilterType.BisqwitNtscSMPTECHalfRes); - mnuNtscSMPTECBisqwitQuarterFilter.Checked = (filterType == VideoFilterType.BisqwitNtscSMPTECQuarterRes); mnuXBRZ2xFilter.Checked = (filterType == VideoFilterType.xBRZ2x); mnuXBRZ3xFilter.Checked = (filterType == VideoFilterType.xBRZ3x); @@ -373,20 +370,5 @@ private void mnuNtscBisqwitQuarterFilter_Click(object sender, EventArgs e) { SetVideoFilter(VideoFilterType.BisqwitNtscQuarterRes); } - - private void mnuNtscSMPTECBisqwitFullFilter_Click(object sender, EventArgs e) - { - SetVideoFilter(VideoFilterType.BisqwitNtscSMPTEC); - } - - private void mnuNtscSMPTECBisqwitHalfFilter_Click(object sender, EventArgs e) - { - SetVideoFilter(VideoFilterType.BisqwitNtscSMPTECHalfRes); - } - - private void mnuNtscSMPTECBisqwitQuarterFilter_Click(object sender, EventArgs e) - { - SetVideoFilter(VideoFilterType.BisqwitNtscSMPTECQuarterRes); - } } } diff --git a/GUI.NET/Forms/frmMain.cs b/GUI.NET/Forms/frmMain.cs index debd63139..b4e966244 100644 --- a/GUI.NET/Forms/frmMain.cs +++ b/GUI.NET/Forms/frmMain.cs @@ -1363,9 +1363,6 @@ private void UpdateMenus() mnuNtscBisqwitQuarterFilter.Enabled = !isHdPackLoader; mnuNtscBisqwitHalfFilter.Enabled = !isHdPackLoader; mnuNtscBisqwitFullFilter.Enabled = !isHdPackLoader; - mnuNtscSMPTECBisqwitQuarterFilter.Enabled = !isHdPackLoader; - mnuNtscSMPTECBisqwitHalfFilter.Enabled = !isHdPackLoader; - mnuNtscSMPTECBisqwitFullFilter.Enabled = !isHdPackLoader; } } catch { } } diff --git a/GUI.NET/InteropEmu.cs b/GUI.NET/InteropEmu.cs index 6de4bef94..80e04b60e 100644 --- a/GUI.NET/InteropEmu.cs +++ b/GUI.NET/InteropEmu.cs @@ -2360,9 +2360,6 @@ public enum VideoFilterType Prescale6x = 22, Prescale8x = 23, Prescale10x = 24, - BisqwitNtscSMPTECQuarterRes = 26, - BisqwitNtscSMPTECHalfRes = 27, - BisqwitNtscSMPTEC = 28, } public enum HDPackOuputTileType From 27a1b211c0c1cb6eab7c72e6ce3f72cae4fcaa1e Mon Sep 17 00:00:00 2001 From: Persune Date: Wed, 27 Apr 2022 08:04:08 +0800 Subject: [PATCH 3/4] Add setting for colorimetry toggle --- Core/BisqwitNtscFilter.cpp | 17 ++++--- Core/EmulationSettings.h | 4 +- GUI.NET/Config/VideoInfo.cs | 3 +- .../Forms/Config/frmVideoConfig.Designer.cs | 45 ++++++++++++------- GUI.NET/Forms/Config/frmVideoConfig.cs | 2 + GUI.NET/Forms/Config/frmVideoConfig.resx | 10 ++--- GUI.NET/InteropEmu.cs | 2 +- InteropDLL/ConsoleWrapper.cpp | 2 +- 8 files changed, 54 insertions(+), 31 deletions(-) diff --git a/Core/BisqwitNtscFilter.cpp b/Core/BisqwitNtscFilter.cpp index b3a3f39fe..ee67edbee 100644 --- a/Core/BisqwitNtscFilter.cpp +++ b/Core/BisqwitNtscFilter.cpp @@ -93,6 +93,11 @@ void BisqwitNtscFilter::OnBeforeApplyFilter() const double pi = std::atan(1.0) * 4; int contrast = (int)((pictureSettings.Contrast + 1.0) * (pictureSettings.Contrast + 1.0) * 167941); int saturation = (int)((pictureSettings.Saturation + 1.0) * (pictureSettings.Saturation + 1.0) * 144044); + bool colorimetryCorrection = _console->GetSettings()->GetNtscFilterSettings().ColorimetryCorrection; + + // [saturation at 0] * 100 / [I or Q width at 0] + double SatFactor = 144044 * 100 / 12; + for(int i = 0; i < 27; i++) { _sinetable[i] = (int8_t)(8 * std::sin(i * 2 * pi / 12 + pictureSettings.Hue * pi)); } @@ -103,14 +108,14 @@ void BisqwitNtscFilter::OnBeforeApplyFilter() _y = contrast / _yWidth; - _ir = (int)(contrast * 1.994681e-6 * saturation / _iWidth); - _qr = (int)(contrast * 9.915742e-7 * saturation / _qWidth); + _ir = colorimetryCorrection ? (int)(contrast * 1.994681e-6 * saturation / _iWidth) : (int)(contrast * (0.95599 / SatFactor) * saturation / _iWidth); + _qr = colorimetryCorrection ? (int)(contrast * 9.915742e-7 * saturation / _qWidth) : (int)(contrast * (0.62082 / SatFactor) * saturation / _qWidth); - _ig = (int)(contrast * 9.151351e-8 * saturation / _iWidth); - _qg = (int)(contrast * -6.334805e-7 * saturation / _qWidth); + _ig = colorimetryCorrection ? (int)(contrast * 9.151351e-8 * saturation / _iWidth) : (int)(contrast * (-0.27201 / SatFactor) * saturation / _iWidth); + _qg = colorimetryCorrection ? (int)(contrast * -6.334805e-7 * saturation / _qWidth) : (int)(contrast * (-0.64720 / SatFactor) * saturation / _qWidth); - _ib = (int)(contrast * -1.012984e-6 * saturation / _iWidth); - _qb = (int)(contrast * 1.667217e-6 * saturation / _qWidth); + _ib = colorimetryCorrection ? (int)(contrast * -1.012984e-6 * saturation / _iWidth) : (int)(contrast * (-1.10674 / SatFactor) * saturation / _iWidth); + _qb = colorimetryCorrection ? (int)(contrast * 1.667217e-6 * saturation / _qWidth) : (int)(contrast * (1.70423 / SatFactor) * saturation / _qWidth); } void BisqwitNtscFilter::RecursiveBlend(int iterationCount, uint64_t *output, uint64_t *currentLine, uint64_t *nextLine, int pixelsPerCycle, bool verticalBlend) diff --git a/Core/EmulationSettings.h b/Core/EmulationSettings.h index a48506462..4d517d7f7 100644 --- a/Core/EmulationSettings.h +++ b/Core/EmulationSettings.h @@ -231,6 +231,7 @@ struct NtscFilterSettings bool MergeFields = false; bool VerticalBlend = false; bool KeepVerticalResolution = false; + bool ColorimetryCorrection = true; double YFilterLength = 0; double IFilterLength = 0; @@ -1223,7 +1224,7 @@ class EmulationSettings return _pictureSettings; } - void SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, bool verticalBlend, bool keepVerticalResolution) + void SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, bool verticalBlend, bool keepVerticalResolution, bool colorimetryCorrection) { _ntscFilterSettings.Artifacts = artifacts; _ntscFilterSettings.Bleed = bleed; @@ -1240,6 +1241,7 @@ class EmulationSettings _ntscFilterSettings.VerticalBlend = verticalBlend; _ntscFilterSettings.KeepVerticalResolution = keepVerticalResolution; + _ntscFilterSettings.ColorimetryCorrection = colorimetryCorrection; } NtscFilterSettings GetNtscFilterSettings() diff --git a/GUI.NET/Config/VideoInfo.cs b/GUI.NET/Config/VideoInfo.cs index 37558f0b9..45d5dc779 100644 --- a/GUI.NET/Config/VideoInfo.cs +++ b/GUI.NET/Config/VideoInfo.cs @@ -41,6 +41,7 @@ public class VideoInfo [MinMax(-100, 100)] public Int32 NtscSharpness = 0; public bool NtscMergeFields = false; public bool NtscVerticalBlend = true; + public bool NtscColorimetryCorrection = true; [MinMax(-50, 400)] public Int32 NtscYFilterLength = 0; [MinMax(0, 400)] public Int32 NtscIFilterLength = 50; @@ -109,7 +110,7 @@ static public void ApplyConfig() InteropEmu.SetVideoAspectRatio(videoInfo.AspectRatio, videoInfo.CustomAspectRatio); InteropEmu.SetPictureSettings(videoInfo.Brightness / 100.0, videoInfo.Contrast / 100.0, videoInfo.Saturation / 100.0, videoInfo.Hue / 100.0, videoInfo.ScanlineIntensity / 100.0); - InteropEmu.SetNtscFilterSettings(videoInfo.NtscArtifacts / 100.0, videoInfo.NtscBleed / 100.0, videoInfo.NtscFringing / 100.0, videoInfo.NtscGamma / 100.0, videoInfo.NtscResolution / 100.0, videoInfo.NtscSharpness / 100.0, videoInfo.NtscMergeFields, videoInfo.NtscYFilterLength / 100.0, videoInfo.NtscIFilterLength / 100.0, videoInfo.NtscQFilterLength / 100.0, videoInfo.NtscVerticalBlend); + InteropEmu.SetNtscFilterSettings(videoInfo.NtscArtifacts / 100.0, videoInfo.NtscBleed / 100.0, videoInfo.NtscFringing / 100.0, videoInfo.NtscGamma / 100.0, videoInfo.NtscResolution / 100.0, videoInfo.NtscSharpness / 100.0, videoInfo.NtscMergeFields, videoInfo.NtscYFilterLength / 100.0, videoInfo.NtscIFilterLength / 100.0, videoInfo.NtscQFilterLength / 100.0, videoInfo.NtscVerticalBlend, videoInfo.NtscColorimetryCorrection); if(!string.IsNullOrWhiteSpace(videoInfo.PaletteData)) { try { diff --git a/GUI.NET/Forms/Config/frmVideoConfig.Designer.cs b/GUI.NET/Forms/Config/frmVideoConfig.Designer.cs index 9a07ee713..d13eb48f3 100644 --- a/GUI.NET/Forms/Config/frmVideoConfig.Designer.cs +++ b/GUI.NET/Forms/Config/frmVideoConfig.Designer.cs @@ -77,6 +77,7 @@ private void InitializeComponent() this.tableLayoutPanel6 = new System.Windows.Forms.TableLayoutPanel(); this.chkMergeFields = new System.Windows.Forms.CheckBox(); this.chkVerticalBlend = new System.Windows.Forms.CheckBox(); + this.chkColorimetryCorrection = new System.Windows.Forms.CheckBox(); this.grpCommon = new System.Windows.Forms.GroupBox(); this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); this.chkBilinearInterpolation = new System.Windows.Forms.CheckBox(); @@ -878,6 +879,7 @@ private void InitializeComponent() this.tableLayoutPanel6.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel6.Controls.Add(this.chkMergeFields, 0, 0); this.tableLayoutPanel6.Controls.Add(this.chkVerticalBlend, 0, 1); + this.tableLayoutPanel6.Controls.Add(this.chkColorimetryCorrection, 1, 1); this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 300); this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(0); @@ -908,6 +910,16 @@ private void InitializeComponent() this.chkVerticalBlend.Text = "Apply Vertical Blending"; this.chkVerticalBlend.UseVisualStyleBackColor = true; // + // chkColorimetryCorrection + // + this.chkColorimetryCorrection.AutoSize = true; + this.chkColorimetryCorrection.Location = new System.Drawing.Point(143, 28); + this.chkColorimetryCorrection.Name = "chkColorimetryCorrection"; + this.chkColorimetryCorrection.Size = new System.Drawing.Size(100, 17); + this.chkColorimetryCorrection.TabIndex = 32; + this.chkColorimetryCorrection.Text = "Colorimetry correction"; + this.chkColorimetryCorrection.UseVisualStyleBackColor = true; + // // grpCommon // this.grpCommon.Controls.Add(this.tableLayoutPanel4); @@ -1976,33 +1988,33 @@ private void InitializeComponent() this.mnuPresetRgb, this.mnuPresetMonochrome}); this.contextPicturePresets.Name = "contextPicturePresets"; - this.contextPicturePresets.Size = new System.Drawing.Size(153, 92); + this.contextPicturePresets.Size = new System.Drawing.Size(148, 92); // // mnuPresetComposite // this.mnuPresetComposite.Name = "mnuPresetComposite"; - this.mnuPresetComposite.Size = new System.Drawing.Size(152, 22); + this.mnuPresetComposite.Size = new System.Drawing.Size(147, 22); this.mnuPresetComposite.Text = "Composite"; this.mnuPresetComposite.Click += new System.EventHandler(this.mnuPresetComposite_Click); // // mnuPresetSVideo // this.mnuPresetSVideo.Name = "mnuPresetSVideo"; - this.mnuPresetSVideo.Size = new System.Drawing.Size(152, 22); + this.mnuPresetSVideo.Size = new System.Drawing.Size(147, 22); this.mnuPresetSVideo.Text = "S-Video"; this.mnuPresetSVideo.Click += new System.EventHandler(this.mnuPresetSVideo_Click); // // mnuPresetRgb // this.mnuPresetRgb.Name = "mnuPresetRgb"; - this.mnuPresetRgb.Size = new System.Drawing.Size(152, 22); + this.mnuPresetRgb.Size = new System.Drawing.Size(147, 22); this.mnuPresetRgb.Text = "RGB"; this.mnuPresetRgb.Click += new System.EventHandler(this.mnuPresetRgb_Click); // // mnuPresetMonochrome // this.mnuPresetMonochrome.Name = "mnuPresetMonochrome"; - this.mnuPresetMonochrome.Size = new System.Drawing.Size(152, 22); + this.mnuPresetMonochrome.Size = new System.Drawing.Size(147, 22); this.mnuPresetMonochrome.Text = "Monochrome"; this.mnuPresetMonochrome.Click += new System.EventHandler(this.mnuPresetMonochrome_Click); // @@ -2020,74 +2032,74 @@ private void InitializeComponent() this.mnuPaletteUnsaturated, this.mnuPaletteYuv}); this.contextPaletteList.Name = "contextPicturePresets"; - this.contextPaletteList.Size = new System.Drawing.Size(268, 208); + this.contextPaletteList.Size = new System.Drawing.Size(255, 208); this.contextPaletteList.Opening += new System.ComponentModel.CancelEventHandler(this.contextPaletteList_Opening); // // mnuDefaultPalette // this.mnuDefaultPalette.Name = "mnuDefaultPalette"; - this.mnuDefaultPalette.Size = new System.Drawing.Size(267, 22); + this.mnuDefaultPalette.Size = new System.Drawing.Size(254, 22); this.mnuDefaultPalette.Text = "Default (NTSC)"; this.mnuDefaultPalette.Click += new System.EventHandler(this.mnuDefaultPalette_Click); // // toolStripMenuItem1 // this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(264, 6); + this.toolStripMenuItem1.Size = new System.Drawing.Size(251, 6); // // mnuPaletteCompositeDirect // this.mnuPaletteCompositeDirect.Name = "mnuPaletteCompositeDirect"; - this.mnuPaletteCompositeDirect.Size = new System.Drawing.Size(267, 22); + this.mnuPaletteCompositeDirect.Size = new System.Drawing.Size(254, 22); this.mnuPaletteCompositeDirect.Text = "Composite Direct (by FirebrandX)"; this.mnuPaletteCompositeDirect.Click += new System.EventHandler(this.mnuPaletteCompositeDirect_Click); // // mnuPaletteNesClassic // this.mnuPaletteNesClassic.Name = "mnuPaletteNesClassic"; - this.mnuPaletteNesClassic.Size = new System.Drawing.Size(267, 22); + this.mnuPaletteNesClassic.Size = new System.Drawing.Size(254, 22); this.mnuPaletteNesClassic.Text = "NES Classic (by FirebrandX)"; this.mnuPaletteNesClassic.Click += new System.EventHandler(this.mnuPaletteNesClassic_Click); // // mnuPaletteNestopiaRgb // this.mnuPaletteNestopiaRgb.Name = "mnuPaletteNestopiaRgb"; - this.mnuPaletteNestopiaRgb.Size = new System.Drawing.Size(267, 22); + this.mnuPaletteNestopiaRgb.Size = new System.Drawing.Size(254, 22); this.mnuPaletteNestopiaRgb.Text = "Nestopia (RGB)"; this.mnuPaletteNestopiaRgb.Click += new System.EventHandler(this.mnuPaletteNestopiaRgb_Click); // // mnuPaletteOriginalHardware // this.mnuPaletteOriginalHardware.Name = "mnuPaletteOriginalHardware"; - this.mnuPaletteOriginalHardware.Size = new System.Drawing.Size(267, 22); + this.mnuPaletteOriginalHardware.Size = new System.Drawing.Size(254, 22); this.mnuPaletteOriginalHardware.Text = "Original Hardware (by FirebrandX)"; this.mnuPaletteOriginalHardware.Click += new System.EventHandler(this.mnuPaletteOriginalHardware_Click); // // mnuPalettePvmStyle // this.mnuPalettePvmStyle.Name = "mnuPalettePvmStyle"; - this.mnuPalettePvmStyle.Size = new System.Drawing.Size(267, 22); + this.mnuPalettePvmStyle.Size = new System.Drawing.Size(254, 22); this.mnuPalettePvmStyle.Text = "PVM Style (by FirebrandX)"; this.mnuPalettePvmStyle.Click += new System.EventHandler(this.mnuPalettePvmStyle_Click); // // mnuPaletteSonyCxa2025As // this.mnuPaletteSonyCxa2025As.Name = "mnuPaletteSonyCxa2025As"; - this.mnuPaletteSonyCxa2025As.Size = new System.Drawing.Size(267, 22); + this.mnuPaletteSonyCxa2025As.Size = new System.Drawing.Size(254, 22); this.mnuPaletteSonyCxa2025As.Text = "Sony CXA2025AS"; this.mnuPaletteSonyCxa2025As.Click += new System.EventHandler(this.mnuPaletteSonyCxa2025As_Click); // // mnuPaletteUnsaturated // this.mnuPaletteUnsaturated.Name = "mnuPaletteUnsaturated"; - this.mnuPaletteUnsaturated.Size = new System.Drawing.Size(267, 22); + this.mnuPaletteUnsaturated.Size = new System.Drawing.Size(254, 22); this.mnuPaletteUnsaturated.Text = "Unsaturated v6 (by FirebrandX)"; this.mnuPaletteUnsaturated.Click += new System.EventHandler(this.mnuPaletteUnsaturated_Click); // // mnuPaletteYuv // this.mnuPaletteYuv.Name = "mnuPaletteYuv"; - this.mnuPaletteYuv.Size = new System.Drawing.Size(267, 22); + this.mnuPaletteYuv.Size = new System.Drawing.Size(254, 22); this.mnuPaletteYuv.Text = "YUV v3 (by FirebrandX)"; this.mnuPaletteYuv.Click += new System.EventHandler(this.mnuPaletteYuv_Click); // @@ -2305,5 +2317,6 @@ private void InitializeComponent() private System.Windows.Forms.ComboBox cboFullscreenResolution; private System.Windows.Forms.Label lblRequestedRefreshRate2; private System.Windows.Forms.ComboBox cboRefreshRate2; + private System.Windows.Forms.CheckBox chkColorimetryCorrection; } } \ No newline at end of file diff --git a/GUI.NET/Forms/Config/frmVideoConfig.cs b/GUI.NET/Forms/Config/frmVideoConfig.cs index f893e3b20..c3de7b7bc 100644 --- a/GUI.NET/Forms/Config/frmVideoConfig.cs +++ b/GUI.NET/Forms/Config/frmVideoConfig.cs @@ -64,6 +64,7 @@ public frmVideoConfig() AddBinding("NtscSharpness", trkSharpness); AddBinding("NtscMergeFields", chkMergeFields); AddBinding("NtscVerticalBlend", chkVerticalBlend); + AddBinding("NtscColorimetryCorrection", chkColorimetryCorrection); AddBinding("NtscYFilterLength", trkYFilterLength); AddBinding("NtscIFilterLength", trkIFilterLength); @@ -296,6 +297,7 @@ private void btnResetPictureSettings_Click(object sender, EventArgs e) trkSharpness.Value = 0; chkMergeFields.Checked = false; chkVerticalBlend.Checked = true; + chkColorimetryCorrection.Checked = true; trkYFilterLength.Value = 0; trkIFilterLength.Value = 50; diff --git a/GUI.NET/Forms/Config/frmVideoConfig.resx b/GUI.NET/Forms/Config/frmVideoConfig.resx index 015d70f09..a2bfec218 100644 --- a/GUI.NET/Forms/Config/frmVideoConfig.resx +++ b/GUI.NET/Forms/Config/frmVideoConfig.resx @@ -121,14 +121,14 @@ 17, 17 - 561, 17 + 537, 17 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACs - BQAAAk1TRnQBSQFMAwEBAAFYAQABWAEAARABAAEQAQAE/wEZAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA + BQAAAk1TRnQBSQFMAwEBAAFoAQABaAEAARABAAEQAQAE/wEZAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA ARADAAEBAQABGAYAAQweAAH5AvgB1QHBAbsBqAFyAWEBkAFHATABkAFHATABpgFuAVwB0gG8AbUB+AL2 pQAB1QHAAbkBlgFNATIBqgFaASwBuwFkASsBwAFpASkBwAFpASkBuwFlASwBqwFbAS0BmAFMATAB0wG9 AbWfAAHRAbgBrwGlAVgBMgHAAW0BLgHCAW0BLQHCAW0BLQHCAW0BLQHCAW0BLQHCAW0BLQHCAW0BLQHA @@ -156,12 +156,12 @@ - 229, 17 + 221, 17 - 110, 17 + 107, 17 - 406, 17 + 389, 17 \ No newline at end of file diff --git a/GUI.NET/InteropEmu.cs b/GUI.NET/InteropEmu.cs index 80e04b60e..d979ce1e6 100644 --- a/GUI.NET/InteropEmu.cs +++ b/GUI.NET/InteropEmu.cs @@ -232,7 +232,7 @@ public static Image GetSaveStatePreview(string saveStatePath) [DllImport(DLLPath)] public static extern void SetVideoResizeFilter(VideoResizeFilter filter); [DllImport(DLLPath)] public static extern void SetRgbPalette(byte[] palette, UInt32 paletteSize); [DllImport(DLLPath)] public static extern void SetPictureSettings(double brightness, double contrast, double saturation, double hue, double scanlineIntensity); - [DllImport(DLLPath)] public static extern void SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, [MarshalAs(UnmanagedType.I1)]bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, [MarshalAs(UnmanagedType.I1)]bool verticalBlend); + [DllImport(DLLPath)] public static extern void SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, [MarshalAs(UnmanagedType.I1)]bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, [MarshalAs(UnmanagedType.I1)]bool verticalBlend, [MarshalAs(UnmanagedType.I1)] bool colorimetryCorrection); [DllImport(DLLPath)] public static extern void SetInputDisplaySettings(byte visiblePorts, InputDisplayPosition displayPosition, [MarshalAs(UnmanagedType.I1)]bool displayHorizontally); [DllImport(DLLPath)] public static extern void SetAutoSaveOptions(UInt32 delayInMinutes, [MarshalAs(UnmanagedType.I1)]bool showMessage); [DllImport(DLLPath)] public static extern void SetPauseScreenMessage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UTF8Marshaler))]string message); diff --git a/InteropDLL/ConsoleWrapper.cpp b/InteropDLL/ConsoleWrapper.cpp index 02b721ac7..b353d290c 100644 --- a/InteropDLL/ConsoleWrapper.cpp +++ b/InteropDLL/ConsoleWrapper.cpp @@ -661,7 +661,7 @@ namespace InteropEmu { DllExport void __stdcall GetRgbPalette(uint32_t *paletteBuffer) { _settings->GetUserRgbPalette(paletteBuffer); } DllExport void __stdcall SetRgbPalette(uint32_t *paletteBuffer, uint32_t paletteSize) { _settings->SetUserRgbPalette(paletteBuffer, paletteSize); } DllExport void __stdcall SetPictureSettings(double brightness, double contrast, double saturation, double hue, double scanlineIntensity) { _settings->SetPictureSettings(brightness, contrast, saturation, hue, scanlineIntensity); } - DllExport void __stdcall SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, bool verticalBlend) { _settings->SetNtscFilterSettings(artifacts, bleed, fringing, gamma, resolution, sharpness, mergeFields, yFilterLength, iFilterLength, qFilterLength, verticalBlend, false); } + DllExport void __stdcall SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, bool verticalBlend, bool keepVerticalResolution, bool colorimetryCorrection) { _settings->SetNtscFilterSettings(artifacts, bleed, fringing, gamma, resolution, sharpness, mergeFields, yFilterLength, iFilterLength, qFilterLength, verticalBlend, keepVerticalResolution, colorimetryCorrection); } DllExport void __stdcall SetPauseScreenMessage(char* message) { _settings->SetPauseScreenMessage(message); } DllExport void __stdcall SetInputDisplaySettings(uint8_t visiblePorts, InputDisplayPosition displayPosition, bool displayHorizontally) { _settings->SetInputDisplaySettings(visiblePorts, displayPosition, displayHorizontally); } From 2ff21bf904b720bcb1bb1b78e3de11bbdac1524f Mon Sep 17 00:00:00 2001 From: Persune Date: Wed, 27 Apr 2022 08:36:14 +0800 Subject: [PATCH 4/4] "keepVerticalResolution" shouldn't be touched --- InteropDLL/ConsoleWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InteropDLL/ConsoleWrapper.cpp b/InteropDLL/ConsoleWrapper.cpp index b353d290c..458d17389 100644 --- a/InteropDLL/ConsoleWrapper.cpp +++ b/InteropDLL/ConsoleWrapper.cpp @@ -661,7 +661,7 @@ namespace InteropEmu { DllExport void __stdcall GetRgbPalette(uint32_t *paletteBuffer) { _settings->GetUserRgbPalette(paletteBuffer); } DllExport void __stdcall SetRgbPalette(uint32_t *paletteBuffer, uint32_t paletteSize) { _settings->SetUserRgbPalette(paletteBuffer, paletteSize); } DllExport void __stdcall SetPictureSettings(double brightness, double contrast, double saturation, double hue, double scanlineIntensity) { _settings->SetPictureSettings(brightness, contrast, saturation, hue, scanlineIntensity); } - DllExport void __stdcall SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, bool verticalBlend, bool keepVerticalResolution, bool colorimetryCorrection) { _settings->SetNtscFilterSettings(artifacts, bleed, fringing, gamma, resolution, sharpness, mergeFields, yFilterLength, iFilterLength, qFilterLength, verticalBlend, keepVerticalResolution, colorimetryCorrection); } + DllExport void __stdcall SetNtscFilterSettings(double artifacts, double bleed, double fringing, double gamma, double resolution, double sharpness, bool mergeFields, double yFilterLength, double iFilterLength, double qFilterLength, bool verticalBlend, bool colorimetryCorrection) { _settings->SetNtscFilterSettings(artifacts, bleed, fringing, gamma, resolution, sharpness, mergeFields, yFilterLength, iFilterLength, qFilterLength, verticalBlend, false, colorimetryCorrection); } DllExport void __stdcall SetPauseScreenMessage(char* message) { _settings->SetPauseScreenMessage(message); } DllExport void __stdcall SetInputDisplaySettings(uint8_t visiblePorts, InputDisplayPosition displayPosition, bool displayHorizontally) { _settings->SetInputDisplaySettings(visiblePorts, displayPosition, displayHorizontally); }