Inclusion to CVS

Jarmo <[email protected]>
Newsgroups gmane.comp.emulators.winex.devel
Message-ID <[email protected]>
QUESTIONs:

When I compile source code debuging messages won't appear anymore.
I have read from documentation about debuging channels but that won't help.
I can turn-on and disable channels with --debugmsg and I tried make_debug 
script without success.

DXT decompression code is removed from source distribution, is that correct ?


New functions to be added in CVS ddraw/d3ddevice/main.c
-------------------------------------------------------

/*
  This code can be distributed under X11 License
  (c) 2003 Jarmo Nikkanen

  ComputeSphereVisibility
  calculates the visibility of an array of spheres within the viewport.
  sphere can be fully, non or partially visible.

  Parameters:
  lpCenters, Array of D3DVECTOR structures containing center point for each 			 
sphere, in world-space coordinates
  lpRadius, Array of D3DVALUE variables representing the radius for each 
sphere.
  dwNumSpheres, Number of spheres.
  dwFlags, Unknown.
  lpdwReturnValues, Array of DWORD values the visibility of each sphere within 
the viewport
*/


HRESULT WINAPI
Main_Direct3DDevice_ComputeSphereVisibility(LPDIRECT3DDEVICE7 iface, 
LPD3DVECTOR lpCenters,
              LPD3DVALUE  lpRadius, DWORD dwSpheres, DWORD dwFlags,LPDWORD 
lpdwReturnValues)
{
    // This is quick implementation. All spheres are fully visible.
    // Should be computed more accurately to improve performance

    FIXME("Not fully implemented");

    while(dwSpheres) {
      dwSpheres--;
      lpdwReturnValues[dwSpheres] = D3DVIS_INSIDE_FRUSTUM;
    }

    return D3D_OK;
}



static HRESULT WINAPI
Main_Direct3DDevice3_ComputeSphereVisibility(LPDIRECT3DDEVICE3 iface, 
LPD3DVECTOR lpCenters,
              LPD3DVALUE  lpRadius, DWORD dwSpheres, DWORD dwFlags,LPDWORD 
lpdwReturnValues)
{
     return 
IDirect3DDevice7_ComputeSphereVisibility(CONVERT7(iface),lpCenters,
     lpRadius,dwSpheres,dwFlags,lpdwReturnValues);
}




-------------------------------------------------------------------------------------




I have fixed one bug in this code and I am tracking an other one. Some 
graphics appears incorrectly most likely in a cases where dwWidth*bpp and 
lPitch are not equal. It seems that some code is using dwWidth*bpp instead of 
lPitch. I tried to use dwWidth*bpp in DIB_DirectDrawSurface_BltFast after 
that all graphics appears correctly but dwWidth*bpp is wrong.
There is also new clipping function that prevents atleast one crash in a 
software I am running.

I haven't tested this with any other software.


/* BltBatch: generic, unimplemented */

