refactor v-size

This commit is contained in:
thrust26 2020-01-13 21:13:55 +01:00
parent 38b4cbe3ba
commit 344e7d7abb
12 changed files with 126 additions and 82 deletions

View File

@ -1525,13 +1525,13 @@
</tr> </tr>
<tr> <tr>
<td>Move display <i>up</i> (uses "Display.YStart")</td> <td>Move display <i>up</i> (uses "Display.VCenter")</td>
<td>Alt + PageUp</td> <td>Alt + PageUp</td>
<td>Cmd + PageUp</td> <td>Cmd + PageUp</td>
</tr> </tr>
<tr> <tr>
<td>Move display <i>down</i> (uses "Display.YStart")</td> <td>Move display <i>down</i> (uses "Display.VCenter")</td>
<td>Alt + PageDown</td> <td>Alt + PageDown</td>
<td>Cmd + PageDown</td> <td>Cmd + PageDown</td>
</tr> </tr>
@ -2004,18 +2004,15 @@
</tr> </tr>
<tr> <tr>
<td><pre>-tia.inter &lt;1|0&gt;</pre></td> <td><pre>-tia.vsizeadjust &lt;-5 - 5&gt;</pre></td>
<td>Use interpolation for the TIA image (results in blending/smoothing <td>Adjust the display height of the TIA image
of the image).</td> </td>
</tr> </tr>
<tr> <tr>
<td><pre>-tia.aspectn &lt;number&gt;<br>-tia.aspectp &lt;number&gt;</pre></td> <td><pre>-tia.inter &lt;1|0&gt;</pre></td>
<td>Specify the amount (as a percentage) to scale the <td>Use interpolation for the TIA image (results in blending/smoothing
TIA image width in NTSC and PAL mode. Since many video modes do not of the image).</td>
use square pixels, you can reduce width until the pixels appear square.
Allowable values are 80 - 120; I find 85 - 90 gives the most authentic
look for NTSC, and 105 - 110 for PAL.</td>
</tr> </tr>
<tr> <tr>
@ -2572,8 +2569,8 @@
</tr> </tr>
<tr> <tr>
<td><pre>-ystart &lt;number&gt;</pre></td> <td><pre>-vcenter &lt;number&gt;</pre></td>
<td>Set "Display.YStart" property (0 - 64).</td> <td>Set "Display.VCenter" property (-5..5).</td>
</tr> </tr>
<tr> <tr>
@ -2718,8 +2715,7 @@
<tr><td>TIA palette</td><td>Palette for emulation mode</td><td>-palette</td></tr> <tr><td>TIA palette</td><td>Palette for emulation mode</td><td>-palette</td></tr>
<tr><td>TIA interpolation</td><td>Interpolation for TIA image</td><td>-tia.inter</td></tr> <tr><td>TIA interpolation</td><td>Interpolation for TIA image</td><td>-tia.inter</td></tr>
<tr><td>TIA zoom</td><td>Zoom level for emulation mode </td><td>-tia.zoom</td></tr> <tr><td>TIA zoom</td><td>Zoom level for emulation mode </td><td>-tia.zoom</td></tr>
<tr><td>NTSC aspect</td><td>Width of TIA image in NTSC mode</td><td>-tia.aspectn</td></tr> <tr><td>V-Size adjust</td><td>Adjust height of TIA image</td><td>-tia.vsizeadjust</td></tr>
<tr><td>PAL aspect</td><td>Width of TIA image in PAL mode</td><td>-tia.aspectp</td></tr>
<tr><td>Emul. speed</td><td>Emulation speed</td><td>-speed</td></tr> <tr><td>Emul. speed</td><td>Emulation speed</td><td>-speed</td></tr>
<tr><td>VSync</td><td>Enable vertical synced updates</td><td>-vsync</td></tr> <tr><td>VSync</td><td>Enable vertical synced updates</td><td>-vsync</td></tr>
<tr><td>Fullscreen</td><td>Self-explanatory - Note that colors may slightly change. <tr><td>Fullscreen</td><td>Self-explanatory - Note that colors may slightly change.
@ -3749,9 +3745,9 @@ Ms Pac-Man (Stella extended codes):
</tr> </tr>
<tr> <tr>
<td VALIGN="TOP"><i>Display.YStart:</i></td> <td VALIGN="TOP"><i>Display.VCenter:</i></td>
<td>Indicates the scan-line to start displaying at. <td>Indicates the offset for the vertical center of the display.
The value must be <i>n</i> such that 0 &lt;= <i>n</i> &lt;= 64. The value must be <i>n</i> such that -5 &lt;= <i>n</i> &lt;= 5.
</td> </td>
</tr> </tr>

