[D3D] Code factorization...

Lionel Ulmer lionel.ulmer at free.fr
Fri May 30 08:55:57 CDT 2003


Now that the texture code is refactored, use it for the Unlock case.

Changelog:
 - added RECT support to the texture upload code
 - use the common code for the FB Unlock code

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c	2003-05-30 11:48:55.000000000 +0200
+++ dlls/ddraw/d3ddevice/mesa.c	2003-05-30 15:04:05.000000000 +0200
@@ -357,6 +357,9 @@
 	HeapFree(GetProcessHeap(), 0, This->view_mat);
 	HeapFree(GetProcessHeap(), 0, This->proj_mat);
 
+	if (glThis->surface_ptr)
+	    HeapFree(GetProcessHeap(), 0, glThis->surface_ptr);
+
 	DeleteCriticalSection(&(This->crit));
 	
 	ENTER_GL();
@@ -2911,13 +2914,13 @@
 #define UNLOCK_TEX_SIZE 256
 
 static void d3ddevice_flush_to_frame_buffer(IDirect3DDeviceImpl *d3d_dev, LPCRECT pRect, IDirectDrawSurfaceImpl *surf) {
-    GLenum buffer_type, buffer_color;
     RECT loc_rect;
     IDirect3DDeviceGLImpl* gl_d3d_dev = (IDirect3DDeviceGLImpl*) d3d_dev;
-    GLint depth_test, alpha_test, cull_face, lighting, min_tex, max_tex, tex_env, blend, stencil_test, fog;
+    GLint depth_test, alpha_test, cull_face, lighting, tex_env, blend, stencil_test, fog;
     GLuint initial_texture;
     GLint tex_state;
     int x, y;
+    BOOLEAN initial = FALSE;
 
     /* Note : no need here to lock the 'device critical section' as we are already protected by
        the GL critical section. */
@@ -2928,6 +2931,24 @@
     loc_rect.right = surf->surface_desc.dwWidth;
 
     TRACE(" flushing memory back to the frame-buffer (%ld,%ld) x (%ld,%ld).\n", loc_rect.top, loc_rect.left, loc_rect.right, loc_rect.bottom);
+
+    glGetIntegerv(GL_TEXTURE_BINDING_2D, &initial_texture);
+    if (gl_d3d_dev->unlock_tex == 0) {
+        glGenTextures(1, &gl_d3d_dev->unlock_tex);
+	glBindTexture(GL_TEXTURE_2D, gl_d3d_dev->unlock_tex);
+	initial = TRUE;
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    } else {
+        glBindTexture(GL_TEXTURE_2D, gl_d3d_dev->unlock_tex);
+    }
+    
+    if (upload_surface_to_tex_memory_init(surf, 0, &gl_d3d_dev->current_internal_format,
+					  initial, FALSE, UNLOCK_TEX_SIZE, UNLOCK_TEX_SIZE) != D3D_OK) {
+        ERR(" unsupported pixel format at frame buffer flush.\n");
+	glBindTexture(GL_TEXTURE_2D, initial_texture);
+	return;
+    }
 	
     glGetIntegerv(GL_DEPTH_TEST, &depth_test);
     glGetIntegerv(GL_ALPHA_TEST, &alpha_test);
@@ -2935,36 +2956,13 @@
     glGetIntegerv(GL_CULL_FACE, &cull_face);
     glGetIntegerv(GL_LIGHTING, &lighting);
     glGetIntegerv(GL_BLEND, &blend);
-    glGetIntegerv(GL_TEXTURE_BINDING_2D, &initial_texture);
     glGetIntegerv(GL_TEXTURE_2D, &tex_state);
     glGetIntegerv(GL_FOG, &fog);
-    glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &max_tex);
-    glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &min_tex);
     glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &tex_env);
     glMatrixMode(GL_TEXTURE);
     glLoadIdentity();
     /* TODO: scissor test if ever we use it ! */
     
