18 |
|
|
19 |
//--------------------------------------------------------------------------- |
//--------------------------------------------------------------------------- |
20 |
|
|
|
#define START_PIXBUF_BACKGROUND_LOADER ((GdkPixbuf *)(-1)) |
|
|
|
|
21 |
CachedImage::CachedImage() { |
CachedImage::CachedImage() { |
22 |
loader = NULL; |
loader = NULL; |
23 |
requestedLOD = -1; |
requestedLOD = -1; |
147 |
size = 0; |
size = 0; |
148 |
loading = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8, 16, 16); |
loading = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8, 16, 16); |
149 |
gdk_pixbuf_ref(loading); |
gdk_pixbuf_ref(loading); |
150 |
|
gtk_object_set_user_data(GTK_OBJECT(loading), (gpointer)(-1)); |
151 |
} |
} |
152 |
|
|
153 |
ImageCache::~ImageCache() { |
ImageCache::~ImageCache() { |
154 |
imageByUrx.clear(); |
imageByUri.clear(); |
155 |
urxByImage.clear(); |
uriByImage.clear(); |
156 |
|
|
157 |
list<CachedImage *>::iterator iter; |
list<CachedImage *>::iterator iter; |
158 |
|
|
166 |
gdk_pixbuf_unref(loading); |
gdk_pixbuf_unref(loading); |
167 |
} |
} |
168 |
|
|
169 |
GdkPixbuf *ImageCache::getPixbuf(string urx, int lod) { |
GdkPixbuf *ImageCache::getPixbuf(string uri, int lod) { |
170 |
CachedImage *ci = imageByUrx[urx]; |
CachedImage *ci = imageByUri[uri]; |
171 |
if (ci == NULL) { |
if (ci == NULL) { |
172 |
ci = new CachedImage(); |
ci = new CachedImage(); |
173 |
imageByUrx[urx] = ci; |
imageByUri[uri] = ci; |
174 |
urxByImage[ci] = urx; |
uriByImage[ci] = uri; |
175 |
} |
} |
176 |
else recentlyUsedImages.remove(ci); |
else recentlyUsedImages.remove(ci); |
177 |
|
|
182 |
GdkPixbuf *pb = ci->getPixbuf(lod); |
GdkPixbuf *pb = ci->getPixbuf(lod); |
183 |
if (pb == START_PIXBUF_BACKGROUND_LOADER) { |
if (pb == START_PIXBUF_BACKGROUND_LOADER) { |
184 |
|
|
185 |
//backgroundLoader->startLoading(urx); |
//backgroundLoader->startLoading(uri); |
186 |
|
|
187 |
pb = ci->getPixbuf(lod); |
pb = ci->getPixbuf(lod); |
188 |
} |
} |
189 |
return (pb == NULL ? loading : pb); |
return (pb == NULL ? loading : pb); |
190 |
} |
} |
191 |
|
|
192 |
int ImageCache::write(string urx, char *data, int len) { |
int ImageCache::write(string uri, char *data, int len) { |
193 |
CachedImage *ci = imageByUrx[urx]; |
CachedImage *ci = imageByUri[uri]; |
194 |
return (ci == NULL ? -1 : ci->write(data, len)); |
return (ci == NULL ? -1 : ci->write(data, len)); |
195 |
} |
} |
196 |
|
|
197 |
int ImageCache::cropToSize(int maxSize) { |
int ImageCache::trimToSize(int maxSize) { |
198 |
CachedImage *ci; |
CachedImage *ci; |
199 |
int sizeChange; |
int sizeChange; |
200 |
while ((size >= maxSize) && (!recentlyUsedImages.empty())) { |
while ((size >= maxSize) && (!recentlyUsedImages.empty())) { |
205 |
|
|
206 |
sizeChange = ci->getSizeChange(); |
sizeChange = ci->getSizeChange(); |
207 |
if (sizeChange == 0) { |
if (sizeChange == 0) { |
208 |
string urx = urxByImage[ci]; |
string uri = uriByImage[ci]; |
209 |
urxByImage.erase(ci); |
uriByImage.erase(ci); |
210 |
imageByUrx.erase(urx); |
imageByUri.erase(uri); |
211 |
size -= ci->getCurrentSize(); |
size -= ci->getCurrentSize(); |
212 |
delete ci; |
delete ci; |
213 |
} |
} |