[D3D 47] Code rework / factorization

Lionel Ulmer lionel.ulmer at free.fr
Tue Dec 24 12:33:08 CST 2002


Changelog:
 Factorize some code in the texture uploading function

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dtexture.c	2002-12-24 17:25:27.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dtexture.c	2002-12-24 18:27:37.000000000 +0100
@@ -146,6 +146,10 @@
 #endif
     void (*ptr_ColorTableEXT) (GLenum target, GLenum internalformat,
 			       GLsizei width, GLenum format, GLenum type, const GLvoid *table) = NULL;
+    BOOL upload_done = FALSE;
+    BOOL error = FALSE;
+    GLenum format, pixel_format;
+    VOID *surface = NULL;
 
     DDSURFACEDESC *src_d = (DDSURFACEDESC *)&(This->surface_desc);
 
@@ -174,6 +178,7 @@
 	
 	if (pal == NULL) {
 	    ERR("Palettized texture Loading with a NULL palette !\n");
+	    glBindTexture(GL_TEXTURE_2D, current_texture);
 	    return;
 	}
 	/* Get the surface's palette */
@@ -206,10 +211,14 @@
 			 GL_COLOR_INDEX,      /* texture format */
 			 GL_UNSIGNED_BYTE,    /* texture type */
 			 src_d->lpSurface); /* the texture */
+
+	    upload_done = TRUE;
 	} else {
-	    DWORD *surface = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));
 	    DWORD i;
-	    BYTE *src = (BYTE *) src_d->lpSurface, *dst = (BYTE *) surface;
+	    BYTE *src = (BYTE *) src_d->lpSurface, *dst;
+	    
+	    surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));
+	    dst = (BYTE *) surface;
 	    
 	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
 	        BYTE color = *src++;
@@ -219,25 +228,8 @@
 		*dst++ = table[color][3];
 	    }
 	    
