Fixed CoerceDIBSection's AuxMod handling. Added CoerceDIBSection2.

This commit is contained in:
Ove Kaaven 2001-04-16 19:05:37 +00:00 committed by Alexandre Julliard
parent 930b509245
commit 6cba8bf47f
2 changed files with 23 additions and 12 deletions

View File

@ -3495,11 +3495,9 @@ INT X11DRV_DIB_Coerce(BITMAPOBJ *bmp, INT req, BOOL lossy)
case DIB_Status_AuxMod: case DIB_Status_AuxMod:
TRACE("AppMod requested in status AuxMod\n" ); TRACE("AppMod requested in status AuxMod\n" );
if (lossy) dib->status = DIB_Status_AppMod;
else {
X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE ); X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
(*dib->copy_aux)(dib->aux_ctx, DIB_Status_AppMod); if (lossy) dib->status = DIB_Status_AppMod;
} else (*dib->copy_aux)(dib->aux_ctx, DIB_Status_AppMod);
if (dib->status != DIB_Status_GdiMod) if (dib->status != DIB_Status_GdiMod)
break; break;
/* fall through if copy_aux() had to change to GdiMod state */ /* fall through if copy_aux() had to change to GdiMod state */
@ -3508,7 +3506,8 @@ INT X11DRV_DIB_Coerce(BITMAPOBJ *bmp, INT req, BOOL lossy)
TRACE("AppMod requested in status GdiMod\n" ); TRACE("AppMod requested in status GdiMod\n" );
X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE ); X11DRV_DIB_DoProtectDIBSection( bmp, PAGE_READWRITE );
if (!lossy) X11DRV_DIB_DoUpdateDIBSection( bmp, TRUE ); if (!lossy) X11DRV_DIB_DoUpdateDIBSection( bmp, TRUE );
/* fall through */ dib->status = DIB_Status_AppMod;
break;
case DIB_Status_InSync: case DIB_Status_InSync:
TRACE("AppMod requested in status InSync\n" ); TRACE("AppMod requested in status InSync\n" );
@ -3549,6 +3548,7 @@ INT X11DRV_DIB_Lock(BITMAPOBJ *bmp, INT req, BOOL lossy)
INT ret = DIB_Status_None; INT ret = DIB_Status_None;
if (dib) { if (dib) {
TRACE("Locking %p from thread %08lx\n", bmp, GetCurrentThreadId());
EnterCriticalSection(&(dib->lock)); EnterCriticalSection(&(dib->lock));
ret = dib->status; ret = dib->status;
if (req != DIB_Status_None) if (req != DIB_Status_None)
@ -3641,23 +3641,22 @@ void X11DRV_DIB_Unlock(BITMAPOBJ *bmp, BOOL commit)
break; break;
} }
LeaveCriticalSection(&(dib->lock)); 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; BITMAPOBJ *bmp;
INT ret; INT ret;
if (!dc) return DIB_Status_None; bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
if (!(dc->flags & DC_MEMORY)) return DIB_Status_None; if (!bmp) return DIB_Status_None;
bmp = (BITMAPOBJ *)GDI_GetObjPtr( dc->hBitmap, BITMAP_MAGIC );
ret = X11DRV_DIB_Coerce(bmp, req, lossy); ret = X11DRV_DIB_Coerce(bmp, req, lossy);
GDI_ReleaseObj( dc->hBitmap ); GDI_ReleaseObj( hBmp );
return ret; return ret;
} }
@ -3670,6 +3669,7 @@ INT X11DRV_LockDIBSection2(HBITMAP hBmp, INT req, BOOL lossy)
INT ret; INT ret;
bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC ); bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
if (!bmp) return DIB_Status_None;
ret = X11DRV_DIB_Lock(bmp, req, lossy); ret = X11DRV_DIB_Lock(bmp, req, lossy);
GDI_ReleaseObj( hBmp ); GDI_ReleaseObj( hBmp );
return ret; return ret;
@ -3683,10 +3683,20 @@ void X11DRV_UnlockDIBSection2(HBITMAP hBmp, BOOL commit)
BITMAPOBJ *bmp; BITMAPOBJ *bmp;
bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC ); bmp = (BITMAPOBJ *)GDI_GetObjPtr( hBmp, BITMAP_MAGIC );
if (!bmp) return;
X11DRV_DIB_Unlock(bmp, commit); X11DRV_DIB_Unlock(bmp, commit);
GDI_ReleaseObj( hBmp ); 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 * X11DRV_LockDIBSection
*/ */

View File

@ -244,6 +244,7 @@ extern int *X11DRV_DIB_BuildColorMap( struct tagDC *dc, WORD coloruse,
extern INT X11DRV_CoerceDIBSection(struct tagDC *dc,INT,BOOL); extern INT X11DRV_CoerceDIBSection(struct tagDC *dc,INT,BOOL);
extern INT X11DRV_LockDIBSection(struct tagDC *dc,INT,BOOL); extern INT X11DRV_LockDIBSection(struct tagDC *dc,INT,BOOL);
extern void X11DRV_UnlockDIBSection(struct tagDC *dc,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 INT X11DRV_LockDIBSection2(HBITMAP bmp,INT,BOOL);
extern void X11DRV_UnlockDIBSection2(HBITMAP bmp,BOOL); extern void X11DRV_UnlockDIBSection2(HBITMAP bmp,BOOL);