Release 980517

Sun May 17 16:23:56 1998  Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>

	* [file/profile.c]
	Fix the return value of PROFILE_GetSection

	* [misc/crtdll.c]
	Do _getdrive, fix _chdrive.

	* [misc/commdlg.c]
	First cut at ChooseColor[WA].

	* [misc/network.c]
	Do something sensible for WNetGetDirectoryType16.

Sun May 17 10:21:35 1998  Andreas Mohr <100.30936@germany.net>

	* [controls/menu.c]
	Fixed disabled sub menus with MF_BYPOSITION that were not disabled.

	* [misc/crtdll.c] [relay32/crtdll.spec] [include/winerror.h]
	Implemented fscanf, fsetpos, _access, _fpreset (thanks to Uwe Bonnes),
	and _ltoa. 

	* [loader/task.c]
	MakeProcInstance: must use CURRENT_DS if hInst == NULL.

	* [misc/shell.c]
	SHELL_GetResourceTable, InternalExtractIcon: fixed broken .ICO handling

	* [windows/winpos.c]
	DeferWindowPos: removed "same parent" requirement.
	Which doc states that this is required ?

Sat May 16 20:08:11 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [loader/module.c] [loader/ne/module.c]
	More NE module cleanups.

	* [loader/task.c]
	Fixed SwitchStackBack().

Fri May 15 10:04:27 1998  Marcus Meissner <marcus@jet.franken.de>

	* [configure.in][inlcude/acconfig.h]
	Fixed broken OSS check, added check for working sigaltstack,
	fixed broken statfs checks on some linux systems.

	* [files/directory.c][loader/pe_image.c][relay32/builtin.c]
	  [loader/module.c]
	Added handling of win32 module pathnames.

	* [relay32/wnaspi32.spec]
	New file.

	* [misc/lzexpand.c]
	LZCopy auto-decompresses LZ compressed files, even if they are not
	specially flagged. Fixes some InstallShield problems.

	* [misc/registry.c]
	Some fixes for RegQueryInfoKey (reference program monkey.exe
	from Win32 SDK works now better). Probably still has faults.

Fri May 15 08:58:58 1998  Martin Boehme <boehme@informatik.mu-luebeck.de>

	* [graphics/mapping.c] [include/dc.h] [include/gdi.h] [objects/dc.c]
	Reworked the way world transformations and mapping modes are handled
	so that both of these transformations can be computed in a single
	step.

	* [graphics/painting.c] [graphics/path.c] [include/path.h]
	More GDI path support.

	* [graphics/x11drv/graphics.c]
	Fixed the return value of GRAPH_DrawArc for the zero height /
	zero width case to reflect Windows' behaviour.

	* [include/windows.h] [relay32/gdi32.spec] [objects/dc.c]
	Implemented ModifyWorldTransform and CombineTransform.

