branch update for HEAD-2003091401
[reactos.git] / subsys / win32k / objects / color.c
index 5e82373..c615cb9 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ *  ReactOS W32 Subsystem
+ *  Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  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.
+ */
+/* $Id$ */
+
 // FIXME: Use PXLATEOBJ logicalToSystem instead of int *mapping
 
 #undef WIN32_LEAN_AND_MEAN
@@ -10,6 +30,8 @@
 #include <win32k/pen.h>
 #include "../eng/handle.h"
 #include <include/inteng.h>
+#include <include/color.h>
+#include <include/palette.h>
 
 #define NDEBUG
 #include <win32k/debug1.h>
@@ -20,7 +42,7 @@ int COLOR_gapFilled = 0;
 int COLOR_max = 256;
 
 static HPALETTE hPrimaryPalette = 0; // used for WM_PALETTECHANGED
-static HPALETTE hLastRealizedPalette = 0; // UnrealizeObject() needs it
+//static HPALETTE hLastRealizedPalette = 0; // UnrealizeObject() needs it
 
 const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] =
 {
@@ -53,42 +75,40 @@ const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] =
   { 0xff, 0xff, 0xff, PC_SYS_USED }     // last 10
 };
 
-ULONG W32kGetSysColor(int nIndex)
+ULONG FASTCALL NtGdiGetSysColor(int nIndex)
 {
-   PALETTEENTRY *p = COLOR_sysPalTemplate + (nIndex * sizeof(PALETTEENTRY));
+   const PALETTEENTRY *p = COLOR_sysPalTemplate + (nIndex * sizeof(PALETTEENTRY));
    return RGB(p->peRed, p->peGreen, p->peBlue);
 }
 
-HPEN STDCALL W32kGetSysColorPen(int nIndex)
+HPEN STDCALL NtGdiGetSysColorPen(int nIndex)
 {
   COLORREF Col;
   memcpy(&Col, COLOR_sysPalTemplate + nIndex, sizeof(COLORREF));
-  return(W32kCreatePen(PS_SOLID, 1, Col));
+  return(NtGdiCreatePen(PS_SOLID, 1, Col));
 }
 
-HBRUSH STDCALL W32kGetSysColorBrush(int nIndex)
+HBRUSH STDCALL NtGdiGetSysColorBrush(int nIndex)
 {
   COLORREF Col;
   memcpy(&Col, COLOR_sysPalTemplate + nIndex, sizeof(COLORREF));
-  return(W32kCreateSolidBrush(Col));
+  return(NtGdiCreateSolidBrush(Col));
 }
 
-//forward declarations
-COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF color );
 
 
-const PALETTEENTRY* COLOR_GetSystemPaletteTemplate(void)
+const PALETTEENTRY* FASTCALL COLOR_GetSystemPaletteTemplate(void)
 {
   return (const PALETTEENTRY*)&COLOR_sysPalTemplate;
 }
 