View File

@ -399,6 +399,7 @@ PhysicalKeyboardHandler::EventMappingArray PhysicalKeyboardHandler::DefaultCommo
{Event::ConsoleReset, KBDK_F2}, {Event::ConsoleReset, KBDK_F2},
{Event::ConsoleColor, KBDK_F3}, {Event::ConsoleColor, KBDK_F3},
{Event::ConsoleBlackWhite, KBDK_F4}, {Event::ConsoleBlackWhite, KBDK_F4},
{Event::Console7800Pause, KBDK_F3, MOD3},
{Event::ConsoleLeftDiffA, KBDK_F5}, {Event::ConsoleLeftDiffA, KBDK_F5},
{Event::ConsoleLeftDiffB, KBDK_F6}, {Event::ConsoleLeftDiffB, KBDK_F6},
{Event::ConsoleRightDiffA, KBDK_F7}, {Event::ConsoleRightDiffA, KBDK_F7},

View File

@ -668,7 +668,11 @@ void Console::changeVerticalCenter(int direction)
if (vcenter != myTIA->vcenter()) myTIA->setVcenter(vcenter); if (vcenter != myTIA->vcenter()) myTIA->setVcenter(vcenter);
ss.str(""); ss.str("");
ss << "V-Center " << (vcenter > 0 ? "+" : "") << vcenter; ss << "V-Center ";
if (!vcenter)
ss << "default";
else
ss << (vcenter > 0 ? "+" : "") << vcenter << "px";
myOSystem.frameBuffer().showMessage(ss.str()); myOSystem.frameBuffer().showMessage(ss.str());
} }
@ -685,24 +689,44 @@ void Console::updateVcenter(Int32 vcenter)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Console::changeScanlineAdjust(int direction) void Console::changeScanlineAdjust(int direction)
{ {
float newVsizeAdjust = myTIA->vsizeAdjust(); Int32 newAdjustVSize = myTIA->adjustVSize();;
if (direction != -1 && direction != +1) return; if (direction != -1 && direction != +1) return;
if(direction == +1) // increase scanline adjustment if(direction == +1) // increase scanline adjustment
{ {
newVsizeAdjust = std::min(myTIA->vsizeAdjust() + 0.5f, 5.f); if (newAdjustVSize >= 5)
{
myOSystem.frameBuffer().showMessage("V-Size at maximum");
return;
}
newAdjustVSize++;
} }
else if(direction == -1) // decrease scanline adjustment else if(direction == -1) // decrease scanline adjustment
{ {
newVsizeAdjust = std::max(myTIA->vsizeAdjust() - 0.5f, -5.f); if (newAdjustVSize <= -5)
{
myOSystem.frameBuffer().showMessage("V-Size at minimum");
return;
}
newAdjustVSize--;
} }
if (newVsizeAdjust != myTIA->vsizeAdjust()) { if (newAdjustVSize != myTIA->adjustVSize()) {
myTIA->setVsizeAdjust(newVsizeAdjust); myTIA->setAdjustVSize(newAdjustVSize);
myOSystem.settings().setValue("tia.vsizeadjust", newVsizeAdjust); myOSystem.settings().setValue("tia.vsizeadjust", newAdjustVSize);
initializeVideo(); initializeVideo();
} }
ostringstream ss;
ss << "V-Size ";
if (!newAdjustVSize)
ss << "default";
else
ss << (newAdjustVSize > 0 ? "+" : "") << newAdjustVSize << "%";
myOSystem.frameBuffer().showMessage(ss.str());
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -724,7 +748,7 @@ void Console::setTIAProperties()
myTIA->setLayout(FrameLayout::pal); myTIA->setLayout(FrameLayout::pal);
} }
myTIA->setVsizeAdjust(myOSystem.settings().getFloat("tia.vsizeadjust")); myTIA->setAdjustVSize(myOSystem.settings().getInt("tia.vsizeadjust"));
myTIA->setVcenter(vcenter); myTIA->setVcenter(vcenter);
myEmulationTiming.updateFrameLayout(myTIA->frameLayout()); myEmulationTiming.updateFrameLayout(myTIA->frameLayout());

