Changeset - r11416:46dd592974ed
[Not reviewed]
master
0 2 0
rubidium - 15 years ago 2009-03-21 18:28:01
rubidium@openttd.org
(svn r15779) -Codechange: unify (most) of the text drawing "API".
2 files changed with 123 insertions and 76 deletions:
0 comments (0 inline, 0 general)
src/gfx.cpp
Show inline comments
 
@@ -325,7 +325,8 @@ static void HandleBiDiAndArabicShapes(ch
 
 * If the string is truncated, add three dots ('...') to show this.
 
 * @param *str string that is checked and possibly truncated
 
 * @param maxw maximum width in pixels of the string
 
 * @return new width of (truncated) string */
 
 * @return new width of (truncated) string
 
 */
 
static int TruncateString(char *str, int maxw)
 
{
 
	int w = 0;
 
@@ -375,22 +376,6 @@ static int TruncateString(char *str, int
 
}
 

	
 
/**
 
 * Write string to output buffer, truncating it to specified maximal width in pixels if it is too long.
 
 *
 
 * @param src   String to truncate
 
 * @param dest  Start of character output buffer where truncated string is stored
 
 * @param maxw  Maximal allowed length of the string in pixels
 
 * @param last  Address of last character in output buffer
 
 *
 
 * @return Actual width of the (possibly) truncated string in pixels
 
 */
 
static inline int TruncateStringID(StringID src, char *dest, int maxw, const char *last)
 
{
 
	GetString(dest, src, last);
 
	return TruncateString(dest, maxw);
 
}
 

	
 
/**
 
 * Draw string starting at position (x,y).
 
 *
 
 * @param x      X position to start drawing
 
@@ -412,20 +397,104 @@ int DrawString(int x, int y, StringID st
 
/**
 
 * Draw string, possibly truncated to make it fit in its allocated space
 
 *
 
 * @param left   The left most position to draw on.
 
 * @param right  The right most position to draw on.
 
 * @param top    The top most position to draw on.
 
 * @param str    String to draw.
 
 * @param last   The end of the string buffer to draw.
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 * @param align  The alignment of the string when drawing left-to-right. In the
 
 *               case a right-to-left language is chosen this is inverted so it
 
 *               will be drawn in the right direction.
 
 * @param underline Whether to underline what has been drawn or not.
 
 *
 
 * @return In case of left or center alignment the right most pixel we have drawn to.
 
 *         In case of right alignment the left most pixel we have drawn to.
 
 */
 
static int DrawString(int left, int right, int top, char *str, const char *last, TextColour colour, TextAlignment align, bool underline = false)
 
{
 
	TruncateString(str, right - left);
 
	HandleBiDiAndArabicShapes(str, last);
 

	
 
	int w = GetStringBoundingBox(str).width;
 

	
 
	switch (align) {
 
		case TA_LEFT:
 
			right = left + w;
 
			break;
 

	
 
		case TA_CENTER:
 
			left += (right - left - w) / 2;
 
			right = left + w;
 
			break;
 

	
 
		case TA_RIGHT:
 
			left = right - w;
 
			break;
 

	
 
		default:
 
			NOT_REACHED();
 
	}
 
	ReallyDoDrawString(str, left, top, colour);
 
	if (underline) {
 
		GfxFillRect(left, top + 10, right, top + 10, _string_colourremap[1]);
 
	}
 

	
 
	return align == TA_RIGHT ? left : right;
 
}
 

	
 
/**
 
 * Draw string, possibly truncated to make it fit in its allocated space
 
 *
 
 * @param left   The left most position to draw on.
 
 * @param right  The right most position to draw on.
 
 * @param top    The top most position to draw on.
 
 * @param str    String to draw.
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 * @param align  The alignment of the string when drawing left-to-right. In the
 
 *               case a right-to-left language is chosen this is inverted so it
 
 *               will be drawn in the right direction.
 
 * @param underline Whether to underline what has been drawn or not.
 
 */
 
int DrawString(int left, int right, int top, const char *str, TextColour colour, TextAlignment align, bool underline)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 
	strecpy(buffer, str, lastof(buffer));
 
	return DrawString(left, right, top, buffer, lastof(buffer), colour, align, underline);
 
}
 

	
 
/**
 
 * Draw string, possibly truncated to make it fit in its allocated space
 
 *
 
 * @param left   The left most position to draw on.
 
 * @param right  The right most position to draw on.
 
 * @param top    The top most position to draw on.
 
 * @param str    String to draw.
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 * @param align  The alignment of the string when drawing left-to-right. In the
 
 *               case a right-to-left language is chosen this is inverted so it
 
 *               will be drawn in the right direction.
 
 * @param underline Whether to underline what has been drawn or not.
 
 */
 
int DrawString(int left, int right, int top, StringID str, TextColour colour, TextAlignment align, bool underline)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 
	GetString(buffer, str, lastof(buffer));
 
	return DrawString(left, right, top, buffer, lastof(buffer), colour, align, underline);
 
}
 

	
 
