xref: /reactos/win32ss/gdi/dib/dib.c (revision 4561998a)
1 /*
2  * PROJECT:         Win32 subsystem
3  * LICENSE:         See COPYING in the top level directory
4  * FILE:            win32ss/gdi/dib/dib.c
5  * PURPOSE:         ROP handling, function pointer arrays, misc
6  * PROGRAMMERS:     Ge van Geldorp
7  */
8 
9 
10 #include <win32k.h>
11 
12 #define NDEBUG
13 #include <debug.h>
14 
15 /* Static data */
16 
17 unsigned char notmask[2] = { 0x0f, 0xf0 };
18 unsigned char altnotmask[2] = { 0xf0, 0x0f };
19 
20 DIB_FUNCTIONS DibFunctionsForBitmapFormat[] =
21 {
22   /* 0 */
23   {
24     Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
25     Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt,
26     Dummy_ColorFill, Dummy_AlphaBlend
27   },
28   /* BMF_1BPP */
29   {
30     DIB_1BPP_PutPixel, DIB_1BPP_GetPixel, DIB_1BPP_HLine, DIB_1BPP_VLine,
31     DIB_1BPP_BitBlt, DIB_1BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
32     DIB_1BPP_TransparentBlt, DIB_1BPP_ColorFill, DIB_XXBPP_AlphaBlend
33   },
34   /* BMF_4BPP */
35   {
36     DIB_4BPP_PutPixel, DIB_4BPP_GetPixel, DIB_4BPP_HLine, DIB_4BPP_VLine,
37     DIB_4BPP_BitBlt, DIB_4BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
38     DIB_4BPP_TransparentBlt, DIB_4BPP_ColorFill, DIB_XXBPP_AlphaBlend
39   },
40   /* BMF_8BPP */
41   {
42     DIB_8BPP_PutPixel, DIB_8BPP_GetPixel, DIB_8BPP_HLine, DIB_8BPP_VLine,
43     DIB_8BPP_BitBlt, DIB_8BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
44     DIB_8BPP_TransparentBlt, DIB_8BPP_ColorFill, DIB_XXBPP_AlphaBlend
45   },
46   /* BMF_16BPP */
47   {
48     DIB_16BPP_PutPixel, DIB_16BPP_GetPixel, DIB_16BPP_HLine, DIB_16BPP_VLine,
49     DIB_16BPP_BitBlt, DIB_16BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
50     DIB_16BPP_TransparentBlt, DIB_16BPP_ColorFill, DIB_16BPP_AlphaBlend
51   },
52   /* BMF_24BPP */
53   {
54     DIB_24BPP_PutPixel, DIB_24BPP_GetPixel, DIB_24BPP_HLine, DIB_24BPP_VLine,
55     DIB_24BPP_BitBlt, DIB_24BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
56     DIB_24BPP_TransparentBlt, DIB_24BPP_ColorFill, DIB_24BPP_AlphaBlend
57   },
58   /* BMF_32BPP */
59   {
60     DIB_32BPP_PutPixel, DIB_32BPP_GetPixel, DIB_32BPP_HLine, DIB_32BPP_VLine,
61     DIB_32BPP_BitBlt, DIB_32BPP_BitBltSrcCopy, DIB_XXBPP_StretchBlt,
62     DIB_32BPP_TransparentBlt, DIB_32BPP_ColorFill, DIB_32BPP_AlphaBlend
63   },
64   /* BMF_4RLE */
65   {
66     Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
67     Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt,
68     Dummy_ColorFill, Dummy_AlphaBlend
69   },
70   /* BMF_8RLE */
71   {
72     Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
73     Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt,
74     Dummy_ColorFill, Dummy_AlphaBlend
75   },
76   /* BMF_JPEG */
77   {
78     Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
79     Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt,
80     Dummy_ColorFill, Dummy_AlphaBlend
81   },
82   /* BMF_PNG */
83   {
84     Dummy_PutPixel, Dummy_GetPixel, Dummy_HLine, Dummy_VLine,
85     Dummy_BitBlt, Dummy_BitBlt, Dummy_StretchBlt, Dummy_TransparentBlt,
86     Dummy_ColorFill, Dummy_AlphaBlend
87   }
88 };
89 
90 
91 ULONG
92 DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern)
93 {
94   ULONG ResultNibble;
95   ULONG Result = 0;
96   ULONG i;
97 static const ULONG ExpandDest[16] =
98     {
99       0x55555555 /* 0000 */,
100       0x555555AA /* 0001 */,
101       0x5555AA55 /* 0010 */,
102       0x5555AAAA /* 0011 */,
103       0x55AA5555 /* 0100 */,
104       0x55AA55AA /* 0101 */,
105       0x55AAAA55 /* 0110 */,
106       0x55AAAAAA /* 0111 */,
107       0xAA555555 /* 1000 */,
108       0xAA5555AA /* 1001 */,
109       0xAA55AA55 /* 1010 */,
110       0xAA55AAAA /* 1011 */,
111       0xAAAA5555 /* 1100 */,
112       0xAAAA55AA /* 1101 */,
113       0xAAAAAA55 /* 1110 */,
114       0xAAAAAAAA /* 1111 */,
115     };
116   static const ULONG ExpandSource[16] =
117     {
118       0x33333333 /* 0000 */,
119       0x333333CC /* 0001 */,
120       0x3333CC33 /* 0010 */,
121       0x3333CCCC /* 0011 */,
122       0x33CC3333 /* 0100 */,
123       0x33CC33CC /* 0101 */,
124       0x33CCCC33 /* 0110 */,
125       0x33CCCCCC /* 0111 */,
126       0xCC333333 /* 1000 */,
127       0xCC3333CC /* 1001 */,
128       0xCC33CC33 /* 1010 */,
129       0xCC33CCCC /* 1011 */,
130       0xCCCC3333 /* 1100 */,
131       0xCCCC33CC /* 1101 */,
132       0xCCCCCC33 /* 1110 */,
133       0xCCCCCCCC /* 1111 */,
134     };
135   static const ULONG ExpandPattern[16] =
136     {
137       0x0F0F0F0F /* 0000 */,
138       0x0F0F0FF0 /* 0001 */,
139       0x0F0FF00F /* 0010 */,
140       0x0F0FF0F0 /* 0011 */,
141       0x0FF00F0F /* 0100 */,
142       0x0FF00FF0 /* 0101 */,
143       0x0FF0F00F /* 0110 */,
144       0x0FF0F0F0 /* 0111 */,
145       0xF00F0F0F /* 1000 */,
146       0xF00F0FF0 /* 1001 */,
147       0xF00FF00F /* 1010 */,
148       0xF00FF0F0 /* 1011 */,
149       0xF0F00F0F /* 1100 */,
150       0xF0F00FF0 /* 1101 */,
151       0xF0F0F00F /* 1110 */,
152       0xF0F0F0F0 /* 1111 */,
153     };
154 
155     Rop &=0xFF;
156     switch(Rop)
157     {
158 
159         /* Optimized code for the various named rop codes. */
160         case R3_OPINDEX_NOOP:        return(Dest);
161         case R3_OPINDEX_BLACKNESS:   return(0);
162         case R3_OPINDEX_NOTSRCERASE: return(~(Dest | Source));
163         case R3_OPINDEX_NOTSRCCOPY:  return(~Source);
164         case R3_OPINDEX_SRCERASE:    return((~Dest) & Source);
165         case R3_OPINDEX_DSTINVERT:   return(~Dest);
166         case R3_OPINDEX_PATINVERT:   return(Dest ^ Pattern);
167         case R3_OPINDEX_SRCINVERT:   return(Dest ^ Source);
168         case R3_OPINDEX_SRCAND:      return(Dest & Source);
169         case R3_OPINDEX_MERGEPAINT:  return(Dest | (~Source));
170         case R3_OPINDEX_SRCPAINT:    return(Dest | Source);
171         case R3_OPINDEX_MERGECOPY:   return(Source & Pattern);
172         case R3_OPINDEX_SRCCOPY:     return(Source);
173         case R3_OPINDEX_PATCOPY:     return(Pattern);
174         case R3_OPINDEX_PATPAINT:    return(Dest | (~Source) | Pattern);
175         case R3_OPINDEX_WHITENESS:   return(0xFFFFFFFF);
176     }
177 
178   /* Expand the ROP operation to all four bytes */
179   Rop |= (Rop << 24) | (Rop << 16) | (Rop << 8);
180   /* Do the operation on four bits simultaneously. */
181   Result = 0;
182   for (i = 0; i < 8; i++)
183   {
184     ResultNibble = Rop & ExpandDest[Dest & 0xF] & ExpandSource[Source & 0xF] & ExpandPattern[Pattern & 0xF];
185     Result |= (((ResultNibble & 0xFF000000) ? 0x8 : 0x0) | ((ResultNibble & 0x00FF0000) ? 0x4 : 0x0) |
186     ((ResultNibble & 0x0000FF00) ? 0x2 : 0x0) | ((ResultNibble & 0x000000FF) ? 0x1 : 0x0)) << (i * 4);
187     Dest >>= 4;
188     Source >>= 4;
189     Pattern >>= 4;
190   }
191   return(Result);
192 }
193 
194 VOID Dummy_PutPixel(SURFOBJ* SurfObj, LONG x, LONG y, ULONG c)
195 {
196   return;
197 }
198 
199 ULONG Dummy_GetPixel(SURFOBJ* SurfObj, LONG x, LONG y)
200 {
201   return 0;
202 }
203 
204 VOID Dummy_HLine(SURFOBJ* SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
205 {
206   return;
207 }
208 
209 VOID Dummy_VLine(SURFOBJ* SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
210 {
211   return;
212 }
213 
214 BOOLEAN Dummy_BitBlt(PBLTINFO BltInfo)
215 {
216   return FALSE;
217 }
218 
219 BOOLEAN Dummy_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
220                          SURFOBJ *PatternSurface, SURFOBJ *MaskSurf,
221                          RECTL*  DestRect,  RECTL  *SourceRect,
222                          POINTL* MaskOrigin, BRUSHOBJ* Brush,
223                          POINTL* BrushOrign,
224                          XLATEOBJ *ColorTranslation,
225                          ROP4 Rop)
226 {
227   return FALSE;
228 }
229 
230 BOOLEAN Dummy_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
231                              RECTL*  DestRect,  RECTL  *SourceRect,
232                              XLATEOBJ *ColorTranslation, ULONG iTransColor)
233 {
234   return FALSE;
235 }
236 
237 BOOLEAN Dummy_ColorFill(SURFOBJ* Dest, RECTL* DestRect, ULONG Color)
238 {
239   return FALSE;
240 }
241 
242 
243 BOOLEAN
244 Dummy_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
245                  RECTL* SourceRect, CLIPOBJ* ClipRegion,
246                  XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
247 {
248   return FALSE;
249 }
250 
251 /* EOF */
252