-BOOL STDCALL W32kAnimatePalette(HPALETTE  hpal,
+BOOL STDCALL NtGdiAnimatePalette(HPALETTE  hpal,
                          UINT  StartIndex,
                          UINT  Entries,
                          CONST PPALETTEENTRY  ppe)
 {
 /*
-  if( hPal != W32kGetStockObject(DEFAULT_PALETTE) )
+  if( hPal != NtGdiGetStockObject(DEFAULT_PALETTE) )
   {
     PALETTEOBJ* palPtr = (PALETTEOBJ *)GDI_GetObjPtr(hPal, PALETTE_MAGIC);
     if (!palPtr) return FALSE;
@@ -109,7 +129,7 @@ BOOL STDCALL W32kAnimatePalette(HPALETTE  hpal,
   UNIMPLEMENTED;
 }
 
-HPALETTE STDCALL W32kCreateHalftonePalette(HDC  hDC)
+HPALETTE STDCALL NtGdiCreateHalftonePalette(HDC  hDC)
 {
   int i, r, g, b;
   struct {
@@ -120,7 +140,7 @@ HPALETTE STDCALL W32kCreateHalftonePalette(HDC  hDC)
 
   Palette.Version = 0x300;
   Palette.NumberOfEntries = 256;
-  W32kGetSystemPaletteEntries(hDC, 0, 256, Palette.aEntries);
+  NtGdiGetSystemPaletteEntries(hDC, 0, 256, Palette.aEntries);
 
   for (r = 0; r < 6; r++) {
     for (g = 0; g < 6; g++) {
@@ -140,17 +160,21 @@ HPALETTE STDCALL W32kCreateHalftonePalette(HDC  hDC)
     Palette.aEntries[i].peBlue = v;
   }
 
-  return W32kCreatePalette((LOGPALETTE *)&Palette);
+  return NtGdiCreatePalette((LOGPALETTE *)&Palette);
 }
 
-HPALETTE STDCALL W32kCreatePalette(CONST PLOGPALETTE palette)
+HPALETTE STDCALL NtGdiCreatePalette(CONST PLOGPALETTE palette)
 {
   PPALOBJ  PalObj;
 
-  HPALETTE NewPalette = (HPALETTE)EngCreatePalette(PAL_INDEXED, palette->palNumEntries, (PULONG*) palette->palPalEntry, 0, 0, 0);
+  HPALETTE NewPalette = PALETTE_AllocPalette(
+         PAL_INDEXED,
+         palette->palNumEntries,
+         (PULONG)palette->palPalEntry,
+         0, 0, 0);
   ULONG size;
 
-  PalObj = (PPALOBJ)AccessUserObject(NewPalette);
+  PalObj = (PPALOBJ) PALETTE_LockPalette(NewPalette);
 
   size = sizeof(LOGPALETTE) + (palette->palNumEntries * sizeof(PALETTEENTRY));
   PalObj->logpalette = ExAllocatePool(NonPagedPool, size);
@@ -158,58 +182,61 @@ HPALETTE STDCALL W32kCreatePalette(CONST PLOGPALETTE palette)
   PALETTE_ValidateFlags(PalObj->logpalette->palPalEntry, PalObj->logpalette->palNumEntries);
   PalObj->logicalToSystem = NULL;
 
+  PALETTE_UnlockPalette(NewPalette);
+
   return NewPalette;
 }
 
-BOOL STDCALL W32kGetColorAdjustment(HDC  hDC,
+BOOL STDCALL NtGdiGetColorAdjustment(HDC  hDC,
                              LPCOLORADJUSTMENT  ca)
 {
   UNIMPLEMENTED;
 }
 
-COLORREF STDCALL W32kGetNearestColor(HDC  hDC,
+COLORREF STDCALL NtGdiGetNearestColor(HDC  hDC,
                               COLORREF  Color)
 {
   COLORREF nearest = CLR_INVALID;
   PDC dc;
   PPALOBJ palObj;
 
-  if( (dc = DC_HandleToPtr(hDC) ) )
-  {
-    HPALETTE hpal = (dc->w.hPalette)? dc->w.hPalette : W32kGetStockObject(DEFAULT_PALETTE);
-    palObj = (PPALOBJ)AccessUserObject(hpal);
-    if (!palObj) {
-//      GDI_ReleaseObj(hdc);
-      return nearest;
+  dc = DC_LockDc(hDC);
+  if (NULL != dc)
+    {
+      HPALETTE hpal = (dc->w.hPalette) ? dc->w.hPalette : NtGdiGetStockObject(DEFAULT_PALETTE);
+      palObj = (PPALOBJ) PALETTE_LockPalette(hpal);
+      if (!palObj)
+       {
+         DC_UnlockDc(hDC);
+         return nearest;
+       }
+
+      nearest = COLOR_LookupNearestColor(palObj->logpalette->palPalEntry,
+                                         palObj->logpalette->palNumEntries, Color);
+      PALETTE_UnlockPalette(hpal);
+      DC_UnlockDc( hDC );
     }
 
-    nearest = COLOR_LookupNearestColor(palObj->logpalette->palPalEntry,
-                                       palObj->logpalette->palNumEntries, Color);
-       // FIXME: release hpal!!
-//    GDI_ReleaseObj( hpal );
-    DC_ReleasePtr( hDC );
-  }
-
   return nearest;
 }
 
-UINT STDCALL W32kGetNearestPaletteIndex(HPALETTE  hpal,
+UINT STDCALL NtGdiGetNearestPaletteIndex(HPALETTE  hpal,
                                  COLORREF  Color)
 {
-  PPALOBJ     palObj = (PPALOBJ)AccessUserObject(hpal);
+  PPALOBJ palObj = (PPALOBJ) PALETTE_LockPalette(hpal);
   UINT index  = 0;
 
-  if( palObj )
-  {
-    // Return closest match for the given RGB color
-    index = COLOR_PaletteLookupPixel(palObj->logpalette->palPalEntry, palObj->logpalette->palNumEntries, NULL, Color, FALSE);
-//    GDI_ReleaseObj( hpalette );
-  }
+  if (NULL != palObj)
+    {
+      /* Return closest match for the given RGB color */
+      index = COLOR_PaletteLookupPixel(palObj->logpalette->palPalEntry, palObj->logpalette->palNumEntries, NULL, Color, FALSE);
+      PALETTE_UnlockPalette(hpal);
+    }
 
   return index;
 }
 
