* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-/* $Id$ */
-#include <w32k.h>
+#include <win32k.h>
#define NDEBUG
#include <debug.h>
+HCOLORSPACE hStockColorSpace = NULL;
+
+
+HCOLORSPACE
+FASTCALL
+IntGdiCreateColorSpace(
+ PLOGCOLORSPACEEXW pLogColorSpace)
+{
+ PCOLORSPACE pCS;
+ HCOLORSPACE hCS;
+
+ pCS = COLORSPACEOBJ_AllocCSWithHandle();
+ hCS = pCS->BaseObject.hHmgr;
+
+ pCS->lcsColorSpace = pLogColorSpace->lcsColorSpace;
+ pCS->dwFlags = pLogColorSpace->dwFlags;
+
+ COLORSPACEOBJ_UnlockCS(pCS);
+ return hCS;
+}
+
+BOOL
+FASTCALL
+IntGdiDeleteColorSpace(
+ HCOLORSPACE hColorSpace)
+{
+ BOOL Ret = FALSE;
+
+ if ( hColorSpace != hStockColorSpace )
+ {
+ Ret = COLORSPACEOBJ_FreeCSByHandle(hColorSpace);
+ if ( !Ret ) SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ }
+ return Ret;
+}
+
HANDLE
APIENTRY
NtGdiCreateColorSpace(
IN PLOGCOLORSPACEEXW pLogColorSpace)
{
- UNIMPLEMENTED;
- return 0;
+ LOGCOLORSPACEEXW Safelcs;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ _SEH2_TRY
+ {
+ ProbeForRead( pLogColorSpace,
+ sizeof(LOGCOLORSPACEEXW),
+ 1);
+ RtlCopyMemory(&Safelcs, pLogColorSpace, sizeof(LOGCOLORSPACEEXW));
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
+ }
+ _SEH2_END;
+
+ if (!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ return NULL;
+ }
+ return IntGdiCreateColorSpace(&Safelcs);
}
BOOL
NtGdiDeleteColorSpace(
IN HANDLE hColorSpace)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IntGdiDeleteColorSpace(hColorSpace);
}
BOOL
FASTCALL
IntGetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP Ramp)
{
- PGDIDEVICE pGDev = (PGDIDEVICE) hPDev;
+ PPDEVOBJ pGDev = (PPDEVOBJ) hPDev;
int i;
if (!(pGDev->flFlags & PDEV_DISPLAY )) return FALSE;
- if ((pGDev->DevInfo.iDitherFormat == BMF_8BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_16BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_24BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_32BPP))
+ if ((pGDev->devinfo.iDitherFormat == BMF_8BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_16BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_24BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_32BPP))
{
if (pGDev->flFlags & PDEV_GAMMARAMP_TABLE)
RtlCopyMemory( Ramp,
for(i=0; i<256; i++ )
{
int NewValue = i * 256;
- if (NewValue > 65535) NewValue = 65535;
Ramp->Red[i] = Ramp->Green[i] = Ramp->Blue[i] = ((WORD)NewValue);
}
}
BOOL
-STDCALL
+APIENTRY
NtGdiGetDeviceGammaRamp(HDC hDC,
LPVOID Ramp)
{
return FALSE;
}
- SafeRamp = ExAllocatePool(PagedPool, sizeof(GAMMARAMP));
+ SafeRamp = ExAllocatePoolWithTag(PagedPool, sizeof(GAMMARAMP), TAG_GDIICM);
if (!SafeRamp)
{
DC_UnlockDc(dc);
return FALSE;
}
- Ret = IntGetDeviceGammaRamp((HDEV)dc->pPDev, SafeRamp);
+ Ret = IntGetDeviceGammaRamp((HDEV)dc->ppdev, SafeRamp);
if (!Ret) return Ret;
- _SEH_TRY
+ _SEH2_TRY
{
ProbeForWrite( Ramp,
sizeof(PVOID),
SafeRamp,
sizeof(GAMMARAMP));
}
- _SEH_HANDLE
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Status = _SEH_GetExceptionCode();
+ Status = _SEH2_GetExceptionCode();
}
- _SEH_END;
+ _SEH2_END;
DC_UnlockDc(dc);
- ExFreePool(SafeRamp);
+ ExFreePoolWithTag(SafeRamp, TAG_GDIICM);
if (!NT_SUCCESS(Status))
{
}
BOOL
-STDCALL
+APIENTRY
NtGdiSetColorSpace(IN HDC hdc,
IN HCOLORSPACE hColorSpace)
{
- UNIMPLEMENTED;
- return 0;
+ PDC pDC;
+ PDC_ATTR pdcattr;
+ PCOLORSPACE pCS;
+
+ pDC = DC_LockDc(hdc);
+ if (!pDC)
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+ pdcattr = pDC->pdcattr;
+
+ if (pdcattr->hColorSpace == hColorSpace)
+ {
+ DC_UnlockDc(pDC);
+ return TRUE;
+ }
+
+ pCS = COLORSPACEOBJ_LockCS(hColorSpace);
+ if (!pCS)
+ {
+ SetLastWin32Error(ERROR_INVALID_HANDLE);
+ return FALSE;
+ }
+
+ if (pDC->dclevel.pColorSpace)
+ {
+ GDIOBJ_ShareUnlockObjByPtr((POBJ) pDC->dclevel.pColorSpace);
+ }
+
+ pDC->dclevel.pColorSpace = pCS;
+ pdcattr->hColorSpace = hColorSpace;
+
+ COLORSPACEOBJ_UnlockCS(pCS);
+ DC_UnlockDc(pDC);
+ return TRUE;
}
BOOL
UpdateDeviceGammaRamp( HDEV hPDev )
{
BOOL Ret = FALSE;
- PPALGDI palGDI;
+ PPALETTE palGDI;
PALOBJ *palPtr;
- PGDIDEVICE pGDev = (PGDIDEVICE) hPDev;
+ PPDEVOBJ pGDev = (PPDEVOBJ) hPDev;
- if ((pGDev->DevInfo.iDitherFormat == BMF_8BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_16BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_24BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_32BPP))
+ if ((pGDev->devinfo.iDitherFormat == BMF_8BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_16BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_24BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_32BPP))
{
if (pGDev->DriverFunctions.IcmSetDeviceGammaRamp)
- return pGDev->DriverFunctions.IcmSetDeviceGammaRamp( pGDev->hPDev,
+ return pGDev->DriverFunctions.IcmSetDeviceGammaRamp( pGDev->dhpdev,
IGRF_RGB_256WORDS,
pGDev->pvGammaRamp);
- if ( (pGDev->DevInfo.iDitherFormat != BMF_8BPP) ||
- !(pGDev->GDIInfo.flRaster & RC_PALETTE)) return FALSE;
+ if ( (pGDev->devinfo.iDitherFormat != BMF_8BPP) ||
+ !(pGDev->gdiinfo.flRaster & RC_PALETTE)) return FALSE;
if (!(pGDev->flFlags & PDEV_GAMMARAMP_TABLE)) return FALSE;
- palGDI = PALETTE_LockPalette(pGDev->DevInfo.hpalDefault);
+ palGDI = PALETTE_LockPalette(pGDev->devinfo.hpalDefault);
if(!palGDI) return FALSE;
palPtr = (PALOBJ*) palGDI;
if (pGDev->flFlags & PDEV_GAMMARAMP_TABLE)
- palGDI->Mode |= PAL_GAMMACORRECTION;
+ palGDI->flFlags |= PAL_GAMMACORRECTION;
else
- palGDI->Mode &= ~PAL_GAMMACORRECTION;
+ palGDI->flFlags &= ~PAL_GAMMACORRECTION;
if (!(pGDev->flFlags & PDEV_DRIVER_PUNTED_CALL)) // No punting, we hook
{
// PALOBJ_cGetColors check mode flags and update Gamma Correction.
// Set the HDEV to pal and go.
palGDI->hPDev = hPDev;
- Ret = pGDev->DriverFunctions.SetPalette(pGDev->hPDev,
+ Ret = pGDev->DriverFunctions.SetPalette(pGDev->dhpdev,
palPtr,
0,
0,
{
WORD IcmGR, i, R, G, B;
BOOL Ret = FALSE, TstPeak;
- PGDIDEVICE pGDev = (PGDIDEVICE) hPDev;
+ PPDEVOBJ pGDev = (PPDEVOBJ) hPDev;
if (!hPDev) return FALSE;
if (!(pGDev->flFlags & PDEV_DISPLAY )) return FALSE;
- if ((pGDev->DevInfo.iDitherFormat == BMF_8BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_16BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_24BPP) ||
- (pGDev->DevInfo.iDitherFormat == BMF_32BPP))
+ if ((pGDev->devinfo.iDitherFormat == BMF_8BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_16BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_24BPP) ||
+ (pGDev->devinfo.iDitherFormat == BMF_32BPP))
{
if (!pGDev->DriverFunctions.IcmSetDeviceGammaRamp)
{ // No driver support
- if (!(pGDev->DevInfo.flGraphicsCaps2 & GCAPS2_CHANGEGAMMARAMP))
+ if (!(pGDev->devinfo.flGraphicsCaps2 & GCAPS2_CHANGEGAMMARAMP))
{ // Driver does not support Gamma Ramp, so test to see we
// have BMF_8BPP only and palette operation support.
- if ((pGDev->DevInfo.iDitherFormat != BMF_8BPP) ||
- !(pGDev->GDIInfo.flRaster & RC_PALETTE)) return FALSE;
+ if ((pGDev->devinfo.iDitherFormat != BMF_8BPP) ||
+ !(pGDev->gdiinfo.flRaster & RC_PALETTE)) return FALSE;
}
}
pGDev->pvGammaRamp = ExAllocatePoolWithTag(PagedPool, sizeof(GAMMARAMP), TAG_GDIICM);
pGDev->flFlags |= PDEV_GAMMARAMP_TABLE;
}
- RtlCopyMemory( pGDev->pvGammaRamp, Ramp, sizeof(GAMMARAMP));
+ if (pGDev->pvGammaRamp)
+ RtlCopyMemory( pGDev->pvGammaRamp, Ramp, sizeof(GAMMARAMP));
Ret = UpdateDeviceGammaRamp(hPDev);
}
BOOL
-STDCALL
+APIENTRY
NtGdiSetDeviceGammaRamp(HDC hDC,
LPVOID Ramp)
{
return FALSE;
}
- SafeRamp = ExAllocatePool(PagedPool, sizeof(GAMMARAMP));
+ SafeRamp = ExAllocatePoolWithTag(PagedPool, sizeof(GAMMARAMP), TAG_GDIICM);
if (!SafeRamp)
{
DC_UnlockDc(dc);
SetLastWin32Error(STATUS_NO_MEMORY);
return FALSE;
}
- _SEH_TRY
+ _SEH2_TRY
{
ProbeForRead( Ramp,
sizeof(PVOID),
Ramp,
sizeof(GAMMARAMP));
}
- _SEH_HANDLE
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Status = _SEH_GetExceptionCode();
+ Status = _SEH2_GetExceptionCode();
}
- _SEH_END;
+ _SEH2_END;
if (!NT_SUCCESS(Status))
{
DC_UnlockDc(dc);
- ExFreePool(SafeRamp);
+ ExFreePoolWithTag(SafeRamp, TAG_GDIICM);
SetLastNtError(Status);
return FALSE;
}
- Ret = IntSetDeviceGammaRamp((HDEV)dc->pPDev, SafeRamp, TRUE);
+ Ret = IntSetDeviceGammaRamp((HDEV)dc->ppdev, SafeRamp, TRUE);
DC_UnlockDc(dc);
- ExFreePool(SafeRamp);
+ ExFreePoolWithTag(SafeRamp, TAG_GDIICM);
return Ret;
}
INT
-STDCALL
+APIENTRY
NtGdiSetIcmMode(HDC hDC,
ULONG nCommand,
ULONG EnableICM) // ulMode