aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJorge Arellano Cid <jcid@dillo.org>2009-01-05 09:38:42 -0300
committerJorge Arellano Cid <jcid@dillo.org>2009-01-05 09:38:42 -0300
commite705debdae8d2ff8e4331246e4d51c077a4235ba (patch)
tree78a509aaad8bf3cfc65a58b5fa4f3df4e1412b28
parentf5decdf48e13d89f133c27e9e8b77c5e04aa4bbd (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...
-rw-r--r--src/dicache.c8
-rw-r--r--src/gif.c1
-rw-r--r--src/jpeg.c1
-rw-r--r--src/png.c1
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);
diff --git a/src/gif.c b/src/gif.c
index ea6990b3..af1a3842 100644
--- a/src/gif.c
+++ b/src/gif.c
@@ -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);
diff --git a/src/jpeg.c b/src/jpeg.c
index 4da2d39e..97254da4 100644
--- a/src/jpeg.c
+++ b/src/jpeg.c
@@ -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);
diff --git a/src/png.c b/src/png.c
index f7e2de8d..10eec6f0 100644
--- a/src/png.c
+++ b/src/png.c
@@ -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);