From a4a739eb58f70368ef87c195ea77629c1526e71f Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Mon, 8 Sep 2008 22:56:38 +0900 Subject: util: Allow to define the maximum file size. This avoids splitting the bitmaps in many files. --- src/gallium/auxiliary/util/p_debug.c | 2 +- src/gallium/auxiliary/util/u_stream.h | 7 ++++- src/gallium/auxiliary/util/u_stream_stdc.c | 4 ++- src/gallium/auxiliary/util/u_stream_wd.c | 43 +++++++++++++++++++++--------- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/gallium/auxiliary/util/p_debug.c b/src/gallium/auxiliary/util/p_debug.c index 131e9b026c4..b6cff281e6d 100644 --- a/src/gallium/auxiliary/util/p_debug.c +++ b/src/gallium/auxiliary/util/p_debug.c @@ -657,7 +657,7 @@ debug_dump_surface_bmp(const char *filename, bmih.biClrUsed = 0; bmih.biClrImportant = 0; - stream = util_stream_create(filename); + stream = util_stream_create(filename, bmfh.bfSize); if(!stream) goto error2; diff --git a/src/gallium/auxiliary/util/u_stream.h b/src/gallium/auxiliary/util/u_stream.h index 516e634a990..a9d0f0121a6 100644 --- a/src/gallium/auxiliary/util/u_stream.h +++ b/src/gallium/auxiliary/util/u_stream.h @@ -40,8 +40,13 @@ struct util_stream; +/** + * Create a stream + * @param filename relative or absolute path (necessary for windows) + * @param optional maximum file size (0 for a growable size). + */ struct util_stream * -util_stream_create(const char *filename); +util_stream_create(const char *filename, size_t max_size); boolean util_stream_write(struct util_stream *stream, const void *data, size_t size); diff --git a/src/gallium/auxiliary/util/u_stream_stdc.c b/src/gallium/auxiliary/util/u_stream_stdc.c index 03c845b6a78..dfb6a0e647b 100644 --- a/src/gallium/auxiliary/util/u_stream_stdc.c +++ b/src/gallium/auxiliary/util/u_stream_stdc.c @@ -48,10 +48,12 @@ struct util_stream struct util_stream * -util_stream_create(const char *filename) +util_stream_create(const char *filename, size_t max_size) { struct util_stream *stream; + (void)max_size; + stream = CALLOC_STRUCT(util_stream); if(!stream) goto error1; diff --git a/src/gallium/auxiliary/util/u_stream_wd.c b/src/gallium/auxiliary/util/u_stream_wd.c index c8bb2ad0117..1e135c6ba06 100644 --- a/src/gallium/auxiliary/util/u_stream_wd.c +++ b/src/gallium/auxiliary/util/u_stream_wd.c @@ -50,6 +50,8 @@ struct util_stream { char filename[MAX_PATH + 1]; WCHAR wFileName[MAX_PATH + 1]; + boolean growable; + size_t map_size; ULONG_PTR iFile; char *pMap; size_t written; @@ -64,11 +66,17 @@ util_stream_map(struct util_stream *stream) static char filename[MAX_PATH + 1]; unsigned filename_len; - filename_len = util_snprintf(filename, - sizeof(filename), - "\\??\\%s.%04x", - stream->filename, - stream->suffix++); + if(stream->growable) + filename_len = util_snprintf(filename, + sizeof(filename), + "\\??\\%s.%04x", + stream->filename, + stream->suffix++); + else + filename_len = util_snprintf(filename, + sizeof(filename), + "\\??\\%s", + stream->filename); EngMultiByteToUnicodeN( stream->wFileName, @@ -77,11 +85,11 @@ util_stream_map(struct util_stream *stream) filename, filename_len); - stream->pMap = EngMapFile(stream->wFileName, MAP_FILE_SIZE, &stream->iFile); + stream->pMap = EngMapFile(stream->wFileName, stream->map_size, &stream->iFile); if(!stream->pMap) return FALSE; - memset(stream->pMap, 0, MAP_FILE_SIZE); + memset(stream->pMap, 0, stream->map_size); stream->written = 0; return TRUE; @@ -92,7 +100,7 @@ static INLINE void util_stream_unmap(struct util_stream *stream) { EngUnmapFile(stream->iFile); - if(stream->written < MAP_FILE_SIZE) { + if(stream->written < stream->map_size) { /* Truncate file size */ stream->pMap = EngMapFile(stream->wFileName, stream->written, &stream->iFile); if(stream->pMap) @@ -104,7 +112,7 @@ util_stream_unmap(struct util_stream *stream) struct util_stream * -util_stream_create(const char *filename) +util_stream_create(const char *filename, size_t max_size) { struct util_stream *stream; @@ -114,6 +122,15 @@ util_stream_create(const char *filename) strncpy(stream->filename, filename, sizeof(stream->filename)); + if(max_size) { + stream->growable = FALSE; + stream->map_size = max_size; + } + else { + stream->growable = TRUE; + stream->map_size = MAP_FILE_SIZE; + } + if(!util_stream_map(stream)) goto error2; @@ -129,7 +146,7 @@ error1: static INLINE void util_stream_copy(struct util_stream *stream, const char *data, size_t size) { - assert(stream->written + size <= MAP_FILE_SIZE); + assert(stream->written + size <= stream->map_size); memcpy(stream->pMap + stream->written, data, size); stream->written += size; } @@ -144,14 +161,14 @@ util_stream_write(struct util_stream *stream, const void *data, size_t size) if(!stream->pMap) return FALSE; - while(stream->written + size > MAP_FILE_SIZE) { - size_t step = MAP_FILE_SIZE - stream->written; + while(stream->written + size > stream->map_size) { + size_t step = stream->map_size - stream->written; util_stream_copy(stream, data, step); data = (const char *)data + step; size -= step; util_stream_unmap(stream); - if(!util_stream_map(stream)) + if(!stream->growable || !util_stream_map(stream)) return FALSE; } -- cgit v1.2.3