ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

pdevobj.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.