Fix for [bug 841] DirectDrawSurface_Blt support for DDBLT_DDFX

Tony Lambregts tony_lambregts at telusplanet.net
Sat Jul 13 22:17:18 CDT 2002


Change log: Added support DDBLT_DDFX flag in DirectDrawSurface_Blt


Tony Lambregts  tony_lambregts at telusplanet.net
-------------- next part --------------
Index: dib.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dsurface/dib.c,v
retrieving revision 1.12
diff -u -r1.12 dib.c
--- dib.c	10 Jul 2002 23:10:54 -0000	1.12
+++ dib.c	13 Jul 2002 05:25:36 -0000
@@ -570,50 +570,144 @@
 		    last_sy = sy;
 		}
 	    }
-	} else if (dwFlags & (DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE)) {
-	    DWORD keylow, keyhigh;
+	} else {
+           LONG dstyinc = ddesc.u1.lPitch, dstxinc = bpp;
+           DWORD keylow = 0, keyhigh = 0;
+           if (dwFlags & (DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE)) {
+ 
+	      if (dwFlags & DDBLT_KEYSRC) {
+		 keylow  = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue;
+		 keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue;
+	      } else if (dwFlags & DDBLT_KEYDEST){
+		 keylow  = ddesc.ddckCKDestBlt.dwColorSpaceLowValue;
+		 keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue;
+	      } else if (dwFlags & DDBLT_KEYSRCOVERRIDE) {
+		 keylow  = lpbltfx->ddckSrcColorkey.dwColorSpaceLowValue;
+		 keyhigh = lpbltfx->ddckSrcColorkey.dwColorSpaceHighValue;
+	      } else {
+		 keylow  = lpbltfx->ddckDestColorkey.dwColorSpaceLowValue;
+		 keyhigh = lpbltfx->ddckDestColorkey.dwColorSpaceHighValue;
+	      } 
+              dwFlags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE);
+           }
 
-	    if (dwFlags & DDBLT_KEYSRC) {
-		keylow  = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue;
-		keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue;
-	    } else if (dwFlags & DDBLT_KEYDEST){
-		/* I'm not sure if this is correct */
-		FIXME("DDBLT_KEYDEST not fully supported yet.\n");
-		keylow  = ddesc.ddckCKDestBlt.dwColorSpaceLowValue;
-		keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue;
-	    } else if (dwFlags & DDBLT_KEYSRCOVERRIDE) {
-		keylow  = lpbltfx->ddckSrcColorkey.dwColorSpaceLowValue;
-		keyhigh = lpbltfx->ddckSrcColorkey.dwColorSpaceHighValue;
-	    } else {
-		keylow  = lpbltfx->ddckDestColorkey.dwColorSpaceLowValue;
-		keyhigh = lpbltfx->ddckDestColorkey.dwColorSpaceHighValue;
-	    }
+           if (dwFlags & DDBLT_DDFX)  {
+              LPBYTE dTopLeft, dTopRight, dBottomLeft, dBottomRight, tmp;
+              LONG tmpxy;
+              dTopLeft     = dbuf;
+              dTopRight    = dbuf+((dstwidth-1)*bpp);
+              dBottomLeft  = dTopLeft+((dstheight-1)*ddesc.u1.lPitch); 
+              dBottomRight = dBottomLeft+((dstwidth-1)*bpp); 
 
-	    for (y = sy = 0; y < dstheight; y++, sy += yinc) {
-		sbuf = sbase + (sy >> 16) * sdesc.u1.lPitch;
+              if (lpbltfx->dwDDFX & DDBLTFX_ARITHSTRETCHY){
+                 /* I don't think we need to do anything about this flag */
+                 WARN("dwflags=DDBLT_DDFX nothing done for DDBLTFX_ARITHSTRETCHY\n");
+              }
+              if (lpbltfx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT) {
+                 tmp          = dTopRight;
+                 dTopRight    = dTopLeft;
+                 dTopLeft     = tmp;
+                 tmp          = dBottomRight;
+                 dBottomRight = dBottomLeft;
+                 dBottomLeft  = tmp;
+                 dstxinc = dstxinc *-1;
+              }
+              if (lpbltfx->dwDDFX & DDBLTFX_MIRRORUPDOWN) {
+                 tmp          = dTopLeft;
+                 dTopLeft     = dBottomLeft;
+                 dBottomLeft  = tmp;
+                 tmp          = dTopRight;
+                 dTopRight    = dBottomRight;
+                 dBottomRight = tmp;
+                 dstyinc = dstyinc *-1;
+              }
+              if (lpbltfx->dwDDFX & DDBLTFX_NOTEARING) {
+                 /* I don't think we need to do anything about this flag */
+                 WARN("dwflags=DDBLT_DDFX nothing done for DDBLTFX_NOTEARING\n");
+              }
+              if (lpbltfx->dwDDFX & DDBLTFX_ROTATE180) { 
+                 tmp          = dBottomRight;
+                 dBottomRight = dTopLeft;
+                 dTopLeft     = tmp;
+                 tmp          = dBottomLeft;
+                 dBottomLeft  = dTopRight;
+                 dTopRight    = tmp;
+                 dstxinc = dstxinc * -1;
+                 dstyinc = dstyinc * -1; 
+              }
+              if (lpbltfx->dwDDFX & DDBLTFX_ROTATE270) {    
+                 tmp          = dTopLeft;
+                 dTopLeft     = dBottomLeft;
+                 dBottomLeft  = dBottomRight;
+                 dBottomRight = dTopRight;
+                 dTopRight    = tmp;
+                 tmpxy   = dstxinc;
+                 dstxinc = dstyinc;
+                 dstyinc = tmpxy;
+                 dstxinc = dstxinc * -1;
+              }
+              if (lpbltfx->dwDDFX & DDBLTFX_ROTATE90) {
+                 tmp          = dTopLeft;
+                 dTopLeft     = dTopRight;
+                 dTopRight    = dBottomRight;
+                 dBottomRight = dBottomLeft;
+                 dBottomLeft  = tmp;
+                 tmpxy   = dstxinc;
+                 dstxinc = dstyinc;
+                 dstyinc = tmpxy;
+                 dstyinc = dstyinc * -1;
+              }
+              if (lpbltfx->dwDDFX & DDBLTFX_ZBUFFERBASEDEST) {
+                 /* I don't think we need to do anything about this flag */
+                 WARN("dwflags=DDBLT_DDFX nothing done for DDBLTFX_ZBUFFERBASEDEST\n");
+              }
+              dbuf = dTopLeft;
+              dwFlags &= ~(DDBLT_DDFX);
+           }
 
-#define COPYROW_COLORKEY(type) { \
-		type *s = (type *) sbuf, *d = (type *) dbuf, tmp; \
-		for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \
-		    tmp = s[sx >> 16]; \
-		    if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \
-		} \
-		break; }
+#define COPY_COLORKEY_FX(type) { \
+	    type *s = (type *) sbuf, *d = (type *) dbuf, *dx, tmp; \
+            for (y = sy = 0; y < dstheight; y++, sy += yinc) { \
+               (LPBYTE)s = sbase + (sy >> 16) * sdesc.u1.lPitch; \
+               (LPBYTE)dx = d; \
+	       for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \
+		  tmp = s[sx >> 16]; \
+		  if (tmp < keylow || tmp > keyhigh) dx[0] = tmp; \
+                  (LPBYTE)dx += dstxinc; \
+	          } \
+               (LPBYTE)d += dstyinc; \
+	    } \
+            break; }
 
