Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorvald Natvig <slicer@users.sourceforge.net>2010-01-28 14:15:22 +0300
committerThorvald Natvig <slicer@users.sourceforge.net>2010-01-28 14:15:22 +0300
commitd87855071a9b4ad417d1f1ba6846361e4ff688de (patch)
tree17ad4b2a9a27c4524430cad3022b4756f9138290 /overlay
parentfc767343be218917fe481a2fec96417aef829b2b (diff)
Use glPixelStorei for subtexture updates on Win32
Diffstat (limited to 'overlay')
-rw-r--r--overlay/opengl.cpp20
1 files changed, 9 insertions, 11 deletions
diff --git a/overlay/opengl.cpp b/overlay/opengl.cpp
index 35a6768a6..df7fc8241 100644
--- a/overlay/opengl.cpp
+++ b/overlay/opengl.cpp
@@ -85,6 +85,8 @@ typedef double GLdouble;
#define GL_TEXTURE_ENV 0x2300
#define GL_TEXTURE_ENV_MODE 0x2200
#define GL_REPLACE 0x1E01
+#define GL_PACK_ROW_LENGTH 0x0D02
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
#define TDEF(ret, name, arg) typedef ret (__stdcall * t##name) arg
#define GLDEF(ret, name, arg) TDEF(ret, name, arg); t##name o##name = NULL
@@ -113,6 +115,7 @@ GLDEF(void, glTexParameteri, (GLenum, GLenum, GLint));
GLDEF(void, glTexEnvi, (GLenum, GLenum, GLint));
GLDEF(void, glTexImage2D, (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *));
GLDEF(void, glTexSubImage2D, (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *));
+GLDEF(void, glPixelStorei, (GLenum, GLint));
GLDEF(void, wglMakeCurrent, (HDC, HGLRC));
GLDEF(HGLRC, wglGetCurrentContext, (void));
GLDEF(HDC, wglGetCurrentDC, (void));
@@ -191,17 +194,11 @@ void Context::blit(unsigned int x, unsigned int y, unsigned int w, unsigned int
if ((x == 0) && (y == 0) && (w == uiWidth) && (h == uiHeight)) {
oglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, uiWidth, uiHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, a_ucTexture);
} else {
- unsigned char *ptr = new unsigned char[w*h*4];
- memset(ptr, 0xff, w * h * 4);
-
- for (int r = 0; r < h; ++r) {
- const unsigned char *sptr = a_ucTexture + 4 * ((y+r) * uiWidth + x);
- unsigned char *dptr = ptr + 4 * w * r;
- memcpy(dptr, sptr, w * 4);
- }
-
- oglTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_BGRA, GL_UNSIGNED_BYTE, ptr);
- delete [] ptr;
+ if (w != uiWidth)
+ oglPixelStorei(GL_UNPACK_ROW_LENGTH, uiWidth);
+ oglTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_BGRA, GL_UNSIGNED_BYTE, a_ucTexture + 4 * (y * uiWidth + x));
+ if (w != uiWidth)
+ oglPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
}
}
@@ -393,6 +390,7 @@ void checkOpenGLHook() {
GLDEF(glTexEnvi);
GLDEF(glTexImage2D);
GLDEF(glTexSubImage2D);
+ GLDEF(glPixelStorei);
GLDEF(wglMakeCurrent);
GLDEF(wglGetCurrentContext);
GLDEF(wglGetCurrentDC);