BOOL FASTCALL co_IntInitializeDesktopGraphics(VOID) { TEXTMETRICW tmw; UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY"); PDESKTOP pdesk; ScreenDeviceContext = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE); if (NULL == ScreenDeviceContext) { IntDestroyPrimarySurface(); return FALSE; } GreSetDCOwner(ScreenDeviceContext, GDI_OBJ_HMGR_PUBLIC); if (! IntCreatePrimarySurface()) { return FALSE; } hSystemBM = NtGdiCreateCompatibleDC(ScreenDeviceContext); NtGdiSelectFont(hSystemBM, NtGdiGetStockObject(SYSTEM_FONT)); GreSetDCOwner(hSystemBM, GDI_OBJ_HMGR_PUBLIC); /* Update the SERVERINFO */ gpsi->aiSysMet[SM_CXSCREEN] = gppdevPrimary->gdiinfo.ulHorzRes; gpsi->aiSysMet[SM_CYSCREEN] = gppdevPrimary->gdiinfo.ulVertRes; gpsi->Planes = NtGdiGetDeviceCaps(ScreenDeviceContext, PLANES); gpsi->BitsPixel = NtGdiGetDeviceCaps(ScreenDeviceContext, BITSPIXEL); gpsi->BitCount = gpsi->Planes * gpsi->BitsPixel; gpsi->dmLogPixels = NtGdiGetDeviceCaps(ScreenDeviceContext, LOGPIXELSY); if (NtGdiGetDeviceCaps(ScreenDeviceContext, RASTERCAPS) & RC_PALETTE) { gpsi->PUSIFlags |= PUSIF_PALETTEDISPLAY; } else gpsi->PUSIFlags &= ~PUSIF_PALETTEDISPLAY; // Font is realized and this dc was previously set to internal DC_ATTR. gpsi->cxSysFontChar = IntGetCharDimensions(hSystemBM, &tmw, (DWORD*)&gpsi->cySysFontChar); gpsi->tmSysFont = tmw; /* Put the pointer in the center of the screen */ gpsi->ptCursor.x = gpsi->aiSysMet[SM_CXSCREEN] / 2; gpsi->ptCursor.y = gpsi->aiSysMet[SM_CYSCREEN] / 2; /* Attach monitor */ UserAttachMonitor((HDEV)gppdevPrimary); /* Setup the cursor */ co_IntLoadDefaultCursors(); /* Show the desktop */ pdesk = IntGetActiveDesktop(); ASSERT(pdesk); co_IntShowDesktop(pdesk, gpsi->aiSysMet[SM_CXSCREEN], gpsi->aiSysMet[SM_CYSCREEN], TRUE); return TRUE; }
/* * @implemented * */ int WINAPI GetDeviceCaps( _In_ HDC hdc, _In_ int nIndex) { PDC_ATTR pdcattr; PDEVCAPS pDevCaps = GdiDevCaps; // Primary display device capabilities. DPRINT("Device CAPS1\n"); HANDLE_METADC(INT, GetDeviceCaps, 0, hdc, nIndex); /* Get the DC attribute */ pdcattr = GdiGetDcAttr(hdc); if (pdcattr == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } if (!(pdcattr->ulDirty_ & DC_PRIMARY_DISPLAY)) return NtGdiGetDeviceCaps(hdc, nIndex); switch (nIndex) { case DRIVERVERSION: return pDevCaps->ulVersion; case TECHNOLOGY: return pDevCaps->ulTechnology; case HORZSIZE: return pDevCaps->ulHorzSize; case VERTSIZE: return pDevCaps->ulVertSize; case HORZRES: return pDevCaps->ulHorzRes; case VERTRES: return pDevCaps->ulVertRes; case LOGPIXELSX: return pDevCaps->ulLogPixelsX; case LOGPIXELSY: return pDevCaps->ulLogPixelsY; case BITSPIXEL: return pDevCaps->ulBitsPixel; case PLANES: return pDevCaps->ulPlanes; case NUMBRUSHES: return -1; case NUMPENS: return pDevCaps->ulNumPens; case NUMFONTS: return pDevCaps->ulNumFonts; case NUMCOLORS: return pDevCaps->ulNumColors; case ASPECTX: return pDevCaps->ulAspectX; case ASPECTY: return pDevCaps->ulAspectY; case ASPECTXY: return pDevCaps->ulAspectXY; case CLIPCAPS: return CP_RECTANGLE; case SIZEPALETTE: return pDevCaps->ulSizePalette; case NUMRESERVED: return 20; case COLORRES: return pDevCaps->ulColorRes; case DESKTOPVERTRES: return pDevCaps->ulVertRes; case DESKTOPHORZRES: return pDevCaps->ulHorzRes; case BLTALIGNMENT: return pDevCaps->ulBltAlignment; case SHADEBLENDCAPS: return pDevCaps->ulShadeBlend; case COLORMGMTCAPS: return pDevCaps->ulColorMgmtCaps; case PHYSICALWIDTH: return pDevCaps->ulPhysicalWidth; case PHYSICALHEIGHT: return pDevCaps->ulPhysicalHeight; case PHYSICALOFFSETX: return pDevCaps->ulPhysicalOffsetX; case PHYSICALOFFSETY: return pDevCaps->ulPhysicalOffsetY; case VREFRESH: return pDevCaps->ulVRefresh; case RASTERCAPS: return pDevCaps->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 pDevCaps->ulTextCaps; case PDEVICESIZE: case SCALINGFACTORX: case SCALINGFACTORY: default: return 0; } return 0; }