DIB section patch

Ove Kaaven ovehk at ping.uio.no
Sun Apr 15 11:36:56 CDT 2001


The GLX code needed extending the DIB section conversion code somewhat.

Log:
Ove Kaaven <ovek at transgaming.com>
Fixed CoerceDIBSection's AuxMod handling. Added CoerceDIBSection2.

Index: wine/graphics/x11drv/dib.c
diff -u wine/graphics/x11drv/dib.c:1.1.1.14 wine/graphics/x11drv/dib.c:1.20
--- wine/graphics/x11drv/dib.c:1.1.1.14	Sat Apr 14 18:54:18 2001
+++ wine/graphics/x11drv/dib.c	Sat Apr 14 19:20:30 2001
@@ -3495,11 +3495,9 @@
 
 	case DIB_Status_AuxMod:
 	  TRACE("AppMod requested in status AuxMod\n" );
+	  X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
 	  if (lossy) dib->status = DIB_Status_AppMod;
-	  else {
-	    X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
-	    (*dib->copy_aux)(dib->aux_ctx, DIB_Status_AppMod);
-	  }
+	  else (*dib->copy_aux)(dib->aux_ctx, DIB_Status_AppMod);
 	  if (dib->status != DIB_Status_GdiMod)
 	    break;
 	  /* fall through if copy_aux() had to change to GdiMod state */
@@ -3508,7 +3506,8 @@
 	  TRACE("AppMod requested in status GdiMod\n" );
 	  X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
 	  if (!lossy) X11DRV_DIB_DoUpdateDIBSection( bmp, TRUE );
-	  /* fall through */
+	  dib->status = DIB_Status_AppMod;
+	  break;
 
         case DIB_Status_InSync:
 	  TRACE("AppMod requested in status InSync\n" );
@@ -3549,6 +3548,7 @@
   INT ret = DIB_Status_None;
 
   if (dib) {
+    TRACE("Locking %p from thread %08lx\n", bmp, GetCurrentThreadId());
     EnterCriticalSection(&(dib->lock));
     ret = dib->status;
     if (req != DIB_Status_None)
@@ -3641,23 +3641,22 @@
 	break;
     }
     LeaveCriticalSection(&(dib->lock));
+    TRACE("Unlocked %p\n", bmp);
   }
 }
 
 /***********************************************************************
- *           X11DRV_CoerceDIBSection
+ *           X11DRV_CoerceDIBSection2
  */
-INT X11DRV_CoerceDIBSection(DC *dc, INT req, BOOL lossy)
+INT X11DRV_CoerceDIBSection2(HBITMAP hBmp, INT req, BOOL lossy)
 {
   BITMAPOBJ *bmp;
   INT ret;
-
-  if (!dc) return DIB_Status_None;
-  if (!(dc->flags & DC_MEMORY)) return DIB_Status_None;
 
-  bmp = (BITMAPOBJ *)GDI_GetObjPtr( dc->hBitmap, BITMAP_MAGIC );
+  bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+  if (!bmp) return DIB_Status_None;
   ret = X11DRV_DIB_Coerce(bmp, req, lossy);
-  GDI_ReleaseObj( dc->hBitmap );
+  GDI_ReleaseObj( hBmp );
   return ret;
 }
 
@@ -3670,6 +3669,7 @@
   INT ret;
 
   bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+  if (!bmp) return DIB_Status_None;
   ret = X11DRV_DIB_Lock(bmp, req, lossy);
   GDI_ReleaseObj( hBmp );
   return ret;
@@ -3683,11 +3683,21 @@
   BITMAPOBJ *bmp;
 
   bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
+  if (!bmp) return;
   X11DRV_DIB_Unlock(bmp, commit);
   GDI_ReleaseObj( hBmp );
 }
 
 /***********************************************************************
+ *           X11DRV_CoerceDIBSection
+ */
+INT X11DRV_CoerceDIBSection(DC *dc, INT req, BOOL lossy)
+{
+  if (!dc) return DIB_Status_None;
+  return X11DRV_CoerceDIBSection2( dc->hBitmap, req, lossy );
+}
+
+/***********************************************************************
  *           X11DRV_LockDIBSection
  */
 INT X11DRV_LockDIBSection(DC *dc, INT req, BOOL lossy)
Index: wine/include/x11drv.h
diff -u wine/include/x11drv.h:1.1.1.11 wine/include/x11drv.h:1.16
--- wine/include/x11drv.h:1.1.1.11	Sat Apr 14 17:47:30 2001
+++ wine/include/x11drv.h	Sat Apr 14 18:04:58 2001
@@ -244,6 +244,7 @@
 extern INT X11DRV_CoerceDIBSection(struct tagDC *dc,INT,BOOL);
 extern INT X11DRV_LockDIBSection(struct tagDC *dc,INT,BOOL);
 extern void X11DRV_UnlockDIBSection(struct tagDC *dc,BOOL);
+extern INT X11DRV_CoerceDIBSection2(HBITMAP bmp,INT,BOOL);
 extern INT X11DRV_LockDIBSection2(HBITMAP bmp,INT,BOOL);
 extern void X11DRV_UnlockDIBSection2(HBITMAP bmp,BOOL);
 





More information about the wine-patches mailing list