b18248d4762ec59aa5cd5df35db7c0269133994d
2 * ReactOS W32 Subsystem
3 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 DIB_32BPP_PutPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
, ULONG c
)
29 PBYTE byteaddr
= (PBYTE
)SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
;
30 PDWORD addr
= (PDWORD
)byteaddr
+ x
;
36 DIB_32BPP_GetPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
)
38 PBYTE byteaddr
= (PBYTE
)SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
;
39 PDWORD addr
= (PDWORD
)byteaddr
+ x
;
41 return (ULONG
)(*addr
);
46 DIB_32BPP_VLine(SURFOBJ
*SurfObj
, LONG x
, LONG y1
, LONG y2
, ULONG c
)
50 PBYTE byteaddr
= (PBYTE
)SurfObj
->pvScan0
+ y1
* SurfObj
->lDelta
;
51 PDWORD addr
= (PDWORD
)byteaddr
+ x
;
52 LONG lDelta
= SurfObj
->lDelta
>> 2; // >> 2 == / sizeof(DWORD)
54 byteaddr
= (PBYTE
)addr
;
64 DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo
)
66 LONG i
, j
, sx
, sy
, xColor
, f1
;
67 PBYTE SourceBits
, DestBits
, SourceLine
, DestLine
;
68 PBYTE SourceBits_4BPP
, SourceLine_4BPP
;
69 PDWORD Source32
, Dest32
;
71 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+ (BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
) + 4 * BltInfo
->DestRect
.left
;
73 switch(BltInfo
->SourceSurface
->iBitmapFormat
)
77 sx
= BltInfo
->SourcePoint
.x
;
78 sy
= BltInfo
->SourcePoint
.y
;
80 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
82 sx
= BltInfo
->SourcePoint
.x
;
83 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
85 if(DIB_1BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
) == 0)
87 DIB_32BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 0));
89 DIB_32BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 1));
98 SourceBits_4BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + (BltInfo
->SourcePoint
.x
>> 1);
100 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
102 SourceLine_4BPP
= SourceBits_4BPP
;
103 sx
= BltInfo
->SourcePoint
.x
;
106 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
108 xColor
= XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
,
109 (*SourceLine_4BPP
& altnotmask
[f1
]) >> (4 * (1 - f1
)));
110 DIB_32BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, xColor
);
111 if(f1
== 1) { SourceLine_4BPP
++; f1
= 0; } else { f1
= 1; }
115 SourceBits_4BPP
+= BltInfo
->SourceSurface
->lDelta
;
120 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
123 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
125 SourceBits
= SourceLine
;
128 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
130 xColor
= *SourceBits
;
131 *((PDWORD
) DestBits
) = (DWORD
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
136 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
137 DestLine
+= 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
;
150 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
152 xColor
= *((PWORD
) SourceBits
);
153 *((PDWORD
) DestBits
) = (DWORD
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
158 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
159 DestLine
+= BltInfo
->DestSurface
->lDelta
;
164 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 3 * BltInfo
->SourcePoint
.x
;
167 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
169 SourceBits
= SourceLine
;
172 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
174 xColor
= (*(SourceBits
+ 2) << 0x10) +
175 (*(SourceBits
+ 1) << 0x08) +
177 *((PDWORD
)DestBits
) = (DWORD
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
182 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
183 DestLine
+= BltInfo
->DestSurface
->lDelta
;
188 if (NULL
== BltInfo
->XlateSourceToDest
|| 0 != (BltInfo
->XlateSourceToDest
->flXlate
& XO_TRIVIAL
))
190 if (BltInfo
->DestRect
.top
< BltInfo
->SourcePoint
.y
)
192 SourceBits
= (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 RtlMoveMemory(DestBits
, SourceBits
, 4 * (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
));
196 SourceBits
+= BltInfo
->SourceSurface
->lDelta
;
197 DestBits
+= BltInfo
->DestSurface
->lDelta
;
202 SourceBits
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ ((BltInfo
->SourcePoint
.y
+ BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
- 1) * BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
203 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+ ((BltInfo
->DestRect
.bottom
- 1) * BltInfo
->DestSurface
->lDelta
) + 4 * BltInfo
->DestRect
.left
;
204 for (j
= BltInfo
->DestRect
.bottom
- 1; BltInfo
->DestRect
.top
<= j
; j
--)
206 RtlMoveMemory(DestBits
, SourceBits
, 4 * (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
));
207 SourceBits
-= BltInfo
->SourceSurface
->lDelta
;
208 DestBits
-= BltInfo
->DestSurface
->lDelta
;
214 if (BltInfo
->DestRect
.top
< BltInfo
->SourcePoint
.y
)
216 SourceBits
= ((PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
);
217 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
219 if (BltInfo
->DestRect
.left
< BltInfo
->SourcePoint
.x
)
221 Dest32
= (DWORD
*) DestBits
;
222 Source32
= (DWORD
*) SourceBits
;
223 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
225 *Dest32
++ = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
++);
230 Dest32
= (DWORD
*) DestBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
231 Source32
= (DWORD
*) SourceBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
232 for (i
= BltInfo
->DestRect
.right
- 1; BltInfo
->DestRect
.left
<= i
; i
--)
234 *Dest32
-- = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
--);
237 SourceBits
+= BltInfo
->SourceSurface
->lDelta
;
238 DestBits
+= BltInfo
->DestSurface
->lDelta
;
243 SourceBits
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ ((BltInfo
->SourcePoint
.y
+ BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
- 1) * BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
244 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+ ((BltInfo
->DestRect
.bottom
- 1) * BltInfo
->DestSurface
->lDelta
) + 4 * BltInfo
->DestRect
.left
;
245 for (j
= BltInfo
->DestRect
.bottom
- 1; BltInfo
->DestRect
.top
<= j
; j
--)
247 if (BltInfo
->DestRect
.left
< BltInfo
->SourcePoint
.x
)
249 Dest32
= (DWORD
*) DestBits
;
250 Source32
= (DWORD
*) SourceBits
;
251 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
253 *Dest32
++ = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
++);
258 Dest32
= (DWORD
*) DestBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
259 Source32
= (DWORD
*) SourceBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
260 for (i
= BltInfo
->DestRect
.right
; BltInfo
->DestRect
.left
<= i
; i
--)
262 *Dest32
-- = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
--);
265 SourceBits
-= BltInfo
->SourceSurface
->lDelta
;
266 DestBits
-= BltInfo
->DestSurface
->lDelta
;
273 DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo
->SourceSurface
->iBitmapFormat
));
281 DIB_32BPP_TransparentBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
282 RECTL
* DestRect
, RECTL
*SourceRect
,
283 XLATEOBJ
*ColorTranslation
, ULONG iTransColor
)
285 ULONG X
, Y
, SourceX
, SourceY
= 0, Source
= 0, wd
;
293 DstHeight
= DestRect
->bottom
- DestRect
->top
;
294 DstWidth
= DestRect
->right
- DestRect
->left
;
295 SrcHeight
= SourceRect
->bottom
- SourceRect
->top
;
296 SrcWidth
= SourceRect
->right
- SourceRect
->left
;
298 DestBits
= (ULONG
*)((PBYTE
)DestSurf
->pvScan0
+
299 (DestRect
->left
<< 2) +
300 DestRect
->top
* DestSurf
->lDelta
);
301 wd
= DestSurf
->lDelta
- ((DestRect
->right
- DestRect
->left
) << 2);
303 for(Y
= DestRect
->top
; Y
< DestRect
->bottom
; Y
++)
305 SourceY
= SourceRect
->top
+(Y
- DestRect
->top
) * SrcHeight
/ DstHeight
;
306 for(X
= DestRect
->left
; X
< DestRect
->right
; X
++, DestBits
++)
308 SourceX
= SourceRect
->left
+(X
- DestRect
->left
) * SrcWidth
/ DstWidth
;
309 if (SourceX
>= 0 && SourceY
>= 0 &&
310 SourceSurf
->sizlBitmap
.cx
> SourceX
&& SourceSurf
->sizlBitmap
.cy
> SourceY
)
312 Source
= DIB_GetSourceIndex(SourceSurf
, SourceX
, SourceY
);
313 if(Source
!= iTransColor
)
315 *DestBits
= XLATEOBJ_iXlate(ColorTranslation
, Source
);
320 DestBits
= (ULONG
*)((ULONG_PTR
)DestBits
+ wd
);
336 static __inline UCHAR
339 return (val
> 255) ? 255 : val
;
343 DIB_32BPP_AlphaBlend(SURFOBJ
* Dest
, SURFOBJ
* Source
, RECTL
* DestRect
,
344 RECTL
* SourceRect
, CLIPOBJ
* ClipRegion
,
345 XLATEOBJ
* ColorTranslation
, BLENDOBJ
* BlendObj
)
347 INT Rows
, Cols
, SrcX
, SrcY
;
350 BLENDFUNCTION BlendFunc
;
351 register NICEPIXEL32 DstPixel
, SrcPixel
;
354 DPRINT("DIB_32BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
355 SourceRect
->left
, SourceRect
->top
, SourceRect
->right
, SourceRect
->bottom
,
356 DestRect
->left
, DestRect
->top
, DestRect
->right
, DestRect
->bottom
);
358 ASSERT(DestRect
->bottom
- DestRect
->top
== SourceRect
->bottom
- SourceRect
->top
&&
359 DestRect
->right
- DestRect
->left
== SourceRect
->right
- SourceRect
->left
);
361 BlendFunc
= BlendObj
->BlendFunction
;
362 if (BlendFunc
.BlendOp
!= AC_SRC_OVER
)
364 DPRINT1("BlendOp != AC_SRC_OVER\n");
367 if (BlendFunc
.BlendFlags
!= 0)
369 DPRINT1("BlendFlags != 0\n");
372 if ((BlendFunc
.AlphaFormat
& ~AC_SRC_ALPHA
) != 0)
374 DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc
.AlphaFormat
);
377 if ((BlendFunc
.AlphaFormat
& AC_SRC_ALPHA
) != 0 &&
378 BitsPerFormat(Source
->iBitmapFormat
) != 32)
380 DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n");
384 Dst
= (PULONG
)((ULONG_PTR
)Dest
->pvScan0
+ (DestRect
->top
* Dest
->lDelta
) +
385 (DestRect
->left
<< 2));
386 DstDelta
= Dest
->lDelta
- ((DestRect
->right
- DestRect
->left
) << 2);
387 SrcBpp
= BitsPerFormat(Source
->iBitmapFormat
);
389 Rows
= DestRect
->bottom
- DestRect
->top
;
390 SrcY
= SourceRect
->top
;
393 Cols
= DestRect
->right
- DestRect
->left
;
394 SrcX
= SourceRect
->left
;
397 SrcPixel
.ul
= DIB_GetSource(Source
, SrcX
++, SrcY
, ColorTranslation
);
398 SrcPixel
.col
.red
= SrcPixel
.col
.red
* BlendFunc
.SourceConstantAlpha
/ 255;
399 SrcPixel
.col
.green
= SrcPixel
.col
.green
* BlendFunc
.SourceConstantAlpha
/ 255;
400 SrcPixel
.col
.blue
= SrcPixel
.col
.blue
* BlendFunc
.SourceConstantAlpha
/ 255;
401 SrcPixel
.col
.alpha
= (SrcBpp
== 32) ? (SrcPixel
.col
.alpha
* BlendFunc
.SourceConstantAlpha
/ 255) : BlendFunc
.SourceConstantAlpha
;
403 Alpha
= ((BlendFunc
.AlphaFormat
& AC_SRC_ALPHA
) != 0) ?
404 SrcPixel
.col
.alpha
: BlendFunc
.SourceConstantAlpha
;
407 DstPixel
.col
.red
= Clamp8(DstPixel
.col
.red
* (255 - Alpha
) / 255 + SrcPixel
.col
.red
);
408 DstPixel
.col
.green
= Clamp8(DstPixel
.col
.green
* (255 - Alpha
) / 255 + SrcPixel
.col
.green
);
409 DstPixel
.col
.blue
= Clamp8(DstPixel
.col
.blue
* (255 - Alpha
) / 255 + SrcPixel
.col
.blue
);
410 DstPixel
.col
.alpha
= Clamp8(DstPixel
.col
.alpha
* (255 - Alpha
) / 255 + SrcPixel
.col
.alpha
);
411 *Dst
++ = DstPixel
.ul
;
413 Dst
= (PULONG
)((ULONG_PTR
)Dst
+ DstDelta
);