-		switch (bpp) {
-		case 1: COPYROW_COLORKEY(BYTE)
-		case 2: COPYROW_COLORKEY(WORD)
-		case 4: COPYROW_COLORKEY(DWORD)
-		default:
-		    FIXME("%s color-keyed blit not implemented for bpp %d!\n",
-		    (dwFlags & DDBLT_KEYSRC) ? "Source" : "Destination", bpp*8);
-		    ret = DDERR_UNSUPPORTED;
-		    goto error;
-		}
-		dbuf += ddesc.u1.lPitch;
-	    }
-#undef COPYROW_COLORKEY
-	    dwFlags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE);
+	    switch (bpp) {
+	    case 1: COPY_COLORKEY_FX(BYTE)
+	    case 2: COPY_COLORKEY_FX(WORD)
+	    case 4: COPY_COLORKEY_FX(DWORD)
+ 	    case 3: {LPBYTE s,d = dbuf, dx;
+		for (y = sy = 0; y < dstheight; y++, sy += yinc) {
+		    sbuf = sbase + (sy >> 16) * sdesc.u1.lPitch;
+		    dx = d;
+		    for (x = sx = 0; x < dstwidth; x++, sx+= xinc) {
+			DWORD pixel;
+			s = sbuf+3*(sx>>16);
+			pixel = (s[0]<<16)|(s[1]<<8)|s[2];
+                        if (pixel < keylow || pixel > keyhigh){
+		            dx[0] = (pixel>>16)&0xff;
+			    dx[1] = (pixel>> 8)&0xff;
+			    dx[2] = (pixel    )&0xff;
+                        }
+		        dx+= dstxinc;
+		    }
+		    d += dstyinc;
+                }
+                break;}
+	    default:
+	       FIXME("%s color-keyed blit not implemented for bpp %d!\n",
+	          (dwFlags & DDBLT_KEYSRC) ? "Source" : "Destination", bpp*8);
+		  ret = DDERR_UNSUPPORTED;
+		  goto error;
+#undef COPY_COLORKEY_FX
+            }
 	}
     }
 


More information about the wine-patches mailing list