GTK: Change the OpenGL texture size when changing scaler size. Thanks to fernandotcl for the patch.
This commit is contained in:
parent
de6db92249
commit
2009faab00
|
@ -29,7 +29,7 @@ template<typename T> T max( T x, T y ) { return x > y ? x : y; }
|
||||||
ScreenAreaGl::ScreenAreaGl(int _iWidth, int _iHeight, int _iScale) :
|
ScreenAreaGl::ScreenAreaGl(int _iWidth, int _iHeight, int _iScale) :
|
||||||
ScreenArea(_iWidth, _iHeight, _iScale),
|
ScreenArea(_iWidth, _iHeight, _iScale),
|
||||||
m_uiScreenTexture(0),
|
m_uiScreenTexture(0),
|
||||||
m_iTextureSize(256)
|
m_iTextureSize(0)
|
||||||
{
|
{
|
||||||
Glib::RefPtr<Gdk::GL::Config> glconfig;
|
Glib::RefPtr<Gdk::GL::Config> glconfig;
|
||||||
|
|
||||||
|
@ -46,6 +46,23 @@ ScreenAreaGl::ScreenAreaGl(int _iWidth, int _iHeight, int _iScale) :
|
||||||
vUpdateSize();
|
vUpdateSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScreenAreaGl::vUpdateTexture()
|
||||||
|
{
|
||||||
|
// Calculate the new texture size as a the smallest working power of two
|
||||||
|
// TODO: Support the ARB_texture_rectangle extension
|
||||||
|
int iExpX = 0, iExpY = 0;
|
||||||
|
for (int i = m_iScaledWidth; i; i >>= 1, ++iExpX);
|
||||||
|
for (int i = m_iScaledHeight; i; i >>= 1, ++iExpY);
|
||||||
|
int iNewTextureSize = 1 << max(iExpX, iExpY);
|
||||||
|
|
||||||
|
// Notify the system if the texture size changed
|
||||||
|
if (iNewTextureSize != m_iTextureSize) {
|
||||||
|
m_iTextureSize = iNewTextureSize;
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, iNewTextureSize, iNewTextureSize,
|
||||||
|
0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ScreenAreaGl::on_realize()
|
void ScreenAreaGl::on_realize()
|
||||||
{
|
{
|
||||||
Gtk::DrawingArea::on_realize();
|
Gtk::DrawingArea::on_realize();
|
||||||
|
@ -60,8 +77,6 @@ void ScreenAreaGl::on_realize()
|
||||||
if (glIsTexture(m_uiScreenTexture))
|
if (glIsTexture(m_uiScreenTexture))
|
||||||
glDeleteTextures(1, &m_uiScreenTexture);
|
glDeleteTextures(1, &m_uiScreenTexture);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
|
@ -76,19 +91,7 @@ void ScreenAreaGl::on_realize()
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
// Calculate texture size as a the smallest working power of two
|
vUpdateTexture();
|
||||||
float n1 = log10((float)m_iScaledWidth ) / log10( 2.0f);
|
|
||||||
float n2 = log10((float)m_iScaledHeight ) / log10( 2.0f);
|
|
||||||
float n = (n1 > n2)? n1 : n2;
|
|
||||||
|
|
||||||
// round up
|
|
||||||
if (((float)((int)n)) != n)
|
|
||||||
n = ((float)((int)n)) + 1.0f;
|
|
||||||
|
|
||||||
m_iTextureSize = (int)pow(2.0f, n);
|
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_iTextureSize, m_iTextureSize, 0,
|
|
||||||
GL_BGRA, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
@ -171,4 +174,18 @@ bool ScreenAreaGl::on_expose_event(GdkEventExpose * _pstEvent)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScreenAreaGl::vOnSizeUpdated()
|
||||||
|
{
|
||||||
|
if (!is_realized())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window();
|
||||||
|
if (!glwindow->gl_begin(get_gl_context()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
vUpdateTexture();
|
||||||
|
|
||||||
|
glwindow->gl_end();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace VBA
|
} // namespace VBA
|
||||||
|
|
|
@ -42,9 +42,9 @@ protected:
|
||||||
private:
|
private:
|
||||||
GLuint m_uiScreenTexture;
|
GLuint m_uiScreenTexture;
|
||||||
int m_iTextureSize;
|
int m_iTextureSize;
|
||||||
/* double m_dAreaTop;
|
|
||||||
double m_dAreaLeft;
|
void vUpdateTexture();
|
||||||
double m_dScaleFactor;*/
|
void vOnSizeUpdated();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace VBA
|
} // namespace VBA
|
||||||
|
|
|
@ -224,6 +224,8 @@ void ScreenArea::vUpdateSize()
|
||||||
memset(m_puiPixels, 0, (m_iScaledWidth + 1) * m_iScaledHeight * sizeof(u32));
|
memset(m_puiPixels, 0, (m_iScaledWidth + 1) * m_iScaledHeight * sizeof(u32));
|
||||||
memset(m_puiDelta, 255, (m_iWidth + 2) * (m_iHeight + 2) * sizeof(u32));
|
memset(m_puiDelta, 255, (m_iWidth + 2) * (m_iHeight + 2) * sizeof(u32));
|
||||||
|
|
||||||
|
vOnSizeUpdated();
|
||||||
|
|
||||||
set_size_request(m_iScale * m_iWidth, m_iScale * m_iHeight);
|
set_size_request(m_iScale * m_iWidth, m_iScale * m_iHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ protected:
|
||||||
virtual bool on_leave_notify_event(GdkEventCrossing * _pstEvent);
|
virtual bool on_leave_notify_event(GdkEventCrossing * _pstEvent);
|
||||||
virtual bool on_configure_event(GdkEventConfigure * event);
|
virtual bool on_configure_event(GdkEventConfigure * event);
|
||||||
virtual bool bOnCursorTimeout();
|
virtual bool bOnCursorTimeout();
|
||||||
|
virtual void vOnSizeUpdated() {}
|
||||||
|
|
||||||
int m_iWidth;
|
int m_iWidth;
|
||||||
int m_iHeight;
|
int m_iHeight;
|
||||||
|
|
|
@ -109,7 +109,7 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="use_action_appearance">False</property>
|
<property name="use_action_appearance">False</property>
|
||||||
<property name="label" translatable="yes">gtk-media-pause</property>
|
<property name="label" translatable="yes">Pause</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/>
|
<accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/>
|
||||||
</object>
|
</object>
|
||||||
|
|
Loading…
Reference in New Issue