Reformatting plus change to NtGdiGetPixel to handle device DCs in addition to DIB DCs. This fixes bug #264.

svn path=/trunk/; revision=8839
This commit is contained in:
Royce Mitchell III 2004-03-22 20:46:33 +00:00
parent d8eb783e69
commit c6df043a61

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: bitmaps.c,v 1.63 2004/03/16 02:15:06 royce Exp $ */
/* $Id: bitmaps.c,v 1.64 2004/03/22 20:46:33 royce Exp $ */
#undef WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
@ -38,7 +38,9 @@
#define NDEBUG
#include <win32k/debug1.h>
BOOL STDCALL NtGdiBitBlt(HDC hDCDest,
BOOL STDCALL
NtGdiBitBlt(
HDC hDCDest,
INT XDest,
INT YDest,
INT Width,
@ -261,7 +263,9 @@ BOOL STDCALL NtGdiBitBlt(HDC hDCDest,
return Status;
}
HBITMAP STDCALL NtGdiCreateBitmap(INT Width,
HBITMAP STDCALL
NtGdiCreateBitmap(
INT Width,
INT Height,
UINT Planes,
UINT BitsPerPel,
@ -336,7 +340,8 @@ HBITMAP STDCALL NtGdiCreateBitmap(INT Width,
return hBitmap;
}
BOOL FASTCALL Bitmap_InternalDelete( PBITMAPOBJ pBmp )
BOOL FASTCALL
Bitmap_InternalDelete( PBITMAPOBJ pBmp )
{
ASSERT( pBmp );
@ -365,7 +370,8 @@ BOOL FASTCALL Bitmap_InternalDelete( PBITMAPOBJ pBmp )
HBITMAP FASTCALL
IntCreateCompatibleBitmap(PDC Dc,
IntCreateCompatibleBitmap(
PDC Dc,
INT Width,
INT Height)
{
@ -393,7 +399,8 @@ IntCreateCompatibleBitmap(PDC Dc,
}
HBITMAP STDCALL
NtGdiCreateCompatibleBitmap(HDC hDC,
NtGdiCreateCompatibleBitmap(
HDC hDC,
INT Width,
INT Height)
{
@ -406,6 +413,7 @@ NtGdiCreateCompatibleBitmap(HDC hDC,
if (NULL == Dc)
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
return NULL;
}
@ -416,7 +424,8 @@ NtGdiCreateCompatibleBitmap(HDC hDC,
return Bmp;
}
HBITMAP STDCALL NtGdiCreateBitmapIndirect(CONST BITMAP *BM)
HBITMAP STDCALL
NtGdiCreateBitmapIndirect(CONST BITMAP *BM)
{
return NtGdiCreateBitmap (BM->bmWidth,
BM->bmHeight,
@ -425,7 +434,9 @@ HBITMAP STDCALL NtGdiCreateBitmapIndirect(CONST BITMAP *BM)
BM->bmBits);
}
HBITMAP STDCALL NtGdiCreateDiscardableBitmap(HDC hDC,
HBITMAP STDCALL
NtGdiCreateDiscardableBitmap(
HDC hDC,
INT Width,
INT Height)
{
@ -433,7 +444,9 @@ HBITMAP STDCALL NtGdiCreateDiscardableBitmap(HDC hDC,
return NtGdiCreateCompatibleBitmap(hDC, Width, Height);
}
BOOL STDCALL NtGdiExtFloodFill(HDC hDC,
BOOL STDCALL
NtGdiExtFloodFill(
HDC hDC,
INT XStart,
INT YStart,
COLORREF Color,
@ -442,7 +455,9 @@ BOOL STDCALL NtGdiExtFloodFill(HDC hDC,
UNIMPLEMENTED;
}
BOOL STDCALL NtGdiFloodFill(HDC hDC,
BOOL STDCALL
NtGdiFloodFill(
HDC hDC,
INT XStart,
INT YStart,
COLORREF Fill)
@ -450,7 +465,9 @@ BOOL STDCALL NtGdiFloodFill(HDC hDC,
return NtGdiExtFloodFill(hDC, XStart, YStart, Fill, FLOODFILLBORDER );
}
BOOL STDCALL NtGdiGetBitmapDimensionEx(HBITMAP hBitmap,
BOOL STDCALL
NtGdiGetBitmapDimensionEx(
HBITMAP hBitmap,
LPSIZE Dimension)
{
PBITMAPOBJ bmp;
@ -468,12 +485,12 @@ BOOL STDCALL NtGdiGetBitmapDimensionEx(HBITMAP hBitmap,
return TRUE;
}
COLORREF
STDCALL
COLORREF STDCALL
NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
{
PDC dc = NULL;
COLORREF clrSource, Result = (COLORREF)CLR_INVALID; // default to failure
COLORREF Result = (COLORREF)CLR_INVALID; // default to failure
BOOL bInRect = FALSE;
PSURFGDI Surface;
PSURFOBJ SurfaceObject;
HPALETTE Pal;
@ -482,16 +499,20 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
PXLATEOBJ XlateObj;
dc = DC_LockDc (hDC);
if (dc != NULL)
if ( !dc )
{
SetLastWin32Error(ERROR_INVALID_HANDLE);
return Result;
}
if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) )
{
bInRect = TRUE;
SurfaceObject = (PSURFOBJ)AccessUserObject((ULONG)dc->Surface);
ASSERT(SurfaceObject);
Surface = (PSURFGDI)AccessInternalObjectFromUserObject(SurfaceObject);
if ( Surface && Surface->DIB_GetPixel )
if ( Surface )
{
clrSource = Surface->DIB_GetPixel(SurfaceObject, XPos, YPos);
if ( dc->w.hPalette != 0 )
Pal = dc->w.hPalette;
else
@ -505,13 +526,53 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
XlateObj = (PXLATEOBJ)IntEngCreateXlate ( PAL_RGB, PalMode, NULL, Pal );
if ( XlateObj )
{
Result = XLATEOBJ_iXlate(XlateObj, clrSource);
// check if this DC has a DIB behind it...
if ( SurfaceObject->pvScan0 ) // STYPE_BITMAP == SurfaceObject->iType
{
ASSERT ( SurfaceObject->lDelta && Surface->DIB_GetPixel );
Result = XLATEOBJ_iXlate(XlateObj, Surface->DIB_GetPixel ( SurfaceObject, XPos, YPos ) );
}
EngDeleteXlate(XlateObj);
}
}
}
}
DC_UnlockDc(hDC);
// if Result is still CLR_INVALID, then the "quick" method above didn't work
if ( bInRect && Result == CLR_INVALID )
{
// FIXME: create a 1x1 32BPP DIB, and blit to it
HDC hDCTmp = NtGdiCreateCompatableDC(hDC);
if ( hDCTmp )
{
static const BITMAPINFOHEADER bih = { sizeof(BITMAPINFOHEADER), 1, 1, 1, 32, BI_RGB, 0, 0, 0, 0, 0 };
BITMAPINFO bi;
RtlMoveMemory ( &(bi.bmiHeader), &bih, sizeof(bih) );
HBITMAP hBmpTmp = NtGdiCreateDIBitmap ( hDC, &bi.bmiHeader, 0, NULL, &bi, DIB_RGB_COLORS );
//HBITMAP hBmpTmp = NtGdiCreateBitmap ( 1, 1, 1, 32, NULL);
if ( hBmpTmp )
{
HBITMAP hBmpOld = (HBITMAP)NtGdiSelectObject ( hDCTmp, hBmpTmp );
if ( hBmpOld )
{
PBITMAPOBJ bmpobj;
NtGdiBitBlt ( hDCTmp, 0, 0, 1, 1, hDC, XPos, YPos, SRCCOPY );
NtGdiSelectObject ( hDCTmp, hBmpOld );
// our bitmap is no longer selected, so we can access it's stuff...
bmpobj = BITMAPOBJ_LockBitmap ( hBmpTmp );
if ( bmpobj )
{
Result = *(COLORREF*)bmpobj->bitmap.bmBits;
BITMAPOBJ_UnlockBitmap ( hBmpTmp );
}
}
NtGdiDeleteObject ( hBmpTmp );
}
NtGdiDeleteDC ( hDCTmp );
}
}
return Result;
@ -525,7 +586,8 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
* to GDI32. I dunno. Write a test and let me know.
*/
static inline BYTE SwapROP3_SrcDst(BYTE bRop3)
static inline BYTE
SwapROP3_SrcDst(BYTE bRop3)
{
return (bRop3 & 0x99) | ((bRop3 & 0x22) << 1) | ((bRop3 & 0x44) >> 1);
}
@ -535,7 +597,9 @@ static inline BYTE SwapROP3_SrcDst(BYTE bRop3)
#define DSTCOPY 0x00AA0029
#define DSTERASE 0x00220326 /* dest = dest & (~src) : DSna */
BOOL STDCALL NtGdiMaskBlt(HDC hdcDest, INT nXDest, INT nYDest,
BOOL STDCALL
NtGdiMaskBlt (
HDC hdcDest, INT nXDest, INT nYDest,
INT nWidth, INT nHeight, HDC hdcSrc,
INT nXSrc, INT nYSrc, HBITMAP hbmMask,
INT xMask, INT yMask, DWORD dwRop)
@ -725,7 +789,9 @@ BOOL STDCALL NtGdiMaskBlt(HDC hdcDest, INT nXDest, INT nYDest,
return TRUE;
}
BOOL STDCALL NtGdiPlgBlt(HDC hDCDest,
BOOL STDCALL
NtGdiPlgBlt(
HDC hDCDest,
CONST POINT *Point,
HDC hDCSrc,
INT XSrc,
@ -739,7 +805,9 @@ BOOL STDCALL NtGdiPlgBlt(HDC hDCDest,
UNIMPLEMENTED;
}
LONG STDCALL NtGdiSetBitmapBits(HBITMAP hBitmap,
LONG STDCALL
NtGdiSetBitmapBits(
HBITMAP hBitmap,
DWORD Bytes,
CONST VOID *Bits)
{
@ -814,7 +882,9 @@ LONG STDCALL NtGdiSetBitmapBits(HBITMAP hBitmap,
return ret;
}
BOOL STDCALL NtGdiSetBitmapDimensionEx(HBITMAP hBitmap,
BOOL STDCALL
NtGdiSetBitmapDimensionEx(
HBITMAP hBitmap,
INT Width,
INT Height,
LPSIZE Size)
@ -839,7 +909,9 @@ BOOL STDCALL NtGdiSetBitmapDimensionEx(HBITMAP hBitmap,
return TRUE;
}
COLORREF STDCALL NtGdiSetPixel(HDC hDC,
COLORREF STDCALL
NtGdiSetPixel(
HDC hDC,
INT X,
INT Y,
COLORREF Color)
@ -852,7 +924,9 @@ COLORREF STDCALL NtGdiSetPixel(HDC hDC,
return ((COLORREF) -1);
}
BOOL STDCALL NtGdiSetPixelV(HDC hDC,
BOOL STDCALL
NtGdiSetPixelV(
HDC hDC,
INT X,
INT Y,
COLORREF Color)
@ -871,7 +945,9 @@ BOOL STDCALL NtGdiSetPixelV(HDC hDC,
return TRUE;
}
BOOL STDCALL NtGdiStretchBlt(HDC hDCDest,
BOOL STDCALL
NtGdiStretchBlt(
HDC hDCDest,
INT XOriginDest,
INT YOriginDest,
INT WidthDest,
@ -1105,7 +1181,8 @@ BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp)
return ((bmWidth * bpp + 31) & ~31) >> 3;
}
HBITMAP FASTCALL BITMAPOBJ_CopyBitmap(HBITMAP hBitmap)
HBITMAP FASTCALL
BITMAPOBJ_CopyBitmap(HBITMAP hBitmap)
{
PBITMAPOBJ bmp;
HBITMAP res;
@ -1135,7 +1212,8 @@ HBITMAP FASTCALL BITMAPOBJ_CopyBitmap(HBITMAP hBitmap)
return res;
}
INT STDCALL BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer)
INT STDCALL
BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer)
{
if(bmp->dib)
{