branch update for HEAD-2003050101
[reactos.git] / subsys / win32k / dib / dib4bpp.c
index 856ea0d..e8231bb 100644 (file)
@@ -8,29 +8,27 @@
 #include "../eng/objects.h"
 #include "dib.h"
 
-PFN_DIB_PutPixel DIB_4BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c)
+VOID DIB_4BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c)
 {
-  unsigned char *vp;
-  unsigned char mask;
-  PBYTE addr = SurfObj->pvBits;
+  PBYTE addr = SurfObj->pvScan0;
 
   addr += (x>>1) + y * SurfObj->lDelta;
   *addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2));
 }
 
-PFN_DIB_GetPixel DIB_4BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y)
+ULONG DIB_4BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y)
 {
-  PBYTE addr = SurfObj->pvBits;
+  PBYTE addr = SurfObj->pvScan0;
 
-  return (PFN_DIB_GetPixel)((addr[(x>>1) + y * SurfObj->lDelta] >> ((1-(x&1))<<2) ) & 0x0f);
+  return (addr[(x>>1) + y * SurfObj->lDelta] >> ((1-(x&1))<<2) ) & 0x0f;
 }
 
-PFN_DIB_HLine DIB_4BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
+VOID DIB_4BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
 {
-  PBYTE  addr = SurfObj->pvBits + (x1>>1) + y * SurfObj->lDelta;
+  PBYTE  addr = SurfObj->pvScan0 + (x1>>1) + y * SurfObj->lDelta;
   LONG  cx = x1;
 
-  while(cx <= x2) {
+  while(cx < x2) {
     *addr = (*addr & notmask[x1&1]) | (c << ((1-(x1&1))<<2));
     if((++x1 & 1) == 0)
       ++addr;
@@ -38,30 +36,29 @@ PFN_DIB_HLine DIB_4BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c
   }
 }
 
-PFN_DIB_VLine DIB_4BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
+VOID DIB_4BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
 {
-  PBYTE  addr = SurfObj->pvBits;
+  PBYTE  addr = SurfObj->pvScan0;
   int  lDelta = SurfObj->lDelta;
 
   addr += (x>>1) + y1 * lDelta;
-  while(y1++ <= y2) {
+  while(y1++ < y2) {
     *addr = (*addr & notmask[x&1]) | (c << ((1-(x&1))<<2));
     addr += lDelta;
   }
 }
 
-BOOLEAN DIB_To_4BPP_Bitblt(  SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
-        SURFGDI *DestGDI,  SURFGDI *SourceGDI,
-        PRECTL  DestRect,  POINTL  *SourcePoint,
-        LONG   Delta,      XLATEOBJ *ColorTranslation)
+BOOLEAN DIB_4BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
+                        SURFGDI *DestGDI,  SURFGDI *SourceGDI,
+                        PRECTL  DestRect,  POINTL  *SourcePoint,
+                        XLATEOBJ *ColorTranslation)
 {
   LONG     i, j, sx, sy, f1, f2, xColor;
   PBYTE    SourceBits_24BPP, SourceLine_24BPP;
-  PBYTE    DestBits, DestLine, SourceBits_4BPP, SourceBits_8BPP, SourceLine_4BPP, SourceLine_8BPP;
-  PWORD    SourceBits_16BPP, SourceLine_16BPP;
-  PDWORD    SourceBits_32BPP, SourceLine_32BPP;
+  PBYTE    DestBits, DestLine, SourceBits_8BPP, SourceLine_8BPP;
+  PBYTE    SourceBits, SourceLine;
 
-  DestBits = DestSurf->pvBits + (DestRect->left>>1) + DestRect->top * DestSurf->lDelta;
+  DestBits = DestSurf->pvScan0 + (DestRect->left>>1) + DestRect->top * DestSurf->lDelta;
 
   switch(SourceGDI->BitsPerPixel)
   {
@@ -103,23 +100,20 @@ BOOLEAN DIB_To_4BPP_Bitblt(  SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
       break;
 
     case 8:
-      SourceBits_8BPP = SourceSurf->pvBits + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x;
+      SourceBits_8BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x;
 
       for (j=DestRect->top; j<DestRect->bottom; j++)
       {
         SourceLine_8BPP = SourceBits_8BPP;
         DestLine = DestBits;
-        sx = SourcePoint->x;
-        f1 = sx & 1;
         f2 = DestRect->left & 1;
 
         for (i=DestRect->left; i<DestRect->right; i++)
         {
           *DestLine = (*DestLine & notmask[i&1]) |
-            ((XLATEOBJ_iXlate(ColorTranslation, *SourceLine_8BPP)) << ((4 * (1-(sx & 1)))));
+            ((XLATEOBJ_iXlate(ColorTranslation, *SourceLine_8BPP)) << ((4 * (1-(i & 1)))));
           if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; }
           SourceLine_8BPP++;
-          sx++;
         }
 
         SourceBits_8BPP += SourceSurf->lDelta;
@@ -127,15 +121,37 @@ BOOLEAN DIB_To_4BPP_Bitblt(  SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
       }
       break;
 
+    case 16:
+      SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 2 * SourcePoint->x;
+      DestLine = DestBits;
+
+      for (j = DestRect->top; j < DestRect->bottom; j++)
+      {
+        SourceBits = SourceLine;
+        DestBits = DestLine;
+        f2 = DestRect->left & 1;
+
+        for (i = DestRect->left; i < DestRect->right; i++)
+        {
+          xColor = *((PWORD) SourceBits);
+          *DestBits = (*DestBits & notmask[i&1]) |
+            ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1-(i & 1)))));
+          if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; }
+          SourceBits += 2;
+        }
+
+        SourceLine += SourceSurf->lDelta;
+        DestLine += DestSurf->lDelta;
+      }
+      break;
+
     case 24:
