Stefan Dösinger : wined3d: Allocate 4 extra bytes in the dib section.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jul 17 07:00:18 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 5702a310e998d29f3e1f8413d127d364d5c1fdd5
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=5702a310e998d29f3e1f8413d127d364d5c1fdd5

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Sun Jul 16 10:08:26 2006 +0200

wined3d: Allocate 4 extra bytes in the dib section.

---

 dlls/wined3d/surface.c |   30 ++++++++++++++++++++++++++++--
 1 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index b827fa8..ce4e384 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -781,6 +781,7 @@ static HRESULT WINAPI IWineD3DSurfaceImp
             GLint  prev_store;
             GLint  prev_depth_test;
             GLint  prev_rasterpos[4];
+            int tex;
 
             /* Some drivers(radeon dri, others?) don't like exceptions during
              * glDrawPixels. If the surface is a DIB section, it might be in GDIMode
@@ -827,6 +828,17 @@ static HRESULT WINAPI IWineD3DSurfaceImp
             glGetIntegerv(GL_UNPACK_ROW_LENGTH, &skipBytes);
             glPixelStorei(GL_UNPACK_ROW_LENGTH, This->currentDesc.Width);
 
+            /* Disable all textures before calling glDrawPixels */
+            for(tex = 0; tex < GL_LIMITS(sampler_stages); tex++) {
+                if (GL_SUPPORT(ARB_MULTITEXTURE)) {
+                    GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + tex));
+                    checkGLcall("glActiveTextureARB");
+                }
+                glDisable(GL_TEXTURE_2D);
+                checkGLcall("glDisable GL_TEXTURE_2D");
+                glDisable(GL_TEXTURE_1D);
+                checkGLcall("glDisable GL_TEXTURE_1D");
+            }
             /* And back buffers are not blended */
             glDisable(GL_BLEND);
             glDisable(GL_DEPTH_TEST);
@@ -993,6 +1005,9 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC
 
     /* Create a DIB section if there isn't a hdc yet */
     if(!This->hDC) {
+        int extraline = 0;
+        SYSTEM_INFO sysInfo;
+
         if(This->Flags & SFLAG_ACTIVELOCK) {
             ERR("Creating a DIB section while a lock is active. Uncertain consequences\n");
         }
@@ -1017,17 +1032,28 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC
                 break;
         }
 
+        /* Some apps access the surface in via DWORDs, and do not take the necessary care at the end of the
+         * surface. So we need at least extra 4 bytes at the end of the surface. Check against the page size,
+         * if the last page used for the surface has at least 4 spare bytes we're safe, otherwise
+         * add an extra line to the dib section
+         */
+        GetSystemInfo(&sysInfo);
+        if( ((This->resource.size + 3) % sysInfo.dwPageSize) < 4) {
+            extraline = 1;
+            TRACE("Adding an extra line to the dib section\n");
+        }
+
         b_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
         if( (NP2_REPACK == wined3d_settings.nonpower2_mode || This->resource.usage & WINED3DUSAGE_RENDERTARGET)) {
             b_info->bmiHeader.biWidth = This->currentDesc.Width;
-            b_info->bmiHeader.biHeight = -This->currentDesc.Height;
+            b_info->bmiHeader.biHeight = -This->currentDesc.Height -extraline;
             b_info->bmiHeader.biSizeImage = This->currentDesc.Width * This->currentDesc.Height * This->bytesPerPixel;
             /* Use the full pow2 image size(assigned below) because LockRect
              * will need it for a full glGetTexImage call
              */
         } else {
             b_info->bmiHeader.biWidth = This->pow2Width;
-            b_info->bmiHeader.biHeight = -This->pow2Height;
+            b_info->bmiHeader.biHeight = -This->pow2Height -extraline;
             b_info->bmiHeader.biSizeImage = This->resource.size;
         }
         b_info->bmiHeader.biPlanes = 1;




More information about the wine-cvs mailing list