WIN32K: little work on Set/GetPixel (I don't know how to actually get/set a pixel...
[reactos.git] / reactos / subsys / win32k / objects / bitmaps.c
index 4085964..270908d 100644 (file)
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: bitmaps.c,v 1.31 2003/08/07 16:18:02 royce Exp $ */
+/* $Id: bitmaps.c,v 1.35 2003/08/20 20:45:28 ea Exp $ */
 #undef WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <stdlib.h>
+#include <win32k/gdiobj.h>
 #include <win32k/bitmaps.h>
 //#include <win32k/debug.h>
 #include "../eng/handle.h"
 #define NDEBUG
 #include <win32k/debug1.h>
 
-BOOL STDCALL W32kBitBlt(HDC  hDCDest,
+//FIXME: where should CLR_INVALID be defined?
+#define CLR_INVALID 0xffffffff
+
+BOOL STDCALL NtGdiBitBlt(HDC  hDCDest,
                  INT  XDest,
                  INT  YDest,
                  INT  Width,
@@ -40,7 +44,7 @@ BOOL STDCALL W32kBitBlt(HDC  hDCDest,
                  INT  YSrc,
                  DWORD  ROP)
 {
-  GDIMULTILOCK Lock[2] = {{hDCDest, 0, GO_DC_MAGIC}, {hDCSrc, 0, GO_DC_MAGIC}};
+  GDIMULTILOCK Lock[2] = {{hDCDest, 0, GDI_OBJECT_TYPE_DC}, {hDCSrc, 0, GDI_OBJECT_TYPE_DC}};
   PDC DCDest = NULL;
   PDC DCSrc  = NULL;
   PSURFOBJ SurfDest, SurfSrc;
@@ -105,12 +109,12 @@ BOOL STDCALL W32kBitBlt(HDC  hDCDest,
     if(DCDest->w.hPalette != 0)
       DestPalette = DCDest->w.hPalette;
     else
-      DestPalette = W32kGetStockObject(DEFAULT_PALETTE);
+      DestPalette = NtGdiGetStockObject(DEFAULT_PALETTE);
 
     if(DCSrc->w.hPalette != 0)
       SourcePalette = DCSrc->w.hPalette;
     else
-      SourcePalette = W32kGetStockObject(DEFAULT_PALETTE);
+      SourcePalette = NtGdiGetStockObject(DEFAULT_PALETTE);
 
     PalDestGDI   = (PPALGDI)AccessInternalObject((ULONG)DestPalette);
     PalSourceGDI = (PPALGDI)AccessInternalObject((ULONG)SourcePalette);
@@ -132,7 +136,7 @@ BOOL STDCALL W32kBitBlt(HDC  hDCDest,
   return Status;
 }
 
-HBITMAP STDCALL W32kCreateBitmap(INT  Width,
+HBITMAP STDCALL NtGdiCreateBitmap(INT  Width,
                           INT  Height,
                           UINT  Planes,
                           UINT  BitsPerPel,
@@ -167,13 +171,13 @@ HBITMAP STDCALL W32kCreateBitmap(INT  Width,
   hBitmap = BITMAPOBJ_AllocBitmap ();
   if (!hBitmap)
   {
-       DPRINT("W32kCreateBitmap: BITMAPOBJ_AllocBitmap returned 0\n");
+       DPRINT("NtGdiCreateBitmap: BITMAPOBJ_AllocBitmap returned 0\n");
     return 0;
   }
 
-  bmp = BITMAPOBJ_HandleToPtr( hBitmap );
+  bmp = BITMAPOBJ_LockBitmap( hBitmap );
 
-  DPRINT("W32kCreateBitmap:%dx%d, %d (%d BPP) colors returning %08x\n", Width, Height,
+  DPRINT("NtGdiCreateBitmap:%dx%d, %d (%d BPP) colors returning %08x\n", Width, Height,
          1 << (Planes * BitsPerPel), BitsPerPel, bmp);
 
   bmp->size.cx = Width;
@@ -193,10 +197,10 @@ HBITMAP STDCALL W32kCreateBitmap(INT  Width,
 
   if (Bits) /* Set bitmap bits */
   {
-    W32kSetBitmapBits(hBitmap, Height * bmp->bitmap.bmWidthBytes, Bits);
+    NtGdiSetBitmapBits(hBitmap, Height * bmp->bitmap.bmWidthBytes, Bits);
   }
 
-  BITMAPOBJ_ReleasePtr( hBitmap );
+  BITMAPOBJ_UnlockBitmap( hBitmap );
 
   return  hBitmap;
 }
@@ -229,7 +233,7 @@ BOOL FASTCALL Bitmap_InternalDelete( PBITMAPOBJ pBmp )
 }
 
 
-HBITMAP STDCALL W32kCreateCompatibleBitmap(HDC hDC,
+HBITMAP STDCALL NtGdiCreateCompatibleBitmap(HDC hDC,
                                     INT  Width,
                                     INT  Height)
 {
@@ -237,9 +241,9 @@ HBITMAP STDCALL W32kCreateCompatibleBitmap(HDC hDC,
   PDC  dc;
 
   hbmpRet = 0;
-  dc = DC_HandleToPtr (hDC);
+  dc = DC_LockDc(hDC);
 
-  DPRINT("W32kCreateCompatibleBitmap(%04x,%d,%d, bpp:%d) = \n", hDC, Width, Height, dc->w.bitsPerPixel);
+  DPRINT("NtGdiCreateCompatibleBitmap(%04x,%d,%d, bpp:%d) = \n", hDC, Width, Height, dc->w.bitsPerPixel);
 
   if (!dc)
   {
@@ -254,36 +258,36 @@ HBITMAP STDCALL W32kCreateCompatibleBitmap(HDC hDC,
     /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */
     if (!Width || !Height)
     {
-      hbmpRet = W32kCreateBitmap (1, 1, 1, 1, NULL);
+      hbmpRet = NtGdiCreateBitmap (1, 1, 1, 1, NULL);
     }
     else
     {
-      hbmpRet = W32kCreateBitmap(Width, Height, 1, dc->w.bitsPerPixel, NULL);
+      hbmpRet = NtGdiCreateBitmap(Width, Height, 1, dc->w.bitsPerPixel, NULL);
     }
   }
   DPRINT ("\t\t%04x\n", hbmpRet);
-  DC_ReleasePtr( hDC );
+  DC_UnlockDc( hDC );
   return hbmpRet;
 }
 
-HBITMAP STDCALL W32kCreateBitmapIndirect(CONST BITMAP  *BM)
+HBITMAP STDCALL NtGdiCreateBitmapIndirect(CONST BITMAP  *BM)
 {
-  return W32kCreateBitmap (BM->bmWidth,
+  return NtGdiCreateBitmap (BM->bmWidth,
                            BM->bmHeight,
                            BM->bmPlanes,
                            BM->bmBitsPixel,
                            BM->bmBits);
 }
 
-HBITMAP STDCALL W32kCreateDiscardableBitmap(HDC  hDC,
+HBITMAP STDCALL NtGdiCreateDiscardableBitmap(HDC  hDC,
                                      INT  Width,
                                      INT  Height)
 {
   /* FIXME: this probably should do something else */
-  return  W32kCreateCompatibleBitmap(hDC, Width, Height);
+  return  NtGdiCreateCompatibleBitmap(hDC, Width, Height);
 }
 
-BOOL STDCALL W32kExtFloodFill(HDC  hDC,
+BOOL STDCALL NtGdiExtFloodFill(HDC  hDC,
                       INT  XStart,
                       INT  YStart,
                       COLORREF  Color,
@@ -292,7 +296,7 @@ BOOL STDCALL W32kExtFloodFill(HDC  hDC,
   UNIMPLEMENTED;
 }
 
-BOOL STDCALL W32kFloodFill(HDC  hDC,
+BOOL STDCALL NtGdiFloodFill(HDC  hDC,
                     INT  XStart,
                     INT  YStart,
                     COLORREF  Fill)
@@ -300,12 +304,12 @@ BOOL STDCALL W32kFloodFill(HDC  hDC,
   UNIMPLEMENTED;
 }
 
-BOOL STDCALL W32kGetBitmapDimensionEx(HBITMAP  hBitmap,
+BOOL STDCALL NtGdiGetBitmapDimensionEx(HBITMAP  hBitmap,
                                LPSIZE  Dimension)
 {
   PBITMAPOBJ  bmp;
 
-  bmp = BITMAPOBJ_HandleToPtr (hBitmap);
+  bmp = BITMAPOBJ_LockBitmap(hBitmap);
   if (bmp == NULL)
   {
     return FALSE;
@@ -313,17 +317,29 @@ BOOL STDCALL W32kGetBitmapDimensionEx(HBITMAP  hBitmap,
 
   *Dimension = bmp->size;
 
+  BITMAPOBJ_UnlockBitmap(hBitmap);
+
   return  TRUE;
 }
 
-COLORREF STDCALL W32kGetPixel(HDC  hDC,
+COLORREF STDCALL NtGdiGetPixel(HDC  hDC,
                        INT  XPos,
                        INT  YPos)
 {
-  UNIMPLEMENTED;
+  PDC      dc = NULL;
+  COLORREF cr = (COLORREF) 0;
+
+  dc = DC_LockDc (hDC);
+  if (NULL == dc)
+  {
+    return (COLORREF) CLR_INVALID;
+  }
+  //FIXME: get actual pixel RGB value
+  DC_UnlockDc (hDC);
+  return cr;
 }
 
-BOOL STDCALL W32kMaskBlt(HDC  hDCDest,
+BOOL STDCALL NtGdiMaskBlt(HDC  hDCDest,
                   INT  XDest,
                   INT  YDest,
                   INT  Width,
@@ -339,7 +355,7 @@ BOOL STDCALL W32kMaskBlt(HDC  hDCDest,
   UNIMPLEMENTED;
 }
 
-BOOL STDCALL W32kPlgBlt(HDC  hDCDest,
+BOOL STDCALL NtGdiPlgBlt(HDC  hDCDest,
                 CONST POINT  *Point,
                 HDC  hDCSrc,
                 INT  XSrc,
@@ -353,14 +369,14 @@ BOOL STDCALL W32kPlgBlt(HDC  hDCDest,
   UNIMPLEMENTED;
 }
 
-LONG STDCALL W32kSetBitmapBits(HBITMAP  hBitmap,
+LONG STDCALL NtGdiSetBitmapBits(HBITMAP  hBitmap,
                         DWORD  Bytes,
                         CONST VOID *Bits)
 {
-  DWORD  height, ret;
-  PBITMAPOBJ  bmp;
+  LONG height, ret;
+  PBITMAPOBJ bmp;
 
-  bmp = BITMAPOBJ_HandleToPtr (hBitmap);
+  bmp = BITMAPOBJ_LockBitmap(hBitmap);
   if (bmp == NULL || Bits == NULL)
   {
     return 0;
@@ -426,14 +442,14 @@ LONG STDCALL W32kSetBitmapBits(HBITMAP  hBitmap,
   return ret;
 }
 
-BOOL STDCALL W32kSetBitmapDimensionEx(HBITMAP  hBitmap,
+BOOL STDCALL NtGdiSetBitmapDimensionEx(HBITMAP  hBitmap,
                                INT  Width,
                                INT  Height,
                                LPSIZE  Size)
 {
   PBITMAPOBJ  bmp;
 
-  bmp = BITMAPOBJ_HandleToPtr (hBitmap);
+  bmp = BITMAPOBJ_LockBitmap(hBitmap);
   if (bmp == NULL)
   {
     return FALSE;
@@ -446,26 +462,52 @@ BOOL STDCALL W32kSetBitmapDimensionEx(HBITMAP  hBitmap,
   bmp->size.cx = Width;
   bmp->size.cy = Height;
 
+  BITMAPOBJ_UnlockBitmap (hBitmap);
+
   return TRUE;
 }
 
-COLORREF STDCALL W32kSetPixel(HDC  hDC,
+COLORREF STDCALL NtGdiSetPixel(HDC  hDC,
                        INT  X,
                        INT  Y,
                        COLORREF  Color)
 {
-  UNIMPLEMENTED;
+   if(NtGdiSetPixelV(hDC,X,Y,Color))
+   {
+      COLORREF cr = NtGdiGetPixel(hDC,X,Y);
+      if(CLR_INVALID != cr) return(cr);
+   }
+   return ((COLORREF) -1);
 }
 
-BOOL STDCALL W32kSetPixelV(HDC  hDC,
+BOOL STDCALL NtGdiSetPixelV(HDC  hDC,
                     INT  X,
                     INT  Y,
                     COLORREF  Color)
 {
-  UNIMPLEMENTED;
+  PDC        dc = NULL;
+  PBITMAPOBJ bmp = NULL;
+  BITMAP     bm;
+
+  dc = DC_LockDc (hDC);
+  if(NULL == dc)
+  {
+    return(FALSE);
+  }
+  bmp = BITMAPOBJ_LockBitmap (dc->w.hBitmap);
+  if(NULL == bmp)
+  {
+    DC_UnlockDc (hDC);
+    return(FALSE);
+  }
+  bm = bmp->bitmap;
+  //FIXME: set the actual pixel value
+  BITMAPOBJ_UnlockBitmap (bmp);
+  DC_UnlockDc (hDC);
+  return(TRUE);
 }
 
-BOOL STDCALL W32kStretchBlt(HDC  hDCDest,
+BOOL STDCALL NtGdiStretchBlt(HDC  hDCDest,
                      INT  XOriginDest,
                      INT  YOriginDest,
                      INT  WidthDest,
@@ -522,7 +564,7 @@ HBITMAP FASTCALL BITMAPOBJ_CopyBitmap(HBITMAP  hBitmap)
   HBITMAP  res;
   BITMAP  bm;
 
-  bmp = BITMAPOBJ_HandleToPtr (hBitmap);
+  bmp = BITMAPOBJ_LockBitmap(hBitmap);
   if (bmp == NULL)
   {
     return 0;
@@ -531,14 +573,14 @@ HBITMAP FASTCALL BITMAPOBJ_CopyBitmap(HBITMAP  hBitmap)
 
   bm = bmp->bitmap;
   bm.bmBits = NULL;
-  res = W32kCreateBitmapIndirect(&bm);
+  res = NtGdiCreateBitmapIndirect(&bm);
   if(res)
   {
     char *buf;
 
     buf = ExAllocatePool (NonPagedPool, bm.bmWidthBytes * bm.bmHeight);
-    W32kGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf);
-    W32kSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf);
+    NtGdiGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf);
+    NtGdiSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf);
     ExFreePool (buf);
   }
 
@@ -549,20 +591,20 @@ INT STDCALL BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer)
 {
   if(bmp->dib)
   {
-    if(count < sizeof(DIBSECTION))
+    if(count < (INT) sizeof(DIBSECTION))
     {
-      if (count > sizeof(BITMAP)) count = sizeof(BITMAP);
+      if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP);
     }
     else
     {
-      if (count > sizeof(DIBSECTION)) count = sizeof(DIBSECTION);
+      if (count > (INT) sizeof(DIBSECTION)) count = sizeof(DIBSECTION);
     }
     memcpy(buffer, bmp->dib, count);
     return count;
   }
   else
   {
-    if (count > sizeof(BITMAP)) count = sizeof(BITMAP);
+    if (count > (INT) sizeof(BITMAP)) count = sizeof(BITMAP);
     memcpy(buffer, &bmp->bitmap, count);
     return count;
   }