View File

@ -119,6 +119,8 @@ class Event
ToggleFrameStats, ToggleSAPortOrder, ToggleFrameStats, ToggleSAPortOrder,
// add new events from here to avoid that user remapped events get overwritten
LastType LastType
}; };
@ -131,7 +133,7 @@ class Event
LastGroup LastGroup
}; };
// Event list version, update if the id of existing event types changed // Event list version, update only if the id of existing(!) event types changed
static constexpr Int32 VERSION = 2; static constexpr Int32 VERSION = 2;
using EventSet = std::set<Event::Type>; using EventSet = std::set<Event::Type>;

View File

@ -50,7 +50,7 @@ Settings::Settings()
// TIA specific options // TIA specific options
setPermanent("tia.zoom", "3"); setPermanent("tia.zoom", "3");
setPermanent("tia.inter", "false"); setPermanent("tia.inter", "false");
setPermanent("tia.vsizeadjust", 0.f); setPermanent("tia.vsizeadjust", 0);
setPermanent("fullscreen", "false"); setPermanent("fullscreen", "false");
setPermanent("tia.fs_stretch", "false"); setPermanent("tia.fs_stretch", "false");
setPermanent("tia.fs_overscan", "0"); setPermanent("tia.fs_overscan", "0");
@ -254,8 +254,8 @@ void Settings::validate()
f = getFloat("speed"); f = getFloat("speed");
if (f <= 0) setValue("speed", "1.0"); if (f <= 0) setValue("speed", "1.0");
i = getFloat("tia.vsizeadjust"); i = getInt("tia.vsizeadjust");
if(i < -5. || i > 5.) setValue("tia.vsizeadjust", 0.f); if(i < -5 || i > 5) setValue("tia.vsizeadjust", 0);
s = getString("tia.dbgcolors"); s = getString("tia.dbgcolors");
sort(s.begin(), s.end()); sort(s.begin(), s.end());
@ -405,9 +405,9 @@ void Settings::usage() const
#endif #endif
<< " -tia.zoom <zoom> Use the specified zoom level (windowed mode)\n" << " -tia.zoom <zoom> Use the specified zoom level (windowed mode)\n"
<< " for TIA image\n" << " for TIA image\n"
<< " -tia.vsizeadjust <-5..5> Adjust the vertical display size [percent]\n"
<< " -tia.inter <1|0> Enable interpolated (smooth) scaling for TIA\n" << " -tia.inter <1|0> Enable interpolated (smooth) scaling for TIA\n"
<< " image\n" << " image\n"
<< " -tia.vsizeadjust <float> Adjust the vertical range of the image [percent]\n"
<< " -tia.fs_stretch <1|0> Stretch TIA image to fill fullscreen mode\n" << " -tia.fs_stretch <1|0> Stretch TIA image to fill fullscreen mode\n"
<< " -tia.fs_overscan <0-10> Add overscan to TIA image in fill fullscreen mode\n" << " -tia.fs_overscan <0-10> Add overscan to TIA image in fill fullscreen mode\n"
<< " -tia.dbgcolors <string> Debug colors to use for each object (see manual\n" << " -tia.dbgcolors <string> Debug colors to use for each object (see manual\n"

View File

