2 * PROJECT: ReactOS Win32k subsystem
3 * LICENSE: See COPYING in the top level directory
4 * FILE: subsystems/win32/win32k/dib/stretchblt.c
5 * PURPOSE: StretchBlt implementation suitable for all bit depths
6 * PROGRAMMERS: Magnus Olsen
16 BOOLEAN
DIB_XXBPP_StretchBlt(SURFOBJ
*DestSurf
, SURFOBJ
*SourceSurf
, SURFOBJ
*MaskSurf
,
17 SURFOBJ
*PatternSurface
,
18 RECTL
*DestRect
, RECTL
*SourceRect
,
19 POINTL
*MaskOrigin
, BRUSHOBJ
*Brush
,
20 POINTL
*BrushOrigin
, XLATEOBJ
*ColorTranslation
,
34 ULONG Dest
, Source
= 0, Pattern
= 0;
38 PFN_DIB_GetPixel fnSource_GetPixel
= NULL
;
39 PFN_DIB_GetPixel fnDest_GetPixel
= NULL
;
40 PFN_DIB_PutPixel fnDest_PutPixel
= NULL
;
41 PFN_DIB_GetPixel fnPattern_GetPixel
= NULL
;
42 PFN_DIB_GetPixel fnMask_GetPixel
= NULL
;
44 LONG PatternX
= 0, PatternY
= 0;
46 BOOL UsesSource
= ROP4_USES_SOURCE(ROP
);
47 BOOL UsesPattern
= ROP4_USES_PATTERN(ROP
);
49 ASSERT(IS_VALID_ROP4(ROP
));
51 fnDest_GetPixel
= DibFunctionsForBitmapFormat
[DestSurf
->iBitmapFormat
].DIB_GetPixel
;
52 fnDest_PutPixel
= DibFunctionsForBitmapFormat
[DestSurf
->iBitmapFormat
].DIB_PutPixel
;
54 DPRINT("Dest BPP: %u, dstRect: (%d,%d)-(%d,%d)\n",
55 BitsPerFormat(DestSurf
->iBitmapFormat
), DestRect
->left
, DestRect
->top
, DestRect
->right
, DestRect
->bottom
);
59 fnSource_GetPixel
= DibFunctionsForBitmapFormat
[SourceSurf
->iBitmapFormat
].DIB_GetPixel
;
60 DPRINT("Source BPP: %u, srcRect: (%d,%d)-(%d,%d)\n",
61 BitsPerFormat(SourceSurf
->iBitmapFormat
), SourceRect
->left
, SourceRect
->top
, SourceRect
->right
, SourceRect
->bottom
);
66 fnMask_GetPixel
= DibFunctionsForBitmapFormat
[MaskSurf
->iBitmapFormat
].DIB_GetPixel
;
69 DstHeight
= DestRect
->bottom
- DestRect
->top
;
70 DstWidth
= DestRect
->right
- DestRect
->left
;
71 SrcHeight
= SourceRect
->bottom
- SourceRect
->top
;
72 SrcWidth
= SourceRect
->right
- SourceRect
->left
;
74 /* FIXME: MaskOrigin? */
76 switch(DestSurf
->iBitmapFormat
)
78 case BMF_1BPP
: xxBPPMask
= 0x1; break;
79 case BMF_4BPP
: xxBPPMask
= 0xF; break;
80 case BMF_8BPP
: xxBPPMask
= 0xFF; break;
81 case BMF_16BPP
: xxBPPMask
= 0xFFFF; break;
82 case BMF_24BPP
: xxBPPMask
= 0xFFFFFF; break;
84 xxBPPMask
= 0xFFFFFFFF;
91 PatternY
= (DestRect
->top
- BrushOrigin
->y
) % PatternSurface
->sizlBitmap
.cy
;
94 PatternY
+= PatternSurface
->sizlBitmap
.cy
;
96 fnPattern_GetPixel
= DibFunctionsForBitmapFormat
[PatternSurface
->iBitmapFormat
].DIB_GetPixel
;
101 Pattern
= Brush
->iSolidColor
;
106 for (DesY
= DestRect
->top
; DesY
< DestRect
->bottom
; DesY
++)
110 PatternX
= (DestRect
->left
- BrushOrigin
->x
) % PatternSurface
->sizlBitmap
.cx
;
113 PatternX
+= PatternSurface
->sizlBitmap
.cx
;
117 sy
= SourceRect
->top
+(DesY
- DestRect
->top
) * SrcHeight
/ DstHeight
;
119 for (DesX
= DestRect
->left
; DesX
< DestRect
->right
; DesX
++)
125 sx
= SourceRect
->left
+(DesX
- DestRect
->left
) * SrcWidth
/ DstWidth
;
126 if (sx
< 0 || sy
< 0 ||
127 MaskSurf
->sizlBitmap
.cx
< sx
|| MaskSurf
->sizlBitmap
.cy
< sy
||
128 fnMask_GetPixel(MaskSurf
, sx
, sy
) != 0)
134 if (UsesSource
&& CanDraw
)
136 sx
= SourceRect
->left
+(DesX
- DestRect
->left
) * SrcWidth
/ DstWidth
;
137 if (sx
>= 0 && sy
>= 0 &&
138 SourceSurf
->sizlBitmap
.cx
> sx
&& SourceSurf
->sizlBitmap
.cy
> sy
)
140 Source
= XLATEOBJ_iXlate(ColorTranslation
, fnSource_GetPixel(SourceSurf
, sx
, sy
));
145 CanDraw
= ((ROP
& 0xFF) != R3_OPINDEX_SRCCOPY
);
151 if (UsesPattern
&& PatternSurface
)
153 Pattern
= fnPattern_GetPixel(PatternSurface
, PatternX
, PatternY
);
155 PatternX
%= PatternSurface
->sizlBitmap
.cx
;
158 Dest
= fnDest_GetPixel(DestSurf
, DesX
, DesY
);
159 Color
= DIB_DoRop(ROP
, Dest
, Source
, Pattern
) & xxBPPMask
;
161 fnDest_PutPixel(DestSurf
, DesX
, DesY
, Color
);
168 PatternY
%= PatternSurface
->sizlBitmap
.cy
;