mirror of
https://github.com/reactos/reactos.git
synced 2025-05-18 00:31:27 +00:00
- Add missing CAPS to psdk.
- Implemented NtGdiGetDeviceCapsAll. - Now support primary display device capabilities in shared gdi handle table. svn path=/trunk/; revision=36825
This commit is contained in:
parent
e77f768a09
commit
7d22914162
4 changed files with 178 additions and 13 deletions
|
@ -744,6 +744,10 @@ extern "C" {
|
||||||
#define TC_VA_ABLE 16384
|
#define TC_VA_ABLE 16384
|
||||||
#define TC_RESERVED 32768
|
#define TC_RESERVED 32768
|
||||||
#define TC_SCROLLBLT 65536
|
#define TC_SCROLLBLT 65536
|
||||||
|
/* CLIPCAPS */
|
||||||
|
#define CP_NONE 0
|
||||||
|
#define CP_RECTANGLE 1
|
||||||
|
#define CP_REGION 2
|
||||||
#define GCP_DBCS 1
|
#define GCP_DBCS 1
|
||||||
#define GCP_ERROR 0x8000
|
#define GCP_ERROR 0x8000
|
||||||
#define GCP_CLASSIN 0x80000
|
#define GCP_CLASSIN 0x80000
|
||||||
|
@ -863,6 +867,20 @@ extern "C" {
|
||||||
#define TCI_SRCCHARSET 1
|
#define TCI_SRCCHARSET 1
|
||||||
#define TCI_SRCCODEPAGE 2
|
#define TCI_SRCCODEPAGE 2
|
||||||
#define TCI_SRCFONTSIG 3
|
#define TCI_SRCFONTSIG 3
|
||||||
|
#if (_WIN32_WINNT >= 0x0500)
|
||||||
|
/* SHADEBLENDCAPS */
|
||||||
|
#define SB_NONE 0x00000000
|
||||||
|
#define SB_CONST_ALPHA 0x00000001
|
||||||
|
#define SB_PIXEL_ALPHA 0x00000002
|
||||||
|
#define SB_PREMULT_ALPHA 0x00000004
|
||||||
|
#define SB_GRAD_RECT 0x00000010
|
||||||
|
#define SB_GRAD_TRI 0x00000020
|
||||||
|
/* Color Management caps */
|
||||||
|
#define CM_NONE 0x00000000
|
||||||
|
#define CM_DEVICE_ICM 0x00000001
|
||||||
|
#define CM_GAMMA_RAMP 0x00000002
|
||||||
|
#define CM_CMYK_COLOR 0x00000004
|
||||||
|
#endif
|
||||||
#define ICM_ON 2
|
#define ICM_ON 2
|
||||||
#define ICM_OFF 1
|
#define ICM_OFF 1
|
||||||
#define ICM_QUERY 3
|
#define ICM_QUERY 3
|
||||||
|
|
|
@ -267,6 +267,7 @@ VOID FASTCALL IntGdiReferencePdev(PGDIDEVICE pPDev);
|
||||||
VOID FASTCALL IntGdiUnreferencePdev(PGDIDEVICE pPDev, DWORD CleanUpType);
|
VOID FASTCALL IntGdiUnreferencePdev(PGDIDEVICE pPDev, DWORD CleanUpType);
|
||||||
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
|
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
|
||||||
BOOL FASTCALL IntGdiCleanDC(HDC hDC);
|
BOOL FASTCALL IntGdiCleanDC(HDC hDC);
|
||||||
|
VOID FASTCALL IntvGetDeviceCaps(PGDIDEVICE, PDEVCAPS);
|
||||||
|
|
||||||
extern PGDIDEVICE pPrimarySurface;
|
extern PGDIDEVICE pPrimarySurface;
|
||||||
|
|
||||||
|
|
|
@ -687,6 +687,9 @@ IntCreatePrimarySurface()
|
||||||
EngUnlockSurface(SurfObj);
|
EngUnlockSurface(SurfObj);
|
||||||
co_IntShowDesktop(IntGetActiveDesktop(), SurfSize.cx, SurfSize.cy);
|
co_IntShowDesktop(IntGetActiveDesktop(), SurfSize.cx, SurfSize.cy);
|
||||||
|
|
||||||
|
// Init Primary Displays Device Capabilities.
|
||||||
|
IntvGetDeviceCaps(&PrimarySurface, &GdiHandleTable->DevCaps);
|
||||||
|
|
||||||
if (!calledFromUser){
|
if (!calledFromUser){
|
||||||
UserLeave();
|
UserLeave();
|
||||||
}
|
}
|
||||||
|
@ -1769,6 +1772,162 @@ NtGdiGetDeviceCaps(HDC hDC,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INT
|
||||||
|
FASTCALL
|
||||||
|
IntcFonts(PGDIDEVICE pDevObj)
|
||||||
|
{
|
||||||
|
ULONG_PTR Junk;
|
||||||
|
// Msdn DrvQueryFont:
|
||||||
|
// If the number of fonts in DEVINFO is -1 and iFace is zero, the driver
|
||||||
|
// should return the number of fonts it supports.
|
||||||
|
if ( pDevObj->DevInfo.cFonts == -1)
|
||||||
|
{
|
||||||
|
if (pDevObj->DriverFunctions.QueryFont)
|
||||||
|
pDevObj->DevInfo.cFonts =
|
||||||
|
(ULONG)pDevObj->DriverFunctions.QueryFont(pDevObj->hPDev, 0, 0, &Junk);
|
||||||
|
else
|
||||||
|
pDevObj->DevInfo.cFonts = 0;
|
||||||
|
}
|
||||||
|
return pDevObj->DevInfo.cFonts;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT
|
||||||
|
FASTCALL
|
||||||
|
IntGetColorManagementCaps(PGDIDEVICE pDevObj)
|
||||||
|
{
|
||||||
|
INT ret = CM_NONE;
|
||||||
|
|
||||||
|
if ( pDevObj->flFlags & PDEV_DISPLAY)
|
||||||
|
{
|
||||||
|
if ( pDevObj->DevInfo.iDitherFormat == BMF_8BPP ||
|
||||||
|
pDevObj->DevInfo.flGraphicsCaps2 & GCAPS2_CHANGEGAMMARAMP)
|
||||||
|
ret = CM_GAMMA_RAMP;
|
||||||
|
}
|
||||||
|
if (pDevObj->DevInfo.flGraphicsCaps & GCAPS_CMYKCOLOR)
|
||||||
|
ret |= CM_CMYK_COLOR;
|
||||||
|
if (pDevObj->DevInfo.flGraphicsCaps & GCAPS_ICM)
|
||||||
|
ret |= CM_DEVICE_ICM;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
FASTCALL
|
||||||
|
IntvGetDeviceCaps(
|
||||||
|
PGDIDEVICE pDevObj,
|
||||||
|
PDEVCAPS pDevCaps)
|
||||||
|
{
|
||||||
|
ULONG Tmp = 0;
|
||||||
|
PGDIINFO pGdiInfo = &pDevObj->GDIInfo;
|
||||||
|
|
||||||
|
pDevCaps->ulVersion = pGdiInfo->ulVersion;
|
||||||
|
pDevCaps->ulTechnology = pGdiInfo->ulTechnology;
|
||||||
|
pDevCaps->ulHorzSizeM = (pGdiInfo->ulHorzSize + 500) / 0x3E8u;
|
||||||
|
pDevCaps->ulVertSizeM = (pGdiInfo->ulVertSize + 500) / 0x3E8u;
|
||||||
|
pDevCaps->ulHorzSize = pGdiInfo->ulHorzSize;
|
||||||
|
pDevCaps->ulVertSize = pGdiInfo->ulVertSize;
|
||||||
|
pDevCaps->ulHorzRes = pGdiInfo->ulHorzRes;
|
||||||
|
pDevCaps->ulVertRes = pGdiInfo->ulVertRes;
|
||||||
|
pDevCaps->ulVRefresh = pGdiInfo->ulVRefresh;
|
||||||
|
pDevCaps->ulDesktopHorzRes = pGdiInfo->ulHorzRes;
|
||||||
|
pDevCaps->ulDesktopVertRes = pGdiInfo->ulVertRes;
|
||||||
|
pDevCaps->ulBltAlignment = pGdiInfo->ulBltAlignment;
|
||||||
|
pDevCaps->ulPlanes = pGdiInfo->cPlanes;
|
||||||
|
|
||||||
|
pDevCaps->ulBitsPixel = pGdiInfo->cBitsPixel;
|
||||||
|
if (pGdiInfo->cBitsPixel == 15) pDevCaps->ulBitsPixel = 16;
|
||||||
|
|
||||||
|
Tmp = pGdiInfo->ulNumColors;
|
||||||
|
if ( Tmp != -1 ) Tmp *= 5;
|
||||||
|
pDevCaps->ulNumPens = Tmp;
|
||||||
|
pDevCaps->ulNumColors = pGdiInfo->ulNumColors;
|
||||||
|
|
||||||
|
pDevCaps->ulNumFonts = IntcFonts(pDevObj);
|
||||||
|
|
||||||
|
pDevCaps->ulRasterCaps = pGdiInfo->flRaster;
|
||||||
|
pDevCaps->ulShadeBlend = pGdiInfo->flShadeBlend;
|
||||||
|
pDevCaps->ulAspectX = pGdiInfo->ulAspectX;
|
||||||
|
pDevCaps->ulAspectY = pGdiInfo->ulAspectY;
|
||||||
|
pDevCaps->ulAspectXY = pGdiInfo->ulAspectXY;
|
||||||
|
pDevCaps->ulLogPixelsX = pGdiInfo->ulLogPixelsX;
|
||||||
|
pDevCaps->ulLogPixelsY = pGdiInfo->ulLogPixelsY;
|
||||||
|
pDevCaps->ulSizePalette = pGdiInfo->ulNumPalReg;
|
||||||
|
pDevCaps->ulColorRes = pGdiInfo->ulDACRed + pGdiInfo->ulDACGreen + pGdiInfo->ulDACBlue;
|
||||||
|
pDevCaps->ulPhysicalWidth = pGdiInfo->szlPhysSize.cx;
|
||||||
|
pDevCaps->ulPhysicalHeight = pGdiInfo->szlPhysSize.cy;
|
||||||
|
pDevCaps->ulPhysicalOffsetX = pGdiInfo->ptlPhysOffset.x;
|
||||||
|
pDevCaps->ulPhysicalOffsetY = pGdiInfo->ptlPhysOffset.y;
|
||||||
|
|
||||||
|
Tmp = 0;
|
||||||
|
Tmp = pGdiInfo->flTextCaps | (TC_SO_ABLE|TC_UA_ABLE|TC_CP_STROKE|TC_OP_STROKE|TC_OP_CHARACTER);
|
||||||
|
|
||||||
|
pDevCaps->ulTextCaps = pGdiInfo->flTextCaps | (TC_SO_ABLE|TC_UA_ABLE|TC_CP_STROKE|TC_OP_STROKE|TC_OP_CHARACTER);
|
||||||
|
|
||||||
|
if (pGdiInfo->ulTechnology)
|
||||||
|
pDevCaps->ulTextCaps = Tmp | TC_VA_ABLE;
|
||||||
|
|
||||||
|
pDevCaps->ulColorMgmtCaps = IntGetColorManagementCaps(pDevObj);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
APIENTRY
|
||||||
|
NtGdiGetDeviceCapsAll (
|
||||||
|
IN HDC hDC,
|
||||||
|
OUT PDEVCAPS pDevCaps)
|
||||||
|
{
|
||||||
|
PDC dc;
|
||||||
|
PDEVCAPS pSafeDevCaps;
|
||||||
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
dc = DC_LockDc(hDC);
|
||||||
|
if (dc == NULL)
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSafeDevCaps = ExAllocatePoolWithTag(PagedPool, sizeof(DEVCAPS), TAG_DC);
|
||||||
|
|
||||||
|
if (!pSafeDevCaps)
|
||||||
|
{
|
||||||
|
DC_UnlockDc(dc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
IntvGetDeviceCaps(dc->pPDev, pSafeDevCaps);
|
||||||
|
|
||||||
|
_SEH_TRY
|
||||||
|
{
|
||||||
|
ProbeForWrite(pDevCaps,
|
||||||
|
sizeof(DEVCAPS),
|
||||||
|
1);
|
||||||
|
RtlCopyMemory(pDevCaps, pSafeDevCaps, sizeof(DEVCAPS));
|
||||||
|
}
|
||||||
|
_SEH_HANDLE
|
||||||
|
{
|
||||||
|
Status = _SEH_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH_END;
|
||||||
|
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastNtError(Status);
|
||||||
|
ExFreePoolWithTag(pSafeDevCaps, TAG_DC);
|
||||||
|
DC_UnlockDc(dc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExFreePoolWithTag(pSafeDevCaps, TAG_DC);
|
||||||
|
DC_UnlockDc( dc );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtGdiResetDC(
|
NtGdiResetDC(
|
||||||
|
|
|
@ -1972,19 +1972,6 @@ NtGdiGetColorSpaceforBitmap(
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtGdiGetDeviceCapsAll (
|
|
||||||
IN HDC hdc,
|
|
||||||
OUT PDEVCAPS pDevCaps)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
APIENTRY
|
|
||||||
NtGdiGetETM(
|
NtGdiGetETM(
|
||||||
IN HDC hdc,
|
IN HDC hdc,
|
||||||
OUT EXTTEXTMETRIC *petm)
|
OUT EXTTEXTMETRIC *petm)
|
||||||
|
|
Loading…
Reference in a new issue