2 * PROJECT: Win32 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 fnDest_GetPixel
= DibFunctionsForBitmapFormat
[DestSurf
->iBitmapFormat
].DIB_GetPixel
;
50 fnDest_PutPixel
= DibFunctionsForBitmapFormat
[DestSurf
->iBitmapFormat
].DIB_PutPixel
;
52 DPRINT("Dest BPP: %u, dstRect: (%d,%d)-(%d,%d)\n",
53 BitsPerFormat(DestSurf
->iBitmapFormat
), DestRect
->left
, DestRect
->top
, DestRect
->right
, DestRect
->bottom
);
57 fnSource_GetPixel
= DibFunctionsForBitmapFormat
[SourceSurf
->iBitmapFormat
].DIB_GetPixel
;
58 DPRINT("Source BPP: %u, srcRect: (%d,%d)-(%d,%d)\n",
59 BitsPerFormat(SourceSurf
->iBitmapFormat
), SourceRect
->left
, SourceRect
->top
, SourceRect
->right
, SourceRect
->bottom
);
64 fnMask_GetPixel
= DibFunctionsForBitmapFormat
[MaskSurf
->iBitmapFormat
].DIB_GetPixel
;
67 DstHeight
= DestRect
->bottom
- DestRect
->top
;
68 DstWidth
= DestRect
->right
- DestRect
->left
;
69 SrcHeight
= SourceRect
->bottom
- SourceRect
->top
;
70 SrcWidth
= SourceRect
->right
- SourceRect
->left
;
72 /* FIXME : MaskOrigin? */
74 switch(DestSurf
->iBitmapFormat
)
76 case BMF_1BPP
: xxBPPMask
= 0x1; break;
77 case BMF_4BPP
: xxBPPMask
= 0xF; break;
78 case BMF_8BPP
: xxBPPMask
= 0xFF; break;
79 case BMF_16BPP
: xxBPPMask
= 0xFFFF; break;
80 case BMF_24BPP
: xxBPPMask
= 0xFFFFFF; break;
82 xxBPPMask
= 0xFFFFFFFF;
89 PatternY
= (DestRect
->top
- BrushOrigin
->y
) % PatternSurface
->sizlBitmap
.cy
;
92 PatternY
+= PatternSurface
->sizlBitmap
.cy
;
94 fnPattern_GetPixel
= DibFunctionsForBitmapFormat
[PatternSurface
->iBitmapFormat
].DIB_GetPixel
;
99 Pattern
= Brush
->iSolidColor
;
104 for (DesY
= DestRect
->top
; DesY
< DestRect
->bottom
; DesY
++)
108 PatternX
= (DestRect
->left
- BrushOrigin
->x
) % PatternSurface
->sizlBitmap
.cx
;
111 PatternX
+= PatternSurface
->sizlBitmap
.cx
;
115 sy
= SourceRect
->top
+(DesY
- DestRect
->top
) * SrcHeight
/ DstHeight
;
117 for (DesX
= DestRect
->left
; DesX
< DestRect
->right
; DesX
++)
123 sx
= SourceRect
->left
+(DesX
- DestRect
->left
) * SrcWidth
/ DstWidth
;
124 if (sx
< 0 || sy
< 0 ||
125 MaskSurf
->sizlBitmap
.cx
< sx
|| MaskSurf
->sizlBitmap
.cy
< sy
||
126 fnMask_GetPixel(MaskSurf
, sx
, sy
) != 0)
132 if (UsesSource
&& CanDraw
)
134 sx
= SourceRect
->left
+(DesX
- DestRect
->left
) * SrcWidth
/ DstWidth
;
135 if (sx
>= 0 && sy
>= 0 &&
136 SourceSurf
->sizlBitmap
.cx
> sx
&& SourceSurf
->sizlBitmap
.cy
> sy
)
138 Source
= XLATEOBJ_iXlate(ColorTranslation
, fnSource_GetPixel(SourceSurf
, sx
, sy
));
143 CanDraw
= (ROP3_TO_ROP4(SRCCOPY
) != ROP
);
151 Pattern
= fnPattern_GetPixel(PatternSurface
, PatternX
, PatternY
);
153 PatternX
%= PatternSurface
->sizlBitmap
.cx
;
156 Dest
= fnDest_GetPixel(DestSurf
, DesX
, DesY
);
157 Color
= DIB_DoRop(ROP
, Dest
, Source
, Pattern
) & xxBPPMask
;
159 fnDest_PutPixel(DestSurf
, DesX
, DesY
, Color
);
166 PatternY
%= PatternSurface
->sizlBitmap
.cy
;