HANDLE hspool = NULL;
+ if ( !ghSpooler && !LoadTheSpoolerDrv())
+ {
+ DPRINT1("WinSpooler.Drv Did not load!\n");
+ }
+ else
+ {
+ DPRINT("WinSpooler.Drv Loaded! hMod -> 0x%x\n", ghSpooler);
+ }
+
if ((!lpwszDevice) && (!lpwszDriver))
{
Default = FALSE; // Ask Win32k to set Default device.
}
else
{
- if (lpwszDevice) // First
+ if ((lpwszDevice) && (wcslen(lpwszDevice) != 0)) // First
{
if (!_wcsnicmp(lpwszDevice, L"\\\\.\\DISPLAY",11)) Display = TRUE;
RtlInitUnicodeString(&Device, lpwszDevice);
(PDEVMODEW) lpInitData,
(lpwszOutput ? &Output : NULL),
iType, // DCW 0 and ICW 1.
+ Display,
hspool,
(PVOID) NULL, // NULL for now.
(PVOID) &UMdhpdev );
DeleteDC(HDC hDC)
{
BOOL Ret = TRUE;
-#if 0
- PDC_ATTR Dc_Attr;
- PLDC pLDC;
+ PLDC pLDC = NULL;
+ HANDLE hPrinter = NULL;
+ ULONG hType = GDI_HANDLE_GET_TYPE(hDC);
- if (!GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return FALSE;
+ pLDC = GdiGetLDC(hDC);
- if ( Dc_Attr )
- {
- pLDC = Dc_Attr->pvLDC;
+ if (hType != GDILoObjType_LO_DC_TYPE)
+ {
+
+ if ( !pLDC || hType == GDILoObjType_LO_METADC16_TYPE)
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+ if (pLDC->Flags & LDC_INIT_DOCUMENT) AbortDoc(hDC);
+ if (pLDC->hPrinter)
+ {
+ DocumentEventEx(NULL, pLDC->hPrinter, hDC, DOCUMENTEVENT_DELETEDC, 0, NULL, 0, NULL);
+ hPrinter = pLDC->hPrinter;
+ pLDC->hPrinter = NULL;
+ }
+ }
- if ( pLDC )
- {
- DPRINT1("Delete the Local DC structure\n");
- LocalFree( pLDC );
- }
- }
-#endif
Ret = NtGdiDeleteObjectApp(hDC);
+ if (Ret && pLDC )
+ {
+ DPRINT1("Delete the Local DC structure\n");
+ LocalFree( pLDC );
+ }
+ if (hPrinter) fpClosePrinter(hPrinter);
return Ret;
}
/*
* @implemented
*/
-DWORD
+INT
WINAPI
SetRelAbs(
HDC hdc,
}
-/*
- * @implemented
- */
-int
-WINAPI
-StartDocW(
- HDC hdc,
- CONST DOCINFOW *a1
- )
-{
- return NtGdiStartDoc ( hdc, (DOCINFOW *)a1, NULL, 0);
-}
-
-
/*
* @implemented
*/
{
PDC_ATTR pDc_Attr;
HGDIOBJ hOldObj = NULL;
-// PTEB pTeb;
+ UINT uType;
if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
{
return NULL;
}
- UINT uType = GDI_HANDLE_GET_TYPE(hGdiObj);
+ uType = GDI_HANDLE_GET_TYPE(hGdiObj);
switch (uType)
{
case GDI_OBJECT_TYPE_FONT:
hOldObj = pDc_Attr->hlfntNew;
if (hOldObj == hGdiObj) return hOldObj;
-#if 0
+
pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
pDc_Attr->hlfntNew = hGdiObj;
- pTeb = NtCurrentTeb();
- if (((pTeb->GdiTebBatch.HDC == 0) ||
- (pTeb->GdiTebBatch.HDC == hDC)) &&
- ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) &&
- (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)))
+
+ if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))
{
- PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] +
- pTeb->GdiTebBatch.Offset);
- pgO->gbHdr.Cmd = GdiBCSelObj;
- pgO->gbHdr.Size = sizeof(GDIBSOBJECT);
- pgO->hgdiobj = hGdiObj;
-
- pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
- pTeb->GdiTebBatch.HDC = hDC;
- pTeb->GdiBatchCount++;
- if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
- return hOldObj;
+ PGDIBSOBJECT pgO;
+
+ pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj);
+ if (pgO)
+ {
+ pgO->hgdiobj = hGdiObj;
+ return hOldObj;
+ }
}
-#endif
+
// default for select object font
return NtGdiSelectFont(hDC, hGdiObj);