d56140f5b5f7db7b17031a0d3292386789bdc2a6
[reactos.git] / subsys / win32k / dib / dib1bpp.c
1 #undef WIN32_LEAN_AND_MEAN
2 #include <windows.h>
3 #include <stdlib.h>
4 #include <win32k/bitmaps.h>
5 #include <win32k/debug.h>
6 #include <debug.h>
7 #include <ddk/winddi.h>
8 #include "../eng/objects.h"
9 #include "dib.h"
10
11 VOID DIB_1BPP_PutPixel(PSURFOBJ SurfObj, LONG x, LONG y, ULONG c)
12 {
13   PBYTE addr = SurfObj->pvScan0;
14
15   addr += y * SurfObj->lDelta + (x >> 3);
16
17   if(c == 0)
18   {
19     *addr = (*addr ^ mask1Bpp[x % 8]);
20   }
21     else
22   {
23     *addr = (*addr | mask1Bpp[x % 8]);
24   }
25 }
26
27 ULONG DIB_1BPP_GetPixel(PSURFOBJ SurfObj, LONG x, LONG y)
28 {
29   PBYTE addr = SurfObj->pvScan0 + y * SurfObj->lDelta + (x >> 3);
30
31   return (*addr & mask1Bpp[x % 8] ? 1 : 0);
32 }
33
34 VOID DIB_1BPP_HLine(PSURFOBJ SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
35 {
36   while(x1 < x2) {
37     DIB_1BPP_PutPixel(SurfObj, x1, y, c);
38     x1++;
39   }
40 }
41
42 VOID DIB_1BPP_VLine(PSURFOBJ SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
43 {
44   while(y1 < y2) {
45     DIB_1BPP_PutPixel(SurfObj, x, y1, c);
46     y1++;
47   }
48 }
49
50 BOOLEAN DIB_1BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
51                         SURFGDI *DestGDI,  SURFGDI *SourceGDI,
52                         PRECTL  DestRect,  POINTL  *SourcePoint,
53                         XLATEOBJ *ColorTranslation)
54 {
55   LONG    i, j, sx, sy = SourcePoint->y;
56
57   switch(SourceGDI->BitsPerPixel)
58   {
59     case 1:
60       for (j=DestRect->top; j<DestRect->bottom; j++)
61       {
62         sx = SourcePoint->x;
63         for (i=DestRect->left; i<DestRect->right; i++)
64         {
65           if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
66           {
67             DIB_1BPP_PutPixel(DestSurf, i, j, 0);
68           } else {
69             DIB_1BPP_PutPixel(DestSurf, i, j, 1);
70           }
71           sx++;
72         }
73         sy++;
74       }
75       break;
76
77     case 4:
78       for (j=DestRect->top; j<DestRect->bottom; j++)
79       {
80         sx = SourcePoint->x;
81         for (i=DestRect->left; i<DestRect->right; i++)
82         {
83           if(XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)) == 0)
84           {
85             DIB_1BPP_PutPixel(DestSurf, i, j, 0);
86           } else {
87             DIB_1BPP_PutPixel(DestSurf, i, j, 1);
88           }
89           sx++;
90         }
91         sy++;
92       }
93       break;
94
95     case 8:
96       for (j=DestRect->top; j<DestRect->bottom; j++)
97       {
98         sx = SourcePoint->x;
99         for (i=DestRect->left; i<DestRect->right; i++)
100         {
101           if(XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)) == 0)
102           {
103             DIB_1BPP_PutPixel(DestSurf, i, j, 0);
104           } else {
105             DIB_1BPP_PutPixel(DestSurf, i, j, 1);
106           }
107           sx++;
108         }
109         sy++;
110       }
111       break;
112
113     case 16:
114       for (j=DestRect->top; j<DestRect->bottom; j++)
115       {
116         sx = SourcePoint->x;
117         for (i=DestRect->left; i<DestRect->right; i++)
118         {
119           if(XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)) == 0)
120           {
121             DIB_1BPP_PutPixel(DestSurf, i, j, 0);
122           } else {
123             DIB_1BPP_PutPixel(DestSurf, i, j, 1);
124           }
125           sx++;
126         }
127         sy++;
128       }
129       break;
130
131     case 24:
132       for (j=DestRect->top; j<DestRect->bottom; j++)
133       {
134         sx = SourcePoint->x;
135         for (i=DestRect->left; i<DestRect->right; i++)
136         {
137           if(XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)) == 0)
138           {
139             DIB_1BPP_PutPixel(DestSurf, i, j, 0);
140           } else {
141             DIB_1BPP_PutPixel(DestSurf, i, j, 1);
142           }
143           sx++;
144         }
145         sy++;
146       }
147       break;
148
149     case 32:
150       for (j=DestRect->top; j<DestRect->bottom; j++)
151       {
152         sx = SourcePoint->x;
153         for (i=DestRect->left; i<DestRect->right; i++)
154         {
155           if(XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)) == 0)
156           {
157             DIB_1BPP_PutPixel(DestSurf, i, j, 0);
158           } else {
159             DIB_1BPP_PutPixel(DestSurf, i, j, 1);
160           }
161           sx++;
162         }
163         sy++;
164       }
165       break;
166
167     default:
168       DbgPrint("DIB_1BPP_Bitblt: Unhandled Source BPP: %u\n", SourceGDI->BitsPerPixel);
169       return FALSE;
170   }
171
172   return TRUE;
173 }