HRESULT WINAPI
DIB_DirectDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface, DWORD dstx,
			      DWORD dsty, LPDIRECTDRAWSURFACE7 src,
			      LPRECT rsrc, DWORD trans)
{
    ICOM_THIS(IDirectDrawSurfaceImpl,iface);
    int			bpp, w, h, x=0, y=0;
    DDSURFACEDESC2	ddesc,sdesc;
    HRESULT		ret = DD_OK;
    LPBYTE		sbuf, dbuf;
    RECT		rsrc2;


    if (TRACE_ON(ddraw)) {
	FIXME("(%p)->(%ld,%ld,%p,%p,%08lx)\n",
		This,dstx,dsty,src,rsrc,trans
	);
	FIXME("	trans:");
	if (FIXME_ON(ddraw))
	  DDRAW_dump_DDBLTFAST(trans);
	if (rsrc)
	  FIXME("\tsrcrect: 
%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
	else
	  FIXME(" srcrect: NULL\n");
    }


    /* We need to lock the surfaces, or we won't get refreshes when done. */
    sdesc.dwSize = sizeof(sdesc);
    IDirectDrawSurface7_Lock(src, NULL,&sdesc,DDLOCK_READONLY, 0);

    ddesc.dwSize = sizeof(ddesc);
    IDirectDrawSurface7_Lock(iface,NULL,&ddesc,DDLOCK_WRITEONLY,0);


    
    // PROCESS COMPRESSED SURFACES
    if (sdesc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC)
    {
       if (ddesc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC) {
           if (sdesc.u4.ddpfPixelFormat.dwFourCC == 
ddesc.u4.ddpfPixelFormat.dwFourCC &&
               sdesc.u1.dwLinearSize == ddesc.u1.dwLinearSize) {
               TRACE("compressed-surface copy (%ld bytes)\n", 
ddesc.u1.dwLinearSize);
               memcpy(ddesc.lpSurface, sdesc.lpSurface, 
ddesc.u1.dwLinearSize);
           } else {
               FIXME("trying to decompress %4.4s surface to %4.4s surface\n", 
(char*)&sdesc.u4.ddpfPixelFormat.dwFourCC,
                                                                              
(char*)&ddesc.u4.ddpfPixelFormat.dwFourCC);
           }
       } else {
           FIXME("software-decompression of %4.4s surface not 
supported\n",(char*)&sdesc.u4.ddpfPixelFormat.dwFourCC);
           /* most compression algorithms are patented, which limits source 
distribution...
            * patented software decompressors will only be available in the 
WineX binaries */
           /* here, we'll just clear the destination surface */
           memset(ddesc.lpSurface, 0, ddesc.u1.lPitch * ddesc.dwHeight);
       }
       goto release;
   }


    //Setup source rect if not defined
    if (!rsrc) {
	   WARN("rsrc is NULL!\n");
	   rsrc = &rsrc2;
	   rsrc->left = rsrc->top = 0;
	   rsrc->right = sdesc.dwWidth;
	   rsrc->bottom = sdesc.dwHeight;
    }


    //CLIPING CODE for source and destination. Everyting is cliped
    //rsrc, dsty, dstx values can be anything.
     
    int ix,iy,srcx,srcy;
    h=rsrc->bottom-rsrc->top;
    w=rsrc->right-rsrc->left;
    srcx=rsrc->left;
    srcy=rsrc->top;
  
    ix=dstx+w;
    iy=dsty+h;

    if (ix<=0 || iy<=0 || dstx>=ddesc.dwWidth || dsty>=ddesc.dwHeight) goto 
release;

    if (x<0) srcx-=dstx,dstx=0;
    if (y<0) srcy-=dsty,dsty=0;
    if (ix>ddesc.dwWidth) ix=ddesc.dwWidth;
    if (iy>ddesc.dwHeight) iy=ddesc.dwHeight;

    ix=srcx+(ix-dstx);
    iy=srcy+(iy-dsty);

    if (ix<=0 || iy<=0 || srcx>=sdesc.dwWidth || srcy>=sdesc.dwHeight) goto 
release;

    if (srcx<0) dstx-=srcx,srcx=0;
    if (srcy<0) dsty-=srcy,srcy=0;
    if (ix>sdesc.dwWidth) ix=sdesc.dwWidth;
    if (iy>sdesc.dwHeight) iy=sdesc.dwHeight;
    
    w=ix-srcx;
    h=iy-srcy;

    // new values initialized in w, h, dstx ,dsty, srcx, srcy. rsrc is not 
modified.
    // Cliping code ends
    

                                            
    bpp = GET_BPP(This->surface_desc);
    sbuf = (BYTE *)sdesc.lpSurface+(srcy*sdesc.u1.lPitch)+(srcx*bpp);
    dbuf = (BYTE *)ddesc.lpSurface+(dsty*ddesc.u1.lPitch)+(dstx*bpp);


 // Setup ColorKeys
 if (trans & (DDBLTFAST_SRCCOLORKEY | DDBLTFAST_DESTCOLORKEY)) {
 	DWORD keylow, keyhigh;
 	if (trans & DDBLTFAST_SRCCOLORKEY) {
 	    keylow  = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue;
 	    keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue;
 	} else {
 	    /* I'm not sure if this is correct */
 	    FIXME("DDBLTFAST_DESTCOLORKEY not fully supported yet.\n");
 	    keylow  = ddesc.ddckCKDestBlt.dwColorSpaceLowValue;
 	    keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue;
 }
  

#define COPYBOX_COLORKEY(type) { \
    type *d = (type *)dbuf, *s = (type *)sbuf, tmp; \
    for (y = 0; y < h; y++) { \
	  for (x = 0; x < w; x++) { \
	    tmp = s[x]; \
	    if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \
	  } \
	  (BYTE *)s += sdesc.u1.lPitch; \
	  (BYTE *)d += ddesc.u1.lPitch; \
    } \
    break; \
}


  	switch (bpp) {
  	case 1: COPYBOX_COLORKEY(BYTE)
  	case 2: COPYBOX_COLORKEY(WORD)
  	case 4: COPYBOX_COLORKEY(DWORD)
  	default:
  	    FIXME("Source color key blitting not supported for bpp %d\n",bpp*8);
  	    ret = DDERR_UNSUPPORTED;
  	    goto error;
  	}
     

#undef COPYBOX_COLORKEY

  }
  else {  // CopyOP Without ColorKey

	int width = w * bpp;

	LONG spitch = sdesc.u1.lPitch;
	LONG dpitch = ddesc.u1.lPitch; 

  	//LONG spitch = sdesc.dwWidth*bpp; // This works fine but it is wrong.
	//LONG dpitch = ddesc.dwWidth*bpp; // It seems that something else is using 
dwWidth instead of lPitch


	/* Detect self-copies and ensure that we copy rows in the
	 * right order to avoid overwriting a that is still needed.
	 * (memmove is used to ensure that the pixels in a row are
	 * copied in the right order.) */

	if (src == iface && srcy < dsty)
	{
	    LPBYTE surf = (BYTE*)sdesc.lpSurface;
	    sbuf = surf + ((srcy+h)-1)*spitch + srcx*bpp;
	    dbuf = surf + ((dsty+h)-1)*dpitch + dstx*bpp;

	    spitch = -spitch;
	    dpitch = -dpitch;
	}
    
	for (y = 0; y < h; y++) {
	    memmove(dbuf, sbuf, width);
	    sbuf += spitch;
	    dbuf += dpitch;
	}

  }

error:
release:
    IDirectDrawSurface7_Unlock(iface, NULL);
    IDirectDrawSurface7_Unlock(src, NULL);
    return ret;
}


------------------------------------------------------------

Regards,
Jarmo



-------------------------------------------------------
This SF.NET email is sponsored by: eBay
Great deals on office technology -- on eBay now! Click here:
http://adfarm.mediaplex.com/ad/ck/711-11697-6916-5
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.