2 * PROJECT: Win32 subsystem
3 * LICENSE: See COPYING in the top level directory
4 * FILE: win32ss/gdi/dib/dib8bpp.c
5 * PURPOSE: Device Independant Bitmap functions, 8bpp
6 * PROGRAMMERS: Jason Filby
17 DIB_8BPP_PutPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
, ULONG c
)
19 PBYTE byteaddr
= (PBYTE
)SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
+ x
;
25 DIB_8BPP_GetPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
)
27 PBYTE byteaddr
= (PBYTE
)SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
+ x
;
29 return (ULONG
)(*byteaddr
);
33 DIB_8BPP_HLine(SURFOBJ
*SurfObj
, LONG x1
, LONG x2
, LONG y
, ULONG c
)
35 memset((PBYTE
)SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
+ x1
, (BYTE
) c
, x2
- x1
);
39 DIB_8BPP_VLine(SURFOBJ
*SurfObj
, LONG x
, LONG y1
, LONG y2
, ULONG c
)
41 PBYTE byteaddr
= (PBYTE
)SurfObj
->pvScan0
+ y1
* SurfObj
->lDelta
;
42 PBYTE addr
= byteaddr
+ x
;
43 LONG lDelta
= SurfObj
->lDelta
;
55 DIB_8BPP_BitBltSrcCopy(PBLTINFO BltInfo
)
57 LONG i
, j
, sx
, sy
, xColor
, f1
;
58 PBYTE SourceBits
, DestBits
, SourceLine
, DestLine
;
59 PBYTE SourceBits_4BPP
, SourceLine_4BPP
;
61 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+ (BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
) + BltInfo
->DestRect
.left
;
63 switch(BltInfo
->SourceSurface
->iBitmapFormat
)
66 sx
= BltInfo
->SourcePoint
.x
;
67 sy
= BltInfo
->SourcePoint
.y
;
69 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
71 sx
= BltInfo
->SourcePoint
.x
;
72 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
74 if(DIB_1BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
) == 0)
76 DIB_8BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 0));
80 DIB_8BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 1));
89 SourceBits_4BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + (BltInfo
->SourcePoint
.x
>> 1);
91 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
93 SourceLine_4BPP
= SourceBits_4BPP
;
94 sx
= BltInfo
->SourcePoint
.x
;
97 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
99 xColor
= XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
,
100 (*SourceLine_4BPP
& altnotmask
[f1
]) >> (4 * (1 - f1
)));
101 DIB_8BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, xColor
);
102 if(f1
== 1) { SourceLine_4BPP
++; f1
= 0; } else { f1
= 1; }
106 SourceBits_4BPP
+= BltInfo
->SourceSurface
->lDelta
;
111 if (NULL
== BltInfo
->XlateSourceToDest
|| 0 != (BltInfo
->XlateSourceToDest
->flXlate
& XO_TRIVIAL
))
113 if (BltInfo
->DestRect
.top
< BltInfo
->SourcePoint
.y
)
115 SourceBits
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
116 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
118 RtlMoveMemory(DestBits
, SourceBits
, BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
);
119 SourceBits
+= BltInfo
->SourceSurface
->lDelta
;
120 DestBits
+= BltInfo
->DestSurface
->lDelta
;
125 SourceBits
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ ((BltInfo
->SourcePoint
.y
+ BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
- 1) * BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
126 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+ ((BltInfo
->DestRect
.bottom
- 1) * BltInfo
->DestSurface
->lDelta
) + BltInfo
->DestRect
.left
;
127 for (j
= BltInfo
->DestRect
.bottom
- 1; BltInfo
->DestRect
.top
<= j
; j
--)
129 RtlMoveMemory(DestBits
, SourceBits
, BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
);
130 SourceBits
-= BltInfo
->SourceSurface
->lDelta
;
131 DestBits
-= BltInfo
->DestSurface
->lDelta
;
137 if (BltInfo
->DestRect
.top
< BltInfo
->SourcePoint
.y
)
139 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
141 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
143 SourceBits
= SourceLine
;
145 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
147 *DestBits
++ = (BYTE
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *SourceBits
++);
149 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
150 DestLine
+= BltInfo
->DestSurface
->lDelta
;
155 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ ((BltInfo
->SourcePoint
.y
+ BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
- 1) * BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
156 DestLine
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+ ((BltInfo
->DestRect
.bottom
- 1) * BltInfo
->DestSurface
->lDelta
) + BltInfo
->DestRect
.left
;
157 for (j
= BltInfo
->DestRect
.bottom
- 1; BltInfo
->DestRect
.top
<= j
; j
--)
159 SourceBits
= SourceLine
;
161 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
163 *DestBits
++ = (BYTE
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *SourceBits
++);
165 SourceLine
-= BltInfo
->SourceSurface
->lDelta
;
166 DestLine
-= BltInfo
->DestSurface
->lDelta
;
173 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 2 * BltInfo
->SourcePoint
.x
;
176 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
178 SourceBits
= SourceLine
;
181 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
183 xColor
= *((PWORD
) SourceBits
);
184 *DestBits
= (BYTE
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
189 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
190 DestLine
+= BltInfo
->DestSurface
->lDelta
;
195 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 3 * BltInfo
->SourcePoint
.x
;
198 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
200 SourceBits
= SourceLine
;
203 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
205 xColor
= (*(SourceBits
+ 2) << 0x10) +
206 (*(SourceBits
+ 1) << 0x08) +
208 *DestBits
= (BYTE
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
213 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
214 DestLine
+= BltInfo
->DestSurface
->lDelta
;
219 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
222 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
224 SourceBits
= SourceLine
;
227 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
229 xColor
= *((PDWORD
) SourceBits
);
230 *DestBits
= (BYTE
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
235 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
236 DestLine
+= BltInfo
->DestSurface
->lDelta
;
241 DPRINT1("DIB_8BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo
->SourceSurface
->iBitmapFormat
));
248 /* BitBlt Optimize */
250 DIB_8BPP_ColorFill(SURFOBJ
* DestSurface
, RECTL
* DestRect
, ULONG color
)
253 for (DestY
= DestRect
->top
; DestY
< DestRect
->bottom
; DestY
++)
255 DIB_8BPP_HLine(DestSurface
, DestRect
->left
, DestRect
->right
, DestY
, color
);
262 DIB_8BPP_TransparentBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
263 RECTL
* DestRect
, RECTL
*SourceRect
,
264 XLATEOBJ
*ColorTranslation
, ULONG iTransColor
)
266 LONG RoundedRight
, X
, Y
, SourceX
= 0, SourceY
= 0;
267 ULONG
*DestBits
, Source
, Dest
;
274 DstHeight
= DestRect
->bottom
- DestRect
->top
;
275 DstWidth
= DestRect
->right
- DestRect
->left
;
276 SrcHeight
= SourceRect
->bottom
- SourceRect
->top
;
277 SrcWidth
= SourceRect
->right
- SourceRect
->left
;
279 RoundedRight
= DestRect
->right
- ((DestRect
->right
- DestRect
->left
) & 0x3);
280 DestBits
= (ULONG
*)((PBYTE
)DestSurf
->pvScan0
+ DestRect
->left
+
281 (DestRect
->top
* DestSurf
->lDelta
));
283 for(Y
= DestRect
->top
; Y
< DestRect
->bottom
; Y
++)
285 DestBits
= (ULONG
*)((PBYTE
)DestSurf
->pvScan0
+ DestRect
->left
+
286 (Y
* DestSurf
->lDelta
));
287 SourceY
= SourceRect
->top
+(Y
- DestRect
->top
) * SrcHeight
/ DstHeight
;
288 for (X
= DestRect
->left
; X
< RoundedRight
; X
+= 4, DestBits
++)
292 SourceX
= SourceRect
->left
+(X
- DestRect
->left
) * SrcWidth
/ DstWidth
;
293 if (SourceX
>= 0 && SourceY
>= 0 &&
294 SourceSurf
->sizlBitmap
.cx
> SourceX
&& SourceSurf
->sizlBitmap
.cy
> SourceY
)
296 Source
= DIB_GetSourceIndex(SourceSurf
, SourceX
, SourceY
);
297 if(Source
!= iTransColor
)
300 Dest
|= (XLATEOBJ_iXlate(ColorTranslation
, Source
) & 0xFF);
304 SourceX
= SourceRect
->left
+(X
+1 - DestRect
->left
) * SrcWidth
/ DstWidth
;
305 if (SourceX
>= 0 && SourceY
>= 0 &&
306 SourceSurf
->sizlBitmap
.cx
> SourceX
&& SourceSurf
->sizlBitmap
.cy
> SourceY
)
308 Source
= DIB_GetSourceIndex(SourceSurf
, SourceX
, SourceY
);
309 if(Source
!= iTransColor
)
312 Dest
|= ((XLATEOBJ_iXlate(ColorTranslation
, Source
) << 8) & 0xFF00);
316 SourceX
= SourceRect
->left
+(X
+2 - DestRect
->left
) * SrcWidth
/ DstWidth
;
317 if (SourceX
>= 0 && SourceY
>= 0 &&
318 SourceSurf
->sizlBitmap
.cx
> SourceX
&& SourceSurf
->sizlBitmap
.cy
> SourceY
)
320 Source
= DIB_GetSourceIndex(SourceSurf
, SourceX
, SourceY
);
321 if(Source
!= iTransColor
)
324 Dest
|= ((XLATEOBJ_iXlate(ColorTranslation
, Source
) << 16) & 0xFF0000);
328 SourceX
= SourceRect
->left
+(X
+3 - DestRect
->left
) * SrcWidth
/ DstWidth
;
329 if (SourceX
>= 0 && SourceY
>= 0 &&
330 SourceSurf
->sizlBitmap
.cx
> SourceX
&& SourceSurf
->sizlBitmap
.cy
> SourceY
)
332 Source
= DIB_GetSourceIndex(SourceSurf
, SourceX
, SourceY
);
333 if(Source
!= iTransColor
)
336 Dest
|= ((XLATEOBJ_iXlate(ColorTranslation
, Source
) << 24) & 0xFF000000);
343 if(X
< DestRect
->right
)
345 for (; X
< DestRect
->right
; X
++)
347 SourceX
= SourceRect
->left
+(X
- DestRect
->left
) * SrcWidth
/ DstWidth
;
348 if (SourceX
>= 0 && SourceY
>= 0 &&
349 SourceSurf
->sizlBitmap
.cx
> SourceX
&& SourceSurf
->sizlBitmap
.cy
> SourceY
)
351 Source
= DIB_GetSourceIndex(SourceSurf
, SourceX
, SourceY
);
352 if(Source
!= iTransColor
)
354 *((BYTE
*)DestBits
) = (BYTE
)(XLATEOBJ_iXlate(ColorTranslation
, Source
) & 0xFF);
357 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ 1);