Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpdevobj.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS kernel 00004 * PURPOSE: Support for physical devices 00005 * FILE: subsystems/win32/win32k/eng/pdevobj.c 00006 * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) 00007 */ 00008 00009 #include <win32k.h> 00010 #define NDEBUG 00011 #include <debug.h> 00012 00013 PPDEVOBJ gppdevPrimary = NULL; 00014 00015 static PPDEVOBJ gppdevList = NULL; 00016 static HSEMAPHORE ghsemPDEV; 00017 00018 INIT_FUNCTION 00019 NTSTATUS 00020 NTAPI 00021 InitPDEVImpl() 00022 { 00023 ghsemPDEV = EngCreateSemaphore(); 00024 if (!ghsemPDEV) return STATUS_INSUFFICIENT_RESOURCES; 00025 return STATUS_SUCCESS; 00026 } 00027 00028 #if DBG 00029 PPDEVOBJ 00030 NTAPI 00031 DbgLookupDHPDEV(DHPDEV dhpdev) 00032 { 00033 PPDEVOBJ ppdev; 00034 00035 /* Lock PDEV list */ 00036 EngAcquireSemaphoreShared(ghsemPDEV); 00037 00038 /* Walk through the list of PDEVs */ 00039 for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext) 00040 { 00041 /* Compare with the given DHPDEV */ 00042 if (ppdev->dhpdev == dhpdev) break; 00043 } 00044 00045 /* Unlock PDEV list */ 00046 EngReleaseSemaphore(ghsemPDEV); 00047 00048 return ppdev; 00049 } 00050 #endif 00051 00052 PPDEVOBJ 00053 PDEVOBJ_AllocPDEV() 00054 { 00055 PPDEVOBJ ppdev; 00056 00057 ppdev = ExAllocatePoolWithTag(PagedPool, sizeof(PDEVOBJ), GDITAG_PDEV); 00058 if (!ppdev) 00059 return NULL; 00060 00061 RtlZeroMemory(ppdev, sizeof(PDEVOBJ)); 00062 00063 ppdev->cPdevRefs = 1; 00064 00065 return ppdev; 00066 } 00067 00068 VOID 00069 NTAPI 00070 PDEVOBJ_vRelease(PPDEVOBJ ppdev) 00071 { 00072 /* Lock loader */ 00073 EngAcquireSemaphore(ghsemPDEV); 00074 00075 /* Decrease reference count */ 00076 --ppdev->cPdevRefs; 00077 00078 ASSERT(ppdev->cPdevRefs >= 0) ; 00079 00080 /* Check if references are left */ 00081 if (ppdev->cPdevRefs == 0) 00082 { 00083 /* Do we have a surface? */ 00084 if(ppdev->pSurface) 00085 { 00086 /* Release the surface and let the driver free it */ 00087 SURFACE_ShareUnlockSurface(ppdev->pSurface); 00088 ppdev->pfn.DisableSurface(ppdev->dhpdev); 00089 } 00090 00091 /* Do we have a palette? */ 00092 if(ppdev->ppalSurf) 00093 { 00094 PALETTE_ShareUnlockPalette(ppdev->ppalSurf); 00095 } 00096 00097 /* Disable PDEV */ 00098 ppdev->pfn.DisablePDEV(ppdev->dhpdev); 00099 00100 /* Remove it from list */ 00101 if( ppdev == gppdevList ) 00102 gppdevList = ppdev->ppdevNext ; 00103 else 00104 { 00105 PPDEVOBJ ppdevCurrent = gppdevList; 00106 BOOL found = FALSE ; 00107 while (!found && ppdevCurrent->ppdevNext) 00108 { 00109 if (ppdevCurrent->ppdevNext == ppdev) 00110 found = TRUE; 00111 else 00112 ppdevCurrent = ppdevCurrent->ppdevNext ; 00113 } 00114 if(found) 00115 ppdevCurrent->ppdevNext = ppdev->ppdevNext; 00116 } 00117 00118 /* Is this the primary one ? */ 00119 if (ppdev == gppdevPrimary) 00120 gppdevPrimary = NULL; 00121 00122 /* Free it */ 00123 ExFreePoolWithTag(ppdev, GDITAG_PDEV ); 00124 } 00125 00126 /* Unlock loader */ 00127 EngReleaseSemaphore(ghsemPDEV); 00128 00129 } 00130 00131 BOOL 00132 NTAPI 00133 PDEVOBJ_bEnablePDEV( 00134 PPDEVOBJ ppdev, 00135 PDEVMODEW pdevmode, 00136 PWSTR pwszLogAddress) 00137 { 00138 PFN_DrvEnablePDEV pfnEnablePDEV; 00139 ULONG i; 00140 00141 DPRINT("PDEVOBJ_bEnablePDEV()\n"); 00142 00143 /* Get the DrvEnablePDEV function */ 00144 pfnEnablePDEV = ppdev->pldev->pfn.EnablePDEV; 00145 00146 /* Call the drivers DrvEnablePDEV function */ 00147 ppdev->dhpdev = pfnEnablePDEV(pdevmode, 00148 pwszLogAddress, 00149 HS_DDI_MAX, 00150 ppdev->ahsurf, 00151 sizeof(GDIINFO), 00152 (PULONG)&ppdev->gdiinfo, 00153 sizeof(DEVINFO), 00154 &ppdev->devinfo, 00155 (HDEV)ppdev, 00156 ppdev->pGraphicsDevice->pwszDescription, 00157 ppdev->pGraphicsDevice->DeviceObject); 00158 00159 /* Fix up some values */ 00160 if (ppdev->gdiinfo.ulLogPixelsX == 0) 00161 ppdev->gdiinfo.ulLogPixelsX = 96; 00162 00163 if (ppdev->gdiinfo.ulLogPixelsY == 0) 00164 ppdev->gdiinfo.ulLogPixelsY = 96; 00165 00166 /* Setup Palette */ 00167 ppdev->ppalSurf = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault); 00168 00169 /* Setup hatch brushes */ 00170 for (i = 0; i < HS_DDI_MAX; i++) 00171 { 00172 if (ppdev->ahsurf[i] == NULL) 00173 ppdev->ahsurf[i] = gahsurfHatch[i]; 00174 } 00175 00176 DPRINT("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev); 00177 00178 return TRUE; 00179 } 00180 00181 VOID 00182 NTAPI 00183 PDEVOBJ_vCompletePDEV( 00184 PPDEVOBJ ppdev) 00185 { 00186 /* Call the drivers DrvCompletePDEV function */ 00187 ppdev->pldev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev); 00188 } 00189 00190 PSURFACE 00191 NTAPI 00192 PDEVOBJ_pSurface( 00193 PPDEVOBJ ppdev) 00194 { 00195 HSURF hsurf; 00196 00197 /* Check if we already have a surface */ 00198 if (ppdev->pSurface) 00199 { 00200 /* Increment reference count */ 00201 GDIOBJ_vReferenceObjectByPointer(&ppdev->pSurface->BaseObject); 00202 } 00203 else 00204 { 00205 /* Call the drivers DrvEnableSurface */ 00206 hsurf = ppdev->pldev->pfn.EnableSurface(ppdev->dhpdev); 00207 00208 /* Lock the surface */ 00209 ppdev->pSurface = SURFACE_ShareLockSurface(hsurf); 00210 } 00211 00212 DPRINT("PDEVOBJ_pSurface() returning %p\n", ppdev->pSurface); 00213 return ppdev->pSurface; 00214 } 00215 00216 PDEVMODEW 00217 NTAPI 00218 PDEVOBJ_pdmMatchDevMode( 00219 PPDEVOBJ ppdev, 00220 PDEVMODEW pdm) 00221 { 00222 PGRAPHICS_DEVICE pGraphicsDevice; 00223 PDEVMODEW pdmCurrent; 00224 ULONG i; 00225 DWORD dwFields; 00226 00227 pGraphicsDevice = ppdev->pGraphicsDevice; 00228 00229 for (i = 0; i < pGraphicsDevice->cDevModes; i++) 00230 { 00231 pdmCurrent = pGraphicsDevice->pDevModeList[i].pdm; 00232 00233 /* Compare asked DEVMODE fields 00234 * Only compare those that are valid in both DEVMODE structs */ 00235 dwFields = pdmCurrent->dmFields & pdm->dmFields ; 00236 00237 /* For now, we only need those */ 00238 if ((dwFields & DM_BITSPERPEL) && 00239 (pdmCurrent->dmBitsPerPel != pdm->dmBitsPerPel)) continue; 00240 if ((dwFields & DM_PELSWIDTH) && 00241 (pdmCurrent->dmPelsWidth != pdm->dmPelsWidth)) continue; 00242 if ((dwFields & DM_PELSHEIGHT) && 00243 (pdmCurrent->dmPelsHeight != pdm->dmPelsHeight)) continue; 00244 if ((dwFields & DM_DISPLAYFREQUENCY) && 00245 (pdmCurrent->dmDisplayFrequency != pdm->dmDisplayFrequency)) continue; 00246 00247 /* Match! Return the DEVMODE */ 00248 return pdmCurrent; 00249 } 00250 00251 /* Nothing found */ 00252 return NULL; 00253 } 00254 00255 static 00256 PPDEVOBJ 00257 EngpCreatePDEV( 00258 PUNICODE_STRING pustrDeviceName, 00259 PDEVMODEW pdm) 00260 { 00261 PGRAPHICS_DEVICE pGraphicsDevice; 00262 PPDEVOBJ ppdev; 00263 DPRINT("EngpCreatePDEV(%wZ, %p)\n", pustrDeviceName, pdm); 00264 00265 /* Try to find the GRAPHICS_DEVICE */ 00266 if (pustrDeviceName) 00267 { 00268 pGraphicsDevice = EngpFindGraphicsDevice(pustrDeviceName, 0, 0); 00269 if (!pGraphicsDevice) 00270 { 00271 DPRINT1("No GRAPHICS_DEVICE found for %ls!\n", 00272 pustrDeviceName ? pustrDeviceName->Buffer : 0); 00273 return NULL; 00274 } 00275 } 00276 else 00277 { 00278 pGraphicsDevice = gpPrimaryGraphicsDevice; 00279 } 00280 00281 /* Allocate a new PDEVOBJ */ 00282 ppdev = PDEVOBJ_AllocPDEV(); 00283 if (!ppdev) 00284 { 00285 DPRINT1("failed to allocate a PDEV\n"); 00286 return NULL; 00287 } 00288 00289 /* If no DEVMODEW is given, ... */ 00290 if (!pdm) 00291 { 00292 /* ... use the device's default one */ 00293 pdm = pGraphicsDevice->pDevModeList[pGraphicsDevice->iDefaultMode].pdm; 00294 DPRINT("Using iDefaultMode = %ld\n", pGraphicsDevice->iDefaultMode); 00295 } 00296 00297 /* Try to get a diplay driver */ 00298 ppdev->pldev = EngLoadImageEx(pdm->dmDeviceName, LDEV_DEVICE_DISPLAY); 00299 if (!ppdev->pldev) 00300 { 00301 DPRINT1("Could not load display driver '%ls', '%s'\n", 00302 pGraphicsDevice->pDiplayDrivers, 00303 pdm->dmDeviceName); 00304 ExFreePoolWithTag(ppdev, GDITAG_PDEV); 00305 return NULL; 00306 } 00307 00308 /* Copy the function table */ 00309 ppdev->pfn = ppdev->pldev->pfn; 00310 00311 /* Set MovePointer function */ 00312 ppdev->pfnMovePointer = ppdev->pfn.MovePointer; 00313 if (!ppdev->pfnMovePointer) 00314 ppdev->pfnMovePointer = EngMovePointer; 00315 00316 ppdev->pGraphicsDevice = pGraphicsDevice; 00317 ppdev->hsemDevLock = EngCreateSemaphore(); 00318 // Should we change the ative mode of pGraphicsDevice ? 00319 ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ; 00320 00321 /* FIXME! */ 00322 ppdev->flFlags = PDEV_DISPLAY; 00323 00324 /* HACK: Don't use the pointer */ 00325 ppdev->Pointer.Exclude.right = -1; 00326 00327 /* Call the driver to enable the PDEV */ 00328 if (!PDEVOBJ_bEnablePDEV(ppdev, pdm, NULL)) 00329 { 00330 DPRINT1("Failed to enable PDEV!\n"); 00331 ASSERT(FALSE); 00332 } 00333 00334 /* FIXME: this must be done in a better way */ 00335 pGraphicsDevice->StateFlags |= DISPLAY_DEVICE_ATTACHED_TO_DESKTOP; 00336 00337 /* Tell the driver that the PDEV is ready */ 00338 PDEVOBJ_vCompletePDEV(ppdev); 00339 00340 /* Return the PDEV */ 00341 return ppdev; 00342 } 00343 00344 VOID 00345 NTAPI 00346 PDEVOBJ_vSwitchPdev( 00347 PPDEVOBJ ppdev, 00348 PPDEVOBJ ppdev2) 00349 { 00350 PDEVOBJ pdevTmp; 00351 DWORD tmpStateFlags; 00352 00353 /* Exchange data */ 00354 pdevTmp = *ppdev; 00355 00356 /* Exchange driver functions */ 00357 ppdev->pfn = ppdev2->pfn; 00358 ppdev2->pfn = pdevTmp.pfn; 00359 00360 /* Exchange LDEVs */ 00361 ppdev->pldev = ppdev2->pldev; 00362 ppdev2->pldev = pdevTmp.pldev; 00363 00364 /* Exchange DHPDEV */ 00365 ppdev->dhpdev = ppdev2->dhpdev; 00366 ppdev2->dhpdev = pdevTmp.dhpdev; 00367 00368 /* Exchange surfaces and associate them with their new PDEV */ 00369 ppdev->pSurface = ppdev2->pSurface; 00370 ppdev2->pSurface = pdevTmp.pSurface; 00371 ppdev->pSurface->SurfObj.hdev = (HDEV)ppdev; 00372 ppdev2->pSurface->SurfObj.hdev = (HDEV)ppdev2; 00373 00374 /* Exchange devinfo */ 00375 ppdev->devinfo = ppdev2->devinfo; 00376 ppdev2->devinfo = pdevTmp.devinfo; 00377 00378 /* Exchange gdiinfo */ 00379 ppdev->gdiinfo = ppdev2->gdiinfo; 00380 ppdev2->gdiinfo = pdevTmp.gdiinfo; 00381 00382 /* Exchange DEVMODE */ 00383 ppdev->pdmwDev = ppdev2->pdmwDev; 00384 ppdev2->pdmwDev = pdevTmp.pdmwDev; 00385 00386 /* Exchange state flags */ 00387 tmpStateFlags = ppdev->pGraphicsDevice->StateFlags; 00388 ppdev->pGraphicsDevice->StateFlags = ppdev2->pGraphicsDevice->StateFlags; 00389 ppdev2->pGraphicsDevice->StateFlags = tmpStateFlags; 00390 00391 /* Notify each driver instance of its new HDEV association */ 00392 ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev); 00393 ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2); 00394 } 00395 00396 00397 BOOL 00398 NTAPI 00399 PDEVOBJ_bSwitchMode( 00400 PPDEVOBJ ppdev, 00401 PDEVMODEW pdm) 00402 { 00403 UNICODE_STRING ustrDevice; 00404 PPDEVOBJ ppdevTmp; 00405 PSURFACE pSurface; 00406 BOOL retval = FALSE; 00407 00408 /* Lock the PDEV */ 00409 EngAcquireSemaphore(ppdev->hsemDevLock); 00410 /* And everything else */ 00411 EngAcquireSemaphore(ghsemPDEV); 00412 00413 DPRINT1("PDEVOBJ_bSwitchMode, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface); 00414 00415 // Lookup the GraphicsDevice + select DEVMODE 00416 // pdm = PDEVOBJ_pdmMatchDevMode(ppdev, pdm); 00417 00418 /* 1. Temporarily disable the current PDEV */ 00419 if (!ppdev->pfn.AssertMode(ppdev->dhpdev, FALSE)) 00420 { 00421 DPRINT1("DrvAssertMode failed\n"); 00422 goto leave; 00423 } 00424 00425 /* 2. Create new PDEV */ 00426 RtlInitUnicodeString(&ustrDevice, ppdev->pGraphicsDevice->szWinDeviceName); 00427 ppdevTmp = EngpCreatePDEV(&ustrDevice, pdm); 00428 if (!ppdevTmp) 00429 { 00430 DPRINT1("Failed to create a new PDEV\n"); 00431 goto leave; 00432 } 00433 00434 /* 3. Create a new surface */ 00435 pSurface = PDEVOBJ_pSurface(ppdevTmp); 00436 if (!pSurface) 00437 { 00438 DPRINT1("DrvEnableSurface failed\n"); 00439 goto leave; 00440 } 00441 00442 /* 4. Get DirectDraw information */ 00443 /* 5. Enable DirectDraw Not traced */ 00444 /* 6. Copy old PDEV state to new PDEV instance */ 00445 00446 /* 7. Switch the PDEVs */ 00447 PDEVOBJ_vSwitchPdev(ppdev, ppdevTmp); 00448 00449 /* 8. Disable DirectDraw */ 00450 00451 PDEVOBJ_vRelease(ppdevTmp); 00452 00453 /* Update primary display capabilities */ 00454 if(ppdev == gppdevPrimary) 00455 { 00456 PDEVOBJ_vGetDeviceCaps(ppdev, &GdiHandleTable->DevCaps); 00457 } 00458 00459 /* Success! */ 00460 retval = TRUE; 00461 leave: 00462 /* Unlock PDEV */ 00463 EngReleaseSemaphore(ppdev->hsemDevLock); 00464 EngReleaseSemaphore(ghsemPDEV); 00465 00466 DPRINT1("leave, ppdev = %p, pSurface = %p\n", ppdev, ppdev->pSurface); 00467 00468 return retval; 00469 } 00470 00471 00472 PPDEVOBJ 00473 NTAPI 00474 EngpGetPDEV( 00475 PUNICODE_STRING pustrDeviceName) 00476 { 00477 UNICODE_STRING ustrCurrent; 00478 PPDEVOBJ ppdev; 00479 PGRAPHICS_DEVICE pGraphicsDevice; 00480 00481 /* Acquire PDEV lock */ 00482 EngAcquireSemaphore(ghsemPDEV); 00483 00484 /* If no device name is given, ... */ 00485 if (!pustrDeviceName && gppdevPrimary) 00486 { 00487 /* ... use the primary PDEV */ 00488 ppdev = gppdevPrimary; 00489 00490 /* Reference the pdev */ 00491 InterlockedIncrement(&ppdev->cPdevRefs); 00492 goto leave; 00493 } 00494 00495 /* Loop all present PDEVs */ 00496 for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext) 00497 { 00498 /* Get a pointer to the GRAPHICS_DEVICE */ 00499 pGraphicsDevice = ppdev->pGraphicsDevice; 00500 00501 /* Compare the name */ 00502 RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName); 00503 if (RtlEqualUnicodeString(pustrDeviceName, &ustrCurrent, FALSE)) 00504 { 00505 /* Found! Reference the PDEV */ 00506 InterlockedIncrement(&ppdev->cPdevRefs); 00507 break; 00508 } 00509 } 00510 00511 /* Did we find one? */ 00512 if (!ppdev) 00513 { 00514 /* No, create a new PDEV */ 00515 ppdev = EngpCreatePDEV(pustrDeviceName, NULL); 00516 if (ppdev) 00517 { 00518 /* Insert the PDEV into the list */ 00519 ppdev->ppdevNext = gppdevList; 00520 gppdevList = ppdev; 00521 00522 /* Set as primary PDEV, if we don't have one yet */ 00523 if (!gppdevPrimary) 00524 { 00525 gppdevPrimary = ppdev; 00526 ppdev->pGraphicsDevice->StateFlags |= DISPLAY_DEVICE_PRIMARY_DEVICE; 00527 } 00528 } 00529 } 00530 00531 leave: 00532 /* Release PDEV lock */ 00533 EngReleaseSemaphore(ghsemPDEV); 00534 00535 return ppdev; 00536 } 00537 00538 INT 00539 NTAPI 00540 PDEVOBJ_iGetColorManagementCaps(PPDEVOBJ ppdev) 00541 { 00542 INT ret = CM_NONE; 00543 00544 if (ppdev->flFlags & PDEV_DISPLAY) 00545 { 00546 if (ppdev->devinfo.iDitherFormat == BMF_8BPP || 00547 ppdev->devinfo.flGraphicsCaps2 & GCAPS2_CHANGEGAMMARAMP) 00548 ret = CM_GAMMA_RAMP; 00549 } 00550 00551 if (ppdev->devinfo.flGraphicsCaps & GCAPS_CMYKCOLOR) 00552 ret |= CM_CMYK_COLOR; 00553 if (ppdev->devinfo.flGraphicsCaps & GCAPS_ICM) 00554 ret |= CM_DEVICE_ICM; 00555 00556 return ret; 00557 } 00558 00559 VOID 00560 NTAPI 00561 PDEVOBJ_vGetDeviceCaps( 00562 IN PPDEVOBJ ppdev, 00563 OUT PDEVCAPS pDevCaps) 00564 { 00565 PGDIINFO pGdiInfo = &ppdev->gdiinfo; 00566 00567 pDevCaps->ulVersion = pGdiInfo->ulVersion; 00568 pDevCaps->ulTechnology = pGdiInfo->ulTechnology; 00569 pDevCaps->ulHorzSizeM = (pGdiInfo->ulHorzSize + 500) / 1000; 00570 pDevCaps->ulVertSizeM = (pGdiInfo->ulVertSize + 500) / 1000; 00571 pDevCaps->ulHorzSize = pGdiInfo->ulHorzSize; 00572 pDevCaps->ulVertSize = pGdiInfo->ulVertSize; 00573 pDevCaps->ulHorzRes = pGdiInfo->ulHorzRes; 00574 pDevCaps->ulVertRes = pGdiInfo->ulVertRes; 00575 pDevCaps->ulBitsPixel = pGdiInfo->cBitsPixel; 00576 if (pDevCaps->ulBitsPixel == 15) pDevCaps->ulBitsPixel = 16; 00577 pDevCaps->ulPlanes = pGdiInfo->cPlanes; 00578 pDevCaps->ulNumPens = pGdiInfo->ulNumColors; 00579 if (pDevCaps->ulNumPens != -1) pDevCaps->ulNumPens *= 5; 00580 pDevCaps->ulNumFonts = 0; // PDEVOBJ_cFonts(ppdev); 00581 pDevCaps->ulNumColors = pGdiInfo->ulNumColors; 00582 pDevCaps->ulRasterCaps = pGdiInfo->flRaster; 00583 pDevCaps->ulAspectX = pGdiInfo->ulAspectX; 00584 pDevCaps->ulAspectY = pGdiInfo->ulAspectY; 00585 pDevCaps->ulAspectXY = pGdiInfo->ulAspectXY; 00586 pDevCaps->ulLogPixelsX = pGdiInfo->ulLogPixelsX; 00587 pDevCaps->ulLogPixelsY = pGdiInfo->ulLogPixelsY; 00588 pDevCaps->ulSizePalette = pGdiInfo->ulNumPalReg; 00589 pDevCaps->ulColorRes = pGdiInfo->ulDACRed + 00590 pGdiInfo->ulDACGreen + 00591 pGdiInfo->ulDACBlue; 00592 pDevCaps->ulPhysicalWidth = pGdiInfo->szlPhysSize.cx; 00593 pDevCaps->ulPhysicalHeight = pGdiInfo->szlPhysSize.cy; 00594 pDevCaps->ulPhysicalOffsetX = pGdiInfo->ptlPhysOffset.x; 00595 pDevCaps->ulPhysicalOffsetY = pGdiInfo->ptlPhysOffset.y; 00596 pDevCaps->ulTextCaps = pGdiInfo->flTextCaps; 00597 pDevCaps->ulTextCaps |= (TC_SO_ABLE|TC_UA_ABLE|TC_CP_STROKE|TC_OP_STROKE|TC_OP_CHARACTER); 00598 if (pGdiInfo->ulTechnology != DT_PLOTTER) 00599 pDevCaps->ulTextCaps |= TC_VA_ABLE; 00600 pDevCaps->ulVRefresh = pGdiInfo->ulVRefresh; 00601 pDevCaps->ulDesktopHorzRes = pGdiInfo->ulHorzRes; 00602 pDevCaps->ulDesktopVertRes = pGdiInfo->ulVertRes; 00603 pDevCaps->ulBltAlignment = pGdiInfo->ulBltAlignment; 00604 pDevCaps->ulPanningHorzRes = pGdiInfo->ulPanningHorzRes; 00605 pDevCaps->ulPanningVertRes = pGdiInfo->ulPanningVertRes; 00606 pDevCaps->xPanningAlignment = pGdiInfo->xPanningAlignment; 00607 pDevCaps->yPanningAlignment = pGdiInfo->yPanningAlignment; 00608 pDevCaps->ulShadeBlend = pGdiInfo->flShadeBlend; 00609 pDevCaps->ulColorMgmtCaps = PDEVOBJ_iGetColorManagementCaps(ppdev); 00610 } 00611 00612 00615 LPWSTR 00616 APIENTRY 00617 EngGetDriverName(IN HDEV hdev) 00618 { 00619 PPDEVOBJ ppdev = (PPDEVOBJ)hdev; 00620 PLDEVOBJ pldev; 00621 00622 if (!hdev) 00623 return NULL; 00624 00625 pldev = ppdev->pldev; 00626 ASSERT(pldev); 00627 00628 if (!pldev->pGdiDriverInfo) 00629 return NULL; 00630 00631 return pldev->pGdiDriverInfo->DriverName.Buffer; 00632 } 00633 00634 00635 INT 00636 APIENTRY 00637 NtGdiGetDeviceCaps( 00638 HDC hdc, 00639 INT Index) 00640 { 00641 PDC pdc; 00642 DEVCAPS devcaps; 00643 00644 /* Lock the given DC */ 00645 pdc = DC_LockDc(hdc); 00646 if (!pdc) 00647 { 00648 EngSetLastError(ERROR_INVALID_HANDLE); 00649 return 0; 00650 } 00651 00652 /* Get the data */ 00653 PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps); 00654 00655 /* Unlock the DC */ 00656 DC_UnlockDc(pdc); 00657 00658 /* Return capability */ 00659 switch (Index) 00660 { 00661 case DRIVERVERSION: 00662 return devcaps.ulVersion; 00663 00664 case TECHNOLOGY: 00665 return devcaps.ulTechnology; 00666 00667 case HORZSIZE: 00668 return devcaps.ulHorzSize; 00669 00670 case VERTSIZE: 00671 return devcaps.ulVertSize; 00672 00673 case HORZRES: 00674 return devcaps.ulHorzRes; 00675 00676 case VERTRES: 00677 return devcaps.ulVertRes; 00678 00679 case LOGPIXELSX: 00680 return devcaps.ulLogPixelsX; 00681 00682 case LOGPIXELSY: 00683 return devcaps.ulLogPixelsY; 00684 00685 case BITSPIXEL: 00686 return devcaps.ulBitsPixel; 00687 00688 case PLANES: 00689 return devcaps.ulPlanes; 00690 00691 case NUMBRUSHES: 00692 return -1; 00693 00694 case NUMPENS: 00695 return devcaps.ulNumPens; 00696 00697 case NUMFONTS: 00698 return devcaps.ulNumFonts; 00699 00700 case NUMCOLORS: 00701 return devcaps.ulNumColors; 00702 00703 case ASPECTX: 00704 return devcaps.ulAspectX; 00705 00706 case ASPECTY: 00707 return devcaps.ulAspectY; 00708 00709 case ASPECTXY: 00710 return devcaps.ulAspectXY; 00711 00712 case CLIPCAPS: 00713 return CP_RECTANGLE; 00714 00715 case SIZEPALETTE: 00716 return devcaps.ulSizePalette; 00717 00718 case NUMRESERVED: 00719 return 20; 00720 00721 case COLORRES: 00722 return devcaps.ulColorRes; 00723 00724 case DESKTOPVERTRES: 00725 return devcaps.ulVertRes; 00726 00727 case DESKTOPHORZRES: 00728 return devcaps.ulHorzRes; 00729 00730 case BLTALIGNMENT: 00731 return devcaps.ulBltAlignment; 00732 00733 case SHADEBLENDCAPS: 00734 return devcaps.ulShadeBlend; 00735 00736 case COLORMGMTCAPS: 00737 return devcaps.ulColorMgmtCaps; 00738 00739 case PHYSICALWIDTH: 00740 return devcaps.ulPhysicalWidth; 00741 00742 case PHYSICALHEIGHT: 00743 return devcaps.ulPhysicalHeight; 00744 00745 case PHYSICALOFFSETX: 00746 return devcaps.ulPhysicalOffsetX; 00747 00748 case PHYSICALOFFSETY: 00749 return devcaps.ulPhysicalOffsetY; 00750 00751 case VREFRESH: 00752 return devcaps.ulVRefresh; 00753 00754 case RASTERCAPS: 00755 return devcaps.ulRasterCaps; 00756 00757 case CURVECAPS: 00758 return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE | 00759 CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT); 00760 00761 case LINECAPS: 00762 return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE | 00763 LC_STYLED | LC_WIDESTYLED | LC_INTERIORS); 00764 00765 case POLYGONALCAPS: 00766 return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE | 00767 PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS); 00768 00769 case TEXTCAPS: 00770 return devcaps.ulTextCaps; 00771 00772 case CAPS1: 00773 case PDEVICESIZE: 00774 case SCALINGFACTORX: 00775 case SCALINGFACTORY: 00776 default: 00777 return 0; 00778 } 00779 00780 return 0; 00781 } 00782 00783 00784 BOOL 00785 APIENTRY 00786 NtGdiGetDeviceCapsAll( 00787 IN HDC hDC, 00788 OUT PDEVCAPS pDevCaps) 00789 { 00790 PDC pdc; 00791 DEVCAPS devcaps; 00792 BOOL bResult = TRUE; 00793 00794 /* Lock the given DC */ 00795 pdc = DC_LockDc(hDC); 00796 if (!pdc) 00797 { 00798 EngSetLastError(ERROR_INVALID_HANDLE); 00799 return FALSE; 00800 } 00801 00802 /* Get the data */ 00803 PDEVOBJ_vGetDeviceCaps(pdc->ppdev, &devcaps); 00804 00805 /* Unlock the DC */ 00806 DC_UnlockDc(pdc); 00807 00808 /* Copy data to caller */ 00809 _SEH2_TRY 00810 { 00811 ProbeForWrite(pDevCaps, sizeof(DEVCAPS), 1); 00812 RtlCopyMemory(pDevCaps, &devcaps, sizeof(DEVCAPS)); 00813 } 00814 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00815 { 00816 SetLastNtError(_SEH2_GetExceptionCode()); 00817 bResult = FALSE; 00818 } 00819 _SEH2_END; 00820 00821 return bResult; 00822 } 00823 00824 DHPDEV 00825 APIENTRY 00826 NtGdiGetDhpdev( 00827 IN HDEV hdev) 00828 { 00829 PPDEVOBJ ppdev; 00830 DHPDEV dhpdev = NULL; 00831 00832 /* Check parameter */ 00833 if (!hdev || (PCHAR)hdev < (PCHAR)MmSystemRangeStart) 00834 return NULL; 00835 00836 /* Lock PDEV list */ 00837 EngAcquireSemaphoreShared(ghsemPDEV); 00838 00839 /* Walk through the list of PDEVs */ 00840 for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext) 00841 { 00842 /* Compare with the given HDEV */ 00843 if (ppdev == (PPDEVOBJ)hdev) 00844 { 00845 /* Found the PDEV! Get it's dhpdev and break */ 00846 dhpdev = ppdev->dhpdev; 00847 break; 00848 } 00849 } 00850 00851 /* Unlock PDEV list */ 00852 EngReleaseSemaphore(ghsemPDEV); 00853 00854 return dhpdev; 00855 } 00856 00857 PSIZEL 00858 FASTCALL 00859 PDEVOBJ_sizl(PPDEVOBJ ppdev, PSIZEL psizl) 00860 { 00861 if (ppdev->flFlags & PDEV_META_DEVICE) 00862 { 00863 psizl->cx = ppdev->ulHorzRes; 00864 psizl->cy = ppdev->ulVertRes; 00865 } 00866 else 00867 { 00868 psizl->cx = ppdev->gdiinfo.ulHorzRes; 00869 psizl->cy = ppdev->gdiinfo.ulVertRes; 00870 } 00871 return psizl; 00872 } Generated on Sat May 26 2012 04:37:09 for ReactOS by
1.7.6.1
|