Difference between revisions of "Techwiki:DC State Saving"
ThePhysicist (talk | contribs) |
ThePhysicist (talk | contribs) (→Saved content) |
||
Line 7: | Line 7: | ||
===Saved content=== | ===Saved content=== | ||
− | The following fields are saved: | + | '''The following fields are saved:''' |
− | DC.ppdev: either copied or initialized to the same value as the original DC | + | :DC.ppdev: either copied or initialized to the same value as the original DC |
− | DC.dclevel.hpal | + | :DC.dclevel.hpal |
− | DC.dclevel.ppal | + | :DC.dclevel.ppal |
− | DC.dclevel.pColorSpace | + | :DC.dclevel.pColorSpace |
− | DC.dclevel.lSaveDepth | + | :DC.dclevel.lSaveDepth |
− | DC.dclevel.hdcSave | + | :DC.dclevel.hdcSave |
− | DC.dclevel.pbrFill | + | :DC.dclevel.pbrFill |
− | DC.dclevel.pbrLine | + | :DC.dclevel.pbrLine |
− | DC.dclevel.pFont | + | :DC.dclevel.pFont |
− | DC.dclevel.lapath (at least partly) | + | :DC.dclevel.lapath (at least partly) |
− | DC.dclevel.ca | + | :DC.dclevel.ca |
− | DC.dclevel.mxWorldToDevice | + | :DC.dclevel.mxWorldToDevice |
− | DC.dclevel.mxDeviceToWorld | + | :DC.dclevel.mxDeviceToWorld |
− | DC.dclevel.mxWorldToPage | + | :DC.dclevel.mxWorldToPage |
− | DC.dclevel.efM11PtoD | + | :DC.dclevel.efM11PtoD |
− | DC.dclevel.efM22PtoD | + | :DC.dclevel.efM22PtoD |
− | DC.dclevel.pSurface | + | :DC.dclevel.pSurface |
− | DC.dclevel.sizl | + | :DC.dclevel.sizl |
− | The following fields are not saved: | + | '''The following fields are not saved:''' |
− | DC.dhpdev | + | :DC.dhpdev |
− | DC.dctype | + | :DC.dctype |
− | DC.fs | + | :DC.fs |
− | DC.hsem | + | :DC.hsem |
− | DC.flGraphicsCaps | + | :DC.flGraphicsCaps |
− | DC.flGraphicsCaps2 | + | :DC.flGraphicsCaps2 |
− | DC.pdcattr | + | :DC.pdcattr |
− | DC.erclClip | + | :DC.erclClip |
− | DC.ptlDCOrig | + | :DC.ptlDCOrig |
− | DC.erclWindow | + | :DC.erclWindow |
− | DC.erclBounds | + | :DC.erclBounds |
− | DC.erclBoundsApp | + | :DC.erclBoundsApp |
− | DC.prgnVis | + | :DC.prgnVis |
− | DC.prgnRao | + | :DC.prgnRao |
− | DC.ptlFillOrigin | + | :DC.ptlFillOrigin |
− | DC.eboFill | + | :DC.eboFill |
− | DC.eboLine | + | :DC.eboLine |
− | DC.eboText | + | :DC.eboText |
− | DC.eboBackground | + | :DC.eboBackground |
− | DC.hlfntCur | + | :DC.hlfntCur |
− | DC.co | + | :DC.co |
− | DC.ipfdDevMax | + | :DC.ipfdDevMax |
− | DC.ulCopyCount | + | :DC.ulCopyCount |
− | The following fields need investigation: | + | '''The following fields need investigation:''' |
− | DC.hdcNext | + | :DC.hdcNext |
− | DC.hdcPrev | + | :DC.hdcPrev |
− | DC.prgnAPI | + | :DC.prgnAPI |
− | DC.flSimulationFlags | + | :DC.flSimulationFlags |
− | DC.lEscapement | + | :DC.lEscapement |
− | DC.prfnt | + | :DC.prfnt |
− | DC.pPFFList | + | :DC.pPFFList |
− | DC.pClrxFormLnk | + | :DC.pClrxFormLnk |
− | DC.pSurfInfo | + | :DC.pSurfInfo |
− | DC.ptlDoBanding | + | :DC.ptlDoBanding |
− | DC.dclevel.lIcmMode | + | :DC.dclevel.lIcmMode |
− | DC.dclevel.ptlBrushOrigin | + | :DC.dclevel.ptlBrushOrigin |
− | DC.dclevel.hpath | + | :DC.dclevel.hpath |
− | DC.dclevel.flPath | + | :DC.dclevel.flPath |
− | DC.dclevel.prgnClip | + | :DC.dclevel.prgnClip |
− | DC.dclevel.prgnMeta | + | :DC.dclevel.prgnMeta |
− | DC.dclevel.flFontState | + | :DC.dclevel.flFontState |
− | DC.dclevel.ufi | + | :DC.dclevel.ufi |
− | DC.dclevel.ufiLoc | + | :DC.dclevel.ufiLoc |
− | DC.dclevel.pUFI | + | :DC.dclevel.pUFI |
− | DC.dclevel.uNumUFIs | + | :DC.dclevel.uNumUFIs |
− | DC.dclevel.ufiSet | + | :DC.dclevel.ufiSet |
− | DC.dclevel.fl | + | :DC.dclevel.fl |
− | DC.dclevel.flbrush | + | :DC.dclevel.flbrush |
− | DC.dclevel.efDxPtoD | + | :DC.dclevel.efDxPtoD |
− | DC.dclevel.efDyPtoD | + | :DC.dclevel.efDyPtoD |
− | DC.dclevel.efM11_TWIPS | + | :DC.dclevel.efM11_TWIPS |
− | DC.dclevel.efM22_TWIPS | + | :DC.dclevel.efM22_TWIPS |
− | DC.dclevel.efPr11 | + | :DC.dclevel.efPr11 |
− | DC.dclevel.efPr22 | + | :DC.dclevel.efPr22 |
− | DC.pdcattr->pvLDC | + | :DC.pdcattr->pvLDC |
− | DC.pdcattr->ulDirty | + | :DC.pdcattr->ulDirty |
− | DC.pdcattr->hbrush | + | :DC.pdcattr->hbrush |
− | DC.pdcattr->hpen | + | :DC.pdcattr->hpen |
− | DC.pdcattr->crBackgroundClr | + | :DC.pdcattr->crBackgroundClr |
− | DC.pdcattr->ulBackgroundClr | + | :DC.pdcattr->ulBackgroundClr |
− | DC.pdcattr->crForegroundClr | + | :DC.pdcattr->crForegroundClr |
− | DC.pdcattr->ulForegroundClr | + | :DC.pdcattr->ulForegroundClr |
− | DC.pdcattr->crBrushClr | + | :DC.pdcattr->crBrushClr |
− | DC.pdcattr->ulBrushClr | + | :DC.pdcattr->ulBrushClr |
− | DC.pdcattr->crPenClr | + | :DC.pdcattr->crPenClr |
− | DC.pdcattr->ulPenClr | + | :DC.pdcattr->ulPenClr |
− | DC.pdcattr->iCS_CP | + | :DC.pdcattr->iCS_CP |
− | DC.pdcattr->iGraphicsMode | + | :DC.pdcattr->iGraphicsMode |
− | DC.pdcattr->jROP2 | + | :DC.pdcattr->jROP2 |
− | DC.pdcattr->jBkMode | + | :DC.pdcattr->jBkMode |
− | DC.pdcattr->jFillMode | + | :DC.pdcattr->jFillMode |
− | DC.pdcattr->jStretchBltMode | + | :DC.pdcattr->jStretchBltMode |
− | DC.pdcattr->ptlCurrent | + | :DC.pdcattr->ptlCurrent |
− | DC.pdcattr->ptfxCurrent | + | :DC.pdcattr->ptfxCurrent |
− | DC.pdcattr->lBkMode | + | :DC.pdcattr->lBkMode |
− | DC.pdcattr->lFillMode | + | :DC.pdcattr->lFillMode |
− | DC.pdcattr->lStretchBltMode | + | :DC.pdcattr->lStretchBltMode |
− | DC.pdcattr->flFontMapper | + | :DC.pdcattr->flFontMapper |
− | DC.pdcattr->lIcmMode | + | :DC.pdcattr->lIcmMode |
− | DC.pdcattr->hcmXform | + | :DC.pdcattr->hcmXform |
− | DC.pdcattr->hColorSpace | + | :DC.pdcattr->hColorSpace |
− | DC.pdcattr->flIcmFlags | + | :DC.pdcattr->flIcmFlags |
− | DC.pdcattr->IcmBrushColor | + | :DC.pdcattr->IcmBrushColor |
− | DC.pdcattr->IcmPenColor | + | :DC.pdcattr->IcmPenColor |
− | DC.pdcattr->pvLIcm | + | :DC.pdcattr->pvLIcm |
− | DC.pdcattr->flTextAlign | + | :DC.pdcattr->flTextAlign |
− | DC.pdcattr->lTextAlign | + | :DC.pdcattr->lTextAlign |
− | DC.pdcattr->lTextExtra | + | :DC.pdcattr->lTextExtra |
− | DC.pdcattr->lRelAbs | + | :DC.pdcattr->lRelAbs |
− | DC.pdcattr->lBreakExtra | + | :DC.pdcattr->lBreakExtra |
− | DC.pdcattr->cBreak | + | :DC.pdcattr->cBreak |
− | DC.pdcattr->hlfntNew | + | :DC.pdcattr->hlfntNew |
− | DC.pdcattr->mxWorldToDevice | + | :DC.pdcattr->mxWorldToDevice |
− | DC.pdcattr->mxDeviceToWorld | + | :DC.pdcattr->mxDeviceToWorld |
− | DC.pdcattr->mxWorldToPage | + | :DC.pdcattr->mxWorldToPage |
− | DC.pdcattr->efM11PtoD | + | :DC.pdcattr->efM11PtoD |
− | DC.pdcattr->efM22PtoD | + | :DC.pdcattr->efM22PtoD |
− | DC.pdcattr->efDxPtoD | + | :DC.pdcattr->efDxPtoD |
− | DC.pdcattr->efDyPtoD | + | :DC.pdcattr->efDyPtoD |
− | DC.pdcattr->iMapMode | + | :DC.pdcattr->iMapMode |
− | DC.pdcattr->dwLayout | + | :DC.pdcattr->dwLayout |
− | DC.pdcattr->lWindowOrgx | + | :DC.pdcattr->lWindowOrgx |
− | DC.pdcattr->ptlWindowOrg | + | :DC.pdcattr->ptlWindowOrg |
− | DC.pdcattr->szlWindowExt | + | :DC.pdcattr->szlWindowExt |
− | DC.pdcattr->ptlViewportOrg | + | :DC.pdcattr->ptlViewportOrg |
− | DC.pdcattr->szlViewportExt | + | :DC.pdcattr->szlViewportExt |
− | DC.pdcattr->flXform | + | :DC.pdcattr->flXform |
− | DC.pdcattr->szlVirtualDevicePixel | + | :DC.pdcattr->szlVirtualDevicePixel |
− | DC.pdcattr->szlVirtualDeviceMm | + | :DC.pdcattr->szlVirtualDeviceMm |
− | DC.pdcattr->szlVirtualDeviceSize | + | :DC.pdcattr->szlVirtualDeviceSize |
− | DC.pdcattr->ptlBrushOrigin | + | :DC.pdcattr->ptlBrushOrigin |
− | DC.pdcattr->VisRectRegion | + | :DC.pdcattr->VisRectRegion |
Revision as of 23:01, 24 March 2009
DC State saving is done from SaveDC (NtGdiSaveDC), restoring from RestoreDC (NtGdiRestoreDC). The Saved levels form a linked list of HDCs, with the first saved state DC in the original DC's dclevel.hdcSave. Each Saved DC has this field set to the last DC that was saved before. The hdcSave field is initialized with 0. The dclevel.lSaveDepth specifies the DCs save level. It is initialized with 1 and grows by one each time you call SaveDC. After calling RestoreDC, it is restored to the requested level. Saved DCs don't belong to the current process. Instead they have a ProcessId of something like 0x80000012 (found on XP).
Saved content
The following fields are saved:
- DC.ppdev: either copied or initialized to the same value as the original DC
- DC.dclevel.hpal
- DC.dclevel.ppal
- DC.dclevel.pColorSpace
- DC.dclevel.lSaveDepth
- DC.dclevel.hdcSave
- DC.dclevel.pbrFill
- DC.dclevel.pbrLine
- DC.dclevel.pFont
- DC.dclevel.lapath (at least partly)
- DC.dclevel.ca
- DC.dclevel.mxWorldToDevice
- DC.dclevel.mxDeviceToWorld
- DC.dclevel.mxWorldToPage
- DC.dclevel.efM11PtoD
- DC.dclevel.efM22PtoD
- DC.dclevel.pSurface
- DC.dclevel.sizl
The following fields are not saved:
- DC.dhpdev
- DC.dctype
- DC.fs
- DC.hsem
- DC.flGraphicsCaps
- DC.flGraphicsCaps2
- DC.pdcattr
- DC.erclClip
- DC.ptlDCOrig
- DC.erclWindow
- DC.erclBounds
- DC.erclBoundsApp
- DC.prgnVis
- DC.prgnRao
- DC.ptlFillOrigin
- DC.eboFill
- DC.eboLine
- DC.eboText
- DC.eboBackground
- DC.hlfntCur
- DC.co
- DC.ipfdDevMax
- DC.ulCopyCount
The following fields need investigation:
- DC.hdcNext
- DC.hdcPrev
- DC.prgnAPI
- DC.flSimulationFlags
- DC.lEscapement
- DC.prfnt
- DC.pPFFList
- DC.pClrxFormLnk
- DC.pSurfInfo
- DC.ptlDoBanding
- DC.dclevel.lIcmMode
- DC.dclevel.ptlBrushOrigin
- DC.dclevel.hpath
- DC.dclevel.flPath
- DC.dclevel.prgnClip
- DC.dclevel.prgnMeta
- DC.dclevel.flFontState
- DC.dclevel.ufi
- DC.dclevel.ufiLoc
- DC.dclevel.pUFI
- DC.dclevel.uNumUFIs
- DC.dclevel.ufiSet
- DC.dclevel.fl
- DC.dclevel.flbrush
- DC.dclevel.efDxPtoD
- DC.dclevel.efDyPtoD
- DC.dclevel.efM11_TWIPS
- DC.dclevel.efM22_TWIPS
- DC.dclevel.efPr11
- DC.dclevel.efPr22
- DC.pdcattr->pvLDC
- DC.pdcattr->ulDirty
- DC.pdcattr->hbrush
- DC.pdcattr->hpen
- DC.pdcattr->crBackgroundClr
- DC.pdcattr->ulBackgroundClr
- DC.pdcattr->crForegroundClr
- DC.pdcattr->ulForegroundClr
- DC.pdcattr->crBrushClr
- DC.pdcattr->ulBrushClr
- DC.pdcattr->crPenClr
- DC.pdcattr->ulPenClr
- DC.pdcattr->iCS_CP
- DC.pdcattr->iGraphicsMode
- DC.pdcattr->jROP2
- DC.pdcattr->jBkMode
- DC.pdcattr->jFillMode
- DC.pdcattr->jStretchBltMode
- DC.pdcattr->ptlCurrent
- DC.pdcattr->ptfxCurrent
- DC.pdcattr->lBkMode
- DC.pdcattr->lFillMode
- DC.pdcattr->lStretchBltMode
- DC.pdcattr->flFontMapper
- DC.pdcattr->lIcmMode
- DC.pdcattr->hcmXform
- DC.pdcattr->hColorSpace
- DC.pdcattr->flIcmFlags
- DC.pdcattr->IcmBrushColor
- DC.pdcattr->IcmPenColor
- DC.pdcattr->pvLIcm
- DC.pdcattr->flTextAlign
- DC.pdcattr->lTextAlign
- DC.pdcattr->lTextExtra
- DC.pdcattr->lRelAbs
- DC.pdcattr->lBreakExtra
- DC.pdcattr->cBreak
- DC.pdcattr->hlfntNew
- DC.pdcattr->mxWorldToDevice
- DC.pdcattr->mxDeviceToWorld
- DC.pdcattr->mxWorldToPage
- DC.pdcattr->efM11PtoD
- DC.pdcattr->efM22PtoD
- DC.pdcattr->efDxPtoD
- DC.pdcattr->efDyPtoD
- DC.pdcattr->iMapMode
- DC.pdcattr->dwLayout
- DC.pdcattr->lWindowOrgx
- DC.pdcattr->ptlWindowOrg
- DC.pdcattr->szlWindowExt
- DC.pdcattr->ptlViewportOrg
- DC.pdcattr->szlViewportExt
- DC.pdcattr->flXform
- DC.pdcattr->szlVirtualDevicePixel
- DC.pdcattr->szlVirtualDeviceMm
- DC.pdcattr->szlVirtualDeviceSize
- DC.pdcattr->ptlBrushOrigin
- DC.pdcattr->VisRectRegion