Author: tkreuzer Date: Mon May 30 22:18:44 2011 New Revision: 52018
URL: http://svn.reactos.org/svn/reactos?rev=52018&view=rev Log: [WIN32K] - Refactor NtGdiGetTextMetricsW - Implement NtGdiGetETM - Halfplement RFONT_vGetTextMetrics - Hackplement RFONT_vGetETM
Modified: branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/textmetric.c branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/font.h
Modified: branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/textmetric.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsyste... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/textmetric.c [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/textmetric.c [iso-8859-1] Mon May 30 22:18:44 2011 @@ -11,6 +11,81 @@ #define NDEBUG #include <debug.h>
+ + +VOID +NTAPI +RFONT_vGetTextMetrics( + PRFONT prfnt, + TMW_INTERNAL *ptmwi) +{ + PIFIMETRICS pifi = prfnt->ppfe->pifi; + + ptmwi->tmw.tmAscent = (prfnt->fddm.fxMaxAscender + 8) / 16; + ptmwi->tmw.tmDescent = (prfnt->fddm.fxMaxDescender + 8) / 16; + ptmwi->tmw.tmHeight = ptmwi->tmw.tmAscent + ptmwi->tmw.tmDescent; + ptmwi->tmw.tmInternalLeading = 0; // FIXME + ptmwi->tmw.tmExternalLeading = 0; // FIXME + ptmwi->tmw.tmAveCharWidth = 0; // FIXME + ptmwi->tmw.tmMaxCharWidth = prfnt->fddm.cxMax; + ptmwi->tmw.tmWeight = pifi->usWinWeight; + ptmwi->tmw.tmOverhang = 0; // FIXME + ptmwi->tmw.tmDigitizedAspectX = pifi->ptlAspect.x; + ptmwi->tmw.tmDigitizedAspectY = pifi->ptlAspect.y; + ptmwi->tmw.tmFirstChar = pifi->wcFirstChar; + ptmwi->tmw.tmLastChar = pifi->wcLastChar; + ptmwi->tmw.tmDefaultChar = pifi->wcDefaultChar; + ptmwi->tmw.tmBreakChar = pifi->wcBreakChar; + ptmwi->tmw.tmItalic = ((pifi->fsSelection & FM_SEL_ITALIC) != 0); + ptmwi->tmw.tmUnderlined = ((pifi->fsSelection & FM_SEL_UNDERSCORE) != 0); + ptmwi->tmw.tmStruckOut = ((pifi->fsSelection & FM_SEL_STRIKEOUT) != 0); + ptmwi->tmw.tmPitchAndFamily = pifi->jWinPitchAndFamily; + ptmwi->tmw.tmCharSet = pifi->jWinCharSet; + ptmwi->tmdiff.chFirst = pifi->chFirstChar; + ptmwi->tmdiff.chLast = pifi->chLastChar; + ptmwi->tmdiff.chDefault = pifi->chDefaultChar; + ptmwi->tmdiff.chBreak = pifi->chBreakChar; + ptmwi->tmdiff.cjotma = 0; // FIXME +} + +VOID +NTAPI +RFONT_vGetETM( + PRFONT prfnt, + EXTTEXTMETRIC *petm) +{ + PIFIMETRICS pifi = prfnt->ppfe->pifi; + + petm->emSize = sizeof(EXTTEXTMETRIC); + petm->emPointSize = 0; // FIXME + petm->emOrientation = 0; // FIXME + petm->emMasterHeight = 0; // FIXME + petm->emMinScale = 0; // FIXME + petm->emMaxScale = 0; // FIXME + petm->emMasterUnits = 0; // FIXME + petm->emCapHeight = 0; // FIXME + petm->emXHeight = 0; // FIXME + petm->emLowerCaseAscent = 0; // FIXME + petm->emLowerCaseDescent = 0; // FIXME + petm->emSlant = 0; // FIXME + petm->emSuperScript = 0; // FIXME + petm->emSubScript = 0; // FIXME + petm->emSuperScriptSize = 0; // FIXME + petm->emSubScriptSize = 0; // FIXME + petm->emUnderlineOffset = 0; // FIXME + petm->emUnderlineWidth = 0; // FIXME + petm->emDoubleUpperUnderlineOffset = 0; // FIXME + petm->emDoubleLowerUnderlineOffset = 0; // FIXME + petm->emDoubleUpperUnderlineWidth = 0; // FIXME + petm->emDoubleLowerUnderlineWidth = 0; // FIXME + petm->emStrikeOutOffset = 0; // FIXME + petm->emStrikeOutWidth = 0; // FIXME + petm->emKernPairs = pifi->cKerningPairs; + petm->emKernTracks = 0; // FIXME + +} + + W32KAPI BOOL APIENTRY @@ -21,7 +96,6 @@ { PDC pdc; PRFONT prfnt; - PIFIMETRICS pifi; BOOL bResult = TRUE;
/* verify that the buffer is large enough */ @@ -36,19 +110,13 @@
/* Get pointer to RFONT and IFI */ prfnt = DC_prfnt(pdc); - pifi = prfnt->ppfe->pifi;
/* Enter SEH for buffer copy */ _SEH2_TRY { /* Probe and fill TMW_INTERNAL */ ProbeForWrite(ptmwi, cj, 1); - RtlCopyMemory(&ptmwi->TextMetric, prfnt->ptmw, sizeof(TEXTMETRICW)); - ptmwi->Diff.cjotma = 0; // FIXME: what is this? - ptmwi->Diff.chFirst = pifi->chFirstChar; - ptmwi->Diff.chLast = pifi->chLastChar; - ptmwi->Diff.ChDefault = pifi->chDefaultChar; - ptmwi->Diff.ChBreak = pifi->chBreakChar; + RFONT_vGetTextMetrics(prfnt, ptmwi); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -69,8 +137,37 @@ IN HDC hdc, OUT EXTTEXTMETRIC *petm) { - ASSERT(FALSE); - return FALSE; + PDC pdc; + PRFONT prfnt; + BOOL bResult = TRUE; + + /* Lock the DC */ + pdc = DC_LockDc(hdc); + if (!pdc) + { + return FALSE; + } + + /* Get pointer to RFONT */ + prfnt = DC_prfnt(pdc); + + /* Enter SEH for buffer copy */ + _SEH2_TRY + { + /* Probe and fill TMW_INTERNAL */ + ProbeForWrite(petm, sizeof(EXTTEXTMETRIC), 1); + RFONT_vGetETM(prfnt, petm); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastNtError(_SEH2_GetExceptionCode()); + bResult = FALSE; + } + _SEH2_END + + /* Unlock the DC and return */ + DC_UnlockDc(pdc); + return bResult; }
W32KAPI
Modified: branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/font.h URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsyste... ============================================================================== --- branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/font.h [iso-8859-1] (original) +++ branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/font.h [iso-8859-1] Mon May 30 22:18:44 2011 @@ -107,7 +107,7 @@ DHPDEV dhpdev;
PFE * ppfe; - PFF * pPFF; + PFF * ppff; RFONTLINK rflPDEV; RFONTLINK rflPFF; PRFONT prfntSystemTT; @@ -121,7 +121,7 @@ FLONG flEUDCState; ULONG ulContent; ULONG ulTimeStamp; - ULONG uiNumLinks; + ULONG ulNumLinks; ULONG iGraphicsMode; ULONG ulOrientation; ULONG cBitsPerPel;