/**
 
 * Draw string, possibly truncated to make it fit in its allocated space
 
 *
 
 * @param x      X position to start drawing
 
 * @param y      Y position to start drawing
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 * @param maxw   Maximal width of the string
 
 *
 
 * @return Horizontal coordinate after drawing the (possibly truncated) string
 
 */
 
int DrawStringTruncated(int x, int y, StringID str, TextColour colour, uint maxw)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 
	TruncateStringID(str, buffer, maxw, lastof(buffer));
 
	HandleBiDiAndArabicShapes(buffer, lastof(buffer));
 
	return ReallyDoDrawString(buffer, x, y, colour);
 
	return DrawString(x, x + maxw, y, str, colour, TA_LEFT, false);
 
}
 

	
 
/**
 
@@ -435,21 +504,10 @@ int DrawStringTruncated(int x, int y, St
 
 * @param y      Y position of the string
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 *
 
 * @return Width of drawn string in pixels
 
 */
 
int DrawStringRightAligned(int x, int y, StringID str, TextColour colour)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 
	int w;
 

	
 
	GetString(buffer, str, lastof(buffer));
 
	HandleBiDiAndArabicShapes(buffer, lastof(buffer));
 

	
 
	w = GetStringBoundingBox(buffer).width;
 
	ReallyDoDrawString(buffer, x - w, y, colour);
 

	
 
	return w;
 
	return DrawString(0, x, y, str, colour, TA_RIGHT, false);
 
}
 

	
 
/**
 
@@ -461,13 +519,9 @@ int DrawStringRightAligned(int x, int y,
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 * @param maxw   Maximal width of the string
 
 */
 
void DrawStringRightAlignedTruncated(int x, int y, StringID str, TextColour colour, uint maxw)
 
int DrawStringRightAlignedTruncated(int x, int y, StringID str, TextColour colour, uint maxw)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 

	
 
	TruncateStringID(str, buffer, maxw, lastof(buffer));
 
	HandleBiDiAndArabicShapes(buffer, lastof(buffer));
 
	ReallyDoDrawString(buffer, x - GetStringBoundingBox(buffer).width, y, colour);
 
	return DrawString(x - maxw, x, y, str, colour, TA_RIGHT, false);
 
}
 

	
 
/**
 
@@ -478,10 +532,9 @@ void DrawStringRightAlignedTruncated(int
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 */
 
void DrawStringRightAlignedUnderline(int x, int y, StringID str, TextColour colour)
 
int DrawStringRightAlignedUnderline(int x, int y, StringID str, TextColour colour)
 
{
 
	int w = DrawStringRightAligned(x, y, str, colour);
 
	GfxFillRect(x - w, y + 10, x, y + 10, _string_colourremap[1]);
 
	return DrawString(0, x, y, str, colour, TA_RIGHT, true);
 
}
 

	
 
/**
 
@@ -491,21 +544,13 @@ void DrawStringRightAlignedUnderline(int
 
 * @param y      Y position of center of the string
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 *
 
 * @return Width of the drawn string in pixels
 
 */
 
int DrawStringCentered(int x, int y, StringID str, TextColour colour)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 
	int w;
 

	
 
	GetString(buffer, str, lastof(buffer));
 
	HandleBiDiAndArabicShapes(buffer, lastof(buffer));
 

	
 
	w = GetStringBoundingBox(buffer).width;
 
	ReallyDoDrawString(buffer, x - w / 2, y, colour);
 

	
 
	return w;
 
	int w = GetStringBoundingBox(buffer).width;
 
	return DrawString(x - w, x + w, y, buffer, lastof(buffer), colour, TA_CENTER);
 
}
 

	
 
/**
 
@@ -517,16 +562,11 @@ int DrawStringCentered(int x, int y, Str
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 *
 
 * @return Right-most coordinate of the (possibly truncated) drawn string
 
 * @return Width of the drawn string in pixels
 
 */
 
int DrawStringCenteredTruncated(int xl, int xr, int y, StringID str, TextColour colour)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 
	TruncateStringID(str, buffer, xr - xl, lastof(buffer));
 
	HandleBiDiAndArabicShapes(buffer, lastof(buffer));
 

	
 
	int w = GetStringBoundingBox(buffer).width;
 
	return ReallyDoDrawString(buffer, (xl + xr - w) / 2, y, colour);
 
	return DrawString(xl, xr, y, str, colour, TA_CENTER, false);
 
}
 

	
 