@ -264,8 +264,8 @@ class TIA : public Device
void setLayout(FrameLayout layout) { myFrameManager->setLayout(layout); } void setLayout(FrameLayout layout) { myFrameManager->setLayout(layout); }
FrameLayout frameLayout() const { return myFrameManager->layout(); } FrameLayout frameLayout() const { return myFrameManager->layout(); }
void setVsizeAdjust(float vsizeAdjust) { myFrameManager->setVsizeAdjust(vsizeAdjust); } void setAdjustVSize(Int32 adjustVSize) { myFrameManager->setAdjustVSize(adjustVSize); }
float vsizeAdjust() const { return myFrameManager->vsizeAdjust(); } Int32 adjustVSize() const { return myFrameManager->adjustVSize(); }
/** /**
Enables/disables color-loss for PAL modes only. Enables/disables color-loss for PAL modes only.

View File

@ -181,9 +181,9 @@ class AbstractFrameManager : public Serializable
virtual Int32 maxVcenter() const { return 0; } virtual Int32 maxVcenter() const { return 0; }
virtual void setVsizeAdjust(float vsizeAdjust) {} virtual void setAdjustVSize(Int32 adjustVSize) {}
virtual float vsizeAdjust() const { return 0; } virtual Int32 adjustVSize() const { return 0; }
/** /**
* The corresponding start line. * The corresponding start line.

View File

@ -121,9 +121,9 @@ void FrameManager::setVcenter(Int32 vcenter)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameManager::setVsizeAdjust(float vsizeAdjust) void FrameManager::setAdjustVSize(Int32 adjustVSize)
{ {
myVsizeAdjust = vsizeAdjust; myVSizeAdjust = adjustVSize;
recalculateMetrics(); recalculateMetrics();
} }
@ -244,10 +244,12 @@ void FrameManager::recalculateMetrics() {
throw runtime_error("frame manager: invalid TV mode"); throw runtime_error("frame manager: invalid TV mode");
} }
myHeight = BSPF::clamp<uInt32>(round(static_cast<float>(baseHeight) * (1.f + myVsizeAdjust / 100.f)), 0, myFrameLines); myHeight = BSPF::clamp<uInt32>(round(static_cast<float>(baseHeight) * (1.f - myVSizeAdjust / 100.f)), 0, myFrameLines);
myYStart = BSPF::clamp<uInt32>(ystartBase + (baseHeight - static_cast<Int32>(myHeight)) / 2 - myVcenter, 0, myFrameLines); myYStart = BSPF::clamp<uInt32>(ystartBase + (baseHeight - static_cast<Int32>(myHeight)) / 2 - myVcenter, 0, myFrameLines);
// TODO: why "- 1" here: ??? // TODO: why "- 1" here: ???
myMaxVcenter = BSPF::clamp<Int32>(ystartBase + (baseHeight - static_cast<Int32>(myHeight)) / 2 - 1, 0, TIAConstants::maxVcenter); myMaxVcenter = BSPF::clamp<Int32>(ystartBase + (baseHeight - static_cast<Int32>(myHeight)) / 2 - 1, 0, TIAConstants::maxVcenter);
//cout << "myVSizeAdjust " << myVSizeAdjust << " " << myHeight << endl << std::flush;
myJitterEmulation.setYStart(myYStart); myJitterEmulation.setYStart(myYStart);
} }

View File

@ -52,9 +52,9 @@ class FrameManager: public AbstractFrameManager {
Int32 maxVcenter() const override { return myMaxVcenter; } Int32 maxVcenter() const override { return myMaxVcenter; }
void setVsizeAdjust(float vsizeAdjust) override; void setAdjustVSize(Int32 adjustVSize) override;
float vsizeAdjust() const override { return myVsizeAdjust; } Int32 adjustVSize() const override { return myVSizeAdjust; }
uInt32 startLine() const override { return myYStart; } uInt32 startLine() const override { return myYStart; }
@ -102,7 +102,7 @@ class FrameManager: public AbstractFrameManager {
uInt32 myYStart{0}; uInt32 myYStart{0};
Int32 myVcenter{0}; Int32 myVcenter{0};
Int32 myMaxVcenter{0}; Int32 myMaxVcenter{0};
float myVsizeAdjust{0.f}; Int32 myVSizeAdjust{0};
bool myJitterEnabled{false}; bool myJitterEnabled{false};

View File

@ -86,7 +86,7 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
fontWidth = font.getMaxCharWidth(), fontWidth = font.getMaxCharWidth(),
buttonHeight = font.getLineHeight() + 4; buttonHeight = font.getLineHeight() + 4;
int xpos, ypos, tabID; int xpos, ypos, tabID;
int lwidth = font.getStringWidth("NTSC scanlines adjust "), int lwidth = font.getStringWidth("V-Size adjust "),
pwidth = font.getStringWidth("XXXXxXXXX"), pwidth = font.getStringWidth("XXXXxXXXX"),
swidth = font.getMaxCharWidth() * 10 - 2; swidth = font.getMaxCharWidth() * 10 - 2;
@ -94,7 +94,7 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
VariantList items; VariantList items;
// Set real dimensions // Set real dimensions
setSize(65 * fontWidth + HBORDER * 2, 14 * (lineHeight + VGAP) + 14 + _th, max_w, max_h); setSize(60 * fontWidth + HBORDER * 2, 14 * (lineHeight + VGAP) + 14 + _th, max_w, max_h);
// The tab widget // The tab widget
xpos = 2; ypos = 4; xpos = 2; ypos = 4;
@ -136,12 +136,12 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
ypos += lineHeight + VGAP; ypos += lineHeight + VGAP;
// Aspect ratio (NTSC mode) // Aspect ratio (NTSC mode)
myVsizeAdjust = myVSizeAdjust =
new SliderWidget(myTab, font, xpos, ypos-1, swidth, lineHeight, new SliderWidget(myTab, font, xpos, ypos-1, swidth, lineHeight,
"V-Size adjust ", lwidth, 0, fontWidth * 4, "", 0, true); "V-Size adjust", lwidth, kVSizeChanged, fontWidth * 7, "%", 0, true);
myVsizeAdjust->setMinValue(-50); myVsizeAdjust->setMaxValue(50); myVSizeAdjust->setMinValue(-5); myVSizeAdjust->setMaxValue(5);
myVsizeAdjust->setTickmarkIntervals(5); myVSizeAdjust->setTickmarkIntervals(2);
wid.push_back(myVsizeAdjust); wid.push_back(myVSizeAdjust);
ypos += lineHeight + VGAP; ypos += lineHeight + VGAP;
// Speed // Speed
@ -159,7 +159,7 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
wid.push_back(myUseVSync); wid.push_back(myUseVSync);
// Move over to the next column // Move over to the next column
xpos += mySpeed->getWidth() + 28; xpos += mySpeed->getWidth() + 44;
ypos = VBORDER; ypos = VBORDER;
// Fullscreen // Fullscreen
@ -342,9 +342,7 @@ void VideoDialog::loadConfig()
myTIAInterpolate->setState(instance().settings().getBool("tia.inter")); myTIAInterpolate->setState(instance().settings().getBool("tia.inter"));
// Aspect ratio setting (NTSC and PAL) // Aspect ratio setting (NTSC and PAL)
myVsizeAdjust->setValue( myVSizeAdjust->setValue(instance().settings().getInt("tia.vsizeadjust"));
round(instance().settings().getFloat("tia.vsizeadjust") * 10)
);
// Emulation speed // Emulation speed
int speed = mapSpeed(instance().settings().getFloat("speed")); int speed = mapSpeed(instance().settings().getFloat("speed"));
@ -416,9 +414,11 @@ void VideoDialog::saveConfig()
instance().settings().setValue("tia.inter", myTIAInterpolate->getState()); instance().settings().setValue("tia.inter", myTIAInterpolate->getState());
// Aspect ratio setting (NTSC and PAL) // Aspect ratio setting (NTSC and PAL)
instance().settings().setValue("tia.vsizeadjust", int oldAdjust = instance().settings().getInt("tia.vsizeadjust");
static_cast<float>(myVsizeAdjust->getValue()) / 10.f int newAdjust = myVSizeAdjust->getValue();
); bool initializeVideo = oldAdjust != newAdjust;
instance().settings().setValue("tia.vsizeadjust", newAdjust);
// Speed // Speed
int speedup = mySpeed->getValue(); int speedup = mySpeed->getValue();
@ -427,8 +427,6 @@ void VideoDialog::saveConfig()
// Fullscreen // Fullscreen
instance().settings().setValue("fullscreen", myFullscreen->getState()); instance().settings().setValue("fullscreen", myFullscreen->getState());
/*instance().settings().setValue("fullscreenmode",
myFullScreenMode->getSelectedTag().toString());*/
// Fullscreen stretch setting // Fullscreen stretch setting
instance().settings().setValue("tia.fs_stretch", myUseStretch->getState()); instance().settings().setValue("tia.fs_stretch", myUseStretch->getState());
// Fullscreen overscan // Fullscreen overscan
@ -478,7 +476,13 @@ void VideoDialog::saveConfig()
// TV scanline intensity // TV scanline intensity
instance().settings().setValue("tv.scanlines", myTVScanIntense->getValueLabel()); instance().settings().setValue("tv.scanlines", myTVScanIntense->getValueLabel());
if (&instance().console()) instance().console().setTIAProperties(); if (instance().hasConsole())
{
instance().console().setTIAProperties();
// TODO: display the new screen (currently all blank)
if (initializeVideo)
instance().console().initializeVideo();
}
// Finally, issue a complete framebuffer re-initialization... // Finally, issue a complete framebuffer re-initialization...
instance().createFrameBuffer(); instance().createFrameBuffer();
@ -498,7 +502,7 @@ void VideoDialog::setDefaults()
myTIAZoom->setValue(300); myTIAZoom->setValue(300);
myTIAPalette->setSelected("standard", ""); myTIAPalette->setSelected("standard", "");
myTIAInterpolate->setState(false); myTIAInterpolate->setState(false);
myVsizeAdjust->setValue(0); myVSizeAdjust->setValue(0);
mySpeed->setValue(0); mySpeed->setValue(0);
myFullscreen->setState(false); myFullscreen->setState(false);
@ -615,6 +619,20 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
setDefaults(); setDefaults();
break; break;
case kVSizeChanged:
{
int adjust = myVSizeAdjust->getValue();
if (!adjust)
{
myVSizeAdjust->setValueLabel("Default");
myVSizeAdjust->setValueUnit("");
}
else
myVSizeAdjust->setValueUnit("%");
break;
}
case kSpeedupChanged: case kSpeedupChanged:
mySpeed->setValueLabel(formatSpeed(mySpeed->getValue())); mySpeed->setValueLabel(formatSpeed(mySpeed->getValue()));
break; break;

