* Replace NtGdiCreatePatternBrush and NtGdiCreateHatchBrush with NtGdiCreatePatternBr...
[reactos.git] / reactos / lib / gdi32 / objects / brush.c
index 4acdb3c..714c77d 100644 (file)
@@ -1,28 +1,80 @@
 #include "precomp.h"
 
+#define NDEBUG
+#include <debug.h>
 
 /*
  * @implemented
  */
-HBRUSH
+BOOL
 STDCALL
-CreateSolidBrush(
-       COLORREF        crColor
-       )
+FixBrushOrgEx(
+   HDC hDC,
+   INT nXOrg,
+   INT nYOrg,
+   LPPOINT lpPoint)
 {
-  return NtGdiCreateSolidBrush(crColor);
+   return FALSE;
 }
 
 /*
  * @implemented
  */
-HBRUSH
-STDCALL
-CreateBrushIndirect(
-       CONST LOGBRUSH  *lplb
-       )
+HBRUSH STDCALL
+CreateDIBPatternBrush(
+   HGLOBAL hglbDIBPacked,
+   UINT fuColorSpec)
 {
-  return NtGdiCreateBrushIndirect(lplb);
+   PVOID lpPackedDIB;
+   HBRUSH hBrush = NULL;
+   PBITMAPINFO pConvertedInfo;
+   UINT ConvertedInfoSize;
+
+   lpPackedDIB = GlobalLock(hglbDIBPacked); 
+   if (lpPackedDIB == NULL)
+      return 0;
+
+   pConvertedInfo = ConvertBitmapInfo((PBITMAPINFO)lpPackedDIB, fuColorSpec,
+                                      &ConvertedInfoSize, TRUE);
+   if (pConvertedInfo)
+   {
+      hBrush = NtGdiCreateDIBBrush(pConvertedInfo, fuColorSpec,
+                                   ConvertedInfoSize, FALSE, FALSE, lpPackedDIB);
+      if ((PBITMAPINFO)lpPackedDIB != pConvertedInfo)
+         RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
+   }
+   
+   GlobalUnlock(hglbDIBPacked);
+
+   return hBrush;
+}
+
+/*
+ * @implemented
+ */
+HBRUSH STDCALL
+CreateDIBPatternBrushPt(
+   CONST VOID *lpPackedDIB,
+   UINT fuColorSpec)
+{
+   HBRUSH hBrush = NULL;
+   PBITMAPINFO pConvertedInfo;
+   UINT ConvertedInfoSize;
+
+   if (lpPackedDIB == NULL)
+      return 0;
+
+   pConvertedInfo = ConvertBitmapInfo((PBITMAPINFO)lpPackedDIB, fuColorSpec,
+                                      &ConvertedInfoSize, TRUE);
+   if (pConvertedInfo)
+   {
+      hBrush = NtGdiCreateDIBBrush(pConvertedInfo, fuColorSpec,
+                                   ConvertedInfoSize, FALSE, FALSE, (PVOID)lpPackedDIB);
+      if ((PBITMAPINFO)lpPackedDIB != pConvertedInfo)
+         RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
+   }
+
+   return hBrush;
 }
 
 /*
@@ -30,12 +82,10 @@ CreateBrushIndirect(
  */
 HBRUSH
 STDCALL
-CreateDIBPatternBrushPt(
-       CONST VOID              *lpPackedDIB,
-       UINT                    iUsage
-       )
+CreateHatchBrush(INT fnStyle,
+                 COLORREF clrref)
 {
-  return NtGdiCreateDIBPatternBrushPt(lpPackedDIB, iUsage);
+    return NtGdiCreateHatchBrushInternal(fnStyle, clrref, FALSE);
 }
 
 /*
@@ -43,12 +93,9 @@ CreateDIBPatternBrushPt(
  */
 HBRUSH
 STDCALL
-CreateHatchBrush(
-       int             fnStyle,
-       COLORREF        clrref
-       )
+CreatePatternBrush(HBITMAP hbmp)
 {
-  return NtGdiCreateHatchBrush(fnStyle, clrref);
+    return NtGdiCreatePatternBrushInternal(hbmp, FALSE, FALSE);
 }
 
 /*
@@ -56,9 +103,66 @@ CreateHatchBrush(
  */
 HBRUSH
 STDCALL
-CreatePatternBrush(
-       HBITMAP         hbmp
-       )
+CreateSolidBrush(IN COLORREF crColor)
 {
-  return NtGdiCreatePatternBrush ( hbmp );
+    /* Call Server-Side API */
+    return NtGdiCreateSolidBrush(crColor, NULL);
 }
+
+/*
+ * @implemented
+ */
+HBRUSH STDCALL
+CreateBrushIndirect(
+   CONST LOGBRUSH *LogBrush)
+{
+   HBRUSH hBrush;
+
+   switch (LogBrush->lbStyle)
+   {
+      case BS_DIBPATTERN8X8:
+      case BS_DIBPATTERN:
+         hBrush = CreateDIBPatternBrush((HGLOBAL)LogBrush->lbHatch,
+                                        LogBrush->lbColor);
+         break;
+
+      case BS_DIBPATTERNPT:
+         hBrush = CreateDIBPatternBrushPt((PVOID)LogBrush->lbHatch,
+                                          LogBrush->lbColor);
+         break;
+
+      case BS_PATTERN:
+         hBrush = NtGdiCreatePatternBrushInternal((HBITMAP)LogBrush->lbHatch, 
+                                                  FALSE, 
+                                                  FALSE);
+         break;
+
+      case BS_PATTERN8X8:
+         hBrush = NtGdiCreatePatternBrushInternal((HBITMAP)LogBrush->lbHatch, 
+                                                  FALSE, 
+                                                  TRUE);
+         break;
+
+      case BS_SOLID:
+         hBrush = NtGdiCreateSolidBrush(LogBrush->lbColor, 0);
+         break;
+
+      case BS_HATCHED:
+         hBrush = NtGdiCreateHatchBrushInternal(LogBrush->lbHatch, 
+                                                LogBrush->lbColor, 
+                                                FALSE);
+         break;
+         
+      case BS_NULL:
+         hBrush = NtGdiGetStockObject(NULL_BRUSH);
+         break;
+
+      default:
+         SetLastError(ERROR_INVALID_PARAMETER);
+         hBrush = NULL;
+         break;
+   }
+
+   return hBrush;
+}
+