-    if ((surf->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 16) &&
-	(surf->surface_desc.u4.ddpfPixelFormat.u2.dwRBitMask ==        0xF800) &&
-	(surf->surface_desc.u4.ddpfPixelFormat.u3.dwGBitMask ==        0x07E0) &&
-	(surf->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask ==        0x001F) &&
-	(surf->surface_desc.u4.ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000)) {
-        buffer_type = GL_UNSIGNED_SHORT_5_6_5;
-	buffer_color = GL_RGB;
-    } else if ((surf->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 32) &&
-	       (surf->surface_desc.u4.ddpfPixelFormat.u2.dwRBitMask ==        0x00FF0000) &&
-	       (surf->surface_desc.u4.ddpfPixelFormat.u3.dwGBitMask ==        0x0000FF00) &&
-	       (surf->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask ==        0x000000FF) &&
-	       (surf->surface_desc.u4.ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000)) {
-        buffer_type = GL_UNSIGNED_BYTE;
-	buffer_color = GL_BGRA;
-	glPixelStorei(GL_UNPACK_SWAP_BYTES, TRUE);
-    } else {
-        ERR(" unsupported pixel format at frame buffer flush.\n");
-	return;
-    }
-
     gl_d3d_dev->transform_state = GL_TRANSFORM_ORTHO;
     d3ddevice_set_ortho(d3d_dev);
     
@@ -2975,40 +2973,26 @@
     glViewport(0, 0, d3d_dev->surface->surface_desc.dwWidth, d3d_dev->surface->surface_desc.dwHeight);
     glScissor(loc_rect.left, surf->surface_desc.dwHeight - loc_rect.bottom,
 	      loc_rect.right - loc_rect.left, loc_rect.bottom - loc_rect.top);
-    
-    if (gl_d3d_dev->unlock_tex == 0) {
-        glGenTextures(1, &gl_d3d_dev->unlock_tex);
-	glBindTexture(GL_TEXTURE_2D, gl_d3d_dev->unlock_tex);
-	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
-		     UNLOCK_TEX_SIZE, UNLOCK_TEX_SIZE, 0,
-		     GL_RGB, buffer_type, NULL);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    } else {
-        glBindTexture(GL_TEXTURE_2D, gl_d3d_dev->unlock_tex);
-    }
-    glPixelStorei(GL_UNPACK_ROW_LENGTH, surf->surface_desc.dwWidth);
-    
-    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
     glDisable(GL_LIGHTING);
     glDisable(GL_CULL_FACE);
     glDisable(GL_ALPHA_TEST);
     glDisable(GL_STENCIL_TEST);
     glDisable(GL_BLEND);
     glDisable(GL_FOG);
-
+    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+    
     for (x = loc_rect.left; x < loc_rect.right; x += UNLOCK_TEX_SIZE) {
         for (y = loc_rect.top; y < loc_rect.bottom; y += UNLOCK_TEX_SIZE) {
 	    /* First, upload the texture... */
-	    int w = (x + UNLOCK_TEX_SIZE > surf->surface_desc.dwWidth)  ? (surf->surface_desc.dwWidth - x)  : UNLOCK_TEX_SIZE;
-	    int h = (y + UNLOCK_TEX_SIZE > surf->surface_desc.dwHeight) ? (surf->surface_desc.dwHeight - y) : UNLOCK_TEX_SIZE;
-	    glTexSubImage2D(GL_TEXTURE_2D,
-			    0,
-			    0, 0,
-			    w, h,
-			    buffer_color,
-			    buffer_type,
-			    ((char *) surf->surface_desc.lpSurface) + (x * GET_BPP(surf->surface_desc)) + (y * surf->surface_desc.u1.lPitch));
+	    RECT flush_rect;
+
+	    flush_rect.left = x;
+	    flush_rect.top = y;
+	    flush_rect.right  = (x + UNLOCK_TEX_SIZE > surf->surface_desc.dwWidth)  ? surf->surface_desc.dwWidth  : (x + UNLOCK_TEX_SIZE);
+	    flush_rect.bottom = (y + UNLOCK_TEX_SIZE > surf->surface_desc.dwHeight) ? surf->surface_desc.dwHeight : (y + UNLOCK_TEX_SIZE);
+
+	    upload_surface_to_tex_memory(&flush_rect, 0, 0, &(gl_d3d_dev->surface_ptr));
+
 	    glBegin(GL_QUADS);
 	    glColor3ub(0xFF, 0xFF, 0xFF);
 	    glTexCoord2f(0.0, 0.0);
@@ -3023,6 +3007,7 @@
 	}
     }
     
+    upload_surface_to_tex_memory_release();
     
     /* And restore all the various states modified by this code */
     if (depth_test != 0) glEnable(GL_DEPTH_TEST);
