diff --git a/reactos/include/win32k/dc.h b/reactos/include/win32k/dc.h index d85424d2c2e..a30e32f5f06 100644 --- a/reactos/include/win32k/dc.h +++ b/reactos/include/win32k/dc.h @@ -104,6 +104,7 @@ typedef struct _DC XLATEOBJ *XlatePen; INT saveLevel; + BOOL IsIC; WIN_DC_INFO w; } DC, *PDC; @@ -136,6 +137,8 @@ typedef struct DEVINFO DevInfo; DRIVER_FUNCTIONS DriverFunctions; PFILE_OBJECT VideoFileObject; + BOOLEAN PreparedDriver; + ULONG DisplayNumber; GDIPOINTER Pointer; diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 32f8ab11567..8c62a8c18d5 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -130,7 +130,8 @@ HDC FASTCALL IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING Device, PUNICODE_STRING Output, - CONST PDEVMODEW InitData); + CONST PDEVMODEW InitData, + BOOL CreateAsIC); COLORREF FASTCALL IntGetDCColor(HDC hDC, ULONG Object); diff --git a/reactos/subsys/win32k/ntuser/metric.c b/reactos/subsys/win32k/ntuser/metric.c index 3046d3c6b77..978186a824c 100644 --- a/reactos/subsys/win32k/ntuser/metric.c +++ b/reactos/subsys/win32k/ntuser/metric.c @@ -42,7 +42,6 @@ NtUserGetSystemMetrics(ULONG Index) { NTSTATUS Status; PWINSTATION_OBJECT WinStaObject; - PWINDOW_OBJECT DesktopWindow; ULONG Width, Height, Result; Result = 0; @@ -156,19 +155,26 @@ NtUserGetSystemMetrics(ULONG Index) return(27); case SM_CXSCREEN: case SM_CYSCREEN: - DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); - if (NULL != DesktopWindow) - { - Width = DesktopWindow->WindowRect.right; - Height = DesktopWindow->WindowRect.bottom; - } - else - { - Width = 640; - Height = 480; - } - IntReleaseWindowObject(DesktopWindow); + { + HDC ScreenDCHandle; + PDC ScreenDC; + + Width = 640; + Height = 480; + ScreenDCHandle = IntGdiCreateDC(NULL, NULL, NULL, NULL, TRUE); + if (NULL != ScreenDCHandle) + { + ScreenDC = DC_LockDc(ScreenDCHandle); + if (NULL != ScreenDC) + { + Width = ScreenDC->DMW.dmPelsWidth; + Height = ScreenDC->DMW.dmPelsHeight; + DC_UnlockDc(ScreenDCHandle); + } + NtGdiDeleteDC(ScreenDCHandle); + } return SM_CXSCREEN == Index ? Width : Height; + } case SM_CXSIZE: case SM_CYSIZE: return(18); diff --git a/reactos/subsys/win32k/ntuser/windc.c b/reactos/subsys/win32k/ntuser/windc.c index 7463bce6d03..370d6a8badd 100644 --- a/reactos/subsys/win32k/ntuser/windc.c +++ b/reactos/subsys/win32k/ntuser/windc.c @@ -132,7 +132,7 @@ DceAllocDCE(HWND hWnd, DCE_TYPE Type) /* No real locking, just get the pointer */ DCEOBJ_UnlockDCE(DceHandle); Dce->Self = DceHandle; - Dce->hDC = IntGdiCreateDC(&DriverName, NULL, NULL, NULL); + Dce->hDC = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE); if (NULL == defaultDCstate) { defaultDCstate = NtGdiGetDCState(Dce->hDC); diff --git a/reactos/subsys/win32k/ntuser/winsta.c b/reactos/subsys/win32k/ntuser/winsta.c index 3f6f2413e38..a070b596e1e 100644 --- a/reactos/subsys/win32k/ntuser/winsta.c +++ b/reactos/subsys/win32k/ntuser/winsta.c @@ -189,7 +189,7 @@ IntInitializeDesktopGraphics(VOID) return FALSE; } RtlInitUnicodeString(&DriverName, L"DISPLAY"); - ScreenDeviceContext = IntGdiCreateDC(&DriverName, NULL, NULL, NULL); + ScreenDeviceContext = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE); if (NULL == ScreenDeviceContext) { IntDestroyPrimarySurface(); diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index 31b7ff80f36..be145c84cb9 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -59,6 +59,12 @@ NtGdiBitBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCDest->IsIC) + { + DC_UnlockDc(hDCDest); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if (UsesSource) { @@ -72,6 +78,13 @@ NtGdiBitBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCSrc->IsIC) + { + DC_UnlockDc(hDCSrc); + DC_UnlockDc(hDCDest); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } } else { @@ -258,6 +271,12 @@ NtGdiTransparentBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCDest->IsIC) + { + DC_UnlockDc(hdcDst); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if((hdcDst != hdcSrc) && !(DCSrc = DC_LockDc(hdcSrc))) { @@ -270,6 +289,16 @@ NtGdiTransparentBlt( { DCSrc = DCDest; } + if (DCSrc->IsIC) + { + DC_UnlockDc(hdcSrc); + if(hdcDst != hdcSrc) + { + DC_UnlockDc(hdcDst); + } + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } /* Offset positions */ xDst += DCDest->w.DCOrgX; @@ -575,6 +604,11 @@ NtGdiGetPixel(HDC hDC, INT XPos, INT YPos) SetLastWin32Error(ERROR_INVALID_HANDLE); return Result; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + return Result; + } XPos += dc->w.DCOrgX; YPos += dc->w.DCOrgY; if ( IN_RECT(dc->CombinedClip->rclBounds,XPos,YPos) ) @@ -1039,6 +1073,12 @@ NtGdiStretchBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCDest->IsIC) + { + DC_UnlockDc(hDCDest); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if (UsesSource) { @@ -1052,6 +1092,13 @@ NtGdiStretchBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (DCSrc->IsIC) + { + DC_UnlockDc(hDCSrc); + DC_UnlockDc(hDCDest); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } } else { diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index a14fb5a1efa..0515507c617 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.c @@ -266,6 +266,12 @@ IntGdiPolyPatBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } for (r = pRects, i = 0; i < cRects; i++) { @@ -466,6 +472,12 @@ NtGdiPatBlt( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } BrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); if (BrushObj == NULL) diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 5ef2813bf1e..3b93e45669c 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -136,7 +136,7 @@ NtGdiCreateCompatableDC(HDC hDC) if (hDC == NULL) { RtlInitUnicodeString(&DriverName, L"DISPLAY"); - DisplayDC = IntGdiCreateDC(&DriverName, NULL, NULL, NULL); + DisplayDC = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, TRUE); if (NULL == DisplayDC) { return NULL; @@ -169,6 +169,7 @@ NtGdiCreateCompatableDC(HDC hDC) /* Copy information from original DC to new DC */ NewDC->hSelf = hNewDC; + NewDC->IsIC = FALSE; NewDC->PDev = OrigDC->PDev; NewDC->DMW = OrigDC->DMW; @@ -454,19 +455,16 @@ SetupDevMode(PDEVMODEW DevMode, ULONG DisplayNumber) return Valid; } -BOOL FASTCALL -IntCreatePrimarySurface() +static BOOL FASTCALL +IntPrepareDriver() { PGD_ENABLEDRIVER GDEnableDriver; DRVENABLEDATA DED; - SURFOBJ *SurfObj; - SIZEL SurfSize; UNICODE_STRING DriverFileNames; PWSTR CurrentName; BOOL GotDriver; BOOL DoDefault; ULONG DisplayNumber; - RECTL SurfaceRect; for (DisplayNumber = 0; ; DisplayNumber++) { @@ -488,7 +486,6 @@ IntCreatePrimarySurface() if (!FindDriverFileNames(&DriverFileNames, DisplayNumber)) { DPRINT1("FindDriverFileNames failed\n"); - /* return FALSE; */ continue; } @@ -543,7 +540,6 @@ IntCreatePrimarySurface() { ObDereferenceObject(PrimarySurface.VideoFileObject); DPRINT1("No suitable DDI driver found\n"); - /* return FALSE; */ continue; } @@ -608,7 +604,6 @@ IntCreatePrimarySurface() ObDereferenceObject(PrimarySurface.VideoFileObject); DPRINT1("DrvEnablePDEV with default parameters failed\n"); DPRINT1("Perhaps DDI driver doesn't match miniport driver?\n"); - /* return FALSE; */ continue; } } @@ -623,7 +618,7 @@ IntCreatePrimarySurface() DPRINT("Adjusting GDIInfo.ulLogPixelsY\n"); PrimarySurface.GDIInfo.ulLogPixelsY = 96; } - + PrimarySurface.Pointer.Exclude.right = -1; DPRINT("calling completePDev\n"); @@ -637,43 +632,66 @@ IntCreatePrimarySurface() DRIVER_ReferenceDriver(L"DISPLAY"); - DPRINT("calling EnableSurface\n"); + PrimarySurface.PreparedDriver = TRUE; + PrimarySurface.DisplayNumber = DisplayNumber; - /* Enable the drawing surface */ - PrimarySurface.Handle = - PrimarySurface.DriverFunctions.EnableSurface(PrimarySurface.PDev); - if (NULL == PrimarySurface.Handle) - { -/* PrimarySurface.DriverFunctions.AssertMode(PrimarySurface.PDev, FALSE);*/ - PrimarySurface.DriverFunctions.DisablePDEV(PrimarySurface.PDev); - ObDereferenceObject(PrimarySurface.VideoFileObject); - DPRINT1("DrvEnableSurface failed\n"); - /* return FALSE; */ - continue; - } - - /* attach monitor */ - IntAttachMonitor(&PrimarySurface, DisplayNumber); - - SurfObj = EngLockSurface((HSURF)PrimarySurface.Handle); - SurfObj->dhpdev = PrimarySurface.PDev; - SurfSize = SurfObj->sizlBitmap; - SurfSize = SurfObj->sizlBitmap; - SurfaceRect.left = SurfaceRect.top = 0; - SurfaceRect.right = SurfObj->sizlBitmap.cx; - SurfaceRect.bottom = SurfObj->sizlBitmap.cy; - /* FIXME - why does EngEraseSurface() sometimes crash? - EngEraseSurface(SurfObj, &SurfaceRect, 0); */ - - /* Put the pointer in the center of the screen */ - GDIDEV(SurfObj)->Pointer.Pos.x = (SurfaceRect.right - SurfaceRect.left) / 2; - GDIDEV(SurfObj)->Pointer.Pos.y = (SurfaceRect.bottom - SurfaceRect.top) / 2; - - EngUnlockSurface(SurfObj); - IntShowDesktop(IntGetActiveDesktop(), SurfSize.cx, SurfSize.cy); - break; + return TRUE; } + return FALSE; +} + +static BOOL FASTCALL +IntPrepareDriverIfNeeded() +{ + return (PrimarySurface.PreparedDriver ? TRUE : IntPrepareDriver()); +} + +BOOL FASTCALL +IntCreatePrimarySurface() +{ + SIZEL SurfSize; + RECTL SurfaceRect; + SURFOBJ *SurfObj; + + if (! IntPrepareDriverIfNeeded()) + { + return FALSE; + } + + DPRINT("calling EnableSurface\n"); + /* Enable the drawing surface */ + PrimarySurface.Handle = + PrimarySurface.DriverFunctions.EnableSurface(PrimarySurface.PDev); + if (NULL == PrimarySurface.Handle) + { +/* PrimarySurface.DriverFunctions.AssertMode(PrimarySurface.PDev, FALSE);*/ + PrimarySurface.DriverFunctions.DisablePDEV(PrimarySurface.PDev); + ObDereferenceObject(PrimarySurface.VideoFileObject); + DPRINT1("DrvEnableSurface failed\n"); + return FALSE; + } + + /* attach monitor */ + IntAttachMonitor(&PrimarySurface, PrimarySurface.DisplayNumber); + + SurfObj = EngLockSurface((HSURF)PrimarySurface.Handle); + SurfObj->dhpdev = PrimarySurface.PDev; + SurfSize = SurfObj->sizlBitmap; + SurfSize = SurfObj->sizlBitmap; + SurfaceRect.left = SurfaceRect.top = 0; + SurfaceRect.right = SurfObj->sizlBitmap.cx; + SurfaceRect.bottom = SurfObj->sizlBitmap.cy; + /* FIXME - why does EngEraseSurface() sometimes crash? + EngEraseSurface(SurfObj, &SurfaceRect, 0); */ + + /* Put the pointer in the center of the screen */ + GDIDEV(SurfObj)->Pointer.Pos.x = (SurfaceRect.right - SurfaceRect.left) / 2; + GDIDEV(SurfObj)->Pointer.Pos.y = (SurfaceRect.bottom - SurfaceRect.top) / 2; + + EngUnlockSurface(SurfObj); + IntShowDesktop(IntGetActiveDesktop(), SurfSize.cx, SurfSize.cy); + return TRUE; } @@ -694,6 +712,7 @@ IntDestroyPrimarySurface() PrimarySurface.DriverFunctions.AssertMode(PrimarySurface.PDev, FALSE); PrimarySurface.DriverFunctions.DisableSurface(PrimarySurface.PDev); PrimarySurface.DriverFunctions.DisablePDEV(PrimarySurface.PDev); + PrimarySurface.PreparedDriver = FALSE; DceEmptyCache(); @@ -704,7 +723,8 @@ HDC FASTCALL IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING Device, PUNICODE_STRING Output, - CONST PDEVMODEW InitData) + CONST PDEVMODEW InitData, + BOOL CreateAsIC) { HDC hNewDC; PDC NewDC; @@ -714,10 +734,18 @@ IntGdiCreateDC(PUNICODE_STRING Driver, UNICODE_STRING StdDriver; RtlInitUnicodeString(&StdDriver, L"DISPLAY"); - + if (NULL == Driver || 0 == RtlCompareUnicodeString(Driver, &StdDriver, TRUE)) { - if (! IntGraphicsCheck(TRUE)) + if (CreateAsIC) + { + if (! IntPrepareDriverIfNeeded()) + { + DPRINT1("Unable to prepare graphics driver, returning NULL ic\n"); + return NULL; + } + } + else if (! IntGraphicsCheck(TRUE)) { DPRINT1("Unable to initialize graphics, returning NULL dc\n"); return NULL; @@ -750,6 +778,7 @@ IntGdiCreateDC(PUNICODE_STRING Driver, return NULL; } + NewDC->IsIC = CreateAsIC; NewDC->DMW = PrimarySurface.DMW; NewDC->DevInfo = &PrimarySurface.DevInfo; NewDC->GDIInfo = &PrimarySurface.GDIInfo; @@ -763,43 +792,46 @@ IntGdiCreateDC(PUNICODE_STRING Driver, NewDC->DMW.dmSize = sizeof(NewDC->DMW); NewDC->DMW.dmFields = 0x000fc000; - /* FIXME: get mode selection information from somewhere */ - NewDC->DMW.dmLogPixels = 96; - SurfObj = EngLockSurface((HSURF)PrimarySurface.Handle); - if ( !SurfObj ) - { - DC_UnlockDc ( hNewDC ); - DC_FreeDC ( hNewDC) ; - return NULL; - } - NewDC->DMW.dmBitsPerPel = BitsPerFormat(SurfObj->iBitmapFormat); - NewDC->DMW.dmPelsWidth = SurfObj->sizlBitmap.cx; - NewDC->DMW.dmPelsHeight = SurfObj->sizlBitmap.cy; - NewDC->DMW.dmDisplayFlags = 0; - NewDC->DMW.dmDisplayFrequency = 0; - NewDC->w.bitsPerPixel = NewDC->DMW.dmBitsPerPel; // FIXME: set this here?? - NewDC->w.hPalette = NewDC->DevInfo->hpalDefault; - NewDC->w.ROPmode = R2_COPYPEN; - DPRINT("Bits per pel: %u\n", NewDC->w.bitsPerPixel); + + if (! CreateAsIC) + { + SurfObj = EngLockSurface((HSURF)PrimarySurface.Handle); + if ( !SurfObj ) + { + DC_UnlockDc ( hNewDC ); + DC_FreeDC ( hNewDC) ; + return NULL; + } + ASSERT(NewDC->DMW.dmBitsPerPel == BitsPerFormat(SurfObj->iBitmapFormat)); + ASSERT(NewDC->DMW.dmPelsWidth == SurfObj->sizlBitmap.cx); + ASSERT(NewDC->DMW.dmPelsHeight == SurfObj->sizlBitmap.cy); + + NewDC->w.hPalette = NewDC->DevInfo->hpalDefault; + NewDC->w.ROPmode = R2_COPYPEN; - DC_UnlockDc( hNewDC ); + DC_UnlockDc( hNewDC ); - hVisRgn = NtGdiCreateRectRgn(0, 0, SurfObj->sizlBitmap.cx, - SurfObj->sizlBitmap.cy); - NtGdiSelectVisRgn(hNewDC, hVisRgn); - NtGdiDeleteObject(hVisRgn); + hVisRgn = NtGdiCreateRectRgn(0, 0, SurfObj->sizlBitmap.cx, + SurfObj->sizlBitmap.cy); + NtGdiSelectVisRgn(hNewDC, hVisRgn); + NtGdiDeleteObject(hVisRgn); - /* Initialize the DC state */ - DC_InitDC(hNewDC); - NtGdiSetTextColor(hNewDC, RGB(0, 0, 0)); - NtGdiSetTextAlign(hNewDC, TA_TOP); - NtGdiSetBkColor(hNewDC, RGB(255, 255, 255)); - NtGdiSetBkMode(hNewDC, OPAQUE); + /* Initialize the DC state */ + DC_InitDC(hNewDC); + NtGdiSetTextColor(hNewDC, RGB(0, 0, 0)); + NtGdiSetTextAlign(hNewDC, TA_TOP); + NtGdiSetBkColor(hNewDC, RGB(255, 255, 255)); + NtGdiSetBkMode(hNewDC, OPAQUE); - EngUnlockSurface(SurfObj); + EngUnlockSurface(SurfObj); + } + else + { + DC_UnlockDc( hNewDC ); + } return hNewDC; } @@ -847,7 +879,7 @@ NtGdiCreateDC(PUNICODE_STRING Driver, } } - Ret = IntGdiCreateDC(&SafeDriver, &SafeDevice, NULL, &SafeInitData); + Ret = IntGdiCreateDC(&SafeDriver, &SafeDevice, NULL, &SafeInitData, FALSE); return Ret; } @@ -856,10 +888,50 @@ HDC STDCALL NtGdiCreateIC(PUNICODE_STRING Driver, PUNICODE_STRING Device, PUNICODE_STRING Output, - CONST PDEVMODEW DevMode) + CONST PDEVMODEW InitData) { - /* FIXME: this should probably do something else... */ - return NtGdiCreateDC(Driver, Device, Output, DevMode); + UNICODE_STRING SafeDriver, SafeDevice; + DEVMODEW SafeInitData; + HDC Ret; + NTSTATUS Status; + + if(InitData) + { + Status = MmCopyFromCaller(&SafeInitData, InitData, sizeof(DEVMODEW)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return NULL; + } + /* FIXME - InitData can have some more bytes! */ + } + + if(Driver) + { + Status = IntSafeCopyUnicodeString(&SafeDriver, Driver); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return NULL; + } + } + + if(Device) + { + Status = IntSafeCopyUnicodeString(&SafeDevice, Device); + if(!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&SafeDriver); + SetLastNtError(Status); + return NULL; + } + } + + Ret = IntGdiCreateDC(NULL == Driver ? NULL : &SafeDriver, + NULL == Device ? NULL : &SafeDevice, NULL, + NULL == InitData ? NULL : &SafeInitData, TRUE); + + return Ret; } BOOL STDCALL @@ -1144,6 +1216,7 @@ NtGdiGetDCState(HDC hDC) newdc->hSelf = hnewdc; newdc->saveLevel = 0; + newdc->IsIC = dc->IsIC; #if 0 PATH_InitGdiPath( &newdc->w.path ); diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index 831b4353eb5..3646147f0dd 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -27,6 +27,11 @@ NtGdiSetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, CONST RGBQUAD *Col PBITMAPOBJ BitmapObj; if (!(dc = DC_LockDc(hDC))) return 0; + if (dc->IsIC) + { + DC_UnlockDc(hDC); + return 0; + } BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); if (BitmapObj == NULL) @@ -73,6 +78,11 @@ NtGdiGetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, RGBQUAD *Colors) PBITMAPOBJ BitmapObj; if (!(dc = DC_LockDc(hDC))) return 0; + if (dc->IsIC) + { + DC_UnlockDc(hDC); + return 0; + } BitmapObj = BITMAPOBJ_LockBitmap(dc->w.hBitmap); if (BitmapObj == NULL) @@ -264,6 +274,11 @@ NtGdiSetDIBits( SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } + if (Dc->IsIC) + { + DC_UnlockDc(hDC); + return 0; + } Ret = IntSetDIBits(Dc, hBitmap, StartScan, ScanLines, Bits, bmi, ColorUse); @@ -325,6 +340,11 @@ NtGdiGetDIBits(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return 0; } + if (Dc->IsIC) + { + DC_UnlockDc(hDC); + return 0; + } hSourcePalette = Dc->w.hPalette; /* FIXME: This is incorrect. hDestPalette should be something other. */ hDestPalette = Dc->DevInfo->hpalDefault; diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 277e855e5aa..ae848136e12 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.c @@ -237,6 +237,12 @@ NtGdiEllipse( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } FillBrush = BRUSHOBJ_LockBrush(dc->w.hBrush); if (NULL == FillBrush) @@ -664,6 +670,12 @@ NtGdiPie(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } FillBrushObj = BRUSHOBJ_LockBrush(dc->w.hBrush); if (NULL == FillBrushObj) @@ -844,6 +856,12 @@ NtGdiPolygon(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); else { + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } Safept = ExAllocatePoolWithTag(PagedPool, sizeof(POINT) * Count, TAG_SHAPE); if(!Safept) SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); @@ -883,6 +901,12 @@ NtGdiPolyPolygon(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(Count > 0) { @@ -1061,6 +1085,12 @@ NtGdiRectangle(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } ret = IntRectangle ( dc, LeftRect, TopRect, RightRect, BottomRect ); DC_UnlockDc ( hDC ); @@ -1358,6 +1388,12 @@ NtGdiRoundRect( DPRINT1("NtGdiRoundRect() - hDC is invalid\n"); SetLastWin32Error(ERROR_INVALID_HANDLE); } + else if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + ret = TRUE; + } else { ret = IntRoundRect ( dc, LeftRect, TopRect, RightRect, BottomRect, Width, Height ); @@ -1490,6 +1526,12 @@ NtGdiGradientFill( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hdc); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(!pVertex || !uVertex || !pMesh || !uMesh) { DC_UnlockDc(hdc); diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 866e04ff0cb..64ba46b8d8d 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -368,6 +368,12 @@ NtGdiArc(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } Ret = IntGdiArc(dc, LeftRect, @@ -404,6 +410,12 @@ NtGdiArcTo(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } // Line from current position to starting point of arc if ( !IntGdiLineTo(dc, XRadial1, YRadial1) ) @@ -466,6 +478,12 @@ NtGdiLineTo(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } Ret = IntGdiLineTo(dc, XEnd, YEnd); @@ -491,6 +509,12 @@ NtGdiMoveToEx(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(Point) { @@ -526,6 +550,12 @@ NtGdiPolyBezier(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(Count > 0) { @@ -577,6 +607,12 @@ NtGdiPolyBezierTo(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(Count > 0) { @@ -639,6 +675,12 @@ NtGdiPolyline(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(Count >= 2) { @@ -690,6 +732,12 @@ NtGdiPolylineTo(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(Count > 0) { @@ -743,6 +791,12 @@ NtGdiPolyPolyline(HDC hDC, SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if(Count > 0) { diff --git a/reactos/subsys/win32k/objects/print.c b/reactos/subsys/win32k/objects/print.c index 29dd8beca4c..784a859e593 100644 --- a/reactos/subsys/win32k/objects/print.c +++ b/reactos/subsys/win32k/objects/print.c @@ -158,6 +158,11 @@ NtGdiExtEscape( SetLastWin32Error(ERROR_INVALID_HANDLE); return -1; } + if ( pDC->IsIC ) + { + DC_UnlockDc(hDC); + return 0; + } if ( InSize && UnsafeInData ) { diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 43cbcd91d33..6497c5182da 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -1534,6 +1534,12 @@ NtGdiExtTextOut( SetLastWin32Error(ERROR_INVALID_HANDLE); return FALSE; } + if (dc->IsIC) + { + DC_UnlockDc(hDC); + /* Yes, Windows really returns TRUE in this case */ + return TRUE; + } if (NULL != UnsafeDx && Count > 0) {