-	    if (init_upload)
-	        glTexImage2D(GL_TEXTURE_2D,
-			     This->mipmap_level,
-			     GL_RGBA,
-			     src_d->dwWidth, src_d->dwHeight,
-			     0,
-			     GL_RGBA,
-			     GL_UNSIGNED_BYTE,
-			     surface);
-	    else
-	        glTexSubImage2D(GL_TEXTURE_2D,
-				This->mipmap_level,
-				0, 0,
-				src_d->dwWidth, src_d->dwHeight,
-				GL_RGBA,
-				GL_UNSIGNED_BYTE,
-				surface);
-	    
-	    HeapFree(GetProcessHeap(), 0, surface);
+	    format = GL_RGBA;
+	    pixel_format = GL_UNSIGNED_BYTE;
 	}
     } else if (src_d->ddpfPixelFormat.dwFlags & DDPF_RGB) {
 	    /* ************
@@ -247,186 +239,89 @@
 	        /* **********************
 		   GL_UNSIGNED_BYTE_3_3_2
 		   ********************** */
-	    if (init_upload)
-	        glTexImage2D(GL_TEXTURE_2D,
-			     This->mipmap_level,
-			     GL_RGB,
-			     src_d->dwWidth, src_d->dwHeight,
-			     0,
-			     GL_RGB,
-			     GL_UNSIGNED_BYTE_3_3_2,
-			     src_d->lpSurface);
-	    else
-	        glTexSubImage2D(GL_TEXTURE_2D,
-				This->mipmap_level,
-				0, 0,
-				src_d->dwWidth, src_d->dwHeight,
-				GL_RGB,
-				GL_UNSIGNED_BYTE_3_3_2,
-				src_d->lpSurface);
+	    format = GL_RGB;
+	    pixel_format = GL_UNSIGNED_BYTE_3_3_2;
 	} else if (src_d->ddpfPixelFormat.u1.dwRGBBitCount == 16) {
   	    if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000) {
-		if (init_upload)
-		    glTexImage2D(GL_TEXTURE_2D,
-				 This->mipmap_level,
-				 GL_RGB,
-				 src_d->dwWidth, src_d->dwHeight,
-				 0,
-				 GL_RGB,
-				 GL_UNSIGNED_SHORT_5_6_5,
-				 src_d->lpSurface);
-		else
-		    glTexSubImage2D(GL_TEXTURE_2D,
-				    This->mipmap_level,
-				    0, 0,
-				    src_d->dwWidth, src_d->dwHeight,
-				    GL_RGB,
-				    GL_UNSIGNED_SHORT_5_6_5,
-				    src_d->lpSurface);
-
+	        format = GL_RGB;
+		pixel_format = GL_UNSIGNED_SHORT_5_6_5;
 	    } else if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000001) {
-		if (init_upload)
-		    glTexImage2D(GL_TEXTURE_2D,
-				 This->mipmap_level,
-				 GL_RGBA,
-				 src_d->dwWidth, src_d->dwHeight,
-				 0,
-				 GL_RGBA,
-				 GL_UNSIGNED_SHORT_5_5_5_1,
-				 src_d->lpSurface);
-		else
-		    glTexSubImage2D(GL_TEXTURE_2D,
-				    This->mipmap_level,
-				    0, 0,
-				    src_d->dwWidth, src_d->dwHeight,
-				    GL_RGBA,
-				    GL_UNSIGNED_SHORT_5_5_5_1,
-				    src_d->lpSurface);
+	        format = GL_RGBA;
+		pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
 	    } else if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000000F) {
-	        if (init_upload)
-		    glTexImage2D(GL_TEXTURE_2D,
-				 This->mipmap_level,
-				 GL_RGBA,
-				 src_d->dwWidth, src_d->dwHeight,
-				 0,
-				 GL_RGBA,
-				 GL_UNSIGNED_SHORT_4_4_4_4,
-				 src_d->lpSurface);
-		else
-		    glTexSubImage2D(GL_TEXTURE_2D,
-				    This->mipmap_level,
-				    0, 0,
-				    src_d->dwWidth, src_d->dwHeight,
-				    GL_RGBA,
-				    GL_UNSIGNED_SHORT_4_4_4_4,
-				    src_d->lpSurface);
+	        format = GL_RGBA;
+		pixel_format = GL_UNSIGNED_SHORT_4_4_4_4;	      
 	    } else if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000F000) {
 	        /* Move the four Alpha bits... */
-	        WORD *surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
 		DWORD i;
-		WORD *src = (WORD *) src_d->lpSurface, *dst = surface;
+		WORD *src = (WORD *) src_d->lpSurface, *dst;
+		
+		surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+		dst = surface;
 		
 		for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
 		    *dst++ = (((*src & 0xFFF0) >>  4) |
 			      ((*src & 0x000F) << 12));
 		    src++;
 		}
