Alexandre Julliard : gdi32: Use reallocs when growing a path instead of doing it by hand.

Alexandre Julliard julliard at winehq.org
Tue Nov 22 13:06:42 CST 2011


Module: wine
Branch: master
Commit: 26b1bfa52b982a943c1f4549209e7ee6c4f22419
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=26b1bfa52b982a943c1f4549209e7ee6c4f22419

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov 22 11:22:36 2011 +0100

gdi32: Use reallocs when growing a path instead of doing it by hand.

---

 dlls/gdi32/path.c |   58 ++++++++++++----------------------------------------
 1 files changed, 14 insertions(+), 44 deletions(-)

diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c
index dfe15ed..6cf92df 100644
--- a/dlls/gdi32/path.c
+++ b/dlls/gdi32/path.c
@@ -74,8 +74,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdi);
  */
 
 #define NUM_ENTRIES_INITIAL 16  /* Initial size of points / flags arrays  */
-#define GROW_FACTOR_NUMER    2  /* Numerator of grow factor for the array */
-#define GROW_FACTOR_DENOM    1  /* Denominator of grow factor             */
 
 /* A floating point version of the POINT structure */
 typedef struct tagFLOAT_POINT
@@ -144,59 +142,31 @@ static void PATH_EmptyPath(GdiPath *pPath)
  * been allocated; allocates larger arrays and copies the existing entries
  * to those arrays, if necessary. Returns TRUE if successful, else FALSE.
  */
-static BOOL PATH_ReserveEntries(GdiPath *pPath, INT numEntries)
+static BOOL PATH_ReserveEntries(GdiPath *pPath, INT count)
 {
-    INT   numEntriesToAllocate;
     POINT *pPointsNew;
     BYTE    *pFlagsNew;
 
-    assert(numEntries>=0);
+    assert(count>=0);
 
     /* Do we have to allocate more memory? */
-    if(numEntries > pPath->numEntriesAllocated)
+    if(count > pPath->numEntriesAllocated)
     {
         /* Find number of entries to allocate. We let the size of the array
          * grow exponentially, since that will guarantee linear time
          * complexity. */
-        if(pPath->numEntriesAllocated)
-        {
-            numEntriesToAllocate=pPath->numEntriesAllocated;
-            while(numEntriesToAllocate<numEntries)
-                numEntriesToAllocate=numEntriesToAllocate*GROW_FACTOR_NUMER/
-                    GROW_FACTOR_DENOM;
-        }
-        else
-            numEntriesToAllocate=numEntries;
+        count = max( pPath->numEntriesAllocated * 2, count );
 
-        /* Allocate new arrays */
-        pPointsNew=HeapAlloc( GetProcessHeap(), 0, numEntriesToAllocate * sizeof(POINT) );
-        if(!pPointsNew)
-            return FALSE;
-        pFlagsNew=HeapAlloc( GetProcessHeap(), 0, numEntriesToAllocate * sizeof(BYTE) );
-        if(!pFlagsNew)
-        {
-            HeapFree( GetProcessHeap(), 0, pPointsNew );
-            return FALSE;
-        }
-
-        /* Copy old arrays to new arrays and discard old arrays */
-        if(pPath->pPoints)
-        {
-            assert(pPath->pFlags);
+        pPointsNew = HeapReAlloc( GetProcessHeap(), 0, pPath->pPoints, count * sizeof(POINT) );
+        if (!pPointsNew) return FALSE;
+        pPath->pPoints = pPointsNew;
 
-            memcpy(pPointsNew, pPath->pPoints,
-                   sizeof(POINT)*pPath->numEntriesUsed);
-            memcpy(pFlagsNew, pPath->pFlags,
-                   sizeof(BYTE)*pPath->numEntriesUsed);
+        pFlagsNew = HeapReAlloc( GetProcessHeap(), 0, pPath->pFlags, count * sizeof(BYTE) );
+        if (!pFlagsNew) return FALSE;
+        pPath->pFlags = pFlagsNew;
 
-            HeapFree( GetProcessHeap(), 0, pPath->pPoints );
-            HeapFree( GetProcessHeap(), 0, pPath->pFlags );
-        }
-        pPath->pPoints=pPointsNew;
-        pPath->pFlags=pFlagsNew;
-        pPath->numEntriesAllocated=numEntriesToAllocate;
+        pPath->numEntriesAllocated = count;
     }
-
     return TRUE;
 }
 




More information about the wine-cvs mailing list