diff engine/core/video/fonts/textrenderpool.cpp @ 0:4a0efb7baf70

* Datasets becomes the new trunk and retires after that :-)
author mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222
date Sun, 29 Jun 2008 18:44:17 +0000
parents
children 90005975cdbb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/engine/core/video/fonts/textrenderpool.cpp	Sun Jun 29 18:44:17 2008 +0000
@@ -0,0 +1,133 @@
+/***************************************************************************
+ *   Copyright (C) 2005-2008 by the FIFE team                              *
+ *   http://www.fifengine.de                                               *
+ *   This file is part of FIFE.                                            *
+ *                                                                         *
+ *   FIFE is free software; you can redistribute it and/or modify          *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA              *
+ ***************************************************************************/
+
+// Standard C++ library includes
+#include <algorithm>
+
+// Platform specific includes
+
+// 3rd party library includes
+#include <boost/bind.hpp>
+
+// FIFE includes
+// These includes are split up in two parts, separated by one empty line
+// First block: files included from the FIFE root src directory
+// Second block: files included from the same folder
+#include "video/image.h"
+#include "util/time/timemanager.h"
+
+#include "fontbase.h"
+#include "textrenderpool.h"
+
+namespace FIFE {
+
+	TextRenderPool::TextRenderPool(size_t poolSize) {
+		m_poolMaxSize = poolSize;
+		m_poolSize = 0;
+
+		m_collectTimer.setInterval( 1000 * 60 );
+		m_collectTimer.setCallback( boost::bind( &TextRenderPool::removeOldEntries, this) );
+	}
+
+	TextRenderPool::~TextRenderPool() {
+		type_pool::iterator it= m_pool.begin();
+		for(;it != m_pool.end(); ++it) {
+			delete it->image;
+		}
+	}
+
+	Image* TextRenderPool::getRenderedText( FontBase* fontbase, const std::string& text) {
+		SDL_Color c = fontbase->getColor();
+
+		type_pool::iterator it= m_pool.begin();
+		for(;it != m_pool.end(); ++it) {
+			if( it->antialias != fontbase->isAntiAlias() )
+				continue;
+
+			if( it->glyph_spacing != fontbase->getGlyphSpacing() )
+				continue;
+
+			if( it->row_spacing != fontbase->getRowSpacing() )
+				continue;
+
+			if( it->color.r != c.r || it->color.g != c.g || it->color.b != c.b  )
+				continue;
+
+			if( it->text != text )
+				continue;
+
+			// Stay sorted after access time
+			it->timestamp = TimeManager::instance()->getTime();
+			m_pool.push_front( *it );
+			m_pool.erase( it );
+
+			return m_pool.front().image;
+		}
+		return 0;
+	}
+
+	void TextRenderPool::addRenderedText( FontBase* fontbase,const std::string& text, Image* image) {
+		// Construct a entry and add it.
+		s_pool_entry centry;
+		centry.antialias = fontbase->isAntiAlias();
+		centry.glyph_spacing = fontbase->getGlyphSpacing();
+		centry.row_spacing = fontbase->getRowSpacing();
+		centry.text = text;
+		centry.color = fontbase->getColor();
+		centry.image = image;
+		centry.timestamp = TimeManager::instance()->getTime();
+		m_pool.push_front( centry );
+
+		// Some minimal amount of entries -> start collection timer
+		// Don't have a timer active if only _some_ text is pooled.
+		if( m_poolSize >= m_poolMaxSize/10 )
+			m_collectTimer.start();
+
+		// Maintain max pool size
+		if( m_poolSize < m_poolMaxSize ) {
+			m_poolSize++;
+			return;
+		} else {
+			delete m_pool.back().image;
+			m_pool.pop_back();
+		}
+	}
+
+	void TextRenderPool::removeOldEntries() {
+
+		type_pool::iterator it = m_pool.begin();
+		uint32_t now = TimeManager::instance()->getTime();
+		while (it != m_pool.end()) {
+			if( (now - it->timestamp) > 1000*60 ) {
+				delete it->image;
+				it = m_pool.erase(it);
+				--m_poolSize;
+			}
+			else {
+				++it;
+			}
+		}
+
+		// Stop if nothing can grow old =)
+		if( m_poolSize == 0 )
+			m_collectTimer.stop();
+	}
+}