Tue May 14 18:03:46 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [controls/commctrl.c][relay32/comctl32.spec]
	  [controls/*.c][include/*.h]
	Implemented InitCommonControlsEx (dll version 4.72 compatible).
	InitCommonControls calls ImageCommonControlsEx.
	Registering code of the common controls had to be changed
	(see XXXX_Register functions).

	* [controls/status.c][include/commctrl.h][include/status.h]
	Implemented most new features and fixed the look and feel.

	* [contols/commctrl.c][include/commctrl.h][relay32/comctl32.spec]
	Implemented MenuHelp (incomplete).

	* [controls/status.c][controls/progress.c]
	Changed allocation strategy for control specific memory.

	* [controls/header.c][include/header.h][include/commctrl.h]
	First implementation of header control.

	* [windows/defwnd.c][windows/syscolors.c]
	Fixed default control colors for Win95 look.

	* [windows/nonclient.c]
	Fixed off by one error for Win95 look. Top border of child windows
	should be visible.

	* [misc/imagelist.h]
	Improved documentation and fixed some bugs.

Thu May 14 15:42:21 1998  Robert Wilhelm  <robert@physiol.med.tu-muenchen.de>

	* [relay32/crtdll.spec]
	Added hypot,j0,j1,jn and ceil.

Wed May 13 19:10:10 1998  Pascal Cuoq <pcuoq@ens-lyon.fr>

	* [controls/listbox.c]
	Item height is now exactly font height.
	Wine listboxes now behave like Windows' when they are 
	created without WS_VSCROLL but the program subsequently 
	calls ShowScrollBar or SetScrollInfo.

Wed May 13 18:33:01 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>

	* [relay32/relay386.c]
	Restore ES also in the non-debug case.

	* [windows/event.c]
	Bugfix: Blocking TSXNextEvent could deadlock Wine.

	* [win32/process.c] [windows/message.c]
	Silly stubs for MsgWaitForMultipleObjects / PostThreadMessage
	that make some programs run better.

	* [windows/winproc.c]
	WINPROC_MapMsg32Ato16/16To32A: added WM_NOTIFY.  

        * [win32/kernel32.c]
	Added 16->32 thunking and improved 32->16 thunking functions.

	* [tools/build.c]
	Added new variant of CallFrom16 stub for use with Win95 thunks.

	* [if1632/kernel.spec] [if1632/builtin.c] [win32/kernel32.c]
	Added a few undocumented KERNEL functions.

	* [loader/ne/module.c] [loader/ne/segment.c]
	Call DllEntryPoint for 16-bit DLLs with subsystem >= 4.0.

	* [win32/kernel32.spec] [win32/wow32.spec] [win32/ordinals.c]
	Use names from the Oct 94 beta release for undoc. functions.

Wed May 13 14:18:26 1998  Matthew Becker <mbecker@glasscity.net>

	* [misc/registry.c]
	Code cleanup.

	* [misc/cpu.c]
	Commented out the registry puts temporarily.

	* [programs/regtest/*]
	New registry testing program.

Tue May 12 22:54:03 1998  Michael Mess <michael@kawo2.rwth-aachen.de>

	* [multimedia/audio.c]
	ioctl's do not commute in /dev/dsp initialization.

Tue May 12 20:11:42 1998  Karl Garrison <karlos@eznet.net>

	* [win32/console.c]
	Implemented SetConsoleTextAttribute, FillConsoleOutputCharacter.
	Improved cursor positioning.
	This allows for text colors in an xterm, rxvt, or console.

Tue May 12 17:57:52 1998  Petter Reinholdtsen <pere@td.org.uit.no>

	* [Makefile.in]
	Create prefix/{bin|lib} directories if missing during install.

Sun May 10 19:37:51 1998  Jan Willamowius <jan@janhh.shnet.org>

	* [multimedia/mmio.c]
	Have mmioSetBuffer return success (0), so Corel Draw 4
	keeps working. (IO is still unbuffered)

Wed May  6 16:57:55 1998  James Juran <jrj120@psu.edu>

        * [Makefile.in] [Make.rules.in]
	Changed "make clean" to remove `textedit` backup files (*%)

	* [controls/menu.c][graphics/x11drv/xfont.c][include/libres.h]
	  [loader/main.c][loader/ne/module.c][scheduler/synchro.c]
	  [win32/time.c][windows/winpos.c][include/windows.h]
	Fixed miscellaneous compilation warnings.

	* [misc/main.c][miscemu/main.c][include/main.h]
	Moved prototypes to new include file main.h, various cleanups.

Tue May  5 21:05:06 1998  Morten Welinder  <terra@diku.dk>

	* [misc/winsock.c]
	Don't refer to __FreeBSD__ when HAVE_STRERROR is meant.

	* [misc/debugstr.c]
	For debug_dumpstrSend, send strings to stderr.

Tue May  5 21:47:40 1998  Huw D M Davies <h.davies1@physics.oxford.ac.uk>

	* [objects/region.c]
	Fix for REGION_RegionOp() if newReg is one of the source regions.

Tue May  5 18:27:32 1998  Jim Peterson <jspeter@roanoke.infi.net>

	* [misc/main.c]
	Add '-h/-help' option and print WINE_RELEASE_INFO with usage message.

	* [misc/spy.c]
	Realign trace messages.

Tue May  5 15:46:47 1998  Donnie V. Savage <dsavage@cisco.com>

	* [graphics/ddraw.c]
	Fixed compile warnings

	* [misc/winsock.c]
	Warnings should not be errors.

Tue May  5 13:40:42 1998  Jim Peterson <jspeter@roanoke.infi.net>

	* [*/*]
	Remove many warnings through explicit casts, added #include's,
	and corrected printf formats.

Tue May  5 05:18:12 1998  Insomnia (Stea Greene) <insomnia@core.binghamton.edu>

	* [graphics/ddraw.c]
	Kept unchanged portion of old palette when changing only a few
	palette entries.  Really should only deallocate the changed cells.
	This make StarCraft work almost perfectly (sound overflows still
	cause static).

