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_4BPP_PutPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
, ULONG c
)
29 PBYTE addr
= (PBYTE
)SurfObj
->pvScan0
+ (x
>>1) + y
* SurfObj
->lDelta
;
30 *addr
= (*addr
& notmask
[x
&1]) | (c
<< ((1-(x
&1))<<2));
34 DIB_4BPP_GetPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
)
36 PBYTE addr
= (PBYTE
)SurfObj
->pvScan0
+ (x
>>1) + y
* SurfObj
->lDelta
;
37 return (*addr
>> ((1-(x
&1))<<2)) & 0x0f;
41 DIB_4BPP_HLine(SURFOBJ
*SurfObj
, LONG x1
, LONG x2
, LONG y
, ULONG c
)
43 PBYTE addr
= (PBYTE
)SurfObj
->pvScan0
+ (x1
>>1) + y
* SurfObj
->lDelta
;
47 *addr
= (*addr
& notmask
[x1
&1]) | (c
<< ((1-(x1
&1))<<2));
55 DIB_4BPP_VLine(SURFOBJ
*SurfObj
, LONG x
, LONG y1
, LONG y2
, ULONG c
)
57 PBYTE addr
= SurfObj
->pvScan0
;
58 int lDelta
= SurfObj
->lDelta
;
60 addr
+= (x
>>1) + y1
* lDelta
;
62 *addr
= (*addr
& notmask
[x
&1]) | (c
<< ((1-(x
&1))<<2));
68 DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo
)
70 LONG i
, j
, sx
, sy
, f2
, xColor
;
71 PBYTE SourceBits_24BPP
, SourceLine_24BPP
;
72 PBYTE DestBits
, DestLine
, SourceBits_8BPP
, SourceLine_8BPP
;
73 PBYTE SourceBits
, SourceLine
;
75 DestBits
= (PBYTE
)BltInfo
->DestSurface
->pvScan0
+
76 (BltInfo
->DestRect
.left
>> 1) +
77 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
;
79 switch (BltInfo
->SourceSurface
->iBitmapFormat
)
82 sx
= BltInfo
->SourcePoint
.x
;
83 sy
= BltInfo
->SourcePoint
.y
;
85 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
87 sx
= BltInfo
->SourcePoint
.x
;
88 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
90 if(DIB_1BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
) == 0)
92 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 0));
94 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 1));
103 sy
= BltInfo
->SourcePoint
.y
;
105 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
107 sx
= BltInfo
->SourcePoint
.x
;
109 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
111 if (NULL
!= BltInfo
->XlateSourceToDest
)
113 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
)));
117 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
));
126 SourceBits_8BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
128 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
130 SourceLine_8BPP
= SourceBits_8BPP
;
132 f2
= BltInfo
->DestRect
.left
& 1;
134 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
136 *DestLine
= (*DestLine
& notmask
[f2
]) |
137 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *SourceLine_8BPP
)) << ((4 * (1 - f2
))));
138 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
142 SourceBits_8BPP
+= BltInfo
->SourceSurface
->lDelta
;
143 DestBits
+= BltInfo
->DestSurface
->lDelta
;
148 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 2 * BltInfo
->SourcePoint
.x
;
151 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
153 SourceBits
= SourceLine
;
155 f2
= BltInfo
->DestRect
.left
& 1;
157 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
159 xColor
= *((PWORD
) SourceBits
);
160 *DestBits
= (*DestBits
& notmask
[f2
]) |
161 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
162 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
166 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
167 DestLine
+= BltInfo
->DestSurface
->lDelta
;
172 SourceBits_24BPP
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
* 3;
174 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
176 SourceLine_24BPP
= SourceBits_24BPP
;
178 f2
= BltInfo
->DestRect
.left
& 1;
180 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
182 xColor
= (*(SourceLine_24BPP
+ 2) << 0x10) +
183 (*(SourceLine_24BPP
+ 1) << 0x08) +
184 (*(SourceLine_24BPP
));
185 *DestLine
= (*DestLine
& notmask
[f2
]) |
186 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
187 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
191 SourceBits_24BPP
+= BltInfo
->SourceSurface
->lDelta
;
192 DestBits
+= BltInfo
->DestSurface
->lDelta
;
197 SourceLine
= (PBYTE
)BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
200 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
202 SourceBits
= SourceLine
;
204 f2
= BltInfo
->DestRect
.left
& 1;
206 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
208 xColor
= *((PDWORD
) SourceBits
);
209 *DestBits
= (*DestBits
& notmask
[f2
]) |
210 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
211 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
215 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
216 DestLine
+= BltInfo
->DestSurface
->lDelta
;
221 DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo
->SourceSurface
->iBitmapFormat
));
228 DIB_4BPP_BitBlt(PBLTINFO BltInfo
)
231 ULONG SourceX
, SourceY
;
233 ULONG Dest
, Source
= 0, Pattern
= 0;
238 static const ULONG ExpandSolidColor
[16] =
258 UsesSource
= ROP4_USES_SOURCE(BltInfo
->Rop4
);
259 UsesPattern
= ROP4_USES_PATTERN(BltInfo
->Rop4
);
261 SourceY
= BltInfo
->SourcePoint
.y
;
262 RoundedRight
= BltInfo
->DestRect
.right
-
263 ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) & 0x7);
267 if (BltInfo
->PatternSurface
)
269 PatternY
= (BltInfo
->DestRect
.top
+ BltInfo
->BrushOrigin
.y
) %
270 BltInfo
->PatternSurface
->sizlBitmap
.cy
;
274 Pattern
= ExpandSolidColor
[BltInfo
->Brush
->iSolidColor
];
278 for (DestY
= BltInfo
->DestRect
.top
; DestY
< BltInfo
->DestRect
.bottom
; DestY
++)
281 (PBYTE
)BltInfo
->DestSurface
->pvScan0
+
282 (BltInfo
->DestRect
.left
>> 1) +
283 DestY
* BltInfo
->DestSurface
->lDelta
);
284 SourceX
= BltInfo
->SourcePoint
.x
;
285 DestX
= BltInfo
->DestRect
.left
;
289 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
293 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
296 if (BltInfo
->PatternSurface
)
298 Pattern
= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
);
301 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
305 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ 1);
308 for (; DestX
< RoundedRight
; DestX
+= 8, SourceX
+= 8, DestBits
++)
314 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 1, SourceY
, BltInfo
->XlateSourceToDest
)) |
315 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 0, SourceY
, BltInfo
->XlateSourceToDest
) << 4) |
316 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 3, SourceY
, BltInfo
->XlateSourceToDest
) << 8) |
317 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 2, SourceY
, BltInfo
->XlateSourceToDest
) << 12) |
318 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 5, SourceY
, BltInfo
->XlateSourceToDest
) << 16) |
319 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 4, SourceY
, BltInfo
->XlateSourceToDest
) << 20) |
320 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 7, SourceY
, BltInfo
->XlateSourceToDest
) << 24) |
321 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 6, SourceY
, BltInfo
->XlateSourceToDest
) << 28);
323 if (BltInfo
->PatternSurface
)
325 Pattern
= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 1) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
);
326 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 0) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 4;
327 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 3) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 8;
328 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 2) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 12;
329 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 5) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 16;
330 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 4) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 20;
331 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 7) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 24;
332 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 6) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 28;
334 *DestBits
= DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
);
337 /* Process the rest of pixel on the line */
338 for (; DestX
< BltInfo
->DestRect
.right
; DestX
++, SourceX
++)
340 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
343 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
345 if (BltInfo
->PatternSurface
)
347 Pattern
= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
);
349 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
353 if (BltInfo
->PatternSurface
)
356 PatternY
%= BltInfo
->PatternSurface
->sizlBitmap
.cy
;
363 /* BitBlt Optimize */
365 DIB_4BPP_ColorFill(SURFOBJ
* DestSurface
, RECTL
* DestRect
, ULONG color
)
369 for (DestY
= DestRect
->top
; DestY
< DestRect
->bottom
; DestY
++)
371 DIB_4BPP_HLine(DestSurface
, DestRect
->left
, DestRect
->right
, DestY
, color
);
377 //NOTE: If you change something here, please do the same in other dibXXbpp.c files!
378 BOOLEAN
DIB_4BPP_StretchBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
379 RECTL
* DestRect
, RECTL
*SourceRect
,
380 POINTL
* MaskOrigin
, POINTL BrushOrigin
,
381 CLIPOBJ
*ClipRegion
, XLATEOBJ
*ColorTranslation
,
398 BOOLEAN DesIsBiggerY
=FALSE
;
400 SrcSizeY
= SourceRect
->bottom
- SourceRect
->top
;
401 SrcSizeX
= SourceRect
->right
- SourceRect
->left
;
403 DesSizeY
= DestRect
->bottom
- DestRect
->top
;
404 DesSizeX
= DestRect
->right
- DestRect
->left
;
406 zoomX
= DesSizeX
/ SrcSizeX
;
407 if (zoomX
==0) zoomX
=1;
409 zoomY
= DesSizeY
/ SrcSizeY
;
410 if (zoomY
==0) zoomY
=1;
412 if (DesSizeY
>SrcSizeY
)
415 switch(SourceSurf
->iBitmapFormat
)
418 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
419 /* This is a reference implementation, it hasn't been optimized for speed */
422 /* Draw one Hline on X - Led to the Des Zoom In*/
423 if (DesSizeX
>SrcSizeX
)
425 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
428 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
430 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
432 if (sy
> SourceRect
->bottom
) break;
436 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
438 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
440 if (sx
> SourceRect
->right
) break;
442 saveX
= DesX
+ zoomX
;
444 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
445 for (count
=DesY
;count
<saveY
;count
++)
446 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, 0);
448 for (count
=DesY
;count
<saveY
;count
++)
449 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, 1);
456 /* Draw one Hline on X - Led to the Des Zoom Out*/
458 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
461 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
463 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
465 if (sy
> SourceRect
->bottom
) break;
469 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
471 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
473 if (sx
> SourceRect
->right
) break;
475 saveX
= DesX
+ zoomX
;
477 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
478 for (count
=DesY
;count
<saveY
;count
++)
479 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, 0);
481 for (count
=DesY
;count
<saveY
;count
++)
482 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, 1);
491 if (DesSizeX
>SrcSizeX
)
493 /* Draw one pixel on X - Led to the Des Zoom In*/
494 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
497 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
499 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
501 if (sy
> SourceRect
->bottom
) break;
505 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
507 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
509 if (sx
> SourceRect
->right
) break;
511 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
512 for (count
=DesY
;count
<saveY
;count
++)
513 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, 0);
515 for (count
=DesY
;count
<saveY
;count
++)
516 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, 1);
524 /* Draw one pixel on X - Led to the Des Zoom Out*/
525 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
528 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
530 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
532 if (sy
> SourceRect
->bottom
) break;
536 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
538 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
540 if (sx
> SourceRect
->right
) break;
542 if (DIB_1BPP_GetPixel(SourceSurf
, sx
, sy
) == 0)
543 for (count
=DesY
;count
<saveY
;count
++)
544 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, 0);
546 for (count
=DesY
;count
<saveY
;count
++)
547 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, 1);
556 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
557 /* This is a reference implementation, it hasn't been optimized for speed */
560 /* Draw one Hline on X - Led to the Des Zoom In*/
561 if (DesSizeX
>SrcSizeX
)
563 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
566 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
568 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
570 if (sy
> SourceRect
->bottom
) break;
574 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
576 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
578 if (sx
> SourceRect
->right
) break;
580 color
= DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
);
582 saveX
= DesX
+ zoomX
;
583 for (count
=DesY
;count
<saveY
;count
++)
584 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
590 /* Draw one Hline on X - Led to the Des Zoom Out*/
592 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
595 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
597 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
599 if (sy
> SourceRect
->bottom
) break;
603 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
605 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
607 if (sx
> SourceRect
->right
) break;
609 color
= DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
);
611 saveX
= DesX
+ zoomX
;
612 for (count
=DesY
;count
<saveY
;count
++)
613 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
622 if (DesSizeX
>SrcSizeX
)
624 /* Draw one pixel on X - Led to the Des Zoom In*/
625 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
628 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
630 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
632 if (sy
> SourceRect
->bottom
) break;
636 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
638 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
640 if (sx
> SourceRect
->right
) break;
642 color
= DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
);
644 for (count
=DesY
;count
<saveY
;count
++)
645 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
651 /* Draw one pixel on X - Led to the Des Zoom Out*/
652 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
655 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
657 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
659 if (sy
> SourceRect
->bottom
) break;
663 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
665 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
667 if (sx
> SourceRect
->right
) break;
669 color
= DIB_4BPP_GetPixel(SourceSurf
, sx
, sy
);
671 for (count
=DesY
;count
<saveY
;count
++)
672 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
680 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
681 /* This is a reference implementation, it hasn't been optimized for speed */
684 /* Draw one Hline on X - Led to the Des Zoom In*/
685 if (DesSizeX
>SrcSizeX
)
687 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
690 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
692 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
694 if (sy
> SourceRect
->bottom
) break;
698 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
700 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
702 if (sx
> SourceRect
->right
) break;
704 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
706 saveX
= DesX
+ zoomX
;
707 for (count
=DesY
;count
<saveY
;count
++)
708 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
714 /* Draw one Hline on X - Led to the Des Zoom Out*/
716 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
719 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
721 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
723 if (sy
> SourceRect
->bottom
) break;
727 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
729 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
731 if (sx
> SourceRect
->right
) break;
733 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
735 saveX
= DesX
+ zoomX
;
736 for (count
=DesY
;count
<saveY
;count
++)
737 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
746 if (DesSizeX
>SrcSizeX
)
748 /* Draw one pixel on X - Led to the Des Zoom In*/
749 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
752 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
754 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
756 if (sy
> SourceRect
->bottom
) break;
760 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
762 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
764 if (sx
> SourceRect
->right
) break;
766 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
768 for (count
=DesY
;count
<saveY
;count
++)
769 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
775 /* Draw one pixel on X - Led to the Des Zoom Out*/
776 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
779 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
781 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
783 if (sy
> SourceRect
->bottom
) break;
787 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
789 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
791 if (sx
> SourceRect
->right
) break;
793 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_8BPP_GetPixel(SourceSurf
, sx
, sy
));
795 for (count
=DesY
;count
<saveY
;count
++)
796 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
804 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
805 /* This is a reference implementation, it hasn't been optimized for speed */
808 /* Draw one Hline on X - Led to the Des Zoom In*/
809 if (DesSizeX
>SrcSizeX
)
811 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
814 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
816 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
818 if (sy
> SourceRect
->bottom
) break;
822 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
824 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
826 if (sx
> SourceRect
->right
) break;
828 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
830 saveX
= DesX
+ zoomX
;
831 for (count
=DesY
;count
<saveY
;count
++)
832 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
838 /* Draw one Hline on X - Led to the Des Zoom Out*/
840 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
843 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
845 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
847 if (sy
> SourceRect
->bottom
) break;
851 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
853 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
855 if (sx
> SourceRect
->right
) break;
857 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
859 saveX
= DesX
+ zoomX
;
860 for (count
=DesY
;count
<saveY
;count
++)
861 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
870 if (DesSizeX
>SrcSizeX
)
872 /* Draw one pixel on X - Led to the Des Zoom In*/
873 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
876 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
878 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
880 if (sy
> SourceRect
->bottom
) break;
884 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
886 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
888 if (sx
> SourceRect
->right
) break;
890 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
892 for (count
=DesY
;count
<saveY
;count
++)
893 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
899 /* Draw one pixel on X - Led to the Des Zoom Out*/
900 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
903 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
905 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
907 if (sy
> SourceRect
->bottom
) break;
911 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
913 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
915 if (sx
> SourceRect
->right
) break;
917 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_16BPP_GetPixel(SourceSurf
, sx
, sy
));
919 for (count
=DesY
;count
<saveY
;count
++)
920 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
928 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
929 /* This is a reference implementation, it hasn't been optimized for speed */
932 /* Draw one Hline on X - Led to the Des Zoom In*/
933 if (DesSizeX
>SrcSizeX
)
935 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
938 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
940 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
942 if (sy
> SourceRect
->bottom
) break;
946 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
948 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
950 if (sx
> SourceRect
->right
) break;
952 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
954 saveX
= DesX
+ zoomX
;
955 for (count
=DesY
;count
<saveY
;count
++)
956 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
962 /* Draw one Hline on X - Led to the Des Zoom Out*/
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
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
979 if (sx
> SourceRect
->right
) break;
981 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
983 saveX
= DesX
+ zoomX
;
984 for (count
=DesY
;count
<saveY
;count
++)
985 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
994 if (DesSizeX
>SrcSizeX
)
996 /* Draw one pixel on X - Led to the Des Zoom In*/
997 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1000 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1002 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1004 if (sy
> SourceRect
->bottom
) break;
1008 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1010 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1012 if (sx
> SourceRect
->right
) break;
1014 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
1016 for (count
=DesY
;count
<saveY
;count
++)
1017 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1023 /* Draw one pixel on X - Led to the Des Zoom Out*/
1024 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1027 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1029 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1031 if (sy
> SourceRect
->bottom
) break;
1035 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1037 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1039 if (sx
> SourceRect
->right
) break;
1041 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_24BPP_GetPixel(SourceSurf
, sx
, sy
));
1043 for (count
=DesY
;count
<saveY
;count
++)
1044 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1052 /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
1053 /* This is a reference implementation, it hasn't been optimized for speed */
1056 /* Draw one Hline on X - Led to the Des Zoom In*/
1057 if (DesSizeX
>SrcSizeX
)
1059 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1062 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1064 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1066 if (sy
> SourceRect
->bottom
) break;
1070 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1072 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1074 if (sx
> SourceRect
->right
) break;
1076 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_32BPP_GetPixel(SourceSurf
, sx
, sy
));
1078 saveX
= DesX
+ zoomX
;
1079 for (count
=DesY
;count
<saveY
;count
++)
1080 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1086 /* Draw one Hline on X - Led to the Des Zoom Out*/
1088 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1091 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1093 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1095 if (sy
> SourceRect
->bottom
) break;
1099 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1101 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1103 if (sx
> SourceRect
->right
) break;
1105 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_32BPP_GetPixel(SourceSurf
, sx
, sy
));
1107 saveX
= DesX
+ zoomX
;
1108 for (count
=DesY
;count
<saveY
;count
++)
1109 DIB_4BPP_HLine(DestSurf
, DesX
, saveX
, count
, color
);
1118 if (DesSizeX
>SrcSizeX
)
1120 /* Draw one pixel on X - Led to the Des Zoom In*/
1121 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1124 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1126 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1128 if (sy
> SourceRect
->bottom
) break;
1132 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1134 sx
= (int) ((ULONG
) SrcSizeX
* (ULONG
) DesX
) / ((ULONG
) DesSizeX
);
1136 if (sx
> SourceRect
->right
) break;
1138 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_32BPP_GetPixel(SourceSurf
, sx
, sy
));
1140 for (count
=DesY
;count
<saveY
;count
++)
1141 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1147 /* Draw one pixel on X - Led to the Des Zoom Out*/
1148 for (DesY
=DestRect
->bottom
-zoomY
; DesY
>=0; DesY
-=zoomY
)
1151 sy
= (int) ((ULONG
) SrcSizeY
* (ULONG
) DesY
) / ((ULONG
) DesSizeY
);
1153 sy
= (int) ((ULONG
) DesSizeY
* (ULONG
) DesY
) / ((ULONG
) SrcSizeY
);
1155 if (sy
> SourceRect
->bottom
) break;
1159 for (DesX
=DestRect
->right
-zoomX
; DesX
>=0; DesX
-=zoomX
)
1161 sx
= (int) ((ULONG
) DesSizeX
* (ULONG
) DesX
) / ((ULONG
) SrcSizeX
);
1163 if (sx
> SourceRect
->right
) break;
1165 color
= XLATEOBJ_iXlate(ColorTranslation
, DIB_32BPP_GetPixel(SourceSurf
, sx
, sy
));
1167 for (count
=DesY
;count
<saveY
;count
++)
1168 DIB_4BPP_PutPixel(DestSurf
, DesX
, count
, color
);
1177 //DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
1185 DIB_4BPP_TransparentBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
1186 RECTL
* DestRect
, POINTL
*SourcePoint
,
1187 XLATEOBJ
*ColorTranslation
, ULONG iTransColor
)
1193 DIB_4BPP_AlphaBlend(SURFOBJ
* Dest
, SURFOBJ
* Source
, RECTL
* DestRect
,
1194 RECTL
* SourceRect
, CLIPOBJ
* ClipRegion
,
1195 XLATEOBJ
* ColorTranslation
, BLENDOBJ
* BlendObj
)