From faabbafa38152dd7a90c96b33dd67da5a6ec487b Mon Sep 17 00:00:00 2001 From: Richard Wilson Date: Sat, 31 Dec 2005 04:29:00 +0000 Subject: [project @ 2005-12-31 04:29:00 by rjw] Improve efficiency of bitmaps not held in memory svn path=/import/netsurf/; revision=1908 --- riscos/bitmap.c | 56 ++++++++++++++++++++++++++++++-------------------------- riscos/bitmap.h | 2 +- 2 files changed, 31 insertions(+), 27 deletions(-) (limited to 'riscos') diff --git a/riscos/bitmap.c b/riscos/bitmap.c index 6e9683e11..eadff03dd 100644 --- a/riscos/bitmap.c +++ b/riscos/bitmap.c @@ -13,6 +13,8 @@ * sprites. */ +#define NDEBUG + #include #include #include @@ -195,18 +197,14 @@ struct bitmap *bitmap_create(int width, int height, bool clear) /** * Create a persistent, opaque bitmap from a file reference. * - * \param width width of image in pixels - * \param height width of image in pixels * \param file the file containing the image data * \return an opaque struct bitmap, or NULL on memory exhaustion */ -struct bitmap *bitmap_create_file(int width, int height, char *file) +struct bitmap *bitmap_create_file(char *file) { struct bitmap *bitmap; - struct bitmap *link; - - if (width == 0 || height == 0 || file[0] == '\0') + if (file[0] == '\0') return NULL; if (!ro_filename_claim(file)) @@ -214,20 +212,16 @@ struct bitmap *bitmap_create_file(int width, int height, char *file) bitmap = calloc(1, sizeof(struct bitmap)); if (!bitmap) return NULL; - bitmap->width = width; - bitmap->height = height; bitmap->opaque = true; bitmap->persistent = true; strcpy(bitmap->filename, file); - /* link into our list of bitmaps at the tail */ + /* link in at the head */ if (bitmap_head) { - for (link = bitmap_head; link->next; link = link->next); - link->next = bitmap; - bitmap->previous = link; - } else { - bitmap_head = bitmap; + bitmap->next = bitmap_head; + bitmap_head->previous = bitmap; } + bitmap_head = bitmap; return bitmap; } @@ -482,13 +476,16 @@ void bitmap_maintain(void) struct bitmap_compressed_header *header; unsigned int maintain_direct_size; -// LOG(("Performing maintenance.")); + LOG(("Performing maintenance.")); - if (!bitmap) { + if ((!bitmap) || ((bitmap_direct_used < bitmap_direct_size) && + (bitmap_compressed_used < bitmap_compressed_size))) { bitmap_maintenance = false; bitmap_maintenance_priority = false; return; } + + /* under heavy loads free up an extra 30% to work with */ maintain_direct_size = bitmap_direct_size; if (!bitmap_maintenance_priority) maintain_direct_size = maintain_direct_size * 0.7; @@ -529,7 +526,7 @@ void bitmap_maintain(void) return; } } - + /* for the remaining entries we dump to disk */ for (; bitmap; bitmap = bitmap->next) { if ((bitmap->sprite_area) || (bitmap->compressed)) { @@ -582,7 +579,7 @@ void bitmap_decompress(struct bitmap *bitmap) free(bitmap->sprite_area); bitmap->sprite_area = NULL; } else { -// LOG(("Decompressed")); + LOG(("Decompressed")); area_size = header->input_size + sizeof(struct bitmap_compressed_header); bitmap_compressed_used -= area_size; @@ -635,18 +632,19 @@ void bitmap_compress(struct bitmap *bitmap) } bitmap->sprite_area = NULL; calc = (100 / (float)output_size) * new_size; -// LOG(("Compression: %i->%i, %.3f%%", -// output_size, new_size, calc)); + LOG(("Compression: %i->%i, %.3f%%", + output_size, new_size, calc)); } } } void bitmap_load_file(struct bitmap *bitmap) { - unsigned int area_size; int len; fileswitch_object_type obj_type; os_error *error; + struct bitmap_compressed_header *bitmap_compressed; + osspriteop_header *bitmap_direct; assert(bitmap->filename); @@ -669,7 +667,7 @@ void bitmap_load_file(struct bitmap *bitmap) return; } -// LOG(("Loaded file from disk")); + LOG(("Loaded file from disk")); /* Sanity check the file we've just loaded: * If it's an uncompressed buffer, then it's a raw sprite area, * including the total size word at the start. Therefore, we check @@ -691,18 +689,24 @@ void bitmap_load_file(struct bitmap *bitmap) strncmp(bitmap->compressed + 20, "bitmap", 6) == 0) { bitmap->sprite_area = (osspriteop_area *)bitmap->compressed; bitmap->compressed = NULL; - area_size = 16 + 44 + bitmap->width * bitmap->height * 4; - bitmap_direct_used += area_size; + bitmap_direct = (osspriteop_header *)(bitmap->sprite_area + 1); + bitmap->width = bitmap_direct->width + 1; + bitmap->height = bitmap_direct->height + 1; + bitmap_direct_used += 16 + 44 + + bitmap->width * bitmap->height * 4; } else if ((int)((*(((int *)bitmap->compressed) + 6)) + sizeof(struct bitmap_compressed_header)) == len && strncmp(bitmap->compressed + 8, "bitmap", 6) == 0) { bitmap_compressed_used -= len; + bitmap_compressed = (struct bitmap_compressed_header *) + bitmap->compressed; + bitmap->width = bitmap_compressed->width; + bitmap->height = bitmap_compressed->height; } else { free(bitmap->compressed); bitmap->compressed = NULL; return; } - if (bitmap->modified) bitmap_delete_file(bitmap); } @@ -764,7 +768,7 @@ void bitmap_save_file(struct bitmap *bitmap) } bitmap->compressed = NULL; bitmap->modified = false; -// LOG(("Saved file to disk")); + LOG(("Saved file to disk")); } } diff --git a/riscos/bitmap.h b/riscos/bitmap.h index 2ce8f04a9..a43c3a6bf 100644 --- a/riscos/bitmap.h +++ b/riscos/bitmap.h @@ -28,7 +28,7 @@ struct bitmap { }; -struct bitmap *bitmap_create_file(int width, int height, char *file); +struct bitmap *bitmap_create_file(char *file); void bitmap_initialise_memory(void); void bitmap_quit(void); void bitmap_maintain(void); -- cgit v1.2.3