View File

@ -58,7 +58,7 @@ class VideoDialog : public Dialog
SliderWidget* myTIAZoom{nullptr}; SliderWidget* myTIAZoom{nullptr};
PopUpWidget* myTIAPalette{nullptr}; PopUpWidget* myTIAPalette{nullptr};
CheckboxWidget* myTIAInterpolate{nullptr}; CheckboxWidget* myTIAInterpolate{nullptr};
SliderWidget* myVsizeAdjust{nullptr}; SliderWidget* myVSizeAdjust{nullptr};
SliderWidget* mySpeed{nullptr}; SliderWidget* mySpeed{nullptr};
CheckboxWidget* myFullscreen{nullptr}; CheckboxWidget* myFullscreen{nullptr};
@ -101,6 +101,7 @@ class VideoDialog : public Dialog
enum { enum {
kSpeedupChanged = 'VDSp', kSpeedupChanged = 'VDSp',
kVSizeChanged = 'VDVs',
kFullScreenChanged = 'VDFs', kFullScreenChanged = 'VDFs',
kOverscanChanged = 'VDOv', kOverscanChanged = 'VDOv',

View File

@ -89,8 +89,8 @@ bool StellaLIBRETRO::create(bool logging)
settings.setValue("palette", video_palette); settings.setValue("palette", video_palette);
settings.setValue("tia.zoom", 1); settings.setValue("tia.zoom", 1);
settings.setValue("tia.vsizeadjust", 0);
settings.setValue("tia.inter", false); settings.setValue("tia.inter", false);
settings.setValue("tia.vsizeadjust", 0.f);
//fastscbios //fastscbios
// Fast loading of Supercharger BIOS // Fast loading of Supercharger BIOS