Author: tkreuzer
Date: Tue Mar 6 15:03:28 2012
New Revision: 56062
URL:
http://svn.reactos.org/svn/reactos?rev=56062&view=rev
Log:
[WIN32K]
Implement NtGdiGetFontData / PFE_ulQueryTrueTypeTable
Modified:
branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fntdrvsup.c
branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fontdata.c
branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/font.h
Modified: branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fntdrvsup.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsyst…
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fntdrvsup.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fntdrvsup.c [iso-8859-1]
Tue Mar 6 15:03:28 2012
@@ -49,22 +49,6 @@
ASSERT(gbAttachedCSRSS);
KeUnstackDetachProcess(pApcState);
gbAttachedCSRSS = FALSE;
-}
-
-VOID
-NTAPI
-RFONT_vInitDeviceMetrics(
- PRFONT prfnt)
-{
- PPDEVOBJ ppdev = (PPDEVOBJ)prfnt->hdevProducer;
-
- ppdev->pldev->pfn.QueryFontData(prfnt->dhpdev,
- &prfnt->fobj,
- QFD_MAXEXTENTS,
- -1,
- NULL,
- &prfnt->fddm,
- sizeof(FD_DEVICEMETRICS));
}
static
@@ -113,6 +97,40 @@
//ppfe->aiFamilyName[];
}
+
+ULONG
+NTAPI
+PFE_ulQueryTrueTypeTable(
+ PPFE ppfe,
+ ULONG ulTableTag,
+ PTRDIFF dpStart,
+ ULONG cjBuffer,
+ PVOID pvBuffer)
+{
+ PPDEVOBJ ppdev = (PDEVOBJ*)ppfe->pPFF->hdev;
+ KAPC_STATE ApcState;
+ ULONG ulResult;
+
+ /* Attach to CSRSS */
+ AttachCSRSS(&ApcState);
+
+ /* Call the driver to copy the requested data */
+ ulResult = ppdev->pfn.QueryTrueTypeTable(ppfe->pPFF->hff,
+ ppfe->iFont,
+ ulTableTag,
+ dpStart,
+ cjBuffer,
+ pvBuffer,
+ NULL,
+ NULL);
+
+ /* Detach from CSRSS */
+ DetachCSRSS(&ApcState);
+
+ /* Return the result */
+ return ulResult;
+}
+
static
VOID
Modified: branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fontdata.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsyst…
==============================================================================
--- branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fontdata.c [iso-8859-1]
(original)
+++ branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/font/fontdata.c [iso-8859-1]
Tue Mar 6 15:03:28 2012
@@ -18,11 +18,75 @@
IN HDC hdc,
IN DWORD dwTable,
IN DWORD dwOffset,
- OUT OPTIONAL PVOID pvBuf,
- IN ULONG cjBuf)
-{
- ASSERT(FALSE);
- return 0;
+ OUT OPTIONAL PVOID pvBuffer,
+ IN ULONG cjBuffer)
+{
+ PDC pdc;
+ PRFONT prfnt;
+ PVOID pvTempBuffer;
+ ULONG ulResult;
+
+ /* Check if the caller provides a buffer */
+ if (cjBuffer)
+ {
+ /* Must have a buffer */
+ if (!pvBuffer) return GDI_ERROR;
+
+ /* Allocate a temp buffer */
+ pvTempBuffer = ExAllocatePoolWithTag(PagedPool, cjBuffer, GDITAG_TEMP);
+ if (!pvTempBuffer)
+ {
+ return GDI_ERROR;
+ }
+ }
+ else
+ {
+ /* Don't provide a buffer */
+ pvTempBuffer = NULL;
+ }
+
+ /* Lock the DC */
+ pdc = DC_LockDc(hdc);
+ if (!pdc)
+ {
+ ulResult = GDI_ERROR;
+ goto leave;
+ }
+
+ /* Get the RFONT from the DC */
+ prfnt = DC_prfnt(pdc);
+
+ /* Query the table data */
+ ulResult = PFE_ulQueryTrueTypeTable(prfnt->ppfe,
+ dwTable,
+ dwOffset,
+ cjBuffer,
+ pvTempBuffer);
+
+ /* Copy the data back, if requested */
+ if (cjBuffer && (ulResult != GDI_ERROR))
+ {
+ _SEH2_TRY
+ {
+ /* Probe and copy the data */
+ ProbeForWrite(pvBuffer, cjBuffer, 1);
+ RtlCopyMemory(pvBuffer, pvTempBuffer, cjBuffer);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ ulResult = GDI_ERROR;
+ }
+ _SEH2_END;
+ }
+
+ /* Unlock the DC */
+ DC_UnlockDc(pdc);
+
+leave:
+ /* Free the temp buffer */
+ if (pvTempBuffer) ExFreePoolWithTag(pvTempBuffer, GDITAG_TEMP);
+
+ return ulResult;
}
W32KAPI
Modified: branches/GSoC_2011/GdiFontDriver/subsystems/win32/win32k/include/font.h
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/GdiFontDriver/subsyst…
==============================================================================
--- 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]
Tue Mar 6 15:03:28 2012
@@ -392,6 +392,12 @@
NTAPI
LFONT_ppfe(PLFONT plfnt);
+PRFONT
+NTAPI
+LFONT_prfntFindLinkedRFONT(
+ _In_ PLFONT plfnt,
+ _In_ PMATRIX pmxWorldToDevice);
+
VOID
NTAPI
UpcaseString(
@@ -403,6 +409,15 @@
NTAPI
CalculateNameHash(
PWSTR pwszName);
+
+ULONG
+NTAPI
+PFE_ulQueryTrueTypeTable(
+ PPFE ppfe,
+ ULONG ulTableTag,
+ PTRDIFF dpStart,
+ ULONG cjBuffer,
+ PVOID pvBuffer);
BOOL
NTAPI