Browse Source

Added maxwidth, lines = font:getWrap(string, wrap) by feature request

[email protected] 15 years ago
parent
commit
0188572124

+ 46 - 11
src/modules/graphics/opengl/Font.cpp

@@ -1,14 +1,14 @@
 /**
 * Copyright (c) 2006-2010 LOVE Development Team
-* 
+*
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
-* 
+*
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
-* 
+*
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
@@ -29,7 +29,7 @@ namespace graphics
 {
 namespace opengl
 {
-	
+
 	Font::Font(love::font::FontData * data)
 	: height(data->getHeight()), lineHeight(1.25), mSpacing(1)
 	{
@@ -54,16 +54,16 @@ namespace opengl
 	{
 		return height / lineHeight;
 	}
-	
+
 	void Font::print(std::string text, float x, float y) const
 	{
 		print(text, x, y, 0.0f, 1.0f, 1.0f);
 	}
-	
+
 	void Font::print(std::string text, float x, float y, float angle, float sx, float sy) const
 	{
 		glPushMatrix();
-		
+
 		glTranslatef(ceil(x), ceil(y), 0.0f);
 		glRotatef(LOVE_TODEG(angle), 0, 0, 1.0f);
 		glScalef(sx, sy, 1.0f);
@@ -77,13 +77,13 @@ namespace opengl
 		}
 		glPopMatrix();
 	}
-	
+
 	void Font::print(char character, float x, float y) const
 	{
 		if (!glyphs[character]) character = ' ';
 		glyphs[character]->draw(x, y+height, 0, 1, 1, 0, 0);
 	}
-	
+
 	int Font::getWidth(const std::string & line) const
 	{
 		if(line.size() == 0) return 0;
@@ -93,7 +93,7 @@ namespace opengl
 		{
 			temp += (spacing[(int)line[i]] * mSpacing);
 		}
-		
+
 		return temp;
 	}
 
@@ -101,12 +101,47 @@ namespace opengl
 	{
 		return this->getWidth(std::string(line));
 	}
-	
+
 	int Font::getWidth(const char character) const
 	{
 		return spacing[(int)character];
 	}
 
+	int Font::getWrap(const std::string & line, float wrap, int * lines) const
+	{
+		if(line.size() == 0) return 0;
+		int maxw = 0;
+		int linen = 1;
+		int temp = 0;
+		std::string text;
+
+		for(unsigned int i = 0; i < line.size(); i++)
+		{
+			if(temp > wrap && text.find(" ") != std::string::npos)
+			{
+				unsigned int space = text.find_last_of(' ');
+				std::string tmp = text.substr(0, space);
+				int w = getWidth(tmp);
+				if(w > maxw) maxw = w;
+				text = text.substr(space+1);
+				temp = getWidth(text);
+				linen++;
+			}
+			temp += (spacing[(int)line[i]] * mSpacing);
+			text += line[i];
+		}
+
+		if(temp > maxw) maxw = temp;
+		if(lines) *lines = linen;
+
+		return maxw;
+	}
+
+	int Font::getWrap(const char * line, float wrap, int * lines) const
+	{
+		return getWrap(std::string(line), wrap, lines);
+	}
+
 	void Font::setLineHeight(float height)
 	{
 		this->lineHeight = height;

+ 16 - 5
src/modules/graphics/opengl/Font.h

@@ -1,14 +1,14 @@
 /**
 * Copyright (c) 2006-2010 LOVE Development Team
-* 
+*
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
-* 
+*
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
-* 
+*
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
@@ -61,7 +61,7 @@ namespace opengl
 		* @param data The font data to construct from.
 		**/
 		Font(love::font::FontData * data);
-		
+
 		virtual ~Font();
 
 		/**
@@ -104,7 +104,7 @@ namespace opengl
 		**/
 		int getWidth(const std::string & line) const;
 		int getWidth(const char * line) const;
-		
+
 		/**
 		* Returns the width of the passed character.
 		*
@@ -112,6 +112,17 @@ namespace opengl
 		**/
 		int getWidth(const char character) const;
 
+		/**
+		 * Returns the maximal width of a wrapped string
+		 * and optionally the number of lines
+		 *
+		 * @param line A line of text
+		 * @param wrap The number of pixels to wrap at
+		 * @param lines Optional output of the number of lines needed
+		 **/
+		int getWrap(const std::string & line, float wrap, int *lines = 0) const;
+		int getWrap(const char * line, float wrap, int *lines = 0) const;
+
 		/**
 		* Sets the line height (which should be a number to multiply the font size by,
 		* example: line height = 1.2 and size = 12 means that rendered line height = 12*1.2)

+ 15 - 3
src/modules/graphics/opengl/wrap_Font.cpp

@@ -1,14 +1,14 @@
 /**
 * Copyright (c) 2006-2010 LOVE Development Team
-* 
+*
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
-* 
+*
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
-* 
+*
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
@@ -47,6 +47,17 @@ namespace opengl
 		return 1;
 	}
 
+	int w_Font_getWrap(lua_State * L)
+	{
+		Font * t = luax_checkfont(L, 1);
+		const char * str = luaL_checkstring(L, 2);
+		float wrap = (float) luaL_checknumber(L, 3);
+		int lines = 0;
+		lua_pushinteger(L, t->getWrap(str, wrap, &lines));
+		lua_pushinteger(L, lines);
+		return 2;
+	}
+
 	int w_Font_setLineHeight(lua_State * L)
 	{
 		Font * t = luax_checkfont(L, 1);
@@ -65,6 +76,7 @@ namespace opengl
 	static const luaL_Reg functions[] = {
 		{ "getHeight", w_Font_getHeight },
 		{ "getWidth", w_Font_getWidth },
+		{ "getWrap", w_Font_getWrap },
 		{ "setLineHeight", w_Font_setLineHeight },
 		{ "getLineHeight", w_Font_getLineHeight },
 		{ 0, 0 }

+ 4 - 3
src/modules/graphics/opengl/wrap_Font.h

@@ -1,14 +1,14 @@
 /**
 * Copyright (c) 2006-2010 LOVE Development Team
-* 
+*
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
-* 
+*
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
-* 
+*
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
@@ -34,6 +34,7 @@ namespace opengl
 	Font * luax_checkfont(lua_State * L, int idx);
 	int w_Font_getHeight(lua_State * L);
 	int w_Font_getWidth(lua_State * L);
+	int w_Font_getWrap(lua_State * L);
 	int w_Font_setLineHeight(lua_State * L);
 	int w_Font_getLineHeight(lua_State * L);
 	int luaopen_font(lua_State * L);