-		
-		if (init_upload)
-		    glTexImage2D(GL_TEXTURE_2D,
-				 This->mipmap_level,
-				 GL_RGBA,
-				 src_d->dwWidth, src_d->dwHeight,
-				 0,
-				 GL_RGBA,
-				 GL_UNSIGNED_SHORT_4_4_4_4,
-				 surface);
-		else
-		    glTexSubImage2D(GL_TEXTURE_2D,
-				    This->mipmap_level,
-				    0, 0,
-				    src_d->dwWidth, src_d->dwHeight,
-				    GL_RGBA,
-				    GL_UNSIGNED_SHORT_4_4_4_4,
-				    surface);
-		
-		HeapFree(GetProcessHeap(), 0, surface);
+
+	        format = GL_RGBA;
+		pixel_format = GL_UNSIGNED_SHORT_4_4_4_4; 		
 	    } else if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00008000) {
 	        /* Converting the 1555 format in 5551 packed */
-	        WORD *surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
 		DWORD i;
-		WORD *src = (WORD *) src_d->lpSurface, *dst = surface;
+		WORD *src = (WORD *) src_d->lpSurface, *dst;
 		
+		surface = (WORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+		dst = (WORD *) surface;
 		for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
 		    *dst++ = (((*src & 0x8000) >> 15) |
 			      ((*src & 0x7FFF) <<  1));
 		    src++;
 		}
 		
-		if (init_upload)
-		    glTexImage2D(GL_TEXTURE_2D,
-				 This->mipmap_level,
-				 GL_RGBA,
-				 src_d->dwWidth, src_d->dwHeight,
-				 0,
-				 GL_RGBA,
-				 GL_UNSIGNED_SHORT_5_5_5_1,
-				 surface);
-		else
-		    glTexSubImage2D(GL_TEXTURE_2D,
-				    This->mipmap_level,
-				    0, 0,
-				    src_d->dwWidth, src_d->dwHeight,
-				    GL_RGBA,
-				    GL_UNSIGNED_SHORT_5_5_5_1,
-				    surface);
-
-		HeapFree(GetProcessHeap(), 0, surface);
+	        format = GL_RGBA;
+		pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
 	    } else {
 	        ERR("Unhandled texture format (bad Aplha channel for a 16 bit texture)\n");
+		error = TRUE;
 	    }
 	} else if (src_d->ddpfPixelFormat.u1.dwRGBBitCount == 24) {
-	    if (init_upload)
-	        glTexImage2D(GL_TEXTURE_2D,
-			     This->mipmap_level,
-			     GL_RGB,
-			     src_d->dwWidth, src_d->dwHeight,
-			     0,
-			     GL_RGB,
-			     GL_UNSIGNED_BYTE,
-			     src_d->lpSurface);
-	    else
-	        glTexSubImage2D(GL_TEXTURE_2D,
-				This->mipmap_level,
-				0, 0,
-				src_d->dwWidth, src_d->dwHeight,
-				GL_RGB,
-				GL_UNSIGNED_BYTE,
-				src_d->lpSurface);
+	    format = GL_RGB;
+	    pixel_format = GL_UNSIGNED_BYTE;
 	} else if (src_d->ddpfPixelFormat.u1.dwRGBBitCount == 32) {
-	    if (init_upload)
-	        glTexImage2D(GL_TEXTURE_2D,
-			     This->mipmap_level,
-			     GL_RGBA,
-			     src_d->dwWidth, src_d->dwHeight,
-			     0,
-			     GL_RGBA,
-			     GL_UNSIGNED_BYTE,
-			     src_d->lpSurface);
-	    else
-	        glTexSubImage2D(GL_TEXTURE_2D,
-				This->mipmap_level,
-				0, 0,
-				src_d->dwWidth, src_d->dwHeight,
-				GL_RGBA,
-				GL_UNSIGNED_BYTE,
-				src_d->lpSurface);
+	    format = GL_RGBA;
+	    pixel_format = GL_UNSIGNED_BYTE;
 	} else {
 	    ERR("Unhandled texture format (bad RGB count)\n");
+	    error = TRUE;
 	}
     } else {
         ERR("Unhandled texture format (neither RGB nor INDEX)\n");
-    }    
+	error = TRUE;
+    } 
+
+    if ((upload_done == FALSE) && (error == FALSE)) {
+        if (init_upload)
+	    glTexImage2D(GL_TEXTURE_2D,
+			 This->mipmap_level,
+			 format,
+			 src_d->dwWidth, src_d->dwHeight,
+			 0,
+			 format,
+			 pixel_format,
+			 surface == NULL ? src_d->lpSurface : surface);
+	else
+	    glTexSubImage2D(GL_TEXTURE_2D,
+			    This->mipmap_level,
+			    0, 0,
+			    src_d->dwWidth, src_d->dwHeight,
+			    format,
+			    pixel_format,
+			    surface == NULL ? src_d->lpSurface : surface);
+	if (surface) HeapFree(GetProcessHeap(), 0, surface);
+    }
+
     glBindTexture(GL_TEXTURE_2D, current_texture);
 }
 


More information about the wine-patches mailing list