xref: /reactos/win32ss/gdi/dib/dib4bpp.c (revision 9393fc32)
1 /*
2  * PROJECT:         Win32 subsystem
3  * LICENSE:         See COPYING in the top level directory
4  * FILE:            win32ss/gdi/dib/dib4bpp.c
5  * PURPOSE:         Device Independant Bitmap functions, 4bpp
6  * PROGRAMMERS:     Jason Filby
7  *                  Doug Lyons
8  */
9 
10 #include <win32k.h>
11 
12 #define NDEBUG
13 #include <debug.h>
14 
15 #define DEC_OR_INC(var, decTrue, amount) \
16     ((var) = (decTrue) ? ((var) - (amount)) : ((var) + (amount)))
17 
18 VOID
DIB_4BPP_PutPixel(SURFOBJ * SurfObj,LONG x,LONG y,ULONG c)19 DIB_4BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c)
20 {
21    PBYTE addr = (PBYTE)SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta;
22    *addr = (*addr & notmask[x&1]) | (BYTE)(c << ((1-(x&1))<<2));
23 }
24 
25 ULONG
DIB_4BPP_GetPixel(SURFOBJ * SurfObj,LONG x,LONG y)26 DIB_4BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y)
27 {
28    PBYTE addr = (PBYTE)SurfObj->pvScan0 + (x>>1) + y * SurfObj->lDelta;
29    return (*addr >> ((1-(x&1))<<2)) & 0x0f;
30 }
31 
32 VOID
DIB_4BPP_HLine(SURFOBJ * SurfObj,LONG x1,LONG x2,LONG y,ULONG c)33 DIB_4BPP_HLine(SURFOBJ *SurfObj, LONG x1, LONG x2, LONG y, ULONG c)
34 {
35   PBYTE  addr = (PBYTE)SurfObj->pvScan0 + (x1>>1) + y * SurfObj->lDelta;
36   LONG  cx = x1;
37 
38   while(cx < x2)
39   {
40     *addr = (*addr & notmask[x1&1]) | (BYTE)(c << ((1-(x1&1))<<2));
41     if((++x1 & 1) == 0)
42       ++addr;
43     ++cx;
44   }
45 }
46 
47 VOID
DIB_4BPP_VLine(SURFOBJ * SurfObj,LONG x,LONG y1,LONG y2,ULONG c)48 DIB_4BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
49 {
50   PBYTE  addr = SurfObj->pvScan0;
51   int  lDelta = SurfObj->lDelta;
52 
53   addr += (x>>1) + y1 * lDelta;
54   while(y1++ < y2)
55   {
56     *addr = (*addr & notmask[x&1]) | (BYTE)(c << ((1-(x&1))<<2));
57     addr += lDelta;
58   }
59 }
60 
61 #ifndef _USE_DIBLIB_
62 BOOLEAN
DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo)63 DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo)
64 {
65   LONG     i, j, sx, sy, f2, xColor;
66   PBYTE    SourceBits_24BPP, SourceLine_24BPP;
67   PBYTE    DestBits, DestLine, SourceBits_8BPP, SourceLine_8BPP;
68   PBYTE    SourceBits, SourceLine;
69   BOOLEAN  bTopToBottom, bLeftToRight;
70 
71   DPRINT("DIB_4BPP_BitBltSrcCopy: SrcSurf cx/cy (%d/%d), DestSuft cx/cy (%d/%d) dstRect: (%d,%d)-(%d,%d)\n",
72          BltInfo->SourceSurface->sizlBitmap.cx, BltInfo->SourceSurface->sizlBitmap.cy,
73          BltInfo->DestSurface->sizlBitmap.cx, BltInfo->DestSurface->sizlBitmap.cy,
74          BltInfo->DestRect.left, BltInfo->DestRect.top, BltInfo->DestRect.right, BltInfo->DestRect.bottom);
75 
76   /* Get back left to right flip here */
77   bLeftToRight = (BltInfo->DestRect.left > BltInfo->DestRect.right);
78 
79   /* Check for top to bottom flip needed. */
80   bTopToBottom = BltInfo->DestRect.top > BltInfo->DestRect.bottom;
81 
82   /* Make WellOrdered with top < bottom and left < right */
83   RECTL_vMakeWellOrdered(&BltInfo->DestRect);
84 
85   DPRINT("BPP is '%d/%d' & BltInfo->SourcePoint.x is '%d' & BltInfo->SourcePoint.y is '%d'.\n",
86          BltInfo->SourceSurface->iBitmapFormat, BltInfo->SourcePoint.x, BltInfo->SourcePoint.y);
87 
88   DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 +
89              (BltInfo->DestRect.left >> 1) +
90              BltInfo->DestRect.top * BltInfo->DestSurface->lDelta;
91 
92   switch (BltInfo->SourceSurface->iBitmapFormat)
93   {
94     case BMF_1BPP:
95       DPRINT("1BPP Case Selected with DestRect Width of '%d'.\n",
96              BltInfo->DestRect.right - BltInfo->DestRect.left);
97 
98       sx = BltInfo->SourcePoint.x;
99 
100       /* This sets sy to the top line */
101       sy = BltInfo->SourcePoint.y;
102 
103       if (bTopToBottom)
104       {
105         /* This sets sy to the bottom line */
106         sy += (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta;
107       }
108 
109       for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
110       {
111         sx = BltInfo->SourcePoint.x;
112 
113         if (bLeftToRight)
114         {
115           /* This sets the sx to the rightmost pixel */
116           sx += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1);
117         }
118 
119         for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++)
120         {
121           if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0)
122           {
123             DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0));
124           }
125           else
126           {
127             DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1));
128           }
129           DEC_OR_INC(sx, bLeftToRight, 1);
130         }
131         DEC_OR_INC(sy, bTopToBottom, 1);
132       }
133       break;
134 
135     case BMF_4BPP:
136       DPRINT("4BPP Case Selected with DestRect Width of '%d'.\n",
137              BltInfo->DestRect.right - BltInfo->DestRect.left);
138 
139       /* This sets sy to the top line */
140       sy = BltInfo->SourcePoint.y;
141 
142       if (bTopToBottom)
143       {
144         /* This sets sy to the bottom line */
145         sy += (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1)
146               * BltInfo->SourceSurface->lDelta;
147       }
148 
149       for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
150       {
151         sx = BltInfo->SourcePoint.x;
152 
153         if (bLeftToRight)
154         {
155           /* This sets the sx to the rightmost pixel */
156           sx += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1);
157         }
158 
159         for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++)
160         {
161           if (NULL != BltInfo->XlateSourceToDest)
162           {
163             DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j,
164               XLATEOBJ_iXlate(BltInfo->XlateSourceToDest,
165               DIB_4BPP_GetPixel(BltInfo->SourceSurface, sx, sy)));
166           }
167           else
168           {
169             DIB_4BPP_PutPixel(BltInfo->DestSurface, i, j,
170               DIB_4BPP_GetPixel(BltInfo->SourceSurface, sx, sy));
171           }
172           DEC_OR_INC(sx, bLeftToRight, 1);
173         }
174         DEC_OR_INC(sy, bTopToBottom, 1);
175       }
176       break;
177 
178     case BMF_8BPP:
179       DPRINT("8BPP-dstRect: (%d,%d)-(%d,%d) and Width of '%d'.\n",
180               BltInfo->DestRect.left, BltInfo->DestRect.top,
181               BltInfo->DestRect.right, BltInfo->DestRect.bottom,
182               BltInfo->DestRect.right - BltInfo->DestRect.left);
183 
184       SourceBits_8BPP = (PBYTE)BltInfo->SourceSurface->pvScan0 +
185         (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x;
186 
187       if (bTopToBottom)
188       {
189         /* This sets SourceBits to the bottom line */
190         SourceBits_8BPP = (PBYTE)((LONG_PTR)SourceBits_8BPP +
191           ((BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) *
192           BltInfo->SourceSurface->lDelta));
193       }
194 
195       for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
196       {
197         SourceLine_8BPP = SourceBits_8BPP;
198         DestLine = DestBits;
199 
200         if (bLeftToRight)
201         {
202           /* This sets SourceBits_8BPP to the rightmost pixel */
203           SourceBits_8BPP += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1);
204         }
205 
206         f2 = BltInfo->DestRect.left & 1;
207 
208         for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++)
209         {
210           *DestLine = (*DestLine & notmask[f2]) |
211             (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *SourceLine_8BPP)) << ((4 * (1 - f2))));
212           if (f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; }
213           DEC_OR_INC(SourceLine_8BPP, bLeftToRight, 1);
214         }
215         DEC_OR_INC(SourceBits_8BPP, bTopToBottom, BltInfo->SourceSurface->lDelta);
216         DestBits += BltInfo->DestSurface->lDelta;
217       }
218       break;
219 
220     case BMF_16BPP:
221       DPRINT("16BPP Case Selected with DestRect Width of '%d'.\n",
222              BltInfo->DestRect.right - BltInfo->DestRect.left);
223 
224       DPRINT("BMF_16BPP-dstRect: (%d,%d)-(%d,%d) and Width of '%d'.\n",
225              BltInfo->DestRect.left, BltInfo->DestRect.top,
226              BltInfo->DestRect.right, BltInfo->DestRect.bottom,
227              BltInfo->DestRect.right - BltInfo->DestRect.left);
228 
229       SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 +
230         (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) +
231         2 * BltInfo->SourcePoint.x;
232 
233       if (bTopToBottom)
234       {
235         /* This sets SourceLine to the bottom line */
236         SourceLine += (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) *
237           BltInfo->SourceSurface->lDelta;;
238       }
239 
240       DestLine = DestBits;
241 
242       for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
243       {
244         SourceBits = SourceLine;
245 
246         if (bLeftToRight)
247         {
248           /* This sets SourceBits to the rightmost pixel */
249           SourceBits += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1) * 2;
250         }
251 
252         DestBits = DestLine;
253         f2 = BltInfo->DestRect.left & 1;
254 
255         for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
256         {
257           xColor = *((PWORD) SourceBits);
258           *DestBits = (*DestBits & notmask[f2]) |
259             (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2))));
260           if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; }
261 
262           DEC_OR_INC(SourceBits, bLeftToRight, 2);
263         }
264 
265         DEC_OR_INC(SourceLine, bTopToBottom, BltInfo->SourceSurface->lDelta);
266         DestLine += BltInfo->DestSurface->lDelta;
267       }
268       break;
269 
270     case BMF_24BPP:
271 
272       DPRINT("24BPP-dstRect: (%d,%d)-(%d,%d) and Width of '%d'.\n",
273              BltInfo->DestRect.left, BltInfo->DestRect.top,
274              BltInfo->DestRect.right, BltInfo->DestRect.bottom,
275              BltInfo->DestRect.right - BltInfo->DestRect.left);
276 
277       SourceBits_24BPP = (PBYTE)BltInfo->SourceSurface->pvScan0 +
278         (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) +
279         BltInfo->SourcePoint.x * 3;
280 
281       if (bTopToBottom)
282       {
283         /* This sets SourceLine to the bottom line */
284         SourceBits_24BPP += BltInfo->SourceSurface->lDelta *
285           (BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1);
286       }
287 
288       for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
289       {
290         SourceLine_24BPP = SourceBits_24BPP;
291         DestLine = DestBits;
292         f2 = BltInfo->DestRect.left & 1;
293 
294         if (bLeftToRight)
295         {
296           /* This sets the SourceBits_24BPP to the rightmost pixel */
297           SourceLine_24BPP += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1) * 3;
298         }
299 
300         for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++)
301         {
302           xColor = (*(SourceLine_24BPP + 2) << 0x10) +
303              (*(SourceLine_24BPP + 1) << 0x08) +
304              (*(SourceLine_24BPP));
305           *DestLine = (*DestLine & notmask[f2]) |
306             (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2))));
307           if(f2 == 1) { DestLine++; f2 = 0; } else { f2 = 1; }
308           DEC_OR_INC(SourceLine_24BPP, bLeftToRight, 3);
309         }
310         DEC_OR_INC(SourceBits_24BPP, bTopToBottom, BltInfo->SourceSurface->lDelta);
311         DestBits += BltInfo->DestSurface->lDelta;
312       }
313       break;
314 
315     case BMF_32BPP:
316       DPRINT("32BPP Case Selected with DestRect Width of '%d'.\n",
317              BltInfo->DestRect.right - BltInfo->DestRect.left);
318 
319       SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 +
320         (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) +
321         4 * BltInfo->SourcePoint.x;
322 
323       if (bTopToBottom)
324       {
325         /* This sets SourceLine to the bottom line */
326         SourceLine += BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1;
327       }
328 
329       DestLine = DestBits;
330 
331       for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
332       {
333         SourceBits = SourceLine;
334         DestBits = DestLine;
335 
336         if (bLeftToRight)
337         {
338           /* This sets SourceBits to the rightmost pixel */
339           SourceBits += (BltInfo->DestRect.right - BltInfo->DestRect.left - 1) * 4;
340         }
341 
342         f2 = BltInfo->DestRect.left & 1;
343 
344         for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
345         {
346           xColor = *((PDWORD) SourceBits);
347           *DestBits = (*DestBits & notmask[f2]) |
348             (BYTE)((XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor)) << ((4 * (1 - f2))));
349           if(f2 == 1) { DestBits++; f2 = 0; } else { f2 = 1; }
350 
351           DEC_OR_INC(SourceBits, bLeftToRight, 4);
352         }
353 
354         DEC_OR_INC(SourceLine, bTopToBottom, BltInfo->SourceSurface->lDelta);
355         DestLine += BltInfo->DestSurface->lDelta;
356       }
357       break;
358 
359     default:
360       DbgPrint("DIB_4BPP_BitBltSrcCopy: Unhandled Source BPP: %u\n",
361         BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat));
362       return FALSE;
363   }
364   return(TRUE);
365 }
366 
367 BOOLEAN
DIB_4BPP_BitBlt(PBLTINFO BltInfo)368 DIB_4BPP_BitBlt(PBLTINFO BltInfo)
369 {
370   LONG DestX, DestY;
371   LONG SourceX, SourceY;
372   LONG PatternY = 0;
373   ULONG Dest, Source = 0, Pattern = 0;
374   BOOLEAN UsesSource;
375   BOOLEAN UsesPattern;
376   PULONG DestBits;
377   LONG RoundedRight;
378   static const ULONG ExpandSolidColor[16] =
379   {
380     0x00000000 /* 0 */,
381     0x11111111 /* 1 */,
382     0x22222222 /* 2 */,
383     0x33333333 /* 3 */,
384     0x44444444 /* 4 */,
385     0x55555555 /* 5 */,
386     0x66666666 /* 6 */,
387     0x77777777 /* 7 */,
388     0x88888888 /* 8 */,
389     0x99999999 /* 9 */,
390     0xAAAAAAAA /* 10 */,
391     0xBBBBBBBB /* 11 */,
392     0xCCCCCCCC /* 12 */,
393     0xDDDDDDDD /* 13 */,
394     0xEEEEEEEE /* 14 */,
395     0xFFFFFFFF /* 15 */,
396   };
397 
398   UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4);
399   UsesPattern = ROP4_USES_PATTERN(BltInfo->Rop4);
400 
401   SourceY = BltInfo->SourcePoint.y;
402   RoundedRight = BltInfo->DestRect.right -
403     ((BltInfo->DestRect.right - BltInfo->DestRect.left) & 0x7);
404 
405   if (UsesPattern)
406   {
407     if (BltInfo->PatternSurface)
408     {
409       PatternY = (BltInfo->DestRect.top + BltInfo->BrushOrigin.y) %
410         BltInfo->PatternSurface->sizlBitmap.cy;
411     }
412     else
413     {
414       if (BltInfo->Brush)
415         Pattern = ExpandSolidColor[BltInfo->Brush->iSolidColor];
416     }
417   }
418 
419   for (DestY = BltInfo->DestRect.top; DestY < BltInfo->DestRect.bottom; DestY++)
420   {
421     DestBits = (PULONG)(
422       (PBYTE)BltInfo->DestSurface->pvScan0 +
423       (BltInfo->DestRect.left >> 1) +
424       DestY * BltInfo->DestSurface->lDelta);
425     SourceX = BltInfo->SourcePoint.x;
426     DestX = BltInfo->DestRect.left;
427 
428     if (DestX & 0x1)
429     {
430       Dest = DIB_4BPP_GetPixel(BltInfo->DestSurface, DestX, DestY);
431 
432       if (UsesSource)
433       {
434         Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest);
435       }
436 
437       if (BltInfo->PatternSurface)
438       {
439         Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface,
440          (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY);
441       }
442 
443       DIB_4BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xF);
444 
445       DestX++;
446       SourceX++;
447       DestBits = (PULONG)((ULONG_PTR)DestBits + 1);
448     }
449 
450     for (; DestX < RoundedRight; DestX += 8, SourceX += 8, DestBits++)
451     {
452       Dest = *DestBits;
453       if (UsesSource)
454       {
455         Source =
456           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 1, SourceY, BltInfo->XlateSourceToDest)) |
457           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 0, SourceY, BltInfo->XlateSourceToDest) << 4) |
458           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 3, SourceY, BltInfo->XlateSourceToDest) << 8) |
459           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 2, SourceY, BltInfo->XlateSourceToDest) << 12) |
460           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 5, SourceY, BltInfo->XlateSourceToDest) << 16) |
461           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 4, SourceY, BltInfo->XlateSourceToDest) << 20) |
462           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 7, SourceY, BltInfo->XlateSourceToDest) << 24) |
463           (DIB_GetSource(BltInfo->SourceSurface, SourceX + 6, SourceY, BltInfo->XlateSourceToDest) << 28);
464       }
465       if (BltInfo->PatternSurface)
466       {
467         Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 1) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY);
468         Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 0) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 4;
469         Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 3) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 8;
470         Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 2) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 12;
471         Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 5) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 16;
472         Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 4) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 20;
473         Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 7) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 24;
474         Pattern |= DIB_GetSourceIndex(BltInfo->PatternSurface, (DestX + BltInfo->BrushOrigin.x + 6) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY) << 28;
475       }
476       *DestBits = DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern);
477     }
478 
479     /* Process the rest of pixel on the line */
480     for (; DestX < BltInfo->DestRect.right; DestX++, SourceX++)
481     {
482       Dest = DIB_4BPP_GetPixel(BltInfo->DestSurface, DestX, DestY);
483       if (UsesSource)
484       {
485         Source = DIB_GetSource(BltInfo->SourceSurface, SourceX, SourceY, BltInfo->XlateSourceToDest);
486       }
487       if (BltInfo->PatternSurface)
488       {
489         Pattern = DIB_GetSourceIndex(BltInfo->PatternSurface,
490           (DestX + BltInfo->BrushOrigin.x) % BltInfo->PatternSurface->sizlBitmap.cx, PatternY);
491       }
492       DIB_4BPP_PutPixel(BltInfo->DestSurface, DestX, DestY, DIB_DoRop(BltInfo->Rop4, Dest, Source, Pattern) & 0xF);
493     }
494 
495     SourceY++;
496     if (BltInfo->PatternSurface)
497     {
498       PatternY++;
499       PatternY %= BltInfo->PatternSurface->sizlBitmap.cy;
500     }
501   }
502 
503   return TRUE;
504 }
505 
506 /* BitBlt Optimize */
507 BOOLEAN
DIB_4BPP_ColorFill(SURFOBJ * DestSurface,RECTL * DestRect,ULONG color)508 DIB_4BPP_ColorFill(SURFOBJ* DestSurface, RECTL* DestRect, ULONG color)
509 {
510   LONG DestY;
511 
512   /* Make WellOrdered by making top < bottom and left < right */
513   RECTL_vMakeWellOrdered(DestRect);
514 
515   for (DestY = DestRect->top; DestY < DestRect->bottom; DestY++)
516   {
517     DIB_4BPP_HLine(DestSurface, DestRect->left, DestRect->right, DestY, color);
518   }
519   return TRUE;
520 }
521 #endif // !_USE_DIBLIB_
522 
523 BOOLEAN
DIB_4BPP_TransparentBlt(SURFOBJ * DestSurf,SURFOBJ * SourceSurf,RECTL * DestRect,RECTL * SourceRect,XLATEOBJ * ColorTranslation,ULONG iTransColor)524 DIB_4BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
525                         RECTL*  DestRect,  RECTL *SourceRect,
526                         XLATEOBJ *ColorTranslation, ULONG iTransColor)
527 {
528   return FALSE;
529 }
530 
531 /* EOF */
532