BOOL FASTCALL IntCreatePrimarySurface(VOID) { /* Create surface */ PDEVOBJ_pSurface(gppdevPrimary); DPRINT("IntCreatePrimarySurface, gppdevPrimary=%p, gppdevPrimary->pSurface = %p\n", gppdevPrimary, gppdevPrimary->pSurface); // Init Primary Displays Device Capabilities. PDEVOBJ_vGetDeviceCaps(gppdevPrimary, &GdiHandleTable->DevCaps); return TRUE; }
BOOL APIENTRY NtGdiGetDeviceCapsAll( IN HDC hDC, OUT PDEVCAPS pDevCaps) { PDC pdc; DEVCAPS devcaps; BOOL bResult = TRUE; /* Lock the given DC */ pdc = DC_LockDc(hDC); if (!pdc) { EngSetLastError(ERROR_INVALID_HANDLE); return FALSE; } /* Get the data */ PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps); /* Unlock the DC */ DC_UnlockDc(pdc); /* Copy data to caller */ _SEH2_TRY { ProbeForWrite(pDevCaps, sizeof(DEVCAPS), 1); RtlCopyMemory(pDevCaps, &devcaps, sizeof(DEVCAPS)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { SetLastNtError(_SEH2_GetExceptionCode()); bResult = FALSE; } _SEH2_END; return bResult; }
INT APIENTRY NtGdiGetDeviceCaps( HDC hdc, INT Index) { PDC pdc; DEVCAPS devcaps; /* Lock the given DC */ pdc = DC_LockDc(hdc); if (!pdc) { EngSetLastError(ERROR_INVALID_HANDLE); return 0; } /* Get the data */ PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps); /* Unlock the DC */ DC_UnlockDc(pdc); /* Return capability */ switch (Index) { case DRIVERVERSION: return devcaps.ulVersion; case TECHNOLOGY: return devcaps.ulTechnology; case HORZSIZE: return devcaps.ulHorzSize; case VERTSIZE: return devcaps.ulVertSize; case HORZRES: return devcaps.ulHorzRes; case VERTRES: return devcaps.ulVertRes; case LOGPIXELSX: return devcaps.ulLogPixelsX; case LOGPIXELSY: return devcaps.ulLogPixelsY; case BITSPIXEL: return devcaps.ulBitsPixel; case PLANES: return devcaps.ulPlanes; case NUMBRUSHES: return -1; case NUMPENS: return devcaps.ulNumPens; case NUMFONTS: return devcaps.ulNumFonts; case NUMCOLORS: return devcaps.ulNumColors; case ASPECTX: return devcaps.ulAspectX; case ASPECTY: return devcaps.ulAspectY; case ASPECTXY: return devcaps.ulAspectXY; case CLIPCAPS: return CP_RECTANGLE; case SIZEPALETTE: return devcaps.ulSizePalette; case NUMRESERVED: return 20; case COLORRES: return devcaps.ulColorRes; case DESKTOPVERTRES: return devcaps.ulVertRes; case DESKTOPHORZRES: return devcaps.ulHorzRes; case BLTALIGNMENT: return devcaps.ulBltAlignment; case SHADEBLENDCAPS: return devcaps.ulShadeBlend; case COLORMGMTCAPS: return devcaps.ulColorMgmtCaps; case PHYSICALWIDTH: return devcaps.ulPhysicalWidth; case PHYSICALHEIGHT: return devcaps.ulPhysicalHeight; case PHYSICALOFFSETX: return devcaps.ulPhysicalOffsetX; case PHYSICALOFFSETY: return devcaps.ulPhysicalOffsetY; case VREFRESH: return devcaps.ulVRefresh; case RASTERCAPS: return devcaps.ulRasterCaps; case CURVECAPS: return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE | CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT); case LINECAPS: return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE | LC_STYLED | LC_WIDESTYLED | LC_INTERIORS); case POLYGONALCAPS: return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE | PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS); case TEXTCAPS: return devcaps.ulTextCaps; case CAPS1: case PDEVICESIZE: case SCALINGFACTORX: case SCALINGFACTORY: default: return 0; } return 0; }
BOOL NTAPI PDEVOBJ_bSwitchMode( PPDEVOBJ ppdev, PDEVMODEW pdm) { UNICODE_STRING ustrDevice; PPDEVOBJ ppdevTmp; PSURFACE pSurface; BOOL retval = FALSE; /* Lock the PDEV */ EngAcquireSemaphore(ppdev->hsemDevLock); /* And everything else */ EngAcquireSemaphore(ghsemPDEV); DPRINT1("PDEVOBJ_bSwitchMode, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface); // Lookup the GraphicsDevice + select DEVMODE // pdm = PDEVOBJ_pdmMatchDevMode(ppdev, pdm); /* 1. Temporarily disable the current PDEV */ if (!ppdev->pfn.AssertMode(ppdev->dhpdev, FALSE)) { DPRINT1("DrvAssertMode failed\n"); goto leave; } /* 2. Create new PDEV */ RtlInitUnicodeString(&ustrDevice, ppdev->pGraphicsDevice->szWinDeviceName); ppdevTmp = EngpCreatePDEV(&ustrDevice, pdm); if (!ppdevTmp) { DPRINT1("Failed to create a new PDEV\n"); goto leave; } /* 3. Create a new surface */ pSurface = PDEVOBJ_pSurface(ppdevTmp); if (!pSurface) { DPRINT1("DrvEnableSurface failed\n"); goto leave; } /* 4. Get DirectDraw information */ /* 5. Enable DirectDraw Not traced */ /* 6. Copy old PDEV state to new PDEV instance */ /* 7. Switch the PDEVs */ PDEVOBJ_vSwitchPdev(ppdev, ppdevTmp); /* 8. Disable DirectDraw */ PDEVOBJ_vRelease(ppdevTmp); /* Update primary display capabilities */ if(ppdev == gppdevPrimary) { PDEVOBJ_vGetDeviceCaps(ppdev, &GdiHandleTable->DevCaps); } /* Success! */ retval = TRUE; leave: /* Unlock PDEV */ EngReleaseSemaphore(ppdev->hsemDevLock); EngReleaseSemaphore(ghsemPDEV); DPRINT1("leave, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface); return retval; }