virtual int getRatio() const = 0;
virtual void prepare() = 0;
virtual void finish() = 0;
+ virtual void pause() = 0;
+ virtual void resume() = 0;
};
class ScalerFactory
{
SDL_UpdateRects(m_screen, 1, &m_area);
};
+
+ void pause() { };
+ void resume() { };
};
const DummyScaler::Factory DummyScaler::factory;
SDL_UpdateRects(m_screen, 1, &m_area);
};
+
+ void pause() { };
+ void resume() { };
};
const ARMScaler::Factory ARMScaler::factory;
#endif
SDL_UpdateRects(m_screen, 1, &m_area);
};
+
+ void pause() { };
+ void resume() { };
};
const SWScaler::Factory SWScaler::factory;
SDL_Surface* m_screen;
SDL_Rect m_area;
SDL_Rect m_real_area;
+ bool m_should_enable, m_enabled; // Try to avoid flicker.
static void setDoubling(bool enable)
{
}
XSPScaler(SDL_Surface* screen, int w, int h)
- : m_screen(screen)
+ : m_screen(screen), m_enabled(false), m_should_enable(true)
{
centerRectangle(m_area, GUI.Width, GUI.Height,
w * 2, h * 2);
- setDoubling(true);
m_real_area.x = m_area.x;
m_real_area.y = m_area.y;
public:
~XSPScaler()
{
- setDoubling(false);
+ if (m_enabled) setDoubling(false);
};
class Factory : public ScalerFactory
return 2;
};
- void prepare() { };
+ void prepare()
+ {
+ if (m_should_enable && !m_enabled) {
+ setDoubling(true);
+ m_enabled = true;
+ }
+ };
void finish()
{
SDL_UpdateRects(m_screen, 1, &m_real_area);
};
+
+ void pause()
+ {
+ m_should_enable = false;
+ if (m_enabled) {
+ setDoubling(false);
+ m_enabled = false;
+ }
+ };
+
+ void resume()
+ {
+ m_should_enable = true; // Will enable later
+ };
};
const XSPScaler::Factory XSPScaler::factory;
#endif
if (Config.touchscreenInput) {
S9xInputScreenChanged();
if (Config.touchscreenShow) {
+ scaler->pause();
S9xInputScreenDraw(Settings.SixteenBit ? 2 : 1,
screen->pixels, screen->pitch);
SDL_Flip(screen);
+ scaler->resume();
}
}
}