util: Allow to define the maximum file size.
This avoids splitting the bitmaps in many files.
This commit is contained in:
parent
1da0a13389
commit
a4a739eb58
|
@ -657,7 +657,7 @@ debug_dump_surface_bmp(const char *filename,
|
||||||
bmih.biClrUsed = 0;
|
bmih.biClrUsed = 0;
|
||||||
bmih.biClrImportant = 0;
|
bmih.biClrImportant = 0;
|
||||||
|
|
||||||
stream = util_stream_create(filename);
|
stream = util_stream_create(filename, bmfh.bfSize);
|
||||||
if(!stream)
|
if(!stream)
|
||||||
goto error2;
|
goto error2;
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,13 @@
|
||||||
struct util_stream;
|
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 *
|
struct util_stream *
|
||||||
util_stream_create(const char *filename);
|
util_stream_create(const char *filename, size_t max_size);
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
util_stream_write(struct util_stream *stream, const void *data, size_t size);
|
util_stream_write(struct util_stream *stream, const void *data, size_t size);
|
||||||
|
|
|
@ -48,10 +48,12 @@ struct util_stream
|
||||||
|
|
||||||
|
|
||||||
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;
|
struct util_stream *stream;
|
||||||
|
|
||||||
|
(void)max_size;
|
||||||
|
|
||||||
stream = CALLOC_STRUCT(util_stream);
|
stream = CALLOC_STRUCT(util_stream);
|
||||||
if(!stream)
|
if(!stream)
|
||||||
goto error1;
|
goto error1;
|
||||||
|
|
|
@ -50,6 +50,8 @@ struct util_stream
|
||||||
{
|
{
|
||||||
char filename[MAX_PATH + 1];
|
char filename[MAX_PATH + 1];
|
||||||
WCHAR wFileName[MAX_PATH + 1];
|
WCHAR wFileName[MAX_PATH + 1];
|
||||||
|
boolean growable;
|
||||||
|
size_t map_size;
|
||||||
ULONG_PTR iFile;
|
ULONG_PTR iFile;
|
||||||
char *pMap;
|
char *pMap;
|
||||||
size_t written;
|
size_t written;
|
||||||
|
@ -64,11 +66,17 @@ util_stream_map(struct util_stream *stream)
|
||||||
static char filename[MAX_PATH + 1];
|
static char filename[MAX_PATH + 1];
|
||||||
unsigned filename_len;
|
unsigned filename_len;
|
||||||
|
|
||||||
filename_len = util_snprintf(filename,
|
if(stream->growable)
|
||||||
sizeof(filename),
|
filename_len = util_snprintf(filename,
|
||||||
"\\??\\%s.%04x",
|
sizeof(filename),
|
||||||
stream->filename,
|
"\\??\\%s.%04x",
|
||||||
stream->suffix++);
|
stream->filename,
|
||||||
|
stream->suffix++);
|
||||||
|
else
|
||||||
|
filename_len = util_snprintf(filename,
|
||||||
|
sizeof(filename),
|
||||||
|
"\\??\\%s",
|
||||||
|
stream->filename);
|
||||||
|
|
||||||
EngMultiByteToUnicodeN(
|
EngMultiByteToUnicodeN(
|
||||||
stream->wFileName,
|
stream->wFileName,
|
||||||
|
@ -77,11 +85,11 @@ util_stream_map(struct util_stream *stream)
|
||||||
filename,
|
filename,
|
||||||
filename_len);
|
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)
|
if(!stream->pMap)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
memset(stream->pMap, 0, MAP_FILE_SIZE);
|
memset(stream->pMap, 0, stream->map_size);
|
||||||
stream->written = 0;
|
stream->written = 0;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -92,7 +100,7 @@ static INLINE void
|
||||||
util_stream_unmap(struct util_stream *stream)
|
util_stream_unmap(struct util_stream *stream)
|
||||||
{
|
{
|
||||||
EngUnmapFile(stream->iFile);
|
EngUnmapFile(stream->iFile);
|
||||||
if(stream->written < MAP_FILE_SIZE) {
|
if(stream->written < stream->map_size) {
|
||||||
/* Truncate file size */
|
/* Truncate file size */
|
||||||
stream->pMap = EngMapFile(stream->wFileName, stream->written, &stream->iFile);
|
stream->pMap = EngMapFile(stream->wFileName, stream->written, &stream->iFile);
|
||||||
if(stream->pMap)
|
if(stream->pMap)
|
||||||
|
@ -104,7 +112,7 @@ util_stream_unmap(struct util_stream *stream)
|
||||||
|
|
||||||
|
|
||||||
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;
|
struct util_stream *stream;
|
||||||
|
|
||||||
|
@ -114,6 +122,15 @@ util_stream_create(const char *filename)
|
||||||
|
|
||||||
strncpy(stream->filename, filename, sizeof(stream->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))
|
if(!util_stream_map(stream))
|
||||||
goto error2;
|
goto error2;
|
||||||
|
|
||||||
|
@ -129,7 +146,7 @@ error1:
|
||||||
static INLINE void
|
static INLINE void
|
||||||
util_stream_copy(struct util_stream *stream, const char *data, size_t size)
|
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);
|
memcpy(stream->pMap + stream->written, data, size);
|
||||||
stream->written += size;
|
stream->written += size;
|
||||||
}
|
}
|
||||||
|
@ -144,14 +161,14 @@ util_stream_write(struct util_stream *stream, const void *data, size_t size)
|
||||||
if(!stream->pMap)
|
if(!stream->pMap)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
while(stream->written + size > MAP_FILE_SIZE) {
|
while(stream->written + size > stream->map_size) {
|
||||||
size_t step = MAP_FILE_SIZE - stream->written;
|
size_t step = stream->map_size - stream->written;
|
||||||
util_stream_copy(stream, data, step);
|
util_stream_copy(stream, data, step);
|
||||||
data = (const char *)data + step;
|
data = (const char *)data + step;
|
||||||
size -= step;
|
size -= step;
|
||||||
|
|
||||||
util_stream_unmap(stream);
|
util_stream_unmap(stream);
|
||||||
if(!util_stream_map(stream))
|
if(!stream->growable || !util_stream_map(stream))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue