2 * PROJECT: Win32 subsystem
3 * LICENSE: See COPYING in the top level directory
4 * FILE: subsystems/win32/win32k/dib/dib4bpp.c
5 * PURPOSE: Device Independant Bitmap functions, 4bpp
6 * PROGRAMMERS: Jason Filby
16 DIB_4BPP_PutPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
, ULONG c
)
18 PBYTE addr
= (PBYTE
)SurfObj
->pvScan0
+ (x
>>1) + y
* SurfObj
->lDelta
;
19 *addr
= (*addr
& notmask
[x
&1]) | (BYTE
)(c
<< ((1-(x
&1))<<2));
23 DIB_4BPP_GetPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
)
25 PBYTE addr
= (PBYTE
)SurfObj
->pvScan0
+ (x
>>1) + y
* SurfObj
->lDelta
;
26 return (*addr
>> ((1-(x
&1))<<2)) & 0x0f;
30 DIB_4BPP_HLine(SURFOBJ
*SurfObj
, LONG x1
, LONG x2
, LONG y
, ULONG c
)
32 PBYTE addr
= (PBYTE
)SurfObj
->pvScan0
+ (x1
>>1) + y
* SurfObj
->lDelta
;
37 *addr
= (*addr
& notmask
[x1
&1]) | (BYTE
)(c
<< ((1-(x1
&1))<<2));
45 DIB_4BPP_VLine(SURFOBJ
*SurfObj
, LONG x
, LONG y1
, LONG y2
, ULONG c
)
47 PBYTE addr
= SurfObj
->pvScan0
;
48 int lDelta
= SurfObj
->lDelta
;
50 addr
+= (x
>>1) + y1
* lDelta
;
53 *addr
= (*addr
& notmask
[x
&1]) | (BYTE
)(c
<< ((1-(x
&1))<<2));
60 DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo
)
62 LONG i
, j
, sx
, sy
, f2
, xColor
;
63 PBYTE SourceBits_24BPP
, SourceLine_24BPP
;
64 PBYTE DestBits
, DestLine
, SourceBits_8BPP
, SourceLine_8BPP
;
65 PBYTE SourceBits
, SourceLine
;
67 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+
68 (BltInfo
->DestRect
.left
>> 1) +
69 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
;
71 switch (BltInfo
->SourceSurface
->iBitmapFormat
)
74 sx
= BltInfo
->SourcePoint
.x
;
75 sy
= BltInfo
->SourcePoint
.y
;
77 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
79 sx
= BltInfo
->SourcePoint
.x
;
80 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
82 if(DIB_1BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
) == 0)
84 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 0));
88 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 1));
97 sy
= BltInfo
->SourcePoint
.y
;
99 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
101 sx
= BltInfo
->SourcePoint
.x
;
103 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
105 if (NULL
!= BltInfo
->XlateSourceToDest
)
107 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
)));
111 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
));
120 SourceBits_8BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
122 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
124 SourceLine_8BPP
= SourceBits_8BPP
;
126 f2
= BltInfo
->DestRect
.left
& 1;
128 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
130 *DestLine
= (*DestLine
& notmask
[f2
]) |
131 (BYTE
)((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *SourceLine_8BPP
)) << ((4 * (1 - f2
))));
132 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
136 SourceBits_8BPP
+= BltInfo
->SourceSurface
->lDelta
;
137 DestBits
+= BltInfo
->DestSurface
->lDelta
;
142 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 2 * BltInfo
->SourcePoint
.x
;
145 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
147 SourceBits
= SourceLine
;
149 f2
= BltInfo
->DestRect
.left
& 1;
151 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
153 xColor
= *((PWORD
) SourceBits
);
154 *DestBits
= (*DestBits
& notmask
[f2
]) |
155 (BYTE
)((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
156 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
160 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
161 DestLine
+= BltInfo
->DestSurface
->lDelta
;
166 SourceBits_24BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
* 3;
168 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
170 SourceLine_24BPP
= SourceBits_24BPP
;
172 f2
= BltInfo
->DestRect
.left
& 1;
174 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
176 xColor
= (*(SourceLine_24BPP
+ 2) << 0x10) +
177 (*(SourceLine_24BPP
+ 1) << 0x08) +
178 (*(SourceLine_24BPP
));
179 *DestLine
= (*DestLine
& notmask
[f2
]) |
180 (BYTE
)((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
181 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
185 SourceBits_24BPP
+= BltInfo
->SourceSurface
->lDelta
;
186 DestBits
+= BltInfo
->DestSurface
->lDelta
;
191 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
194 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
196 SourceBits
= SourceLine
;
198 f2
= BltInfo
->DestRect
.left
& 1;
200 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
202 xColor
= *((PDWORD
) SourceBits
);
203 *DestBits
= (*DestBits
& notmask
[f2
]) |
204 (BYTE
)((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
205 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
209 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
210 DestLine
+= BltInfo
->DestSurface
->lDelta
;
215 DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo
->SourceSurface
->iBitmapFormat
));
222 DIB_4BPP_BitBlt(PBLTINFO BltInfo
)
225 LONG SourceX
, SourceY
;
227 ULONG Dest
, Source
= 0, Pattern
= 0;
232 static const ULONG ExpandSolidColor
[16] =
252 UsesSource
= ROP4_USES_SOURCE(BltInfo
->Rop4
);
253 UsesPattern
= ROP4_USES_PATTERN(BltInfo
->Rop4
);
255 SourceY
= BltInfo
->SourcePoint
.y
;
256 RoundedRight
= BltInfo
->DestRect
.right
-
257 ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) & 0x7);
261 if (BltInfo
->PatternSurface
)
263 PatternY
= (BltInfo
->DestRect
.top
+ BltInfo
->BrushOrigin
.y
) %
264 BltInfo
->PatternSurface
->sizlBitmap
.cy
;
269 Pattern
= ExpandSolidColor
[BltInfo
->Brush
->iSolidColor
];
273 for (DestY
= BltInfo
->DestRect
.top
; DestY
< BltInfo
->DestRect
.bottom
; DestY
++)
276 (PBYTE
)BltInfo
->DestSurface
->pvScan0
+
277 (BltInfo
->DestRect
.left
>> 1) +
278 DestY
* BltInfo
->DestSurface
->lDelta
);
279 SourceX
= BltInfo
->SourcePoint
.x
;
280 DestX
= BltInfo
->DestRect
.left
;
284 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
288 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
291 if (BltInfo
->PatternSurface
)
293 Pattern
= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
);
296 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
300 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ 1);
303 for (; DestX
< RoundedRight
; DestX
+= 8, SourceX
+= 8, DestBits
++)
309 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 1, SourceY
, BltInfo
->XlateSourceToDest
)) |
310 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 0, SourceY
, BltInfo
->XlateSourceToDest
) << 4) |
311 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 3, SourceY
, BltInfo
->XlateSourceToDest
) << 8) |
312 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 2, SourceY
, BltInfo
->XlateSourceToDest
) << 12) |
313 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 5, SourceY
, BltInfo
->XlateSourceToDest
) << 16) |
314 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 4, SourceY
, BltInfo
->XlateSourceToDest
) << 20) |
315 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 7, SourceY
, BltInfo
->XlateSourceToDest
) << 24) |
316 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 6, SourceY
, BltInfo
->XlateSourceToDest
) << 28);
318 if (BltInfo
->PatternSurface
)
320 Pattern
= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 1) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
);
321 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 0) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 4;
322 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 3) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 8;
323 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 2) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 12;
324 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 5) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 16;
325 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 4) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 20;
326 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 7) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 24;
327 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 6) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 28;
329 *DestBits
= DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
);
332 /* Process the rest of pixel on the line */
333 for (; DestX
< BltInfo
->DestRect
.right
; DestX
++, SourceX
++)
335 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
338 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
340 if (BltInfo
->PatternSurface
)
342 Pattern
= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
);
344 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
348 if (BltInfo
->PatternSurface
)
351 PatternY
%= BltInfo
->PatternSurface
->sizlBitmap
.cy
;
358 /* BitBlt Optimize */
360 DIB_4BPP_ColorFill(SURFOBJ
* DestSurface
, RECTL
* DestRect
, ULONG color
)
364 for (DestY
= DestRect
->top
; DestY
< DestRect
->bottom
; DestY
++)
366 DIB_4BPP_HLine(DestSurface
, DestRect
->left
, DestRect
->right
, DestY
, color
);
370 #endif // !_USE_DIBLIB_
373 DIB_4BPP_TransparentBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
374 RECTL
* DestRect
, RECTL
*SourceRect
,
375 XLATEOBJ
*ColorTranslation
, ULONG iTransColor
)