[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / objects / icm.c
index e583380..3dfe7d0 100644 (file)
  *  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
@@ -37,23 +92,22 @@ APIENTRY
 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,
@@ -64,7 +118,6 @@ IntGetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP 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);
         }
@@ -75,7 +128,7 @@ IntGetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP Ramp)
 }
 
 BOOL
-STDCALL
+APIENTRY
 NtGdiGetDeviceGammaRamp(HDC  hDC,
                              LPVOID  Ramp)
 {
@@ -93,7 +146,7 @@ NtGdiGetDeviceGammaRamp(HDC  hDC,
      return FALSE;
   }
 
-  SafeRamp = ExAllocatePool(PagedPool, sizeof(GAMMARAMP));
+  SafeRamp = ExAllocatePoolWithTag(PagedPool, sizeof(GAMMARAMP), TAG_GDIICM);
   if (!SafeRamp)
   {
       DC_UnlockDc(dc);
@@ -101,11 +154,11 @@ NtGdiGetDeviceGammaRamp(HDC  hDC,
       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),
@@ -114,14 +167,14 @@ NtGdiGetDeviceGammaRamp(HDC  hDC,
                     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))
   {
@@ -132,12 +185,46 @@ NtGdiGetDeviceGammaRamp(HDC  hDC,
 }
 
 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
@@ -145,33 +232,33 @@ FASTCALL
 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
      {
@@ -179,7 +266,7 @@ UpdateDeviceGammaRamp( HDEV hPDev )
      // 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,
@@ -203,24 +290,24 @@ IntSetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP Ramp, BOOL Test)
 {
   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;
         }
      }
 
@@ -261,7 +348,8 @@ IntSetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP Ramp, BOOL Test)
         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);
 
@@ -272,7 +360,7 @@ IntSetDeviceGammaRamp(HDEV hPDev, PGAMMARAMP Ramp, BOOL Test)
 }
 
 BOOL
-STDCALL
+APIENTRY
 NtGdiSetDeviceGammaRamp(HDC  hDC,
                              LPVOID  Ramp)
 {
@@ -289,14 +377,14 @@ NtGdiSetDeviceGammaRamp(HDC  hDC,
      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),
@@ -305,28 +393,28 @@ NtGdiSetDeviceGammaRamp(HDC  hDC,
                     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