Mon May  4 15:04:57 1998  Alexander V. Lukyanov <lav@long.yar.ru>

	* [misc/lstr.c]
	FormatMessage: terminate string on %0, undo linefeed strip.
diff --git a/graphics/path.c b/graphics/path.c
index a795af8..b68d286 100644
--- a/graphics/path.c
+++ b/graphics/path.c
@@ -62,15 +62,16 @@
 static BOOL32 PATH_PathToRegion(const GdiPath *pPath, INT32 nPolyFillMode,
    HRGN32 *pHrgn);
 static void   PATH_EmptyPath(GdiPath *pPath);
-static BOOL32 PATH_AddEntry(GdiPath *pPath, POINT32 point, BYTE flags);
+static BOOL32 PATH_AddEntry(GdiPath *pPath, const POINT32 *pPoint,
+   BYTE flags);
 static BOOL32 PATH_ReserveEntries(GdiPath *pPath, INT32 numEntries);
 static BOOL32 PATH_GetPathFromHDC(HDC32 hdc, GdiPath **ppPath);
-static BOOL32 PATH_DoArcPart(GdiPath *pPath, POINT32 corners[],
+static BOOL32 PATH_DoArcPart(GdiPath *pPath, FLOAT_POINT corners[],
    double angleStart, double angleEnd, BOOL32 addMoveTo);
-static void PATH_ScaleNormalizedPoint(POINT32 corners[], double x, double y,
-   POINT32 *pPoint);
-static void PATH_NormalizePoint(POINT32 corners[], const POINT32 *pPoint,
-   double *pX, double *pY);
+static void PATH_ScaleNormalizedPoint(FLOAT_POINT corners[], double x,
+   double y, POINT32 *pPoint);
+static void PATH_NormalizePoint(FLOAT_POINT corners[], const FLOAT_POINT
+   *pPoint, double *pX, double *pY);
 
 
 /***********************************************************************
@@ -218,6 +219,8 @@
       return FALSE;
    }
    
+   /* FIXME: Shouldn't we draw a line to the beginning of the figure? */
+   
    /* Set PT_CLOSEFIGURE on the last entry and start a new stroke */
    if(pPath->numEntriesUsed)
    {
@@ -436,7 +439,7 @@
    if(PATH_PathToRegion(pPath, GetPolyFillMode32(hdc), &hrgnPath))
    {
       hrgnClip=CreateRectRgn32(0, 0, 0, 0);
-      if(hrgnClip==NULL)
+      if(hrgnClip==(HRGN32)0)
          success=FALSE;
       else
       {
@@ -564,7 +567,6 @@
    
    /* Check that path is open */
    if(pPath->state!=PATH_Open)
-      /* FIXME: Do we have to call SetLastError? */
       return FALSE;
 
    /* Convert point to device coordinates */
@@ -580,12 +582,93 @@
       if(!GetCurrentPositionEx32(hdc, &pointCurPos) ||
          !LPtoDP32(hdc, &pointCurPos, 1))
          return FALSE;
-      if(!PATH_AddEntry(pPath, pointCurPos, PT_MOVETO))
+      if(!PATH_AddEntry(pPath, &pointCurPos, PT_MOVETO))
          return FALSE;
    }
    
    /* Add a PT_LINETO entry */
-   return PATH_AddEntry(pPath, point, PT_LINETO);
+   return PATH_AddEntry(pPath, &point, PT_LINETO);
+}
+
+/* PATH_Rectangle
+ *
+ * Should be called when a call to Rectangle is performed on a DC that has
+ * an open path. Returns TRUE if successful, else FALSE.
+ */
+BOOL32 PATH_Rectangle(HDC32 hdc, INT32 x1, INT32 y1, INT32 x2, INT32 y2)
+{
+   GdiPath *pPath;
+   POINT32 corners[2], pointTemp;
+   INT32   temp;
+
+   /* Get pointer to path */
+   if(!PATH_GetPathFromHDC(hdc, &pPath))
+      return FALSE;
+   
+   /* Check that path is open */
+   if(pPath->state!=PATH_Open)
+      return FALSE;
+
+   /* Convert points to device coordinates */
+   corners[0].x=x1;
+   corners[0].y=y1;
+   corners[1].x=x2;
+   corners[1].y=y2;
+   if(!LPtoDP32(hdc, corners, 2))
+      return FALSE;
+   
+   /* Make sure first corner is top left and second corner is bottom right */
+   if(corners[0].x>corners[1].x)
+   {
+      temp=corners[0].x;
+      corners[0].x=corners[1].x;
+      corners[1].x=temp;
+   }
+   if(corners[0].y>corners[1].y)
+   {
+      temp=corners[0].y;
+      corners[0].y=corners[1].y;
+      corners[1].y=temp;
+   }
+   
+   /* In GM_COMPATIBLE, don't include bottom and right edges */
+   if(GetGraphicsMode(hdc)==GM_COMPATIBLE)
+   {
+      corners[1].x--;
+      corners[1].y--;
+   }
+
+   /* Close any previous figure */
+   if(!CloseFigure32(hdc))
+   {
+      /* The CloseFigure call shouldn't have failed */
+      assert(FALSE);
+      return FALSE;
+   }
+
+   /* Add four points to the path */
+   pointTemp.x=corners[1].x;
+   pointTemp.y=corners[0].y;
+   if(!PATH_AddEntry(pPath, &pointTemp, PT_MOVETO))
+      return FALSE;
+   if(!PATH_AddEntry(pPath, corners, PT_LINETO))
+      return FALSE;
+   pointTemp.x=corners[0].x;
+   pointTemp.y=corners[1].y;
+   if(!PATH_AddEntry(pPath, &pointTemp, PT_LINETO))
+      return FALSE;
+   if(!PATH_AddEntry(pPath, corners+1, PT_LINETO))
+      return FALSE;
+
+   /* Close the rectangle figure */
+   if(!CloseFigure32(hdc))
+   {
+      /* The CloseFigure call shouldn't have failed */
+      assert(FALSE);
+      return FALSE;
+   }
+
+   return TRUE;
 }
 
 /* PATH_Ellipse
@@ -596,7 +679,9 @@
  */
 BOOL32 PATH_Ellipse(HDC32 hdc, INT32 x1, INT32 y1, INT32 x2, INT32 y2)
 {
-   return PATH_Arc(hdc, x1, y1, x2, y2, x1, 0, x1, 0);
+   // TODO: This should probably be revised to call PATH_AngleArc
+   // (once it exists)
+   return PATH_Arc(hdc, x1, y1, x2, y2, x1, (y1+y2)/2, x1, (y1+y2)/2);
 }
 
 /* PATH_Arc
@@ -608,16 +693,23 @@
 BOOL32 PATH_Arc(HDC32 hdc, INT32 x1, INT32 y1, INT32 x2, INT32 y2,
    INT32 xStart, INT32 yStart, INT32 xEnd, INT32 yEnd)
 {
-   GdiPath *pPath;
-   double  angleStart, angleEnd, angleStartQuadrant, angleEndQuadrant=0.0;
-           /* Initialize angleEndQuadrant to silence gcc's warning */
-   double  x, y;
-   POINT32 corners[2], pointStart, pointEnd;
-   BOOL32  start, end;
-   INT32   temp;
+   GdiPath     *pPath;
+   DC          *pDC;
+   double      angleStart, angleEnd, angleStartQuadrant, angleEndQuadrant=0.0;
+               /* Initialize angleEndQuadrant to silence gcc's warning */
+   double      x, y;
+   FLOAT_POINT corners[2], pointStart, pointEnd;
+   BOOL32      start, end;
+   INT32       temp;
 
    /* FIXME: This function should check for all possible error returns */
+   /* FIXME: Do we have to respect newStroke? */
    
+   /* Get pointer to DC */
+   pDC=DC_GetDCPtr(hdc);
+   if(pDC==NULL)
+      return FALSE;
+
    /* Get pointer to path */
    if(!PATH_GetPathFromHDC(hdc, &pPath))
       return FALSE;
@@ -626,34 +718,28 @@
    if(pPath->state!=PATH_Open)
       return FALSE;
 
+   /* FIXME: Do we have to close the current figure? */
+   
    /* Check for zero height / width */
-   /* FIXME: Should we do this before or after LPtoDP? */
+   /* FIXME: Only in GM_COMPATIBLE? */
    if(x1==x2 || y1==y2)
       return TRUE;
    
-   /* In GM_COMPATIBLE, don't include bottom and right edges */
-   if(GetGraphicsMode(hdc)==GM_COMPATIBLE)
-   {
-      /* FIXME: Should we do this before or after LPtoDP? */
-      x2--;
-      y2--;
-   }
-
    /* Convert points to device coordinates */
-   corners[0].x=x1;
-   corners[0].y=y1;
-   corners[1].x=x2;
-   corners[1].y=y2;
-   pointStart.x=xStart;
-   pointStart.y=yStart;
-   pointEnd.x=xEnd;
-   pointEnd.y=yEnd;
-   if(!LPtoDP32(hdc, corners, 2) || !LPtoDP32(hdc, &pointStart, 1) ||
-      !LPtoDP32(hdc, &pointEnd, 1))
-      return FALSE;
+   corners[0].x=(FLOAT)x1;
+   corners[0].y=(FLOAT)y1;
+   corners[1].x=(FLOAT)x2;
+   corners[1].y=(FLOAT)y2;
+   pointStart.x=(FLOAT)xStart;
+   pointStart.y=(FLOAT)yStart;
+   pointEnd.x=(FLOAT)xEnd;
+   pointEnd.y=(FLOAT)yEnd;
+   INTERNAL_LPTODP_FLOAT(pDC, corners);
+   INTERNAL_LPTODP_FLOAT(pDC, corners+1);
+   INTERNAL_LPTODP_FLOAT(pDC, &pointStart);
+   INTERNAL_LPTODP_FLOAT(pDC, &pointEnd);
 
-   /* Make sure first corner is top left and right corner is bottom right */
-   /* FIXME: Should we do this before or after LPtoDP? */
+   /* Make sure first corner is top left and second corner is bottom right */
    if(corners[0].x>corners[1].x)
    {
       temp=corners[0].x;
@@ -691,6 +777,13 @@
       }
    }
 
+   /* In GM_COMPATIBLE, don't include bottom and right edges */
+   if(GetGraphicsMode(hdc)==GM_COMPATIBLE)
+   {
+      corners[1].x--;
+      corners[1].y--;
+   }
+   
    /* Add the arc to the path with one Bezier spline per quadrant that the
     * arc spans */
    start=TRUE;
@@ -717,9 +810,9 @@
 
       /* Have we reached the last part of the arc? */
       if((GetArcDirection32(hdc)==AD_CLOCKWISE &&
-         angleEnd<=angleEndQuadrant) ||
+         angleEnd<angleEndQuadrant) ||
 	 (GetArcDirection32(hdc)==AD_COUNTERCLOCKWISE &&
-	 angleEnd>=angleEndQuadrant))
+	 angleEnd>angleEndQuadrant))
       {
 	 /* Adjust the end angle for this quadrant */
          angleEndQuadrant=angleEnd;
@@ -791,7 +884,7 @@
    /* Create a region from the strokes */
    hrgn=CreatePolyPolygonRgn32(pPath->pPoints, pNumPointsInStroke,
       numStrokes, nPolyFillMode);
-   if(hrgn==NULL)
+   if(hrgn==(HRGN32)0)
    {
       SetLastError(ERROR_NOT_ENOUGH_MEMORY);
       return FALSE;
@@ -823,10 +916,14 @@
  * or PT_BEZIERTO, optionally ORed with PT_CLOSEFIGURE. Returns TRUE if
  * successful, FALSE otherwise (e.g. if not enough memory was available).
  */
-BOOL32 PATH_AddEntry(GdiPath *pPath, POINT32 point, BYTE flags)
+BOOL32 PATH_AddEntry(GdiPath *pPath, const POINT32 *pPoint, BYTE flags)
 {
    assert(pPath!=NULL);
    
+   /* FIXME: If newStroke is true, perhaps we want to check that we're
+    * getting a PT_MOVETO
+    */
+
    /* Check that path is open */
    if(pPath->state!=PATH_Open)
       return FALSE;
@@ -836,9 +933,13 @@
       return FALSE;
 
    /* Store information in path entry */
-   pPath->pPoints[pPath->numEntriesUsed]=point;
+   pPath->pPoints[pPath->numEntriesUsed]=*pPoint;
    pPath->pFlags[pPath->numEntriesUsed]=flags;
 
+   /* If this is PT_CLOSEFIGURE, we have to start a new stroke next time */
+   if((flags & PT_CLOSEFIGURE) == PT_CLOSEFIGURE)
+      pPath->newStroke=TRUE;
+
    /* Increment entry count */
    pPath->numEntriesUsed++;
 
@@ -936,7 +1037,7 @@
  * point is added to the path; otherwise, it is assumed that the current
  * position is equal to the first control point.
  */
-static BOOL32 PATH_DoArcPart(GdiPath *pPath, POINT32 corners[],
+static BOOL32 PATH_DoArcPart(GdiPath *pPath, FLOAT_POINT corners[],
    double angleStart, double angleEnd, BOOL32 addMoveTo)
 {
    double  halfAngle, a;
@@ -950,21 +1051,30 @@
 
    /* Compute control points */
    halfAngle=(angleEnd-angleStart)/2.0;
-   a=4.0/3.0*(1-cos(halfAngle))/sin(halfAngle);
-   xNorm[0]=cos(angleStart);
-   yNorm[0]=sin(angleStart);
-   xNorm[1]=xNorm[0] - a*yNorm[0];
-   yNorm[1]=yNorm[0] + a*xNorm[0];
-   xNorm[3]=cos(angleEnd);
-   yNorm[3]=sin(angleEnd);
-   xNorm[2]=xNorm[3] + a*yNorm[3];
-   yNorm[2]=yNorm[3] - a*xNorm[3];
+   if(fabs(halfAngle)>1e-8)
+   {
+      a=4.0/3.0*(1-cos(halfAngle))/sin(halfAngle);
+      xNorm[0]=cos(angleStart);
+      yNorm[0]=sin(angleStart);
+      xNorm[1]=xNorm[0] - a*yNorm[0];
+      yNorm[1]=yNorm[0] + a*xNorm[0];
+      xNorm[3]=cos(angleEnd);
+      yNorm[3]=sin(angleEnd);
+      xNorm[2]=xNorm[3] + a*yNorm[3];
+      yNorm[2]=yNorm[3] - a*xNorm[3];
+   }
+   else
+      for(i=0; i<4; i++)
+      {
+	 xNorm[i]=cos(angleStart);
+	 yNorm[i]=sin(angleStart);
+      }
    
    /* Add starting point to path if desired */
    if(addMoveTo)
    {
       PATH_ScaleNormalizedPoint(corners, xNorm[0], yNorm[0], &point);
-      if(!PATH_AddEntry(pPath, point, PT_MOVETO))
+      if(!PATH_AddEntry(pPath, &point, PT_MOVETO))
          return FALSE;
    }
 
@@ -972,7 +1082,7 @@
    for(i=1; i<4; i++)
    {
       PATH_ScaleNormalizedPoint(corners, xNorm[i], yNorm[i], &point);
-      if(!PATH_AddEntry(pPath, point, PT_BEZIERTO))
+      if(!PATH_AddEntry(pPath, &point, PT_BEZIERTO))
          return FALSE;
    }
 
@@ -986,12 +1096,12 @@
  * coordinates (-1.0, -1.0) correspond to corners[0], the coordinates
  * (1.0, 1.0) correspond to corners[1].
  */
-static void PATH_ScaleNormalizedPoint(POINT32 corners[], double x, double y,
-   POINT32 *pPoint)
+static void PATH_ScaleNormalizedPoint(FLOAT_POINT corners[], double x,
+   double y, POINT32 *pPoint)
 {
-   pPoint->x=(INT32)floor( (double)corners[0].x +
+   pPoint->x=GDI_ROUND( (double)corners[0].x +
       (double)(corners[1].x-corners[0].x)*0.5*(x+1.0) );
-   pPoint->y=(INT32)floor( (double)corners[0].y +
+   pPoint->y=GDI_ROUND( (double)corners[0].y +
       (double)(corners[1].y-corners[0].y)*0.5*(y+1.0) );
 }
 
@@ -1000,7 +1110,8 @@
  * Normalizes a point with respect to the box whose corners are passed in
  * "corners". The normalized coordinates are stored in "*pX" and "*pY".
  */
-static void PATH_NormalizePoint(POINT32 corners[], const POINT32 *pPoint,
+static void PATH_NormalizePoint(FLOAT_POINT corners[],
+   const FLOAT_POINT *pPoint,
    double *pX, double *pY)
 {
    *pX=(double)(pPoint->x-corners[0].x)/(double)(corners[1].x-corners[0].x) *