Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

403 lines
9.5 KiB

/******************************Module*Header*******************************\
* Module Name: image .c *
* *
* Client side stubs for Alpha, Transparent and GradientFill *
* *
* Created: 05-Jun-1997 *
* Author: Mark Enstrom [marke] *
* *
* Copyright (c) 1991-1999 Microsoft Corporation *
\**************************************************************************/
#include "precomp.h"
#pragma hdrstop
/******************************Public*Routine******************************\
* GdiAlphaBlend
*
* DC to DC alpha blt
*
* Arguments:
*
* hdcDst - dst dc
* DstX - dst x origin
* DstY - dst y origin
* DstCx - dst width
* DstCy - dst height
* hdcSrc - src dc
* SrcX - src x origin
* SrcY - src y origin
* SrcCx - src width
* SrcCy - src height
* BlendFunction - blend function
*
* Return Value:
*
* Status
*
* History:
*
* 12/3/1996 Mark Enstrom [marke]
*
\**************************************************************************/
BOOL
GdiAlphaBlend(
HDC hdcDest,
int DstX,
int DstY,
int DstCx,
int DstCy,
HDC hdcSrc,
int SrcX,
int SrcY,
int SrcCx,
int SrcCy,
BLENDFUNCTION BlendFunction
)
{
BOOL bRet = FALSE;
BLENDULONG Blend;
FIXUP_HANDLE(hdcDest);
FIXUP_HANDLE(hdcSrc);
Blend.Blend = BlendFunction;
//
// check for metafile
//
if (!hdcSrc || IS_METADC16_TYPE(hdcSrc))
return(bRet);
if (IS_ALTDC_TYPE(hdcDest))
{
PLDC pldc;
if (IS_METADC16_TYPE(hdcDest))
return(bRet);
DC_PLDC(hdcDest,pldc,bRet);
if (pldc->iType == LO_METADC)
{
if (!MF_AnyBitBlt(hdcDest,
DstX,
DstY,
DstCx,
DstCy,
(LPPOINT)NULL,
hdcSrc,
SrcX,
SrcY,
SrcCx,
SrcCy,
(HBITMAP)NULL,
0,
0,
Blend.ul,
EMR_ALPHABLEND))
{
return(bRet);
}
}
if (pldc->fl & LDC_SAP_CALLBACK)
{
vSAPCallback(pldc);
}
if (pldc->fl & LDC_DOC_CANCELLED)
{
return(bRet);
}
if (pldc->fl & LDC_CALL_STARTPAGE)
{
StartPage(hdcDest);
}
}
RESETUSERPOLLCOUNT();
//
// call kernel to draw
//
bRet = NtGdiAlphaBlend(
hdcDest,
DstX,
DstY,
DstCx,
DstCy,
(HDC)hdcSrc,
SrcX,
SrcY,
SrcCx,
SrcCy,
BlendFunction,
NULL
);
return(bRet);
}
/******************************Public*Routine******************************\
* GdiGradientFill
*
* metafile or call kernel
*
* Arguments:
*
* hdc - hdc
* pVertex - pointer to vertex array
* nVertex - number of elements in vertex array
* pMesh - pointer to mesh array
* nCount - number of elements in mesh array
* ulMode - drawing mode
*
* Return Value:
*
* status
*
* History:
*
* 12/3/1996 Mark Enstrom [marke]
*
\**************************************************************************/
BOOL
GdiGradientFill(
HDC hdc,
PTRIVERTEX pVertex,
ULONG nVertex,
PVOID pMesh,
ULONG nCount,
ULONG ulMode
)
{
BOOL bRet = TRUE;
PTRIVERTEX pTempVertex = pVertex;
PDC_ATTR pdcattr;
FIXUP_HANDLE(hdc);
PSHARED_GET_VALIDATE(pdcattr,hdc,DC_TYPE);
if (pdcattr)
{
//
// NT metafile
//
if (IS_ALTDC_TYPE(hdc))
{
PLDC pldc;
if (IS_METADC16_TYPE(hdc))
return(bRet);
DC_PLDC(hdc,pldc,bRet);
if (pldc->iType == LO_METADC)
{
bRet = MF_GradientFill(hdc,pVertex,nVertex,pMesh,nCount,ulMode);
if (!bRet)
{
return(bRet);
}
}
if (pldc->fl & LDC_SAP_CALLBACK)
{
vSAPCallback(pldc);
}
if (pldc->fl & LDC_DOC_CANCELLED)
{
return(bRet);
}
if (pldc->fl & LDC_CALL_STARTPAGE)
{
StartPage(hdc);
}
}
RESETUSERPOLLCOUNT();
//
// if icm is on, tanslate vertex array
//
if (
(IS_ICM_INSIDEDC(pdcattr->lIcmMode)) &&
(pVertex != NULL) &&
(nVertex > 0) &&
(nVertex < 0x80000000)
)
{
pTempVertex = (PTRIVERTEX)LOCALALLOC(nVertex * sizeof(TRIVERTEX));
if (pTempVertex != NULL)
{
//
// copy to new vertex array
//
memcpy(pTempVertex,pVertex,nVertex * sizeof(TRIVERTEX));
bRet = IcmTranslateTRIVERTEX(hdc,pdcattr,pTempVertex,nVertex);
}
else
{
bRet = FALSE;
GdiSetLastError(ERROR_NOT_ENOUGH_MEMORY);
}
}
if (bRet)
{
//
// call kernel to draw
//
bRet = NtGdiGradientFill(hdc,
pTempVertex,
nVertex,
pMesh,
nCount,
ulMode
);
}
//
// free temp buffer
//
if (pTempVertex != pVertex)
{
LOCALFREE(pTempVertex);
}
}
else
{
bRet = FALSE;
GdiSetLastError(ERROR_INVALID_PARAMETER);
}
return(bRet);
}
/******************************Public*Routine******************************\
* GdiTransparentBlt
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 12/3/1996 Lingyun Wang
*
\**************************************************************************/
BOOL
GdiTransparentBlt(
HDC hdcDest,
int DstX,
int DstY,
int DstCx,
int DstCy,
HDC hSrc,
int SrcX,
int SrcY,
int SrcCx,
int SrcCy,
UINT Color
)
{
BOOL bRet = FALSE;
PDC_ATTR pdca;
if ((DstCx <= 0) || (DstCy <= 0) || (SrcCx <= 0) || (SrcCy <= 0))
{
return (FALSE);
}
FIXUP_HANDLE(hdcDest);
FIXUP_HANDLE(hSrc);
if (!hSrc || IS_METADC16_TYPE(hSrc))
return(bRet);
if (IS_ALTDC_TYPE(hdcDest))
{
PLDC pldc;
if (IS_METADC16_TYPE(hdcDest))
return(bRet);
DC_PLDC(hdcDest,pldc,bRet);
if (pldc->iType == LO_METADC)
{
if (!MF_AnyBitBlt(hdcDest,
DstX,
DstY,
DstCx,
DstCy,
(LPPOINT)NULL,
hSrc,
SrcX,
SrcY,
SrcCx,
SrcCy,
(HBITMAP)NULL,
0,
0,
Color,
EMR_TRANSPARENTBLT))
{
return(bRet);
}
}
if (pldc->fl & LDC_SAP_CALLBACK)
{
vSAPCallback(pldc);
}
if (pldc->fl & LDC_DOC_CANCELLED)
{
return(bRet);
}
if (pldc->fl & LDC_CALL_STARTPAGE)
{
StartPage(hdcDest);
}
}
RESETUSERPOLLCOUNT();
bRet = NtGdiTransparentBlt(
hdcDest,
DstX,
DstY,
DstCx,
DstCy,
hSrc,
SrcX,
SrcY,
SrcCx,
SrcCy,
Color);
return(bRet);
}