From a5be2ef67d91f2cba7551e3a52a6b989c87e8611 Mon Sep 17 00:00:00 2001 From: fluxgen <fluxgen> Date: Fri, 2 Jan 2004 22:19:39 +0000 Subject: textured pixmap cache fix --- src/FbTk/ImageControl.cc | 31 ++++++++++++++++++++++--------- src/FbTk/ImageControl.hh | 18 +++++++----------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/FbTk/ImageControl.cc b/src/FbTk/ImageControl.cc index 783f7a7..977d899 100644 --- a/src/FbTk/ImageControl.cc +++ b/src/FbTk/ImageControl.cc @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: ImageControl.cc,v 1.7 2004/01/02 13:28:00 fluxgen Exp $ +// $Id: ImageControl.cc,v 1.8 2004/01/02 22:19:39 fluxgen Exp $ #include "ImageControl.hh" @@ -150,15 +150,27 @@ ImageControl::~ImageControl() { Pixmap ImageControl::searchCache(unsigned int width, unsigned int height, - unsigned long texture_type, - const FbTk::Color &color, const FbTk::Color &color_to) const { + const Texture &text) const { + if (text.pixmap().drawable() != None) { + // do comparsion with width/height and texture_pixmap + CacheList::iterator it = cache.begin(); + CacheList::iterator it_end = cache.end(); + for (; it != it_end; ++it) { + if ((*it)->texture_pixmap = text.pixmap().drawable() && + (*it)->width == width && (*it)->height == height) + return (*it)->pixmap; + } + return None; + } + Cache tmp; + tmp.texture_pixmap = text.pixmap().drawable(); tmp.width = width; tmp.height = height; - tmp.texture = texture_type; - tmp.pixel1 = color.pixel(); - tmp.pixel2 = color_to.pixel(); + tmp.texture = text.type(); + tmp.pixel1 = text.color().pixel(); + tmp.pixel2 = text.colorTo().pixel(); CacheList::iterator it = cache.find(&tmp); if (it == cache.end()) { return None; @@ -179,10 +191,10 @@ Pixmap ImageControl::renderImage(unsigned int width, unsigned int height, return ParentRelative; // search cache first - Pixmap pixmap = searchCache(width, height, texture.type(), - texture.color(), texture.colorTo()); - if (pixmap) + Pixmap pixmap = searchCache(width, height, texture); + if (pixmap) { return pixmap; // return cache item + } // render new image TextureRender image(*this, width, height, m_colors, m_num_colors); @@ -194,6 +206,7 @@ Pixmap ImageControl::renderImage(unsigned int width, unsigned int height, Cache *tmp = new Cache; tmp->pixmap = pixmap; + tmp->texture_pixmap = texture.pixmap().drawable(); tmp->width = width; tmp->height = height; tmp->count = 1; diff --git a/src/FbTk/ImageControl.hh b/src/FbTk/ImageControl.hh index 0ccb928..087cd69 100644 --- a/src/FbTk/ImageControl.hh +++ b/src/FbTk/ImageControl.hh @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: ImageControl.hh,v 1.7 2004/01/02 13:27:29 fluxgen Exp $ +// $Id: ImageControl.hh,v 1.8 2004/01/02 22:19:39 fluxgen Exp $ #ifndef FBTK_IMAGECONTROL_HH #define FBTK_IMAGECONTROL_HH @@ -79,8 +79,7 @@ private: Search cache for a specific pixmap @return None if no cache was found */ - Pixmap searchCache(unsigned int width, unsigned int height, unsigned long texture_type, - const FbTk::Color &color, const FbTk::Color &color_to) const; + Pixmap searchCache(unsigned int width, unsigned int height, const Texture &text) const; void createColorTable(); bool m_dither; @@ -109,24 +108,21 @@ private: typedef struct Cache { Pixmap pixmap; - + Pixmap texture_pixmap; unsigned int count, width, height; unsigned long pixel1, pixel2, texture; } Cache; - struct ltCacheEntry - { - bool operator()(const Cache* s1, const Cache* s2) const - { - return - (s1->width < s2->width || s1->width == s2->width && + struct ltCacheEntry { + bool operator()(const Cache* s1, const Cache* s2) const { + return (s1->width < s2->width || s1->width == s2->width && (s1->height < s2->height || s1->height == s2->height && (s1->texture < s2->texture || s1->texture == s2->texture && s1->pixel1 < s2->pixel1 || s1->pixel1 == s2->pixel1 && (s1->texture & FbTk::Texture::GRADIENT) && s1->pixel2 < s2->pixel2) )); - } + } }; -- cgit v0.11.2