-UINT STDCALL W32kGetPaletteEntries(HPALETTE  hpal,
+UINT STDCALL NtGdiGetPaletteEntries(HPALETTE  hpal,
                             UINT  StartIndex,
                             UINT  Entries,
                             LPPALETTEENTRY  pe)
@@ -217,51 +244,61 @@ UINT STDCALL W32kGetPaletteEntries(HPALETTE  hpal,
   PPALOBJ palPtr;
   UINT numEntries;
 
-  palPtr = (PPALOBJ)AccessUserObject(hpal);
-  if (!palPtr) return 0;
+  palPtr = (PPALOBJ) PALETTE_LockPalette(hpal);
+  if (NULL == palPtr)
+    {
+      return 0;
+    }
 
   numEntries = palPtr->logpalette->palNumEntries;
-  if (StartIndex + Entries > numEntries) Entries = numEntries - StartIndex;
-  if (pe)
-  {
-    if (StartIndex >= numEntries)
+  if (numEntries < StartIndex + Entries)
     {
-//      GDI_ReleaseObj( hpalette );
-      return 0;
+      Entries = numEntries - StartIndex;
+    }
+  if (NULL != pe)
+    {
+      if (numEntries <= StartIndex)
+       {
+         PALETTE_UnlockPalette(hpal);
+         return 0;
+       }
+      memcpy(pe, &palPtr->logpalette->palPalEntry[StartIndex], Entries * sizeof(PALETTEENTRY));
+      for (numEntries = 0; numEntries < Entries; numEntries++)
+       {
+         if (pe[numEntries].peFlags & 0xF0)
+           {
+             pe[numEntries].peFlags = 0;
+           }
+       }
     }
-    memcpy(pe, &palPtr->logpalette->palPalEntry[StartIndex], Entries * sizeof(PALETTEENTRY));
-    for(numEntries = 0; numEntries < Entries ; numEntries++)
-      if (pe[numEntries].peFlags & 0xF0)
-        pe[numEntries].peFlags = 0;
-  }
 
-//  GDI_ReleaseObj( hpalette );
+  PALETTE_UnlockPalette(hpal);
   return Entries;
 }
 
-UINT STDCALL W32kGetSystemPaletteEntries(HDC  hDC,
+UINT STDCALL NtGdiGetSystemPaletteEntries(HDC  hDC,
                                   UINT  StartIndex,
                                   UINT  Entries,
                                   LPPALETTEENTRY  pe)
 {
-  UINT i;
-  PDC dc;
+  //UINT i;
+  //PDC dc;
 /*
   if (!(dc = AccessUserObject(hdc))) return 0;
 
   if (!pe)
   {
-    Entries = dc->devCaps->sizePalette;
+    Entries = dc->GDIInfo->ulNumPalReg;
     goto done;
   }
 
-  if (StartIndex >= dc->devCaps->sizePalette)
+  if (StartIndex >= dc->GDIInfo->ulNumPalReg)
   {
     Entries = 0;
     goto done;
   }
 
-  if (StartIndex + Entries >= dc->devCaps->sizePalette) Entries = dc->devCaps->sizePalette - StartIndex;
+  if (StartIndex + Entries >= dc->GDIInfo->ulNumPalReg) Entries = dc->GDIInfo->ulNumPalReg - StartIndex;
 
   for (i = 0; i < Entries; i++)
   {
@@ -271,11 +308,14 @@ UINT STDCALL W32kGetSystemPaletteEntries(HDC  hDC,
   done:
 //    GDI_ReleaseObj(hdc);
   return count; */
+  // FIXME UNIMPLEMENTED;
+  return 0;
 }
 
-UINT STDCALL W32kGetSystemPaletteUse(HDC  hDC)
+UINT STDCALL NtGdiGetSystemPaletteUse(HDC  hDC)
 {
   UNIMPLEMENTED;
+  return 0;
 }
 
 /*!
@@ -293,7 +333,7 @@ A logical palette is a buffer between color-intensive applications and the syste
    the dc palette.
 -- If it is an RGB palette, then an XLATEOBJ is created between the RGB values and the dc palette.
 */
-UINT STDCALL W32kRealizePalette(HDC  hDC)
+UINT STDCALL NtGdiRealizePalette(HDC hDC)
 {
   PPALOBJ palPtr, sysPtr;
   PPALGDI palGDI, sysGDI;
@@ -302,22 +342,23 @@ UINT STDCALL W32kRealizePalette(HDC  hDC)
   HPALETTE systemPalette;
   PSURFGDI SurfGDI;
   BOOLEAN success;
+  USHORT sysMode, palMode;
 
-  dc = DC_HandleToPtr(hDC);
+  dc = DC_LockDc(hDC);
   if (!dc)
        return 0;
 
-  palPtr = (PPALOBJ)AccessUserObject(dc->w.hPalette);
-  SurfGDI = (PSURFGDI)AccessInternalObjectFromUserObject(dc->Surface);
-  systemPalette = W32kGetStockObject(STOCK_DEFAULT_PALETTE);
-  sysPtr = (PPALOBJ)AccessInternalObject(systemPalette);
-  palGDI = (PPALGDI)AccessInternalObject(dc->w.hPalette);
-  sysGDI = (PPALGDI)AccessInternalObject(systemPalette);
+  SurfGDI = (PSURFGDI)AccessInternalObject((ULONG)dc->Surface);
+  systemPalette = NtGdiGetStockObject((INT)DEFAULT_PALETTE);
+  palGDI = PALETTE_LockPalette(dc->w.hPalette);
+  palPtr = (PPALOBJ) palGDI;
+  sysGDI = PALETTE_LockPalette(systemPalette);
+  sysPtr = (PPALOBJ) sysGDI;
 
   // Step 1: Create mapping of system palette\DC palette
   realized = PALETTE_SetMapping(palPtr, 0, palPtr->logpalette->palNumEntries,
                (dc->w.hPalette != hPrimaryPalette) ||
-               (dc->w.hPalette == W32kGetStockObject(DEFAULT_PALETTE)));
+               (dc->w.hPalette == NtGdiGetStockObject(DEFAULT_PALETTE)));
 
   // Step 2:
   // The RealizePalette function modifies the palette for the device associated with the specified device context. If the
@@ -334,6 +375,12 @@ UINT STDCALL W32kRealizePalette(HDC  hDC)
     }
   }
 
