diff options
author | Jorge Arellano Cid <jcid@dillo.org> | 2009-01-05 09:38:42 -0300 |
---|---|---|
committer | Jorge Arellano Cid <jcid@dillo.org> | 2009-01-05 09:38:42 -0300 |
commit | e705debdae8d2ff8e4331246e4d51c077a4235ba (patch) | |
tree | 78a509aaad8bf3cfc65a58b5fa4f3df4e1412b28 /src | |
parent | f5decdf48e13d89f133c27e9e8b77c5e04aa4bbd (diff) |
These optimizations are for repeated images in a page.
1.- Every repeated cache-served-image is decoded. The patch adds
an extra reference to the dicache entry, so only one of them is
decoded, and the imgbuf deletion is left to a_Dicache_cleanup.
2.- Every repeated cache-served-image call copyRow for each row.
The patch avoids that.
This is common with small images (e.g. bullets), but the
overhead may be not worth the patch...
Diffstat (limited to 'src')
-rw-r--r-- | src/dicache.c | 8 | ||||
-rw-r--r-- | src/gif.c | 1 | ||||
-rw-r--r-- | src/jpeg.c | 1 | ||||
-rw-r--r-- | src/png.c | 1 |
4 files changed, 8 insertions, 3 deletions
diff --git a/src/dicache.c b/src/dicache.c index c8cf7471..975b6a10 100644 --- a/src/dicache.c +++ b/src/dicache.c @@ -388,10 +388,12 @@ void a_Dicache_callback(int Op, CacheClient_t *Client) Client->Version = DicEntry->version; /* Only call the decoder when necessary */ + int newData = FALSE; if (Op == CA_Send && DicEntry->State < DIC_Close && DicEntry->DecodedSize < Client->BufSize) { DicEntry->Decoder(Op, Client); DicEntry->DecodedSize = Client->BufSize; + newData = TRUE; } else if (Op == CA_Close || Op == CA_Abort) { if (DicEntry->State < DIC_Close) { DicEntry->Decoder(Op, Client); @@ -409,7 +411,7 @@ void a_Dicache_callback(int Op, CacheClient_t *Client) DicEntry->version, DicEntry->width, DicEntry->height, DicEntry->type); } - if (DicEntry->State == DIC_Write) { + if (DicEntry->State == DIC_Write && newData) { if (DicEntry->ScanNumber == Image->ScanNumber) { for (i = 0; i < DicEntry->height; ++i) if (a_Bitvec_get_bit(DicEntry->BitVec, (int)i) && @@ -450,8 +452,8 @@ void a_Dicache_cleanup(void) node = dList_nth_data(CachedIMGs, i); /* iterate each entry of this node */ for (entry = node->first; entry; entry = entry->next) { - if (entry->v_imgbuf && - a_Imgbuf_last_reference(entry->v_imgbuf)) { + if (entry->RefCount == 1 || + (entry->v_imgbuf && a_Imgbuf_last_reference(entry->v_imgbuf))) { /* free this unused entry */ if (entry->next) { Dicache_remove(node->url, entry->version); @@ -179,6 +179,7 @@ void *a_Gif_image(const char *Type, void *Ptr, CA_Callback_t *Call, DicEntry = a_Dicache_add_entry(web->url); DicEntry->DecoderData = Gif_new(web->Image, DicEntry->url, DicEntry->version); + a_Dicache_ref(DicEntry->url, DicEntry->version); } else { /* Repeated image */ a_Dicache_ref(DicEntry->url, DicEntry->version); @@ -123,6 +123,7 @@ void *a_Jpeg_image(const char *Type, void *P, CA_Callback_t *Call, DicEntry = a_Dicache_add_entry(web->url); DicEntry->DecoderData = Jpeg_new(web->Image, DicEntry->url, DicEntry->version); + a_Dicache_ref(DicEntry->url, DicEntry->version); } else { /* Repeated image */ a_Dicache_ref(DicEntry->url, DicEntry->version); @@ -474,6 +474,7 @@ void *a_Png_image(const char *Type, void *Ptr, CA_Callback_t *Call, DicEntry = a_Dicache_add_entry(web->url); DicEntry->DecoderData = Png_new(web->Image, DicEntry->url, DicEntry->version); + a_Dicache_ref(DicEntry->url, DicEntry->version); } else { /* Repeated image */ a_Dicache_ref(DicEntry->url, DicEntry->version); |