Check unpack align for alpha texture updates, do single texsubimage2d call (thanks Hugh)
This commit is contained in:
@@ -270,21 +270,67 @@ namespace lime {
|
|||||||
//mPixelWidth, mPixelHeight);
|
//mPixelWidth, mPixelHeight);
|
||||||
|
|
||||||
PixelFormat fmt = inSurface->Format ();
|
PixelFormat fmt = inSurface->Format ();
|
||||||
|
int pw = inSurface->BytesPP ();
|
||||||
GLuint store_format = (fmt == pfAlpha ? GL_ALPHA : GL_RGBA);
|
GLuint store_format = (fmt == pfAlpha ? GL_ALPHA : GL_RGBA);
|
||||||
glGetError ();
|
glGetError ();
|
||||||
const uint8 *p0 = inSurface->Row (mDirtyRect.y) + (mDirtyRect.x * inSurface->BytesPP ());
|
|
||||||
|
int x0 = mDirtyRect.x;
|
||||||
|
int y0 = mDirtyRect.y;
|
||||||
|
int dw = mDirtyRect.w;
|
||||||
|
int dh = mDirtyRect.h;
|
||||||
|
|
||||||
#if defined(LIME_GLES)
|
#if defined(LIME_GLES)
|
||||||
// TODO: pixel transform & copy rect
|
|
||||||
for (int y = 0; y < mDirtyRect.h; y++) {
|
uint8 *buffer = 0;
|
||||||
|
if (pw == 1) {
|
||||||
|
|
||||||
glTexSubImage2D (GL_TEXTURE_2D, 0, mDirtyRect.x, mDirtyRect.y + y, mDirtyRect.w, 1, store_format, GL_UNSIGNED_BYTE, p0 + (y * inSurface->GetStride ()));
|
// Make unpack align a multiple of 4 ...
|
||||||
|
if (inSurface->Width () > 3) {
|
||||||
|
|
||||||
|
dw = (dw + 3) & ~3;
|
||||||
|
if (x0 + dw > inSurface->Width ()) {
|
||||||
|
|
||||||
|
x0 = inSurface->Width () - dw;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint8 *p0 = inSurface->Row (y0) + (x0 * pw);
|
||||||
|
buffer = (uint8 *)malloc (pw * dw * dh);
|
||||||
|
|
||||||
|
for (int y = 0; y < dh; y++) {
|
||||||
|
|
||||||
|
memcpy (buffer + (y * dw), p0, dw);
|
||||||
|
p0 += inSurface->GetStride ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// TODO: pre-alpha ?
|
||||||
|
buffer = (uint8 *)malloc (pw * dw * dh);
|
||||||
|
const uint8 *p0 = inSurface->Row (y0) + (x0 * pw);
|
||||||
|
|
||||||
|
for (int y = 0; y < mDirtyRect.h; y++) {
|
||||||
|
|
||||||
|
memcpy (buffer + (y * dw * pw), p0, dw * pw);
|
||||||
|
p0 += inSurface->GetStride ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glTexSubImage2D (GL_TEXTURE_2D, 0, x0, y0, dw, dh, store_format, GL_UNSIGNED_BYTE, buffer);
|
||||||
|
free (buffer);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
const uint8 *p0 = inSurface->Row (y0) + (x0 * pw);
|
||||||
glPixelStorei (GL_UNPACK_ROW_LENGTH, inSurface->Width ());
|
glPixelStorei (GL_UNPACK_ROW_LENGTH, inSurface->Width ());
|
||||||
glTexSubImage2D (GL_TEXTURE_2D, 0, mDirtyRect.x, mDirtyRect.y, mDirtyRect.w, mDirtyRect.h, store_format, GL_UNSIGNED_BYTE, p0);
|
glTexSubImage2D (GL_TEXTURE_2D, 0, x0, y0, dw, dh, store_format, GL_UNSIGNED_BYTE, p0);
|
||||||
glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int err = glGetError ();
|
int err = glGetError ();
|
||||||
|
|||||||
Reference in New Issue
Block a user