+  // need to pass this to IntEngCreateXlate with palettes unlocked
+  sysMode = sysGDI->Mode;
+  palMode = palGDI->Mode;
+  PALETTE_UnlockPalette(systemPalette);
+  PALETTE_UnlockPalette(dc->w.hPalette);
+
   // Step 3: Create the XLATEOBJ for device managed DCs
   if(dc->w.flags != DC_MEMORY)
   {
@@ -341,13 +388,12 @@ UINT STDCALL W32kRealizePalette(HDC  hDC)
     palPtr->logicalToSystem = IntEngCreateXlate(sysGDI->Mode, palGDI->Mode, systemPalette, dc->w.hPalette);
   }
 
-//  GDI_ReleaseObj(dc->w.hPalette);
-//  GDI_ReleaseObj(hdc);
+  DC_UnlockDc(hDC);
 
   return realized;
 }
 
-BOOL STDCALL W32kResizePalette(HPALETTE  hpal,
+BOOL STDCALL NtGdiResizePalette(HPALETTE  hpal,
                         UINT  Entries)
 {
 /*  PPALOBJ palPtr = (PPALOBJ)AccessUserObject(hPal);
@@ -401,75 +447,91 @@ BOOL STDCALL W32kResizePalette(HPALETTE  hpal,
  *
  * \todo       implement ForceBackground == TRUE
 */
-HPALETTE STDCALL W32kSelectPalette(HDC  hDC,
+HPALETTE STDCALL NtGdiSelectPalette(HDC  hDC,
                             HPALETTE  hpal,
                             BOOL  ForceBackground)
 {
   PDC dc;
   HPALETTE oldPal;
+  PPALGDI PalGDI;
 
   // FIXME: mark the palette as a [fore\back]ground pal
-  dc = DC_HandleToPtr(hDC);
-  if( dc ){
-       oldPal = dc->w.hPalette;
-       dc->w.hPalette = hpal;
-       DC_ReleasePtr( hDC );
-  }
+  dc = DC_LockDc(hDC);
+  if (NULL != dc)
+    {
+      /* Check if this is a valid palette handle */
+      PalGDI = PALETTE_LockPalette(hpal);
+      if (NULL != PalGDI)
+       {
+         PALETTE_UnlockPalette(hpal);
+         oldPal = dc->w.hPalette;
+         dc->w.hPalette = hpal;
+       }
+      else
+       {
+         oldPal = NULL;
+       }
+      DC_UnlockDc(hDC);
+    }
 
   return oldPal;
 }
 
-BOOL STDCALL W32kSetColorAdjustment(HDC  hDC,
+BOOL STDCALL NtGdiSetColorAdjustment(HDC  hDC,
                              CONST LPCOLORADJUSTMENT  ca)
 {
   UNIMPLEMENTED;
 }
 
-UINT STDCALL W32kSetPaletteEntries(HPALETTE  hpal,
+UINT STDCALL NtGdiSetPaletteEntries(HPALETTE  hpal,
                             UINT  Start,
                             UINT  Entries,
                             CONST LPPALETTEENTRY  pe)
 {
   PPALOBJ palPtr;
-  INT numEntries;
+  WORD numEntries;
 
-  palPtr = (PPALOBJ)AccessUserObject(hpal);
+  palPtr = (PPALOBJ)PALETTE_LockPalette(hpal);
   if (!palPtr) return 0;
 
   numEntries = palPtr->logpalette->palNumEntries;
   if (Start >= numEntries)
-  {
-//    GDI_ReleaseObj( hpalette );
-    return 0;
-  }
-  if (Start + Entries > numEntries) Entries = numEntries - Start;
+    {
+      PALETTE_UnlockPalette(hpal);
+      return 0;
+    }
+  if (numEntries < Start + Entries)
+    {
+      Entries = numEntries - Start;
+    }
   memcpy(&palPtr->logpalette->palPalEntry[Start], pe, Entries * sizeof(PALETTEENTRY));
   PALETTE_ValidateFlags(palPtr->logpalette->palPalEntry, palPtr->logpalette->palNumEntries);
   ExFreePool(palPtr->logicalToSystem);
   palPtr->logicalToSystem = NULL;
-//  GDI_ReleaseObj( hpalette );
+  PALETTE_UnlockPalette(hpal);
+
   return Entries;
 }
 
-UINT STDCALL W32kSetSystemPaletteUse(HDC  hDC,
+UINT STDCALL NtGdiSetSystemPaletteUse(HDC  hDC,
                               UINT  Usage)
 {
   UNIMPLEMENTED;
 }
 
-BOOL STDCALL W32kUnrealizeObject(HGDIOBJ  hgdiobj)
+BOOL STDCALL NtGdiUnrealizeObject(HGDIOBJ  hgdiobj)
 {
   UNIMPLEMENTED;
 }
 
-BOOL STDCALL W32kUpdateColors(HDC  hDC)
+BOOL STDCALL NtGdiUpdateColors(HDC  hDC)
 {
-  PDC dc;
-  HWND hWnd;
-  int size;
+  //PDC dc;
+  //HWND hWnd;
+  //int size;
 /*
   if (!(dc = AccessUserObject(hDC))) return 0;
-  size = dc->devCaps->sizePalette;
+  size = dc->GDIInfo->ulNumPalReg;
 //  GDI_ReleaseObj( hDC );
 
   if (Callout.WindowFromDC)
@@ -480,10 +542,11 @@ BOOL STDCALL W32kUpdateColors(HDC  hDC)
     // but it would take forever given the speed of XGet/PutPixel.
     if (hWnd && size) Callout.RedrawWindow( hWnd, NULL, 0, RDW_INVALIDATE );
   } */
+  // FIXME UNIMPLEMENTED
   return 0x666;
 }
 
-int COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, int size,
+INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size,
                              PXLATEOBJ XlateObj, COLORREF col, BOOL skipReserved)
 {
   int i, best = 0, diff = 0x7fffffff;
@@ -502,10 +565,10 @@ int COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, int size,
 
     if( r < diff ) { best = i; diff = r; }
   }
-  return (XlateObj->pulXlate) ? XlateObj->pulXlate[best] : best;
+  return (XlateObj->pulXlate) ? (INT)XlateObj->pulXlate[best] : best;
 }
 
-COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF color )
+COLORREF STDCALL COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF color )
 {
   unsigned char spec_type = color >> 24;
   int i;
@@ -530,7 +593,7 @@ COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF
   return (0x00ffffff & *(COLORREF*)(COLOR_sysPal + COLOR_PaletteLookupPixel(COLOR_sysPal, 256, NULL, color, FALSE)));
 }
 
-int COLOR_PaletteLookupExactIndex( PALETTEENTRY* palPalEntry, int size,
+int STDCALL COLOR_PaletteLookupExactIndex( PALETTEENTRY* palPalEntry, int size,
                                    COLORREF col )
 {
   int i;
@@ -542,3 +605,4 @@ int COLOR_PaletteLookupExactIndex( PALETTEENTRY* palPalEntry, int size,
   }
   return -1;
 }
+/* EOF */