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]) | (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]) | (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]) | (c
<< ((1-(x
&1))<<2));
59 DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo
)
61 LONG i
, j
, sx
, sy
, f2
, xColor
;
62 PBYTE SourceBits_24BPP
, SourceLine_24BPP
;
63 PBYTE DestBits
, DestLine
, SourceBits_8BPP
, SourceLine_8BPP
;
64 PBYTE SourceBits
, SourceLine
;
66 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+
67 (BltInfo
->DestRect
.left
>> 1) +
68 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
;
70 switch (BltInfo
->SourceSurface
->iBitmapFormat
)
73 sx
= BltInfo
->SourcePoint
.x
;
74 sy
= BltInfo
->SourcePoint
.y
;
76 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
78 sx
= BltInfo
->SourcePoint
.x
;
79 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
81 if(DIB_1BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
) == 0)
83 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 0));
87 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 1));
96 sy
= BltInfo
->SourcePoint
.y
;
98 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
100 sx
= BltInfo
->SourcePoint
.x
;
102 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
104 if (NULL
!= BltInfo
->XlateSourceToDest
)
106 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
)));
110 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
));
119 SourceBits_8BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
121 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
123 SourceLine_8BPP
= SourceBits_8BPP
;
125 f2
= BltInfo
->DestRect
.left
& 1;
127 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
129 *DestLine
= (*DestLine
& notmask
[f2
]) |
130 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *SourceLine_8BPP
)) << ((4 * (1 - f2
))));
131 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
135 SourceBits_8BPP
+= BltInfo
->SourceSurface
->lDelta
;
136 DestBits
+= BltInfo
->DestSurface
->lDelta
;
141 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 2 * BltInfo
->SourcePoint
.x
;
144 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
146 SourceBits
= SourceLine
;
148 f2
= BltInfo
->DestRect
.left
& 1;
150 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
152 xColor
= *((PWORD
) SourceBits
);
153 *DestBits
= (*DestBits
& notmask
[f2
]) |
154 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
155 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
159 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
160 DestLine
+= BltInfo
->DestSurface
->lDelta
;
165 SourceBits_24BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
* 3;
167 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
169 SourceLine_24BPP
= SourceBits_24BPP
;
171 f2
= BltInfo
->DestRect
.left
& 1;
173 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
175 xColor
= (*(SourceLine_24BPP
+ 2) << 0x10) +
176 (*(SourceLine_24BPP
+ 1) << 0x08) +
177 (*(SourceLine_24BPP
));
178 *DestLine
= (*DestLine
& notmask
[f2
]) |
179 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
180 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
184 SourceBits_24BPP
+= BltInfo
->SourceSurface
->lDelta
;
185 DestBits
+= BltInfo
->DestSurface
->lDelta
;
190 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
193 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
195 SourceBits
= SourceLine
;
197 f2
= BltInfo
->DestRect
.left
& 1;
199 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
201 xColor
= *((PDWORD
) SourceBits
);
202 *DestBits
= (*DestBits
& notmask
[f2
]) |
203 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
204 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
208 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
209 DestLine
+= BltInfo
->DestSurface
->lDelta
;
214 DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo
->SourceSurface
->iBitmapFormat
));
221 DIB_4BPP_BitBlt(PBLTINFO BltInfo
)
224 ULONG SourceX
, SourceY
;
226 ULONG Dest
, Source
= 0, Pattern
= 0;
231 static const ULONG ExpandSolidColor
[16] =
251 UsesSource
= ROP4_USES_SOURCE(BltInfo
->Rop4
);
252 UsesPattern
= ROP4_USES_PATTERN(BltInfo
->Rop4
);
254 SourceY
= BltInfo
->SourcePoint
.y
;
255 RoundedRight
= BltInfo
->DestRect
.right
-
256 ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) & 0x7);
260 if (BltInfo
->PatternSurface
)
262 PatternY
= (BltInfo
->DestRect
.top
+ BltInfo
->BrushOrigin
.y
) %
263 BltInfo
->PatternSurface
->sizlBitmap
.cy
;
268 Pattern
= ExpandSolidColor
[BltInfo
->Brush
->iSolidColor
];
272 for (DestY
= BltInfo
->DestRect
.top
; DestY
< BltInfo
->DestRect
.bottom
; DestY
++)
275 (PBYTE
)BltInfo
->DestSurface
->pvScan0
+
276 (BltInfo
->DestRect
.left
>> 1) +
277 DestY
* BltInfo
->DestSurface
->lDelta
);
278 SourceX
= BltInfo
->SourcePoint
.x
;
279 DestX
= BltInfo
->DestRect
.left
;
283 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
287 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
290 if (BltInfo
->PatternSurface
)
292 Pattern
= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
);
295 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
299 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ 1);
302 for (; DestX
< RoundedRight
; DestX
+= 8, SourceX
+= 8, DestBits
++)
308 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 1, SourceY
, BltInfo
->XlateSourceToDest
)) |
309 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 0, SourceY
, BltInfo
->XlateSourceToDest
) << 4) |
310 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 3, SourceY
, BltInfo
->XlateSourceToDest
) << 8) |
311 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 2, SourceY
, BltInfo
->XlateSourceToDest
) << 12) |
312 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 5, SourceY
, BltInfo
->XlateSourceToDest
) << 16) |
313 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 4, SourceY
, BltInfo
->XlateSourceToDest
) << 20) |
314 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 7, SourceY
, BltInfo
->XlateSourceToDest
) << 24) |
315 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 6, SourceY
, BltInfo
->XlateSourceToDest
) << 28);
317 if (BltInfo
->PatternSurface
)
319 Pattern
= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 1) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
);
320 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 0) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 4;
321 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 3) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 8;
322 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 2) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 12;
323 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 5) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 16;
324 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 4) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 20;
325 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 7) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 24;
326 Pattern
|= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 6) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
) << 28;
328 *DestBits
= DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
);
331 /* Process the rest of pixel on the line */
332 for (; DestX
< BltInfo
->DestRect
.right
; DestX
++, SourceX
++)
334 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
337 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
339 if (BltInfo
->PatternSurface
)
341 Pattern
= DIB_GetSourceIndex(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
);
343 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
347 if (BltInfo
->PatternSurface
)
350 PatternY
%= BltInfo
->PatternSurface
->sizlBitmap
.cy
;
357 /* BitBlt Optimize */
359 DIB_4BPP_ColorFill(SURFOBJ
* DestSurface
, RECTL
* DestRect
, ULONG color
)
363 for (DestY
= DestRect
->top
; DestY
< DestRect
->bottom
; DestY
++)
365 DIB_4BPP_HLine(DestSurface
, DestRect
->left
, DestRect
->right
, DestY
, color
);
371 DIB_4BPP_TransparentBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
372 RECTL
* DestRect
, RECTL
*SourceRect
,
373 XLATEOBJ
*ColorTranslation
, ULONG iTransColor
)
379 DIB_4BPP_AlphaBlend(SURFOBJ
* Dest
, SURFOBJ
* Source
, RECTL
* DestRect
,
380 RECTL
* SourceRect
, CLIPOBJ
* ClipRegion
,
381 XLATEOBJ
* ColorTranslation
, BLENDOBJ
* BlendObj
)