2 * PROJECT: ReactOS Win32k subsystem
3 * LICENSE: See COPYING in the top level directory
4 * FILE: win32ss/gdi/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
,
36 ULONG Dest
, Source
= 0, Pattern
= 0;
40 PFN_DIB_GetPixel fnSource_GetPixel
= NULL
;
41 PFN_DIB_GetPixel fnDest_GetPixel
= NULL
;
42 PFN_DIB_PutPixel fnDest_PutPixel
= NULL
;
43 PFN_DIB_GetPixel fnPattern_GetPixel
= NULL
;
44 PFN_DIB_GetPixel fnMask_GetPixel
= NULL
;
46 LONG PatternX
= 0, PatternY
= 0;
48 BOOL UsesSource
= ROP4_USES_SOURCE(ROP
);
49 BOOL UsesPattern
= ROP4_USES_PATTERN(ROP
);
51 ASSERT(IS_VALID_ROP4(ROP
));
53 fnDest_GetPixel
= DibFunctionsForBitmapFormat
[DestSurf
->iBitmapFormat
].DIB_GetPixel
;
54 fnDest_PutPixel
= DibFunctionsForBitmapFormat
[DestSurf
->iBitmapFormat
].DIB_PutPixel
;
56 DPRINT("Dest BPP: %u, dstRect: (%d,%d)-(%d,%d)\n",
57 BitsPerFormat(DestSurf
->iBitmapFormat
), DestRect
->left
, DestRect
->top
, DestRect
->right
, DestRect
->bottom
);
61 SourceCy
= abs(SourceSurf
->sizlBitmap
.cy
);
62 fnSource_GetPixel
= DibFunctionsForBitmapFormat
[SourceSurf
->iBitmapFormat
].DIB_GetPixel
;
63 DPRINT("Source BPP: %u, srcRect: (%d,%d)-(%d,%d)\n",
64 BitsPerFormat(SourceSurf
->iBitmapFormat
), SourceRect
->left
, SourceRect
->top
, SourceRect
->right
, SourceRect
->bottom
);
69 fnMask_GetPixel
= DibFunctionsForBitmapFormat
[MaskSurf
->iBitmapFormat
].DIB_GetPixel
;
70 MaskCy
= abs(MaskSurf
->sizlBitmap
.cy
);
73 DstHeight
= DestRect
->bottom
- DestRect
->top
;
74 DstWidth
= DestRect
->right
- DestRect
->left
;
75 SrcHeight
= SourceRect
->bottom
- SourceRect
->top
;
76 SrcWidth
= SourceRect
->right
- SourceRect
->left
;
78 /* FIXME: MaskOrigin? */
80 switch(DestSurf
->iBitmapFormat
)
82 case BMF_1BPP
: xxBPPMask
= 0x1; break;
83 case BMF_4BPP
: xxBPPMask
= 0xF; break;
84 case BMF_8BPP
: xxBPPMask
= 0xFF; break;
85 case BMF_16BPP
: xxBPPMask
= 0xFFFF; break;
86 case BMF_24BPP
: xxBPPMask
= 0xFFFFFF; break;
88 xxBPPMask
= 0xFFFFFFFF;
95 PatternY
= (DestRect
->top
- BrushOrigin
->y
) % PatternSurface
->sizlBitmap
.cy
;
98 PatternY
+= PatternSurface
->sizlBitmap
.cy
;
100 fnPattern_GetPixel
= DibFunctionsForBitmapFormat
[PatternSurface
->iBitmapFormat
].DIB_GetPixel
;
105 Pattern
= Brush
->iSolidColor
;
110 for (DesY
= DestRect
->top
; DesY
< DestRect
->bottom
; DesY
++)
114 PatternX
= (DestRect
->left
- BrushOrigin
->x
) % PatternSurface
->sizlBitmap
.cx
;
117 PatternX
+= PatternSurface
->sizlBitmap
.cx
;
121 sy
= SourceRect
->top
+(DesY
- DestRect
->top
) * SrcHeight
/ DstHeight
;
123 for (DesX
= DestRect
->left
; DesX
< DestRect
->right
; DesX
++)
129 sx
= SourceRect
->left
+(DesX
- DestRect
->left
) * SrcWidth
/ DstWidth
;
130 if (sx
< 0 || sy
< 0 ||
131 MaskSurf
->sizlBitmap
.cx
< sx
|| MaskCy
< sy
||
132 fnMask_GetPixel(MaskSurf
, sx
, sy
) != 0)
138 if (UsesSource
&& CanDraw
)
140 sx
= SourceRect
->left
+(DesX
- DestRect
->left
) * SrcWidth
/ DstWidth
;
141 if (sx
>= 0 && sy
>= 0 &&
142 SourceSurf
->sizlBitmap
.cx
> sx
&& SourceCy
> sy
)
144 Source
= XLATEOBJ_iXlate(ColorTranslation
, fnSource_GetPixel(SourceSurf
, sx
, sy
));
149 CanDraw
= ((ROP
& 0xFF) != R3_OPINDEX_SRCCOPY
);
155 if (UsesPattern
&& PatternSurface
)
157 Pattern
= fnPattern_GetPixel(PatternSurface
, PatternX
, PatternY
);
159 PatternX
%= PatternSurface
->sizlBitmap
.cx
;
162 Dest
= fnDest_GetPixel(DestSurf
, DesX
, DesY
);
163 Color
= DIB_DoRop(ROP
, Dest
, Source
, Pattern
) & xxBPPMask
;
165 fnDest_PutPixel(DestSurf
, DesX
, DesY
, Color
);
172 PatternY
%= PatternSurface
->sizlBitmap
.cy
;