mirror of
https://github.com/reactos/reactos.git
synced 2024-08-05 19:11:16 +00:00
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:
parent
d8eb783e69
commit
c6df043a61
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue