Alexandre Julliard : gdi32: Specify an initial allocation size for paths to avoid some reallocations.
Alexandre Julliard
julliard at winehq.org
Wed Nov 23 13:40:06 CST 2011
Module: wine
Branch: master
Commit: 79691e7afa5dfe2423f12bb47401736ea8ae9777
URL: http://source.winehq.org/git/wine.git/?a=commit;h=79691e7afa5dfe2423f12bb47401736ea8ae9777
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Nov 23 14:00:22 2011 +0100
gdi32: Specify an initial allocation size for paths to avoid some reallocations.
---
dlls/gdi32/path.c | 21 +++++++++++----------
1 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c
index 51354df..4d753fd 100644
--- a/dlls/gdi32/path.c
+++ b/dlls/gdi32/path.c
@@ -125,7 +125,7 @@ void free_gdi_path( struct gdi_path *path )
HeapFree( GetProcessHeap(), 0, path );
}
-static struct gdi_path *alloc_gdi_path(void)
+static struct gdi_path *alloc_gdi_path( int count )
{
struct gdi_path *path = HeapAlloc( GetProcessHeap(), 0, sizeof(*path) );
@@ -134,8 +134,9 @@ static struct gdi_path *alloc_gdi_path(void)
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return NULL;
}
- path->points = HeapAlloc( GetProcessHeap(), 0, NUM_ENTRIES_INITIAL * sizeof(*path->points) );
- path->flags = HeapAlloc( GetProcessHeap(), 0, NUM_ENTRIES_INITIAL * sizeof(*path->flags) );
+ count = max( NUM_ENTRIES_INITIAL, count );
+ path->points = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*path->points) );
+ path->flags = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*path->flags) );
if (!path->points || !path->flags)
{
free_gdi_path( path );
@@ -143,7 +144,7 @@ static struct gdi_path *alloc_gdi_path(void)
return NULL;
}
path->count = 0;
- path->allocated = NUM_ENTRIES_INITIAL;
+ path->allocated = count;
path->newStroke = TRUE;
return path;
}
@@ -352,7 +353,7 @@ static struct gdi_path *PATH_FlattenPath(const struct gdi_path *pPath)
struct gdi_path *new_path;
INT srcpt;
- if (!(new_path = alloc_gdi_path())) return NULL;
+ if (!(new_path = alloc_gdi_path( pPath->count ))) return NULL;
for(srcpt = 0; srcpt < pPath->count; srcpt++) {
switch(pPath->flags[srcpt] & ~PT_CLOSEFIGURE) {
@@ -1810,7 +1811,7 @@ static struct gdi_path *PATH_WidenPath(DC *dc)
else
pStrokes = HeapReAlloc(GetProcessHeap(), 0, pStrokes, numStrokes * sizeof(*pStrokes));
if(!pStrokes) return NULL;
- pStrokes[numStrokes - 1] = alloc_gdi_path();
+ pStrokes[numStrokes - 1] = alloc_gdi_path(0);
/* fall through */
case PT_LINETO:
case (PT_LINETO | PT_CLOSEFIGURE):
@@ -1828,11 +1829,11 @@ static struct gdi_path *PATH_WidenPath(DC *dc)
}
}
- pNewPath = alloc_gdi_path();
+ pNewPath = alloc_gdi_path( flat_path->count );
for(i = 0; i < numStrokes; i++) {
- pUpPath = alloc_gdi_path();
- pDownPath = alloc_gdi_path();
+ pUpPath = alloc_gdi_path( pStrokes[i]->count );
+ pDownPath = alloc_gdi_path( pStrokes[i]->count );
for(j = 0; j < pStrokes[i]->count; j++) {
/* Beginning or end of the path if not closed */
@@ -2094,7 +2095,7 @@ BOOL nulldrv_BeginPath( PHYSDEV dev )
{
DC *dc = get_nulldrv_dc( dev );
struct path_physdev *physdev;
- struct gdi_path *path = alloc_gdi_path();
+ struct gdi_path *path = alloc_gdi_path(0);
if (!path) return FALSE;
if (!path_driver.pCreateDC( &dc->physDev, NULL, NULL, NULL, NULL ))
More information about the wine-cvs
mailing list