/**
 
@@ -536,18 +576,14 @@ int DrawStringCenteredTruncated(int xl, 
 
 * @param y      Y position of center of the string
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 *
 
 * @return Width of the drawn string in pixels
 
 */
 
int DoDrawStringCentered(int x, int y, const char *str, TextColour colour)
 
{
 
	char buffer[DRAW_STRING_BUFFER];
 
	strecpy(buffer, str, lastof(buffer));
 
	HandleBiDiAndArabicShapes(buffer, lastof(buffer));
 

	
 
	int w = GetStringBoundingBox(buffer).width;
 
	ReallyDoDrawString(buffer, x - w / 2, y, colour);
 
	return w;
 
	return DrawString(x - w, x + w, y, buffer, lastof(buffer), colour, TA_CENTER);
 
}
 

	
 
/**
 
@@ -558,10 +594,12 @@ int DoDrawStringCentered(int x, int y, c
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 */
 
void DrawStringCenterUnderline(int x, int y, StringID str, TextColour colour)
 
int DrawStringCenterUnderline(int x, int y, StringID str, TextColour colour)
 
{
 
	int w = DrawStringCentered(x, y, str, colour);
 
	GfxFillRect(x - (w >> 1), y + 10, x - (w >> 1) + w, y + 10, _string_colourremap[1]);
 
	char buffer[DRAW_STRING_BUFFER];
 
	GetString(buffer, str, lastof(buffer));
 
	int w = GetStringBoundingBox(buffer).width;
 
	return DrawString(x - w, y + w, y, buffer, lastof(buffer), colour, TA_CENTER, true);
 
}
 

	
 
/**
 
@@ -573,10 +611,9 @@ void DrawStringCenterUnderline(int x, in
 
 * @param str    String to draw
 
 * @param colour Colour used for drawing the string, see DoDrawString() for details
 
 */
 
void DrawStringCenterUnderlineTruncated(int xl, int xr, int y, StringID str, TextColour colour)
 
int DrawStringCenterUnderlineTruncated(int xl, int xr, int y, StringID str, TextColour colour)
 
{
 
	int w = DrawStringCenteredTruncated(xl, xr, y, str, colour);
 
	GfxFillRect((xl + xr - w) / 2, y + 10, (xl + xr + w) / 2, y + 10, _string_colourremap[1]);
 
	return DrawString(xl, xr, y, str, colour, TA_CENTER, true);
 
}
 

	
 
/**
src/gfx_func.h
Show inline comments
 
@@ -85,6 +85,16 @@ void GfxScroll(int left, int top, int wi
 

	
 
void DrawSprite(SpriteID img, SpriteID pal, int x, int y, const SubSprite *sub = NULL);
 

	
 
/** How to align the to-be drawn text. */
 
enum TextAlignment {
 
	TA_LEFT,   ///< Left align the text
 
	TA_CENTER, ///< Center the text
 
	TA_RIGHT,  ///< Right align the text
 
};
 

	
 
int DrawString(int left, int right, int top, const char *str, TextColour colour, TextAlignment align = TA_LEFT, bool underline = false);
 
int DrawString(int left, int right, int top, StringID str, TextColour colour, TextAlignment align = TA_LEFT, bool underline = false);
 

	
 
int DrawStringCentered(int x, int y, StringID str, TextColour colour);
 
int DrawStringCenteredTruncated(int xl, int xr, int y, StringID str, TextColour colour);
 
int DoDrawStringCentered(int x, int y, const char *str, TextColour colour);
 
@@ -95,12 +105,12 @@ int DrawStringTruncated(int x, int y, St
 
int DoDrawString(const char *string, int x, int y, TextColour colour, bool parse_string_also_when_clipped = false);
 
int DoDrawStringTruncated(const char *str, int x, int y, TextColour colour, uint maxw);
 

	
 
void DrawStringCenterUnderline(int x, int y, StringID str, TextColour colour);
 
void DrawStringCenterUnderlineTruncated(int xl, int xr, int y, StringID str, TextColour colour);
 
int DrawStringCenterUnderline(int x, int y, StringID str, TextColour colour);
 
int DrawStringCenterUnderlineTruncated(int xl, int xr, int y, StringID str, TextColour colour);
 

	
 
int DrawStringRightAligned(int x, int y, StringID str, TextColour colour);
 
void DrawStringRightAlignedTruncated(int x, int y, StringID str, TextColour colour, uint maxw);
 
void DrawStringRightAlignedUnderline(int x, int y, StringID str, TextColour colour);
 
int DrawStringRightAlignedTruncated(int x, int y, StringID str, TextColour colour, uint maxw);
 
int DrawStringRightAlignedUnderline(int x, int y, StringID str, TextColour colour);
 

	
 
void DrawCharCentered(uint32 c, int x, int y, TextColour colour);
 

	
0 comments (0 inline, 0 general)