+
+BOOLEAN
+DIB_16BPP_BitBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
+ SURFGDI *DestGDI, SURFGDI *SourceGDI,
+ PRECTL DestRect, POINTL *SourcePoint,
+ PBRUSHOBJ Brush, PPOINTL BrushOrigin,
+ XLATEOBJ *ColorTranslation, ULONG Rop4)
+{
+ LONG i, j, k, sx, sy;
+ ULONG Dest, Source, Pattern;
+ PULONG DestBits;
+ BOOL UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
+ BOOL UsesPattern = ((Rop4 & 0xF00000) >> 4) != (Rop4 & 0x0F0000);
+ LONG RoundedRight = DestRect->right - (DestRect->right & 0x1);
+
+ if (Rop4 == SRCCOPY)
+ {
+ return(DIB_16BPP_BitBltSrcCopy(DestSurf, SourceSurf, DestGDI, SourceGDI, DestRect, SourcePoint, ColorTranslation));
+ }
+ else
+ {
+ sy = SourcePoint->y;
+
+ for (j=DestRect->top; j<DestRect->bottom; j++)
+ {
+ sx = SourcePoint->x;
+ DestBits = (PULONG)(DestSurf->pvScan0 + 2 * DestRect->left + j * DestSurf->lDelta);
+ for (i=DestRect->left; i<RoundedRight; i+=2, DestBits++)
+ {
+ Dest = *DestBits;
+ if (UsesSource)
+ {
+ Source = 0;
+ for (k = 0; k < 2; k++)
+ {
+ Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + i + k, sy, ColorTranslation) << (k * 16));
+ }
+ }
+ if (UsesPattern)
+ {
+ /* FIXME: No support for pattern brushes. */
+ Pattern = (Brush->iSolidColor & 0xFFFF) |
+ ((Brush->iSolidColor & 0xFFFF) << 16);
+ }
+ *DestBits = DIB_DoRop(Rop4, Dest, Source, Pattern);
+ }
+ if (i < DestRect->right)
+ {
+ Dest = *DestBits;
+ for (; i < DestRect->right; i++)
+ {
+ if (UsesSource)
+ {
+ Source = DIB_GetSource(SourceSurf, SourceGDI, sx + i, sy, ColorTranslation);
+ }
+ if (UsesPattern)
+ {
+ /* FIXME: No support for pattern brushes. */
+ Pattern = (Brush->iSolidColor & 0xFFFF) |
+ ((Brush->iSolidColor & 0xFFFF) << 16);
+ }
+ DIB_16BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xFFFF);
+ Dest >>= 16;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+
+/* EOF */