[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / objects / stockobj.c
index 9e543a7..02b07df 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.
  */
 /*
  * STOCKOBJ.C - GDI Stock Objects
  *
- * $Id$
  *
  */
 
-#include <w32k.h>
+#include <win32k.h>
 
 #define NDEBUG
 #include <debug.h>
 
-static COLORREF SysColors[] =
+
+static const COLORREF SysColors[] =
 {
-  RGB(212, 208, 200), /* COLOR_SCROLLBAR  */
-  RGB(58, 110, 165),  /* COLOR_BACKGROUND  */
-  RGB(10, 36, 106),   /* COLOR_ACTIVECAPTION  */
-  RGB(128, 128, 128), /* COLOR_INACTIVECAPTION  */
-  RGB(212, 208, 200), /* COLOR_MENU  */
-  RGB(255, 255, 255), /* COLOR_WINDOW  */
-  RGB(0, 0, 0),       /* COLOR_WINDOWFRAME  */
-  RGB(0, 0, 0),       /* COLOR_MENUTEXT  */
-  RGB(0, 0, 0),       /* COLOR_WINDOWTEXT  */
-  RGB(255, 255, 255), /* COLOR_CAPTIONTEXT  */
-  RGB(212, 208, 200), /* COLOR_ACTIVEBORDER  */
-  RGB(212, 208, 200), /* COLOR_INACTIVEBORDER  */
-  RGB(128, 128, 128), /* COLOR_APPWORKSPACE  */
-  RGB(10, 36, 106),   /* COLOR_HIGHLIGHT  */
-  RGB(255, 255, 255), /* COLOR_HIGHLIGHTTEXT  */
-  RGB(212, 208, 200), /* COLOR_BTNFACE  */
-  RGB(128, 128, 128), /* COLOR_BTNSHADOW  */
-  RGB(128, 128, 128), /* COLOR_GRAYTEXT  */
-  RGB(0, 0, 0),       /* COLOR_BTNTEXT  */
-  RGB(212, 208, 200), /* COLOR_INACTIVECAPTIONTEXT  */
-  RGB(255, 255, 255), /* COLOR_BTNHIGHLIGHT  */
-  RGB(64, 64, 64),    /* COLOR_3DDKSHADOW  */
-  RGB(212, 208, 200), /* COLOR_3DLIGHT  */
-  RGB(0, 0, 0),       /* COLOR_INFOTEXT  */
-  RGB(255, 255, 225), /* COLOR_INFOBK  */
-  RGB(181, 181, 181), /* COLOR_UNKNOWN  */
-  RGB(0, 0, 128),     /* COLOR_HOTLIGHT  */
-  RGB(166, 202, 240), /* COLOR_GRADIENTACTIVECAPTION  */
-  RGB(192, 192, 192), /* COLOR_GRADIENTINACTIVECAPTION  */
-  RGB(49, 106, 197),  /* COLOR_MENUHILIGHT  */
-  RGB(236, 233, 216)  /* COLOR_MENUBAR  */
+    RGB(212, 208, 200), /* COLOR_SCROLLBAR  */
+    RGB(58, 110, 165),  /* COLOR_BACKGROUND  */
+    RGB(10, 36, 106),   /* COLOR_ACTIVECAPTION  */
+    RGB(128, 128, 128), /* COLOR_INACTIVECAPTION  */
+    RGB(212, 208, 200), /* COLOR_MENU  */
+    RGB(255, 255, 255), /* COLOR_WINDOW  */
+    RGB(0, 0, 0),       /* COLOR_WINDOWFRAME  */
+    RGB(0, 0, 0),       /* COLOR_MENUTEXT  */
+    RGB(0, 0, 0),       /* COLOR_WINDOWTEXT  */
+    RGB(255, 255, 255), /* COLOR_CAPTIONTEXT  */
+    RGB(212, 208, 200), /* COLOR_ACTIVEBORDER  */
+    RGB(212, 208, 200), /* COLOR_INACTIVEBORDER  */
+    RGB(128, 128, 128), /* COLOR_APPWORKSPACE  */
+    RGB(10, 36, 106),   /* COLOR_HIGHLIGHT  */
+    RGB(255, 255, 255), /* COLOR_HIGHLIGHTTEXT  */
+    RGB(212, 208, 200), /* COLOR_BTNFACE  */
+    RGB(128, 128, 128), /* COLOR_BTNSHADOW  */
+    RGB(128, 128, 128), /* COLOR_GRAYTEXT  */
+    RGB(0, 0, 0),       /* COLOR_BTNTEXT  */
+    RGB(212, 208, 200), /* COLOR_INACTIVECAPTIONTEXT  */
+    RGB(255, 255, 255), /* COLOR_BTNHIGHLIGHT  */
+    RGB(64, 64, 64),    /* COLOR_3DDKSHADOW  */
+    RGB(212, 208, 200), /* COLOR_3DLIGHT  */
+    RGB(0, 0, 0),       /* COLOR_INFOTEXT  */
+    RGB(255, 255, 225), /* COLOR_INFOBK  */
+    RGB(181, 181, 181), /* COLOR_UNKNOWN  */
+    RGB(0, 0, 128),     /* COLOR_HOTLIGHT  */
+    RGB(166, 202, 240), /* COLOR_GRADIENTACTIVECAPTION  */
+    RGB(192, 192, 192), /* COLOR_GRADIENTINACTIVECAPTION  */
+    RGB(49, 106, 197),  /* COLOR_MENUHILIGHT  */
+    RGB(236, 233, 216)  /* COLOR_MENUBAR  */
 };
 #define NUM_SYSCOLORS (sizeof(SysColors) / sizeof(SysColors[0]))
 
-static HPEN SysColorPens[NUM_SYSCOLORS];
-static HBRUSH SysColorBrushes[NUM_SYSCOLORS];
+// System Bitmap DC
+HDC hSystemBM;
 
 /*  GDI stock objects */
 
 static LOGPEN WhitePen =
-{ PS_SOLID, { 0, 0 }, RGB(255,255,255) };
+    { PS_SOLID, { 0, 0 }, RGB(255,255,255) };
 
 static LOGPEN BlackPen =
-{ PS_SOLID, { 0, 0 }, RGB(0,0,0) };
+    { PS_SOLID, { 0, 0 }, RGB(0,0,0) };
 
 static LOGPEN NullPen =
-{ PS_NULL, { 0, 0 }, 0 };
+    { PS_NULL, { 0, 0 }, 0 };
 
 static LOGFONTW OEMFixedFont =
-{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
-  0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Bitstream Vera Sans Mono" };
+    { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
+      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New"
+    }; //Bitstream Vera Sans Mono
 
 static LOGFONTW AnsiFixedFont =
-{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-  0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Bitstream Vera Sans Mono" };
+    { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
+      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New"
+    }; //Bitstream Vera Sans Mono
 
-/*static LOGFONTW AnsiVarFont =
- *{ 10, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
- *  0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif" }; */
+static LOGFONTW AnsiVarFont =
+    { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"
+    };
 
 static LOGFONTW SystemFont =
-{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-  0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"Bitstream Vera Sans" };
+    { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"Courier New"
+    }; //Bitstream Vera Sans
 
 static LOGFONTW DeviceDefaultFont =
-{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-  0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"Bitstream Vera Sans" };
+    { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"
+    }; //Bitstream Vera Sans
 
 static LOGFONTW SystemFixedFont =
-{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-  0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Bitstream Vera Sans Mono" };
+    { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
+      0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New"
+    }; //Bitstream Vera Sans Mono
 
 /* FIXME: Is this correct? */
 static LOGFONTW DefaultGuiFont =
-{ 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
-  0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"Bitstream Vera Sans" };
-
-#define NB_STOCK_OBJECTS (DEFAULT_GUI_FONT + 1)
+    { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
+      0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"
+    }; //Bitstream Vera Sans
+
+HGDIOBJ StockObjects[NB_STOCK_OBJECTS];
+
+static
+HPEN
+FASTCALL
+IntCreateStockPen(DWORD dwPenStyle,
+                  DWORD dwWidth,
+                  ULONG ulBrushStyle,
+                  ULONG ulColor)
+{
+    HPEN hPen;
+    PBRUSH pbrushPen = PEN_AllocPenWithHandle();
+
+    if ((dwPenStyle & PS_STYLE_MASK) == PS_NULL) dwWidth = 1;
+
+    pbrushPen->ptPenWidth.x = abs(dwWidth);
+    pbrushPen->ptPenWidth.y = 0;
+    pbrushPen->ulPenStyle = dwPenStyle;
+    pbrushPen->BrushAttr.lbColor = ulColor;
+    pbrushPen->ulStyle = ulBrushStyle;
+    pbrushPen->hbmClient = (HANDLE)NULL;
+    pbrushPen->dwStyleCount = 0;
+    pbrushPen->pStyle = 0;
+    pbrushPen->flAttrs = GDIBRUSH_IS_OLDSTYLEPEN;
+
+    switch (dwPenStyle & PS_STYLE_MASK)
+    {
+        case PS_NULL:
+            pbrushPen->flAttrs |= GDIBRUSH_IS_NULL;
+            break;
 
-static HGDIOBJ StockObjects[NB_STOCK_OBJECTS];
+        case PS_SOLID:
+            pbrushPen->flAttrs |= GDIBRUSH_IS_SOLID;
+            break;
+    }
+    hPen = pbrushPen->BaseObject.hHmgr;
+    PEN_UnlockPen(pbrushPen);
+    return hPen;
+}
 
 /*!
  * Creates a bunch of stock objects: brushes, pens, fonts.
@@ -117,41 +160,47 @@ static HGDIOBJ StockObjects[NB_STOCK_OBJECTS];
 VOID FASTCALL
 CreateStockObjects(void)
 {
-  UINT Object;
+    UINT Object;
+
+    DPRINT("Beginning creation of stock objects\n");
 
-  DPRINT("Beginning creation of stock objects\n");
+    /* Create GDI Stock Objects from the logical structures we've defined */
 
-  /* Create GDI Stock Objects from the logical structures we've defined */
+    StockObjects[WHITE_BRUSH] =  IntGdiCreateSolidBrush(RGB(255,255,255));
+    StockObjects[DC_BRUSH]    =  IntGdiCreateSolidBrush(RGB(255,255,255));
+    StockObjects[LTGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(192,192,192));
+    StockObjects[GRAY_BRUSH] =   IntGdiCreateSolidBrush(RGB(128,128,128));
+    StockObjects[DKGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(64,64,64));
+    StockObjects[BLACK_BRUSH] =  IntGdiCreateSolidBrush(RGB(0,0,0));
+    StockObjects[NULL_BRUSH] =   IntGdiCreateNullBrush();
 
-  StockObjects[WHITE_BRUSH] =  IntGdiCreateSolidBrush(RGB(255,255,255));
-  StockObjects[LTGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(192,192,192));
-  StockObjects[GRAY_BRUSH] =   IntGdiCreateSolidBrush(RGB(128,128,128));
-  StockObjects[DKGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(64,64,64));
-  StockObjects[BLACK_BRUSH] =  IntGdiCreateSolidBrush(RGB(0,0,0));
-  StockObjects[NULL_BRUSH] =   IntGdiCreateNullBrush();
+    StockObjects[WHITE_PEN] = IntCreateStockPen(WhitePen.lopnStyle, WhitePen.lopnWidth.x, BS_SOLID, WhitePen.lopnColor);
+    StockObjects[BLACK_PEN] = IntCreateStockPen(BlackPen.lopnStyle, BlackPen.lopnWidth.x, BS_SOLID, BlackPen.lopnColor);
+    StockObjects[DC_PEN]    = IntCreateStockPen(BlackPen.lopnStyle, BlackPen.lopnWidth.x, BS_SOLID, BlackPen.lopnColor);
+    StockObjects[NULL_PEN]  = IntCreateStockPen(NullPen.lopnStyle, NullPen.lopnWidth.x, BS_SOLID, NullPen.lopnColor);
 
-  StockObjects[WHITE_PEN] = IntGdiCreatePenIndirect(&WhitePen);
-  StockObjects[BLACK_PEN] = IntGdiCreatePenIndirect(&BlackPen);
-  StockObjects[NULL_PEN] =  IntGdiCreatePenIndirect(&NullPen);
+    StockObjects[20] = NULL; /* TODO: Unknown internal stock object */
+    StockObjects[DEFAULT_BITMAP] = GreCreateBitmap(1, 1, 1, 1, NULL);
 
-  (void) TextIntCreateFontIndirect(&OEMFixedFont, (HFONT*)&StockObjects[OEM_FIXED_FONT]);
-  (void) TextIntCreateFontIndirect(&AnsiFixedFont, (HFONT*)&StockObjects[ANSI_FIXED_FONT]);
-  (void) TextIntCreateFontIndirect(&SystemFont, (HFONT*)&StockObjects[SYSTEM_FONT]);
-  (void) TextIntCreateFontIndirect(&DeviceDefaultFont, (HFONT*)&StockObjects[DEVICE_DEFAULT_FONT]);
-  (void) TextIntCreateFontIndirect(&SystemFixedFont, (HFONT*)&StockObjects[SYSTEM_FIXED_FONT]);
-  (void) TextIntCreateFontIndirect(&DefaultGuiFont, (HFONT*)&StockObjects[DEFAULT_GUI_FONT]);
+    (void) TextIntCreateFontIndirect(&OEMFixedFont, (HFONT*)&StockObjects[OEM_FIXED_FONT]);
+    (void) TextIntCreateFontIndirect(&AnsiFixedFont, (HFONT*)&StockObjects[ANSI_FIXED_FONT]);
+    (void) TextIntCreateFontIndirect(&AnsiVarFont, (HFONT*)&StockObjects[ANSI_VAR_FONT]);
+    (void) TextIntCreateFontIndirect(&SystemFont, (HFONT*)&StockObjects[SYSTEM_FONT]);
+    (void) TextIntCreateFontIndirect(&DeviceDefaultFont, (HFONT*)&StockObjects[DEVICE_DEFAULT_FONT]);
+    (void) TextIntCreateFontIndirect(&SystemFixedFont, (HFONT*)&StockObjects[SYSTEM_FIXED_FONT]);
+    (void) TextIntCreateFontIndirect(&DefaultGuiFont, (HFONT*)&StockObjects[DEFAULT_GUI_FONT]);
 
-  StockObjects[DEFAULT_PALETTE] = (HGDIOBJ*)PALETTE_Init();
+    StockObjects[DEFAULT_PALETTE] = (HGDIOBJ)gppalDefault->BaseObject.hHmgr;
 
-  for (Object = 0; Object < NB_STOCK_OBJECTS; Object++)
+    for (Object = 0; Object < NB_STOCK_OBJECTS; Object++)
     {
-      if (NULL != StockObjects[Object])
-       {
-         GDIOBJ_ConvertToStockObj(GdiHandleTable, &StockObjects[Object]);
-       }
+        if (NULL != StockObjects[Object])
+        {
+            GDIOBJ_ConvertToStockObj(&StockObjects[Object]);
+        }
     }
 
-  DPRINT("Completed creation of stock objects\n");
+    DPRINT("Completed creation of stock objects\n");
 }
 
 /*!
@@ -159,136 +208,69 @@ CreateStockObjects(void)
  * \param      Object - stock object id.
  * \return     Handle to the object.
 */
-HGDIOBJ STDCALL
+HGDIOBJ APIENTRY
 NtGdiGetStockObject(INT Object)
 {
-  DPRINT("NtGdiGetStockObject index %d\n", Object);
+    DPRINT("NtGdiGetStockObject index %d\n", Object);
 
-  return ((Object < 0) || (NB_STOCK_OBJECTS <= Object)) ? NULL : StockObjects[Object];
+    return ((Object < 0) || (NB_STOCK_OBJECTS <= Object)) ? NULL : StockObjects[Object];
 }
 
 BOOL FASTCALL
 IntSetSysColors(UINT nColors, INT *Elements, COLORREF *Colors)
 {
-  UINT i;
+    UINT i;
 
-  ASSERT(Elements);
-  ASSERT(Colors);
+    ASSERT(Elements);
+    ASSERT(Colors);
 
-  for(i = 0; i < nColors; i++)
-  {
-    if((*Elements) >= 0 && (*Elements) < NUM_SYSCOLORS)
+    for (i = 0; i < nColors; i++)
     {
-      SysColors[*Elements] = *Colors;
-      /* FIXME - update the syscolor pens and brushes */
+        if ((UINT)(*Elements) < NUM_SYSCOLORS)
+        {
+            gpsi->argbSystem[*Elements] = *Colors;
+            IntGdiSetSolidBrushColor(gpsi->ahbrSystem[*Elements], *Colors);
+        }
+        Elements++;
+        Colors++;
     }
-    Elements++;
-    Colors++;
-  }
-
-  return nColors > 0;
+    return nColors > 0;
 }
 
-BOOL FASTCALL
-IntGetSysColorBrushes(HBRUSH *Brushes, UINT nBrushes)
+HGDIOBJ FASTCALL
+IntGetSysColorBrush(INT Object)
 {
-  UINT i;
-
-  ASSERT(Brushes);
-
-  if(nBrushes > NUM_SYSCOLORS)
-  {
-    SetLastWin32Error(ERROR_INVALID_PARAMETER);
-    return FALSE;
-  }
-
-  for(i = 0; i < nBrushes; i++)
-  {
-    *(Brushes++) = SysColorBrushes[i];
-  }
-
-  return nBrushes > 0;
+    return ((Object < 0) || (NUM_SYSCOLORS <= Object)) ? NULL : gpsi->ahbrSystem[Object];
 }
 
-BOOL FASTCALL
-IntGetSysColorPens(HPEN *Pens, UINT nPens)
+DWORD FASTCALL
+IntGetSysColor(INT nIndex)
 {
-  UINT i;
-
-  ASSERT(Pens);
-
-  if(nPens > NUM_SYSCOLORS)
-  {
-    SetLastWin32Error(ERROR_INVALID_PARAMETER);
-    return FALSE;
-  }
-
-  for(i = 0; i < nPens; i++)
-  {
-    *(Pens++) = SysColorPens[i];
-  }
-
-  return nPens > 0;
-}
-
-BOOL FASTCALL
-IntGetSysColors(COLORREF *Colors, UINT nColors)
-{
-  UINT i;
-  COLORREF *col;
-
-  ASSERT(Colors);
-
-  if(nColors > NUM_SYSCOLORS)
-  {
-    SetLastWin32Error(ERROR_INVALID_PARAMETER);
-    return FALSE;
-  }
-
-  col = &SysColors[0];
-  for(i = 0; i < nColors; i++)
-  {
-    *(Colors++) = *(col++);
-  }
-
-  return nColors > 0;
+    return (NUM_SYSCOLORS <= (UINT)nIndex) ? 0 : gpsi->argbSystem[nIndex];
 }
 
 VOID FASTCALL
 CreateSysColorObjects(VOID)
 {
-  UINT i;
-  LOGPEN Pen;
+    UINT i;
 
-  /* Create the syscolor brushes */
-  for(i = 0; i < NUM_SYSCOLORS; i++)
-  {
-    if(SysColorBrushes[i] == NULL)
+    for (i = 0; i < NUM_SYSCOLORS; i++)
     {
-      SysColorBrushes[i] = IntGdiCreateSolidBrush(SysColors[i]);
-      if(SysColorBrushes[i] != NULL)
-      {
-        GDIOBJ_ConvertToStockObj(GdiHandleTable, (HGDIOBJ*)&SysColorBrushes[i]);
-      }
+        gpsi->argbSystem[i] = SysColors[i];
     }
-  }
-
-  /* Create the syscolor pens */
-  Pen.lopnStyle = PS_SOLID;
-  Pen.lopnWidth.x = 0;
-  Pen.lopnWidth.y = 0;
-  for(i = 0; i < NUM_SYSCOLORS; i++)
-  {
-    if(SysColorPens[i] == NULL)
+
+    /* Create the syscolor brushes */
+    for (i = 0; i < NUM_SYSCOLORS; i++)
     {
-      Pen.lopnColor = SysColors[i];
-      SysColorPens[i] = IntGdiCreatePenIndirect(&Pen);
-      if(SysColorPens[i] != NULL)
-      {
-        GDIOBJ_ConvertToStockObj(GdiHandleTable, (HGDIOBJ*)&SysColorPens[i]);
-      }
+        if (gpsi->ahbrSystem[i] == NULL)
+        {
+            gpsi->ahbrSystem[i] = IntGdiCreateSolidBrush(SysColors[i]);
+            if (gpsi->ahbrSystem[i] != NULL)
+            {
+                GDIOBJ_ConvertToStockObj((HGDIOBJ*)&gpsi->ahbrSystem[i]);
+            }
+        }
     }
-  }
 }
 
 /* EOF */