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.
26 DIB_32BPP_PutPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
, ULONG c
)
28 PBYTE byteaddr
= SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
;
29 PDWORD addr
= (PDWORD
)byteaddr
+ x
;
35 DIB_32BPP_GetPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
)
37 PBYTE byteaddr
= SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
;
38 PDWORD addr
= (PDWORD
)byteaddr
+ x
;
40 return (ULONG
)(*addr
);
46 DIB_32BPP_HLine(SURFOBJ
*SurfObj
, LONG x1
, LONG x2
, LONG y
, ULONG c
)
48 PBYTE byteaddr
= SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
;
49 PDWORD addr
= (PDWORD
)byteaddr
+ x1
;
51 if (cx
>0) memset4(addr
, c
, cx
);
55 DIB_32BPP_HLine(SURFOBJ
*SurfObj
, LONG x1
, LONG x2
, LONG y
, ULONG c
)
57 PBYTE byteaddr
= SurfObj
->pvScan0
+ y
* SurfObj
->lDelta
;
58 PDWORD addr
= (PDWORD
)byteaddr
+ x1
;
70 DIB_32BPP_VLine(SURFOBJ
*SurfObj
, LONG x
, LONG y1
, LONG y2
, ULONG c
)
72 PBYTE byteaddr
= SurfObj
->pvScan0
+ y1
* SurfObj
->lDelta
;
73 PDWORD addr
= (PDWORD
)byteaddr
+ x
;
74 LONG lDelta
= SurfObj
->lDelta
>> 2; /* >> 2 == / sizeof(DWORD) */
76 byteaddr
= (PBYTE
)addr
;
85 DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo
)
87 LONG i
, j
, sx
, sy
, xColor
, f1
;
88 PBYTE SourceBits
, DestBits
, SourceLine
, DestLine
;
89 PBYTE SourceBits_4BPP
, SourceLine_4BPP
;
90 PDWORD Source32
, Dest32
;
92 DestBits
= BltInfo
->DestSurface
->pvScan0
+ (BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
) + 4 * BltInfo
->DestRect
.left
;
94 switch(BltInfo
->SourceSurface
->iBitmapFormat
)
98 sx
= BltInfo
->SourcePoint
.x
;
99 sy
= BltInfo
->SourcePoint
.y
;
101 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
103 sx
= BltInfo
->SourcePoint
.x
;
104 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
106 if(DIB_1BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
) == 0)
108 DIB_32BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 0));
110 DIB_32BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 1));
119 SourceBits_4BPP
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + (BltInfo
->SourcePoint
.x
>> 1);
121 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
123 SourceLine_4BPP
= SourceBits_4BPP
;
124 sx
= BltInfo
->SourcePoint
.x
;
127 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
129 xColor
= XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
,
130 (*SourceLine_4BPP
& altnotmask
[f1
]) >> (4 * (1 - f1
)));
131 DIB_32BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, xColor
);
132 if(f1
== 1) { SourceLine_4BPP
++; f1
= 0; } else { f1
= 1; }
136 SourceBits_4BPP
+= BltInfo
->SourceSurface
->lDelta
;
141 SourceLine
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
144 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
146 SourceBits
= SourceLine
;
149 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
151 xColor
= *SourceBits
;
152 *((PDWORD
) DestBits
) = (DWORD
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
157 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
158 DestLine
+= BltInfo
->DestSurface
->lDelta
;
163 SourceLine
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 2 * BltInfo
->SourcePoint
.x
;
166 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
168 SourceBits
= SourceLine
;
171 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
173 xColor
= *((PWORD
) SourceBits
);
174 *((PDWORD
) DestBits
) = (DWORD
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
179 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
180 DestLine
+= BltInfo
->DestSurface
->lDelta
;
185 SourceLine
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 3 * BltInfo
->SourcePoint
.x
;
188 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
190 SourceBits
= SourceLine
;
193 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
195 xColor
= (*(SourceBits
+ 2) << 0x10) +
196 (*(SourceBits
+ 1) << 0x08) +
198 *((PDWORD
)DestBits
) = (DWORD
)XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
);
203 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
204 DestLine
+= BltInfo
->DestSurface
->lDelta
;
209 if (NULL
== BltInfo
->XlateSourceToDest
|| 0 != (BltInfo
->XlateSourceToDest
->flXlate
& XO_TRIVIAL
))
211 if (BltInfo
->DestRect
.top
< BltInfo
->SourcePoint
.y
)
213 SourceBits
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
214 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
216 RtlMoveMemory(DestBits
, SourceBits
, 4 * (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
));
217 SourceBits
+= BltInfo
->SourceSurface
->lDelta
;
218 DestBits
+= BltInfo
->DestSurface
->lDelta
;
223 SourceBits
= BltInfo
->SourceSurface
->pvScan0
+ ((BltInfo
->SourcePoint
.y
+ BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
- 1) * BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
224 DestBits
= BltInfo
->DestSurface
->pvScan0
+ ((BltInfo
->DestRect
.bottom
- 1) * BltInfo
->DestSurface
->lDelta
) + 4 * BltInfo
->DestRect
.left
;
225 for (j
= BltInfo
->DestRect
.bottom
- 1; BltInfo
->DestRect
.top
<= j
; j
--)
227 RtlMoveMemory(DestBits
, SourceBits
, 4 * (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
));
228 SourceBits
-= BltInfo
->SourceSurface
->lDelta
;
229 DestBits
-= BltInfo
->DestSurface
->lDelta
;
235 if (BltInfo
->DestRect
.top
< BltInfo
->SourcePoint
.y
)
237 SourceBits
= (BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
);
238 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
240 if (BltInfo
->DestRect
.left
< BltInfo
->SourcePoint
.x
)
242 Dest32
= (DWORD
*) DestBits
;
243 Source32
= (DWORD
*) SourceBits
;
244 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
246 *Dest32
++ = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
++);
251 Dest32
= (DWORD
*) DestBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
252 Source32
= (DWORD
*) SourceBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
253 for (i
= BltInfo
->DestRect
.right
- 1; BltInfo
->DestRect
.left
<= i
; i
--)
255 *Dest32
-- = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
--);
258 SourceBits
+= BltInfo
->SourceSurface
->lDelta
;
259 DestBits
+= BltInfo
->DestSurface
->lDelta
;
264 SourceBits
= BltInfo
->SourceSurface
->pvScan0
+ ((BltInfo
->SourcePoint
.y
+ BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
- 1) * BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
265 DestBits
= BltInfo
->DestSurface
->pvScan0
+ ((BltInfo
->DestRect
.bottom
- 1) * BltInfo
->DestSurface
->lDelta
) + 4 * BltInfo
->DestRect
.left
;
266 for (j
= BltInfo
->DestRect
.bottom
- 1; BltInfo
->DestRect
.top
<= j
; j
--)
268 if (BltInfo
->DestRect
.left
< BltInfo
->SourcePoint
.x
)
270 Dest32
= (DWORD
*) DestBits
;
271 Source32
= (DWORD
*) SourceBits
;
272 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
274 *Dest32
++ = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
++);
279 Dest32
= (DWORD
*) DestBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
280 Source32
= (DWORD
*) SourceBits
+ (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
- 1);
281 for (i
= BltInfo
->DestRect
.right
; BltInfo
->DestRect
.left
< i
; i
--)
283 *Dest32
-- = XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *Source32
--);
286 SourceBits
-= BltInfo
->SourceSurface
->lDelta
;
287 DestBits
-= BltInfo
->DestSurface
->lDelta
;
294 DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo
->SourceSurface
->iBitmapFormat
));
302 DIB_32BPP_BitBlt(PBLTINFO BltInfo
)
305 ULONG SourceX
, SourceY
;
307 ULONG Dest
, Source
= 0, Pattern
= 0;
312 switch (BltInfo
->Rop4
)
316 //return(0x00000000);
317 return DIB32_ColorFill(BltInfo
, 0x00000000);
321 //return(0xFFFFFFFF);
322 return DIB32_ColorFill(BltInfo
, 0xFFFFFFFF);
327 return DIB32_Srccopy(BltInfo
);
332 return DIB_32DstInvert(BltInfo
);
336 // return(Dest | Source);
337 return DIB32_SrcPaint(BltInfo
);
344 UsesSource
= ROP4_USES_SOURCE(BltInfo
->Rop4
);
345 UsesPattern
= ROP4_USES_PATTERN(BltInfo
->Rop4
);
347 SourceY
= BltInfo
->SourcePoint
.y
;
349 BltInfo
->DestSurface
->pvScan0
+
350 (BltInfo
->DestRect
.left
<< 2) +
351 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
);
355 if (BltInfo
->PatternSurface
)
357 PatternY
= (BltInfo
->DestRect
.top
+ BltInfo
->BrushOrigin
.y
) %
358 BltInfo
->PatternSurface
->sizlBitmap
.cy
;
362 Pattern
= BltInfo
->Brush
->iSolidColor
;
366 for (DestY
= BltInfo
->DestRect
.top
; DestY
< BltInfo
->DestRect
.bottom
; DestY
++)
368 SourceX
= BltInfo
->SourcePoint
.x
;
370 for (DestX
= BltInfo
->DestRect
.left
; DestX
< BltInfo
->DestRect
.right
; DestX
++, DestBits
++, SourceX
++)
376 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
379 if (BltInfo
->PatternSurface
)
381 Pattern
= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
);
384 *DestBits
= DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
);
388 if (BltInfo
->PatternSurface
)
391 PatternY
%= BltInfo
->PatternSurface
->sizlBitmap
.cy
;
394 (ULONG_PTR
)DestBits
-
395 ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) << 2) +
396 BltInfo
->DestSurface
->lDelta
);
402 /* optimze functions for bitblt */
405 DIB_32DstInvert(PBLTINFO BltInfo
)
408 ULONG top
= BltInfo
->DestRect
.top
;
409 ULONG left
= BltInfo
->DestRect
.left
;
410 ULONG DestX
= BltInfo
->DestRect
.right
- left
;
411 ULONG DestY
= BltInfo
->DestRect
.bottom
- top
;
412 ULONG delta
= BltInfo
->DestSurface
->lDelta
- (DestX
<< 2);
414 /* Calculate the Initial Destination */
415 DestBits
= (PULONG
)(BltInfo
->DestSurface
->pvScan0
+ (left
<< 2) +
416 top
* BltInfo
->DestSurface
->lDelta
);
423 *DestBits
=~ *DestBits
;
425 /* Update Position */
428 /* Decrease distance to do */
432 /* Update position */
433 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ delta
);
435 /* Decrease distance to do */
444 DIB32_SrcPaint(PBLTINFO BltInfo
)
446 BOOLEAN status
= FALSE
;
449 switch (BltInfo
->SourceSurface
->iBitmapFormat
)
457 ULONG SourceX
, SourceY
;
460 ULONG bottom
= BltInfo
->DestRect
.bottom
;
461 ULONG right
= BltInfo
->DestRect
.right
;
462 ULONG delta
= BltInfo
->DestSurface
->lDelta
- ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) <<2) ;
464 DestBits
= (PULONG
)(BltInfo
->DestSurface
->pvScan0
+ (BltInfo
->DestRect
.left
<< 2) +
465 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
);
467 SourceY
= BltInfo
->SourcePoint
.y
;
469 for (DestY
= BltInfo
->DestRect
.top
; DestY
< bottom
; DestY
++)
471 SourceX
= BltInfo
->SourcePoint
.x
;
472 for (DestX
= BltInfo
->DestRect
.left
; DestX
< right
; DestX
++, DestBits
++, SourceX
++)
475 *DestBits
= (*DestBits
| DIB_GetSource(BltInfo
->SourceSurface
, SourceX
,
476 SourceY
, BltInfo
->XlateSourceToDest
));
479 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ delta
);
490 ULONG SourceX
, SourceY
;
493 ULONG bottom
= BltInfo
->DestRect
.bottom
;
494 ULONG right
= BltInfo
->DestRect
.right
;
495 ULONG delta
= BltInfo
->DestSurface
->lDelta
- ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) <<2) ;
497 DestBits
= (PULONG
)(BltInfo
->DestSurface
->pvScan0
+ (BltInfo
->DestRect
.left
<< 2) +
498 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
);
500 SourceY
= BltInfo
->SourcePoint
.y
;
502 for (DestY
= BltInfo
->DestRect
.top
; DestY
< bottom
; DestY
++)
505 SourceX
= BltInfo
->SourcePoint
.x
;
506 for (DestX
= BltInfo
->DestRect
.left
; DestX
< right
; DestX
++, DestBits
++, SourceX
++)
508 *DestBits
= (*DestBits
| DIB_32BPP_GetPixel(BltInfo
->SourceSurface
, SourceX
, SourceY
));
511 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ delta
);
526 DIB32_Srccopy(PBLTINFO BltInfo
)
528 BOOLEAN status
= FALSE
;
531 switch (BltInfo
->SourceSurface
->iBitmapFormat
)
539 ULONG SourceX
, SourceY
;
542 ULONG bottom
= BltInfo
->DestRect
.bottom
;
543 ULONG right
= BltInfo
->DestRect
.right
;
544 ULONG delta
= ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) <<2) + BltInfo
->DestSurface
->lDelta
;
546 DestBits
= (PULONG
)(BltInfo
->DestSurface
->pvScan0
+ (BltInfo
->DestRect
.left
<< 2) +
547 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
);
549 SourceY
= BltInfo
->SourcePoint
.y
;
551 for (DestY
= BltInfo
->DestRect
.top
; DestY
< bottom
; DestY
++)
554 SourceX
= BltInfo
->SourcePoint
.x
;
555 for (DestX
= BltInfo
->DestRect
.left
; DestX
< right
; DestX
++, DestBits
++, SourceX
++)
557 if (SourceX
> BltInfo
->SourceSurface
->sizlBitmap
.cx
) break;
559 *DestBits
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
,
560 SourceY
, BltInfo
->XlateSourceToDest
);
563 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
- delta
);
575 register PBYTE Destaddr
;
576 register PBYTE Srcaddr
;
577 LONG DesmaxX
, DesmaxY
;
578 LONG SrcmaxX
, SrcmaxY
;
580 SrcmaxX
= BltInfo
->SourceSurface
->sizlBitmap
.cx
- BltInfo
->SourcePoint
.x
;
581 SrcmaxY
= BltInfo
->SourceSurface
->sizlBitmap
.cy
- BltInfo
->SourcePoint
.y
;
583 DesmaxX
= BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
;
584 DesmaxY
= BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
;
586 if (DesmaxX
> SrcmaxX
) DesmaxX
= SrcmaxX
;
587 if (DesmaxY
> SrcmaxY
) DesmaxY
= SrcmaxY
;
589 Destdelta
= BltInfo
->DestSurface
->lDelta
;
590 Sourcedelta
= BltInfo
->SourceSurface
->lDelta
;
591 Destaddr
= BltInfo
->DestSurface
->pvScan0
+ BltInfo
->DestRect
.top
* Destdelta
+ BltInfo
->DestRect
.left
;
592 Srcaddr
= BltInfo
->SourceSurface
->pvScan0
+ BltInfo
->SourcePoint
.y
* Sourcedelta
+ BltInfo
->SourcePoint
.x
;
599 RtlCopyMemory(Destaddr
, Srcaddr
, DesmaxX
);
600 Destaddr
+= Destdelta
;
601 Srcaddr
+= Sourcedelta
;
616 DIB32_ColorFill(PBLTINFO BltInfo
, ULONG color
)
623 if (BltInfo
->DestRect
.left
!=0)
625 SourceX
= (BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) -1;
626 for (DestY
=BltInfo
->DestRect
.bottom
-1;DestY
>=BltInfo
->DestRect
.top
;DestY
--)
628 memset4( (PDWORD
) (BltInfo
->DestSurface
->pvScan0
+ DestY
*
629 BltInfo
->DestSurface
->lDelta
+
630 BltInfo
->DestRect
.left
), color
, SourceX
);
634 SourceX
= ((BltInfo
->DestRect
.bottom
- BltInfo
->DestRect
.top
) * BltInfo
->DestRect
.right
) -1;
636 memset4(BltInfo
->DestSurface
->pvScan0
+ BltInfo
->DestRect
.top
*
637 BltInfo
->DestSurface
->lDelta
, color
, SourceX
);
643 for (DestY
=BltInfo
->DestRect
.bottom
-1;DestY
>=BltInfo
->DestRect
.top
;DestY
--)
645 DIB_32BPP_HLine(BltInfo
->DestSurface
, BltInfo
->DestRect
.left
, BltInfo
->DestRect
.right
, DestY
, color
);
652 =======================================
653 Stretching functions goes below
654 Some parts of code are based on an
655 article "Bresenhame image scaling"
656 Dr. Dobb Journal, May 2002
657 =======================================
660 typedef unsigned long PIXEL
;
662 //NOTE: If you change something here, please do the same in other dibXXbpp.c files!
664 /* 32-bit Color (___ format) */
665 inline PIXEL
average32(PIXEL a
, PIXEL b
)
667 return a
; // FIXME: Temp hack to remove "PCB-effect" from the image
670 void ScaleLineAvg32(PIXEL
*Target
, PIXEL
*Source
, int SrcWidth
, int TgtWidth
)
672 int NumPixels
= TgtWidth
;
673 int IntPart
= SrcWidth
/ TgtWidth
;
674 int FractPart
= SrcWidth
% TgtWidth
;
675 int Mid
= TgtWidth
>> 1;
680 skip
= (TgtWidth
< SrcWidth
) ? 0 : (TgtWidth
/ (2*SrcWidth
) + 1);
683 while (NumPixels
-- > 0) {
686 p
= average32(p
, *(Source
+1));
700 FinalCopy32(PIXEL
*Target
, PIXEL
*Source
, PSPAN ClipSpans
, UINT ClipSpansCount
, UINT
*SpanIndex
,
701 UINT DestY
, RECTL
*DestRect
)
705 while (ClipSpans
[*SpanIndex
].Y
< DestY
706 || (ClipSpans
[*SpanIndex
].Y
== DestY
707 && ClipSpans
[*SpanIndex
].X
+ ClipSpans
[*SpanIndex
].Width
< DestRect
->left
))
710 if (ClipSpansCount
<= *SpanIndex
)
712 /* No more spans, everything else is clipped away, we're done */
716 while (ClipSpans
[*SpanIndex
].Y
== DestY
)
718 if (ClipSpans
[*SpanIndex
].X
< DestRect
->right
)
720 Left
= max(ClipSpans
[*SpanIndex
].X
, DestRect
->left
);
721 Right
= min(ClipSpans
[*SpanIndex
].X
+ ClipSpans
[*SpanIndex
].Width
, DestRect
->right
);
722 memcpy(Target
+ Left
- DestRect
->left
, Source
+ Left
- DestRect
->left
,
723 (Right
- Left
) * sizeof(PIXEL
));
726 if (ClipSpansCount
<= *SpanIndex
)
728 /* No more spans, everything else is clipped away, we're done */
736 //NOTE: If you change something here, please do the same in other dibXXbpp.c files!
737 BOOLEAN
ScaleRectAvg32(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
738 RECTL
* DestRect
, RECTL
*SourceRect
,
739 POINTL
* MaskOrigin
, POINTL BrushOrigin
,
740 CLIPOBJ
*ClipRegion
, XLATEOBJ
*ColorTranslation
,
743 int NumPixels
= DestRect
->bottom
- DestRect
->top
;
744 int IntPart
= (((SourceRect
->bottom
- SourceRect
->top
) / (DestRect
->bottom
- DestRect
->top
)) * SourceSurf
->lDelta
) / 4;
745 int FractPart
= (SourceRect
->bottom
- SourceRect
->top
) % (DestRect
->bottom
- DestRect
->top
);
746 int Mid
= (DestRect
->bottom
- DestRect
->top
) >> 1;
749 PIXEL
*ScanLine
, *ScanLineAhead
;
750 PIXEL
*PrevSource
= NULL
;
751 PIXEL
*PrevSourceAhead
= NULL
;
752 PIXEL
*Target
= (PIXEL
*) (DestSurf
->pvScan0
+ (DestRect
->top
* DestSurf
->lDelta
) + 4 * DestRect
->left
);
753 PIXEL
*Source
= (PIXEL
*) (SourceSurf
->pvScan0
+ (SourceRect
->top
* SourceSurf
->lDelta
) + 4 * SourceRect
->left
);
759 if (! ClipobjToSpans(&ClipSpans
, &ClipSpansCount
, ClipRegion
, DestRect
))
763 if (0 == ClipSpansCount
)
765 /* No clip spans == empty clipping region, everything clipped away */
766 ASSERT(NULL
== ClipSpans
);
769 skip
= (DestRect
->bottom
- DestRect
->top
< SourceRect
->bottom
- SourceRect
->top
) ? 0 : ((DestRect
->bottom
- DestRect
->top
) / (2 * (SourceRect
->bottom
- SourceRect
->top
)) + 1);
772 ScanLine
= (PIXEL
*)ExAllocatePool(PagedPool
, (DestRect
->right
- DestRect
->left
) * sizeof(PIXEL
));
773 ScanLineAhead
= (PIXEL
*)ExAllocatePool(PagedPool
, (DestRect
->right
- DestRect
->left
) * sizeof(PIXEL
));
775 DestY
= DestRect
->top
;
777 while (NumPixels
-- > 0) {
778 if (Source
!= PrevSource
) {
779 if (Source
== PrevSourceAhead
) {
780 /* the next scan line has already been scaled and stored in
781 * ScanLineAhead; swap the buffers that ScanLine and ScanLineAhead
784 PIXEL
*tmp
= ScanLine
;
785 ScanLine
= ScanLineAhead
;
788 ScaleLineAvg32(ScanLine
, Source
, SourceRect
->right
- SourceRect
->left
, DestRect
->right
- DestRect
->left
);
793 if (E
>= Mid
&& PrevSourceAhead
!= (PIXEL
*)((BYTE
*)Source
+ SourceSurf
->lDelta
)) {
795 ScaleLineAvg32(ScanLineAhead
, (PIXEL
*)((BYTE
*)Source
+ SourceSurf
->lDelta
), SourceRect
->right
- SourceRect
->left
, DestRect
->right
- DestRect
->left
);
796 for (x
= 0; x
< DestRect
->right
- DestRect
->left
; x
++)
797 ScanLine
[x
] = average32(ScanLine
[x
], ScanLineAhead
[x
]);
798 PrevSourceAhead
= (PIXEL
*)((BYTE
*)Source
+ SourceSurf
->lDelta
);
801 if (! FinalCopy32(Target
, ScanLine
, ClipSpans
, ClipSpansCount
, &SpanIndex
, DestY
, DestRect
))
803 /* No more spans, everything else is clipped away, we're done */
804 ExFreePool(ClipSpans
);
805 ExFreePool(ScanLine
);
806 ExFreePool(ScanLineAhead
);
810 Target
= (PIXEL
*)((BYTE
*)Target
+ DestSurf
->lDelta
);
813 if (E
>= DestRect
->bottom
- DestRect
->top
) {
814 E
-= DestRect
->bottom
- DestRect
->top
;
815 Source
= (PIXEL
*)((BYTE
*)Source
+ SourceSurf
->lDelta
);
819 if (skip
> 0 && Source
!= PrevSource
)
820 ScaleLineAvg32(ScanLine
, Source
, SourceRect
->right
- SourceRect
->left
, DestRect
->right
- DestRect
->left
);
822 if (! FinalCopy32(Target
, ScanLine
, ClipSpans
, ClipSpansCount
, &SpanIndex
, DestY
, DestRect
))
824 /* No more spans, everything else is clipped away, we're done */
825 ExFreePool(ClipSpans
);
826 ExFreePool(ScanLine
);
827 ExFreePool(ScanLineAhead
);
831 Target
= (PIXEL
*)((BYTE
*)Target
+ DestSurf
->lDelta
);
834 ExFreePool(ClipSpans
);
835 ExFreePool(ScanLine
);
836 ExFreePool(ScanLineAhead
);
842 //NOTE: If you change something here, please do the same in other dibXXbpp.c files!
843 BOOLEAN
DIB_32BPP_StretchBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
844 RECTL
* DestRect
, RECTL
*SourceRect
,
845 POINTL
* MaskOrigin
, POINTL BrushOrigin
,
846 CLIPOBJ
*ClipRegion
, XLATEOBJ
*ColorTranslation
,
864 BOOLEAN DesIsBiggerY
=FALSE
;
866 DPRINT("DIB_32BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
867 BitsPerFormat(SourceSurf
->iBitmapFormat
), SourceRect
->left
, SourceRect
->top
, SourceRect
->right
, SourceRect
->bottom
,
868 DestRect
->left
, DestRect
->top
, DestRect
->right
, DestRect
->bottom
);
870 SrcSizeY
= SourceRect
->bottom
;
871 SrcSizeX
= SourceRect
->right
;
873 DesSizeY
= DestRect
->bottom
;
874 DesSizeX
= DestRect
->right
;
876 zoomX
= DesSizeX
/ SrcSizeX
;
877 if (zoomX
==0) zoomX
=1;
879 zoomY
= DesSizeY
/ SrcSizeY
;
880 if (zoomY
==0) zoomY
=1;
882 if (DesSizeY
>SrcSizeY
)
885 switch(SourceSurf
->iBitmapFormat
)
888 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
889 /* This is a reference implementation, it hasn't been optimized for speed */
892 /* Draw one Hline on X - Led to the Des Zoom In*/
893 if (DesSizeX
>SrcSizeX
)
895 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
898 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
900 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
902 if (sy
> SourceRect
->bottom
) break;
906 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
908 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
910 if (sx
> SourceRect
->right
) break;
912 saveX
= DesX
+ zoomX
;
914 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
915 for (count
=DesY
;count
<saveY
;count
++)
916 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, 0);
918 for (count
=DesY
;count
<saveY
;count
++)
919 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, 1);
926 /* Draw one Hline on X - Led to the Des Zoom Out*/
928 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
931 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
933 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
935 if (sy
> SourceRect
->bottom
) break;
939 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
941 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
943 if (sx
> SourceRect
->right
) break;
945 saveX
= DesX
+ zoomX
;
947 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
948 for (count
=DesY
;count
<saveY
;count
++)
949 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, 0);
951 for (count
=DesY
;count
<saveY
;count
++)
952 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, 1);
961 if (DesSizeX
>SrcSizeX
)
963 /* Draw one pixel on X - Led to the Des Zoom In*/
964 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
967 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
969 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
971 if (sy
> SourceRect
->bottom
) break;
975 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
977 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
979 if (sx
> SourceRect
->right
) break;
981 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
982 for (count
=DesY
;count
<saveY
;count
++)
983 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, 0);
985 for (count
=DesY
;count
<saveY
;count
++)
986 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, 1);
994 /* Draw one pixel on X - Led to the Des Zoom Out*/
995 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
998 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1000 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1002 if (sy
> SourceRect
->bottom
) break;
1006 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1008 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1010 if (sx
> SourceRect
->right
) break;
1012 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
1013 for (count
=DesY
;count
<saveY
;count
++)
1014 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, 0);
1016 for (count
=DesY
;count
<saveY
;count
++)
1017 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, 1);
1026 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
1027 /* This is a reference implementation, it hasn't been optimized for speed */
1030 /* Draw one Hline on X - Led to the Des Zoom In*/
1031 if (DesSizeX
>SrcSizeX
)
1033 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1036 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1038 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1040 if (sy
> SourceRect
->bottom
) break;
1044 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1046 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1048 if (sx
> SourceRect
->right
) break;
1050 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
));
1052 saveX
= DesX
+ zoomX
;
1053 for (count
=DesY
;count
<saveY
;count
++)
1054 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1060 /* Draw one Hline on X - Led to the Des Zoom Out*/
1062 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1065 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1067 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1069 if (sy
> SourceRect
->bottom
) break;
1073 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1075 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1077 if (sx
> SourceRect
->right
) break;
1079 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
));
1081 saveX
= DesX
+ zoomX
;
1082 for (count
=DesY
;count
<saveY
;count
++)
1083 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1092 if (DesSizeX
>SrcSizeX
)
1094 /* Draw one pixel on X - Led to the Des Zoom In*/
1095 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1098 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1100 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1102 if (sy
> SourceRect
->bottom
) break;
1106 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1108 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1110 if (sx
> SourceRect
->right
) break;
1112 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
));
1114 for (count
=DesY
;count
<saveY
;count
++)
1115 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1121 /* Draw one pixel on X - Led to the Des Zoom Out*/
1122 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1125 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1127 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1129 if (sy
> SourceRect
->bottom
) break;
1133 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1135 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1137 if (sx
> SourceRect
->right
) break;
1139 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
));
1141 for (count
=DesY
;count
<saveY
;count
++)
1142 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1150 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
1151 /* This is a reference implementation, it hasn't been optimized for speed */
1154 /* Draw one Hline on X - Led to the Des Zoom In*/
1155 if (DesSizeX
>SrcSizeX
)
1157 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1160 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1162 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1164 if (sy
> SourceRect
->bottom
) break;
1168 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1170 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1172 if (sx
> SourceRect
->right
) break;
1174 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
1176 saveX
= DesX
+ zoomX
;
1177 for (count
=DesY
;count
<saveY
;count
++)
1178 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1184 /* Draw one Hline on X - Led to the Des Zoom Out*/
1186 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1189 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1191 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1193 if (sy
> SourceRect
->bottom
) break;
1197 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1199 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1201 if (sx
> SourceRect
->right
) break;
1203 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
1205 saveX
= DesX
+ zoomX
;
1206 for (count
=DesY
;count
<saveY
;count
++)
1207 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1216 if (DesSizeX
>SrcSizeX
)
1218 /* Draw one pixel on X - Led to the Des Zoom In*/
1219 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1222 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1224 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1226 if (sy
> SourceRect
->bottom
) break;
1230 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1232 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1234 if (sx
> SourceRect
->right
) break;
1236 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
1238 for (count
=DesY
;count
<saveY
;count
++)
1239 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1245 /* Draw one pixel on X - Led to the Des Zoom Out*/
1246 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1249 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1251 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1253 if (sy
> SourceRect
->bottom
) break;
1257 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1259 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1261 if (sx
> SourceRect
->right
) break;
1263 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
1265 for (count
=DesY
;count
<saveY
;count
++)
1266 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1274 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
1275 /* This is a reference implementation, it hasn't been optimized for speed */
1278 /* Draw one Hline on X - Led to the Des Zoom In*/
1279 if (DesSizeX
>SrcSizeX
)
1281 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1284 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1286 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1288 if (sy
> SourceRect
->bottom
) break;
1292 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1294 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1296 if (sx
> SourceRect
->right
) break;
1298 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
1300 saveX
= DesX
+ zoomX
;
1301 for (count
=DesY
;count
<saveY
;count
++)
1302 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1308 /* Draw one Hline on X - Led to the Des Zoom Out*/
1310 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1313 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1315 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1317 if (sy
> SourceRect
->bottom
) break;
1321 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1323 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1325 if (sx
> SourceRect
->right
) break;
1327 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
1329 saveX
= DesX
+ zoomX
;
1330 for (count
=DesY
;count
<saveY
;count
++)
1331 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1340 if (DesSizeX
>SrcSizeX
)
1342 /* Draw one pixel on X - Led to the Des Zoom In*/
1343 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1346 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1348 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1350 if (sy
> SourceRect
->bottom
) break;
1354 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1356 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1358 if (sx
> SourceRect
->right
) break;
1360 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
1362 for (count
=DesY
;count
<saveY
;count
++)
1363 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1369 /* Draw one pixel on X - Led to the Des Zoom Out*/
1370 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1373 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1375 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1377 if (sy
> SourceRect
->bottom
) break;
1381 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1383 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1385 if (sx
> SourceRect
->right
) break;
1387 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
1389 for (count
=DesY
;count
<saveY
;count
++)
1390 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1398 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
1399 /* This is a reference implementation, it hasn't been optimized for speed */
1402 /* Draw one Hline on X - Led to the Des Zoom In*/
1403 if (DesSizeX
>SrcSizeX
)
1405 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1408 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1410 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1412 if (sy
> SourceRect
->bottom
) break;
1416 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1418 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1420 if (sx
> SourceRect
->right
) break;
1422 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
1424 saveX
= DesX
+ zoomX
;
1425 for (count
=DesY
;count
<saveY
;count
++)
1426 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1432 /* Draw one Hline on X - Led to the Des Zoom Out*/
1434 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1437 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1439 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1441 if (sy
> SourceRect
->bottom
) break;
1445 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1447 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1449 if (sx
> SourceRect
->right
) break;
1451 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
1453 saveX
= DesX
+ zoomX
;
1454 for (count
=DesY
;count
<saveY
;count
++)
1455 DIB_32BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1464 if (DesSizeX
>SrcSizeX
)
1466 /* Draw one pixel on X - Led to the Des Zoom In*/
1467 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1470 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1472 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1474 if (sy
> SourceRect
->bottom
) break;
1478 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1480 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1482 if (sx
> SourceRect
->right
) break;
1484 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
1486 for (count
=DesY
;count
<saveY
;count
++)
1487 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1493 /* Draw one pixel on X - Led to the Des Zoom Out*/
1494 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1497 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1499 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1501 if (sy
> SourceRect
->bottom
) break;
1505 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1507 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1509 if (sx
> SourceRect
->right
) break;
1511 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
1513 for (count
=DesY
;count
<saveY
;count
++)
1514 DIB_32BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1522 return ScaleRectAvg32(DestSurf
, SourceSurf
, DestRect
, SourceRect
, MaskOrigin
, BrushOrigin
,
1523 ClipRegion
, ColorTranslation
, Mode
);
1527 //DPRINT1("DIB_32BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
1537 DIB_32BPP_TransparentBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
1538 RECTL
* DestRect
, POINTL
*SourcePoint
,
1539 XLATEOBJ
*ColorTranslation
, ULONG iTransColor
)
1541 ULONG X
, Y
, SourceX
, SourceY
, Source
, wd
;
1544 SourceY
= SourcePoint
->y
;
1545 DestBits
= (ULONG
*)(DestSurf
->pvScan0
+
1546 (DestRect
->left
<< 2) +
1547 DestRect
->top
* DestSurf
->lDelta
);
1548 wd
= DestSurf
->lDelta
- ((DestRect
->right
- DestRect
->left
) << 2);
1550 for(Y
= DestRect
->top
; Y
< DestRect
->bottom
; Y
++)
1552 SourceX
= SourcePoint
->x
;
1553 for(X
= DestRect
->left
; X
< DestRect
->right
; X
++, DestBits
++, SourceX
++)
1555 Source
= DIB_GetSourceIndex(SourceSurf
, SourceX
, SourceY
);
1556 if(Source
!= iTransColor
)
1558 *DestBits
= XLATEOBJ_iXlate(ColorTranslation
, Source
);
1563 DestBits
= (ULONG
*)((ULONG_PTR
)DestBits
+ wd
);