mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
Skeleton of NtGdiStretchBlt() implemented.
svn path=/trunk/; revision=6861
This commit is contained in:
parent
8a1c4241be
commit
578a12d532
1 changed files with 184 additions and 3 deletions
|
@ -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.45 2003/11/08 02:16:31 sedwards Exp $ */
|
||||
/* $Id: bitmaps.c,v 1.46 2003/12/04 21:35:11 fireball Exp $ */
|
||||
#undef WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -58,7 +58,7 @@ BOOL STDCALL NtGdiBitBlt(HDC hDCDest,
|
|||
ULONG SourceMode, DestMode;
|
||||
PBRUSHOBJ BrushObj;
|
||||
BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000);
|
||||
BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000);
|
||||
BOOL UsesPattern = TRUE;//((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000);
|
||||
|
||||
DCDest = DC_LockDc(hDCDest);
|
||||
if (NULL == DCDest)
|
||||
|
@ -793,7 +793,188 @@ BOOL STDCALL NtGdiStretchBlt(HDC hDCDest,
|
|||
INT HeightSrc,
|
||||
DWORD ROP)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
PDC DCDest = NULL;
|
||||
PDC DCSrc = NULL;
|
||||
PSURFOBJ SurfDest, SurfSrc;
|
||||
PSURFGDI SurfGDIDest, SurfGDISrc;
|
||||
RECTL DestRect;
|
||||
POINTL SourcePoint;
|
||||
BOOL Status;
|
||||
PPALGDI PalDestGDI, PalSourceGDI;
|
||||
PXLATEOBJ XlateObj = NULL;
|
||||
HPALETTE SourcePalette, DestPalette;
|
||||
ULONG SourceMode, DestMode;
|
||||
PBRUSHOBJ BrushObj;
|
||||
BOOL UsesSource = ((ROP & 0xCC0000) >> 2) != (ROP & 0x330000);
|
||||
BOOL UsesPattern = ((ROP & 0xF00000) >> 4) != (ROP & 0x0F0000);
|
||||
|
||||
DCDest = DC_LockDc(hDCDest);
|
||||
if (NULL == DCDest)
|
||||
{
|
||||
DPRINT1("Invalid destination dc handle (0x%08x) passed to NtGdiStretchBlt\n", hDCDest);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (UsesSource)
|
||||
{
|
||||
if (hDCSrc != hDCDest)
|
||||
{
|
||||
DCSrc = DC_LockDc(hDCSrc);
|
||||
if (NULL == DCSrc)
|
||||
{
|
||||
DC_UnlockDc(hDCDest);
|
||||
DPRINT1("Invalid source dc handle (0x%08x) passed to NtGdiStretchBlt\n", hDCSrc);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DCSrc = DCDest;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DCSrc = NULL;
|
||||
}
|
||||
|
||||
/* Offset the destination and source by the origin of their DCs. */
|
||||
XOriginDest += DCDest->w.DCOrgX;
|
||||
YOriginDest += DCDest->w.DCOrgY;
|
||||
if (UsesSource)
|
||||
{
|
||||
XOriginSrc += DCSrc->w.DCOrgX;
|
||||
YOriginSrc += DCSrc->w.DCOrgY;
|
||||
}
|
||||
|
||||
DestRect.left = XOriginDest;
|
||||
DestRect.top = YOriginDest;
|
||||
DestRect.right = XOriginDest+WidthDest;
|
||||
DestRect.bottom = YOriginDest+HeightDest;
|
||||
|
||||
SourcePoint.x = XOriginSrc;
|
||||
SourcePoint.y = YOriginSrc;
|
||||
|
||||
/* Determine surfaces to be used in the bitblt */
|
||||
SurfDest = (PSURFOBJ)AccessUserObject((ULONG)DCDest->Surface);
|
||||
SurfGDIDest = (PSURFGDI)AccessInternalObjectFromUserObject(SurfDest);
|
||||
if (UsesSource)
|
||||
{
|
||||
SurfSrc = (PSURFOBJ)AccessUserObject((ULONG)DCSrc->Surface);
|
||||
SurfGDISrc = (PSURFGDI)AccessInternalObjectFromUserObject(SurfSrc);
|
||||
}
|
||||
else
|
||||
{
|
||||
SurfSrc = NULL;
|
||||
SurfGDISrc = NULL;
|
||||
}
|
||||
|
||||
if (UsesPattern)
|
||||
{
|
||||
BrushObj = BRUSHOBJ_LockBrush(DCDest->w.hBrush);
|
||||
if (NULL == BrushObj)
|
||||
{
|
||||
if (UsesSource && hDCSrc != hDCDest)
|
||||
{
|
||||
DC_UnlockDc(hDCSrc);
|
||||
}
|
||||
DC_UnlockDc(hDCDest);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BrushObj = NULL;
|
||||
}
|
||||
|
||||
if (DCDest->w.hPalette != 0)
|
||||
{
|
||||
DestPalette = DCDest->w.hPalette;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE);
|
||||
}
|
||||
|
||||
if (UsesSource && DCSrc->w.hPalette != 0)
|
||||
{
|
||||
SourcePalette = DCSrc->w.hPalette;
|
||||
}
|
||||
else
|
||||
{
|
||||
SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE);
|
||||
}
|
||||
|
||||
PalSourceGDI = PALETTE_LockPalette(SourcePalette);
|
||||
if (NULL == PalSourceGDI)
|
||||
{
|
||||
if (UsesSource && hDCSrc != hDCDest)
|
||||
{
|
||||
DC_UnlockDc(hDCSrc);
|
||||
}
|
||||
DC_UnlockDc(hDCDest);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
SourceMode = PalSourceGDI->Mode;
|
||||
PALETTE_UnlockPalette(SourcePalette);
|
||||
|
||||
if (DestPalette == SourcePalette)
|
||||
{
|
||||
DestMode = SourceMode;
|
||||
}
|
||||
else
|
||||
{
|
||||
PalDestGDI = PALETTE_LockPalette(DestPalette);
|
||||
if (NULL == PalDestGDI)
|
||||
{
|
||||
if (UsesSource && hDCSrc != hDCDest)
|
||||
{
|
||||
DC_UnlockDc(hDCSrc);
|
||||
}
|
||||
DC_UnlockDc(hDCDest);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
DestMode = PalDestGDI->Mode;
|
||||
PALETTE_UnlockPalette(DestPalette);
|
||||
}
|
||||
|
||||
XlateObj = (PXLATEOBJ)IntEngCreateXlate(DestMode, SourceMode, DestPalette, SourcePalette);
|
||||
if (NULL == XlateObj)
|
||||
{
|
||||
if (UsesSource && hDCSrc != hDCDest)
|
||||
{
|
||||
DC_UnlockDc(hDCSrc);
|
||||
}
|
||||
DC_UnlockDc(hDCDest);
|
||||
SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Perform the bitblt operation */
|
||||
// Status = IntEngBitBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip, XlateObj,
|
||||
// &DestRect, &SourcePoint, NULL, BrushObj, NULL, ROP);
|
||||
|
||||
//Status = IntEngStretchBlt(SurfDest, SurfSrc, NULL, DCDest->CombinedClip,
|
||||
// XlateObj, &DestRect, &SourceRect, NULL, NULL, NULL, ROP);
|
||||
Status = FALSE;
|
||||
|
||||
|
||||
EngDeleteXlate(XlateObj);
|
||||
if (UsesPattern)
|
||||
{
|
||||
BRUSHOBJ_UnlockBrush(DCDest->w.hBrush);
|
||||
}
|
||||
if (UsesSource && hDCSrc != hDCDest)
|
||||
{
|
||||
DC_UnlockDc(hDCSrc);
|
||||
}
|
||||
DC_UnlockDc(hDCDest);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Internal Functions */
|
||||
|
|
Loading…
Reference in a new issue