--- dlls/ddraw_CVS/d3dtexture.c	2003-05-30 11:48:55.000000000 +0200
+++ dlls/ddraw/d3dtexture.c	2003-05-30 15:03:13.000000000 +0200
@@ -121,7 +121,7 @@
 
 	    if (upload_surface_to_tex_memory_init(surf_ptr, surf_ptr->mipmap_level, &(gl_surf_ptr->current_internal_format),
 						  gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) == D3D_OK) {
-	        upload_surface_to_tex_memory(NULL, &(gl_surf_ptr->surface_ptr));
+	        upload_surface_to_tex_memory(NULL, 0, 0, &(gl_surf_ptr->surface_ptr));
 		upload_surface_to_tex_memory_release();
 		gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
 	    }
@@ -232,7 +232,7 @@
 		/* If not 'full size' and the surface is dirty, first flush it to GL before doing the copy. */
 	        if (upload_surface_to_tex_memory_init(surf_ptr, surf_ptr->mipmap_level, &(gl_surf_ptr->current_internal_format),
 						      gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) != D3D_OK) {
-		    upload_surface_to_tex_memory(NULL, &(gl_surf_ptr->surface_ptr));
+		    upload_surface_to_tex_memory(NULL, 0, 0, &(gl_surf_ptr->surface_ptr));
 		    upload_surface_to_tex_memory_release();
 		    gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
 		} else {
@@ -245,7 +245,7 @@
 		gl_surf_ptr->dirty_flag = SURFACE_MEMORY_DIRTY;
 		if (upload_surface_to_tex_memory_init(surf_ptr, surf_ptr->mipmap_level, &(gl_surf_ptr->current_internal_format),
 						       gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) != D3D_OK) {
-		    upload_surface_to_tex_memory(NULL, &(gl_surf_ptr->surface_ptr));
+		    upload_surface_to_tex_memory(NULL, 0, 0, &(gl_surf_ptr->surface_ptr));
 		    upload_surface_to_tex_memory_release();
 		    gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
 		} else {
--- dlls/ddraw_CVS/mesa.c	2003-05-30 11:48:55.000000000 +0200
+++ dlls/ddraw/mesa.c	2003-05-30 15:11:28.000000000 +0200
@@ -586,6 +586,8 @@
 static CONVERT_TYPES convert_type;
 static IDirectDrawSurfaceImpl *current_surface;
 static GLuint current_level;
+static DWORD current_tex_width;
+static DWORD current_tex_height;
 
 HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLuint level, GLenum *current_internal_format,
 					  BOOLEAN need_to_alloc, BOOLEAN need_alpha_ck, DWORD tex_width, DWORD tex_height)
@@ -617,6 +619,9 @@
 	tex_height = surf_ptr->surface_desc.dwHeight;
     }
 
+    current_tex_width = tex_width;
+    current_tex_height = tex_height;
+
     if (src_pf->dwFlags & DDPF_PALETTEINDEXED8) {
 	/* ****************
 	   Paletted Texture
@@ -820,18 +825,32 @@
     return DD_OK;
 }
 
-HRESULT upload_surface_to_tex_memory(RECT *rect, void **temp_buffer)
+HRESULT upload_surface_to_tex_memory(RECT *rect, DWORD xoffset, DWORD yoffset, void **temp_buffer)
 {
     const DDSURFACEDESC * const src_d = (DDSURFACEDESC *)&(current_surface->surface_desc);
     void *surf_buffer = NULL;
+    RECT lrect;
+    DWORD width, height;
+    BYTE bpp = GET_BPP(current_surface->surface_desc);
+
+    if (rect == NULL) {
+	lrect.top = 0;
+	lrect.left = 0;
+	lrect.bottom = current_tex_height;
+	lrect.right = current_tex_width;
+	rect = &lrect;
+    }
+
+    width = rect->right - rect->left;
+    height = rect->bottom - rect->top;
 
     switch (convert_type) {
         case CONVERT_PALETTED: {
 	    IDirectDrawPaletteImpl* pal = current_surface->palette;
 	    BYTE table[256][4];
 	    int i;
-	    BYTE *src = (BYTE *) src_d->lpSurface, *dst;
-	    	    
+	    BYTE *src = (BYTE *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
+	    
 	    if (pal == NULL) {
 		/* Upload a black texture. The real one will be uploaded on palette change */
 		WARN("Palettized texture Loading with a NULL palette !\n");
@@ -856,10 +875,10 @@
 	    
 	    if (*temp_buffer == NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
-					 src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));
+					 current_tex_width * current_tex_height * sizeof(DWORD));
 	    dst = (BYTE *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		BYTE color = *src++;
 		*dst++ = table[color][0];
 		*dst++ = table[color][1];
@@ -880,14 +899,14 @@
 	              color-space or not ?
 	    */
 	    DWORD i;
-	    WORD *src = (WORD *) src_d->lpSurface, *dst;
+	    WORD *src = (WORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+					 current_tex_width * current_tex_height * sizeof(WORD));
 	    dst = (WORD *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		WORD color = *src++;
 		*dst = ((color & 0xFFC0) | ((color & 0x1F) << 1));
 		if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -900,14 +919,14 @@
         case CONVERT_CK_5551: {
 	    /* Change the alpha value of the color-keyed pixels to emulate color-keying. */
 	    DWORD i;
-	    WORD *src = (WORD *) src_d->lpSurface, *dst;
+	    WORD *src = (WORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+					 current_tex_width * current_tex_height * sizeof(WORD));
 	    dst = (WORD *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		WORD color = *src++;
 		*dst = color & 0xFFFE;
 		if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -920,14 +939,14 @@
         case CONVERT_CK_4444: {
 	    /* Change the alpha value of the color-keyed pixels to emulate color-keying. */
 	    DWORD i;
-	    WORD *src = (WORD *) src_d->lpSurface, *dst;
+	    WORD *src = (WORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+					 current_tex_width * current_tex_height * sizeof(WORD));
 	    dst = (WORD *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		WORD color = *src++;
 		*dst = color & 0xFFF0;
 		if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -940,14 +959,14 @@
         case CONVERT_CK_4444_ARGB: {
 	    /* Move the four Alpha bits... */
 	    DWORD i;
-	    WORD *src = (WORD *) src_d->lpSurface, *dst;
+	    WORD *src = (WORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+					 current_tex_width * current_tex_height * sizeof(WORD));
 	    dst = (WORD *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		WORD color = *src++;
 		*dst = (color & 0x0FFF) << 4;
 		if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -959,14 +978,14 @@
 	
         case CONVERT_CK_1555: {
 	    DWORD i;
-	    WORD *src = (WORD *) src_d->lpSurface, *dst;
+	    WORD *src = (WORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+					 current_tex_width * current_tex_height * sizeof(WORD));
 	    dst = (WORD *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		WORD color = *src++;
 		*dst = (color & 0x7FFF) << 1;
 		if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -979,15 +998,15 @@
         case CONVERT_555: {
 	    /* Converting the 0555 format in 5551 packed */
 	    DWORD i;
-	    WORD *src = (WORD *) src_d->lpSurface, *dst;
+	    WORD *src = (WORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(WORD));
+					 current_tex_width * current_tex_height * sizeof(WORD));
 	    dst = (WORD *) *temp_buffer;
 	    
 	    if (src_d->dwFlags & DDSD_CKSRCBLT) {
-		for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+		for (i = 0; i < height * width; i++) {
 		    WORD color = *src++;
 		    *dst = (color & 0x7FFF) << 1;
 		    if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -996,7 +1015,7 @@
 		    dst++;
 		}
 	    } else {
-		for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+		for (i = 0; i < height * width; i++) {
 		    WORD color = *src++;
 		    *dst++ = ((color & 0x7FFF) << 1) | 0x0001;
 		}
@@ -1007,15 +1026,15 @@
         case CONVERT_CK_RGB24: {
 	    /* This is a pain :-) */
 	    DWORD i;
-	    BYTE *src = (BYTE *) src_d->lpSurface;
+	    BYTE *src = (BYTE *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top));
 	    DWORD *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));
+					 current_tex_width * current_tex_height * sizeof(DWORD));
 	    dst = (DWORD *) *temp_buffer;
 
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		DWORD color = *((DWORD *) src) & 0x00FFFFFF;
 		src += 3;
 		*dst = *src++ << 8;
@@ -1029,14 +1048,14 @@
         case CONVERT_CK_8888: {
 	    /* Just use the alpha component to handle color-keying... */
 	    DWORD i;
-	    DWORD *src = (DWORD *) src_d->lpSurface, *dst;
+	    DWORD *src = (DWORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));	    
+					 current_tex_width * current_tex_height * sizeof(DWORD));	    
 	    dst = (DWORD *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		DWORD color = *src++;
 		*dst = color & 0xFFFFFF00;
 		if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -1048,14 +1067,14 @@
 	
         case CONVERT_CK_8888_ARGB: {
 	    DWORD i;
-	    DWORD *src = (DWORD *) src_d->lpSurface, *dst;
+	    DWORD *src = (DWORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));	    
+					 current_tex_width * current_tex_height * sizeof(DWORD));	    
 	    dst = (DWORD *) *temp_buffer;
 	    
-	    for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+	    for (i = 0; i < height * width; i++) {
 		DWORD color = *src++;
 		*dst = (color & 0x00FFFFFF) << 8;
 		if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -1068,15 +1087,15 @@
         case CONVERT_RGB32_888: {
 	    /* Just add an alpha component and handle color-keying... */
 	    DWORD i;
-	    DWORD *src = (DWORD *) src_d->lpSurface, *dst;
+	    DWORD *src = (DWORD *) (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top)), *dst;
 	    
 	    if (*temp_buffer != NULL)
 		*temp_buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-					 src_d->dwWidth * src_d->dwHeight * sizeof(DWORD));	    
+					 current_tex_width * current_tex_height * sizeof(DWORD));	    
 	    dst = (DWORD *) *temp_buffer;
 	    
 	    if (src_d->dwFlags & DDSD_CKSRCBLT) {
-		for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+		for (i = 0; i < height * width; i++) {
 		    DWORD color = *src++;
 		    *dst = color << 8;
 		    if ((color < src_d->ddckCKSrcBlt.dwColorSpaceLowValue) ||
@@ -1085,7 +1104,7 @@
 		    dst++;
 		}
 	    } else {
-		for (i = 0; i < src_d->dwHeight * src_d->dwWidth; i++) {
+		for (i = 0; i < height * width; i++) {
 		    *dst++ = (*src++ << 8) | 0xFF;
 		}
 	    }
@@ -1093,7 +1112,7 @@
 
         case NO_CONVERSION:
 	    /* Nothing to do here as the name suggests... This just prevents a compiler warning */
-	    surf_buffer = src_d->lpSurface;
+	    surf_buffer = (((BYTE *) src_d->lpSurface) + (bpp * rect->left) + (src_d->u1.lPitch * rect->top));
 	    break;
     }
 
@@ -1103,8 +1122,8 @@
     
     glTexSubImage2D(GL_TEXTURE_2D,
 		    current_level,
-		    0, 0,
-		    src_d->dwWidth, src_d->dwHeight,
+		    xoffset, yoffset,
+		    width, height,
 		    current_format,
 		    current_pixel_format,
 		    surf_buffer);
--- dlls/ddraw_CVS/mesa_private.h	2003-05-30 11:48:55.000000000 +0200
+++ dlls/ddraw/mesa_private.h	2003-05-30 15:02:43.000000000 +0200
@@ -105,7 +105,11 @@
     Display  *display;
     Drawable drawable;
 
+    /* Variables used for the flush to frame-buffer code using the texturing code */
     GLuint unlock_tex;
+    void *surface_ptr;
+    GLenum current_internal_format;
+    
     SURFACE_STATE state, front_state;
     IDirectDrawSurfaceImpl *lock_surf, *front_lock_surf;
 } IDirect3DDeviceGLImpl;
@@ -149,7 +153,7 @@
 /* Memory to texture conversion code. Split in three functions to do some optimizations. */
 extern HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surface, GLuint level, GLenum *prev_internal_format,
 						 BOOLEAN need_to_alloc, BOOLEAN need_alpha_ck, DWORD tex_width, DWORD tex_height);
-extern HRESULT upload_surface_to_tex_memory(RECT *rect, void **temp_buffer);
+extern HRESULT upload_surface_to_tex_memory(RECT *rect, DWORD xoffset, DWORD yoffset, void **temp_buffer);
 extern HRESULT upload_surface_to_tex_memory_release(void);
 
 #endif /* HAVE_OPENGL */


More information about the wine-patches mailing list