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.
23 DIB_4BPP_PutPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
, ULONG c
)
25 PBYTE addr
= SurfObj
->pvScan0
+ (x
>>1) + y
* SurfObj
->lDelta
;
26 *addr
= (*addr
& notmask
[x
&1]) | (c
<< ((1-(x
&1))<<2));
30 DIB_4BPP_GetPixel(SURFOBJ
*SurfObj
, LONG x
, LONG y
)
32 PBYTE addr
= SurfObj
->pvScan0
+ (x
>>1) + y
* SurfObj
->lDelta
;
33 return (*addr
>> ((1-(x
&1))<<2)) & 0x0f;
37 DIB_4BPP_HLine(SURFOBJ
*SurfObj
, LONG x1
, LONG x2
, LONG y
, ULONG c
)
39 PBYTE addr
= SurfObj
->pvScan0
+ (x1
>>1) + y
* SurfObj
->lDelta
;
43 *addr
= (*addr
& notmask
[x1
&1]) | (c
<< ((1-(x1
&1))<<2));
51 DIB_4BPP_VLine(SURFOBJ
*SurfObj
, LONG x
, LONG y1
, LONG y2
, ULONG c
)
53 PBYTE addr
= SurfObj
->pvScan0
;
54 int lDelta
= SurfObj
->lDelta
;
56 addr
+= (x
>>1) + y1
* lDelta
;
58 *addr
= (*addr
& notmask
[x
&1]) | (c
<< ((1-(x
&1))<<2));
64 DIB_4BPP_BitBltSrcCopy(PBLTINFO BltInfo
)
66 LONG i
, j
, sx
, sy
, f2
, xColor
;
67 PBYTE SourceBits_24BPP
, SourceLine_24BPP
;
68 PBYTE DestBits
, DestLine
, SourceBits_8BPP
, SourceLine_8BPP
;
69 PBYTE SourceBits
, SourceLine
;
71 DestBits
= BltInfo
->DestSurface
->pvScan0
+
72 (BltInfo
->DestRect
.left
>> 1) +
73 BltInfo
->DestRect
.top
* BltInfo
->DestSurface
->lDelta
;
75 switch (BltInfo
->SourceSurface
->iBitmapFormat
)
78 sx
= BltInfo
->SourcePoint
.x
;
79 sy
= BltInfo
->SourcePoint
.y
;
81 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
83 sx
= BltInfo
->SourcePoint
.x
;
84 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
86 if(DIB_1BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
) == 0)
88 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 0));
90 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, 1));
99 sy
= BltInfo
->SourcePoint
.y
;
101 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
103 sx
= BltInfo
->SourcePoint
.x
;
105 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
107 if (NULL
!= BltInfo
->XlateSourceToDest
)
109 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
)));
113 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, i
, j
, DIB_4BPP_GetPixel(BltInfo
->SourceSurface
, sx
, sy
));
122 SourceBits_8BPP
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
;
124 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
126 SourceLine_8BPP
= SourceBits_8BPP
;
128 f2
= BltInfo
->DestRect
.left
& 1;
130 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
132 *DestLine
= (*DestLine
& notmask
[f2
]) |
133 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, *SourceLine_8BPP
)) << ((4 * (1 - f2
))));
134 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
138 SourceBits_8BPP
+= BltInfo
->SourceSurface
->lDelta
;
139 DestBits
+= BltInfo
->DestSurface
->lDelta
;
144 SourceLine
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 2 * BltInfo
->SourcePoint
.x
;
147 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
149 SourceBits
= SourceLine
;
151 f2
= BltInfo
->DestRect
.left
& 1;
153 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
155 xColor
= *((PWORD
) SourceBits
);
156 *DestBits
= (*DestBits
& notmask
[f2
]) |
157 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
158 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
162 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
163 DestLine
+= BltInfo
->DestSurface
->lDelta
;
168 SourceBits_24BPP
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + BltInfo
->SourcePoint
.x
* 3;
170 for (j
=BltInfo
->DestRect
.top
; j
<BltInfo
->DestRect
.bottom
; j
++)
172 SourceLine_24BPP
= SourceBits_24BPP
;
174 f2
= BltInfo
->DestRect
.left
& 1;
176 for (i
=BltInfo
->DestRect
.left
; i
<BltInfo
->DestRect
.right
; i
++)
178 xColor
= (*(SourceLine_24BPP
+ 2) << 0x10) +
179 (*(SourceLine_24BPP
+ 1) << 0x08) +
180 (*(SourceLine_24BPP
));
181 *DestLine
= (*DestLine
& notmask
[f2
]) |
182 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
183 if(f2
== 1) { DestLine
++; f2
= 0; } else { f2
= 1; }
187 SourceBits_24BPP
+= BltInfo
->SourceSurface
->lDelta
;
188 DestBits
+= BltInfo
->DestSurface
->lDelta
;
193 SourceLine
= BltInfo
->SourceSurface
->pvScan0
+ (BltInfo
->SourcePoint
.y
* BltInfo
->SourceSurface
->lDelta
) + 4 * BltInfo
->SourcePoint
.x
;
196 for (j
= BltInfo
->DestRect
.top
; j
< BltInfo
->DestRect
.bottom
; j
++)
198 SourceBits
= SourceLine
;
200 f2
= BltInfo
->DestRect
.left
& 1;
202 for (i
= BltInfo
->DestRect
.left
; i
< BltInfo
->DestRect
.right
; i
++)
204 xColor
= *((PDWORD
) SourceBits
);
205 *DestBits
= (*DestBits
& notmask
[f2
]) |
206 ((XLATEOBJ_iXlate(BltInfo
->XlateSourceToDest
, xColor
)) << ((4 * (1 - f2
))));
207 if(f2
== 1) { DestBits
++; f2
= 0; } else { f2
= 1; }
211 SourceLine
+= BltInfo
->SourceSurface
->lDelta
;
212 DestLine
+= BltInfo
->DestSurface
->lDelta
;
217 DbgPrint("DIB_4BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo
->SourceSurface
->iBitmapFormat
));
224 DIB_4BPP_BitBlt(PBLTINFO BltInfo
)
227 ULONG SourceX
, SourceY
;
229 ULONG Dest
, Source
= 0, Pattern
= 0;
234 static const ULONG ExpandSolidColor
[16] =
254 UsesSource
= ROP_USES_SOURCE(BltInfo
->Rop4
);
255 UsesPattern
= ROP_USES_PATTERN(BltInfo
->Rop4
);
257 SourceY
= BltInfo
->SourcePoint
.y
;
258 RoundedRight
= BltInfo
->DestRect
.right
-
259 ((BltInfo
->DestRect
.right
- BltInfo
->DestRect
.left
) & 0x7);
263 if (BltInfo
->PatternSurface
)
265 PatternY
= (BltInfo
->DestRect
.top
+ BltInfo
->BrushOrigin
.y
) %
266 BltInfo
->PatternSurface
->sizlBitmap
.cy
;
270 Pattern
= ExpandSolidColor
[BltInfo
->Brush
->iSolidColor
];
274 for (DestY
= BltInfo
->DestRect
.top
; DestY
< BltInfo
->DestRect
.bottom
; DestY
++)
277 BltInfo
->DestSurface
->pvScan0
+
278 (BltInfo
->DestRect
.left
>> 1) +
279 DestY
* BltInfo
->DestSurface
->lDelta
);
280 SourceX
= BltInfo
->SourcePoint
.x
;
281 DestX
= BltInfo
->DestRect
.left
;
285 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
289 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
292 if (BltInfo
->PatternSurface
)
294 Pattern
= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
);
297 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
301 DestBits
= (PULONG
)((ULONG_PTR
)DestBits
+ 1);
304 for (; DestX
< RoundedRight
; DestX
+= 8, SourceX
+= 8, DestBits
++)
310 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 1, SourceY
, BltInfo
->XlateSourceToDest
)) |
311 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 0, SourceY
, BltInfo
->XlateSourceToDest
) << 4) |
312 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 3, SourceY
, BltInfo
->XlateSourceToDest
) << 8) |
313 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 2, SourceY
, BltInfo
->XlateSourceToDest
) << 12) |
314 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 5, SourceY
, BltInfo
->XlateSourceToDest
) << 16) |
315 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 4, SourceY
, BltInfo
->XlateSourceToDest
) << 20) |
316 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 7, SourceY
, BltInfo
->XlateSourceToDest
) << 24) |
317 (DIB_GetSource(BltInfo
->SourceSurface
, SourceX
+ 6, SourceY
, BltInfo
->XlateSourceToDest
) << 28);
319 if (BltInfo
->PatternSurface
)
321 Pattern
= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 1) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
);
322 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 0) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 4;
323 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 3) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 8;
324 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 2) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 12;
325 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 5) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 16;
326 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 4) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 20;
327 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 7) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 24;
328 Pattern
|= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
+ 6) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
) << 28;
330 *DestBits
= DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
);
333 /* Process the rest of pixel on the line */
334 for (; DestX
< BltInfo
->DestRect
.right
; DestX
++, SourceX
++)
336 Dest
= DIB_4BPP_GetPixel(BltInfo
->DestSurface
, DestX
, DestY
);
339 Source
= DIB_GetSource(BltInfo
->SourceSurface
, SourceX
, SourceY
, BltInfo
->XlateSourceToDest
);
341 if (BltInfo
->PatternSurface
)
343 Pattern
= DIB_GetSource(BltInfo
->PatternSurface
, (DestX
+ BltInfo
->BrushOrigin
.x
) % BltInfo
->PatternSurface
->sizlBitmap
.cx
, PatternY
, BltInfo
->XlatePatternToDest
);
345 DIB_4BPP_PutPixel(BltInfo
->DestSurface
, DestX
, DestY
, DIB_DoRop(BltInfo
->Rop4
, Dest
, Source
, Pattern
) & 0xF);
349 if (BltInfo
->PatternSurface
)
352 PatternY
%= BltInfo
->PatternSurface
->sizlBitmap
.cy
;
359 BOOLEAN
DIB_4BPP_StretchBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
360 RECTL
* DestRect
, RECTL
*SourceRect
,
361 POINTL
* MaskOrigin
, POINTL BrushOrigin
,
362 CLIPOBJ
*ClipRegion
, XLATEOBJ
*ColorTranslation
,
365 DbgPrint("DIB_4BPP_StretchBlt: Source BPP: %u\n", BitsPerFormat(SourceSurf
->iBitmapFormat
));
370 DIB_4BPP_TransparentBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
,
371 RECTL
* DestRect
, POINTL
*SourcePoint
,
372 XLATEOBJ
*ColorTranslation
, ULONG iTransColor
)