-      SourceBits_24BPP = SourceSurf->pvBits + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x * 3;
+      SourceBits_24BPP = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + SourcePoint->x * 3;
 
       for (j=DestRect->top; j<DestRect->bottom; j++)
       {
         SourceLine_24BPP = SourceBits_24BPP;
         DestLine = DestBits;
-        sx = SourcePoint->x;
-        f1 = sx & 1;
         f2 = DestRect->left & 1;
 
         for (i=DestRect->left; i<DestRect->right; i++)
@@ -144,10 +160,9 @@ BOOLEAN DIB_To_4BPP_Bitblt(  SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
              (*(SourceLine_24BPP + 1) << 0x08) +
              (*(SourceLine_24BPP));
           *DestLine = (*DestLine & notmask[i&1]) |
-            ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1-(sx & 1)))));
+            ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1-(i & 1)))));
           if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; }
           SourceLine_24BPP+=3;
-          sx++;
         }
 
         SourceBits_24BPP += SourceSurf->lDelta;
@@ -155,6 +170,30 @@ BOOLEAN DIB_To_4BPP_Bitblt(  SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
       }
       break;
 
+    case 32:
+      SourceLine = SourceSurf->pvScan0 + (SourcePoint->y * SourceSurf->lDelta) + 4 * SourcePoint->x;
+      DestLine = DestBits;
+
+      for (j = DestRect->top; j < DestRect->bottom; j++)
+      {
+        SourceBits = SourceLine;
+        DestBits = DestLine;
+        f2 = DestRect->left & 1;
+
+        for (i = DestRect->left; i < DestRect->right; i++)
+        {
+          xColor = *((PDWORD) SourceBits);
+          *DestBits = (*DestBits & notmask[i&1]) |
+            ((XLATEOBJ_iXlate(ColorTranslation, xColor)) << ((4 * (1-(i & 1)))));
+          if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; }
+          SourceBits += 4;
+        }
+
+        SourceLine += SourceSurf->lDelta;
+        DestLine += DestSurf->lDelta;
+      }
+      break;
+
     default:
       DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel);
       return FALSE;