+
+BOOLEAN
+DIB_1BPP_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 & 0x7);
+
+ if (Rop4 == SRCCOPY)
+ {
+ return(DIB_1BPP_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 + (DestRect->left>>3) + j * DestSurf->lDelta);
+ for (i=DestRect->left; i<RoundedRight; i+=32, DestBits++)
+ {
+ Dest = *DestBits;
+ if (UsesSource)
+ {
+ Source = 0;
+ for (k = 0; k < 32; k++)
+ {
+ Source |= (DIB_GetSource(SourceSurf, SourceGDI, sx + i + k, sy, ColorTranslation) << k);
+ }
+ }
+ if (UsesPattern)
+ {
+ /* FIXME: No support for pattern brushes. */
+ Pattern = Brush->iSolidColor ? 0xFFFFFFFF : 0x00000000;
+ }
+ *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 ? 0xFFFFFFFF : 0x00000000;
+ }
+ DIB_1BPP_PutPixel(DestSurf, i, j, DIB_DoRop(Rop4, Dest, Source, Pattern) & 0xF);
+ Dest >>= 1;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+
+/* EOF */