gui: fix console lockup when scrolling

Apparently fixing all the signed/unsigned warnings was good. :)

Change-Id: I62faa23179e8b2436fe0d24d2152af341cd42fe9
diff --git a/gui/console.cpp b/gui/console.cpp
index 218a305..9c780c0 100644
--- a/gui/console.cpp
+++ b/gui/console.cpp
@@ -206,7 +206,7 @@
 	gr_fill(mConsoleX + (mConsoleW * 9 / 10), mConsoleY, (mConsoleW / 10), mConsoleH);
 
 	// Don't try to continue to render without data
-	int prevCount = mLastCount;
+	size_t prevCount = mLastCount;
 	mLastCount = gConsole.size();
 	mRender = false;
 	if (mLastCount == 0)
@@ -215,12 +215,11 @@
 	// Due to word wrap, figure out what / how the newly added text needs to be added to the render vector that is word wrapped
 	// Note, that multiple consoles on different GUI pages may be different widths or use different fonts, so the word wrapping
 	// may different in different console windows
-	for (int i = prevCount; i < mLastCount; i++) {
+	for (size_t i = prevCount; i < mLastCount; i++) {
 		string curr_line = gConsole[i];
 		string curr_color = gConsoleColor[i];
-		int line_char_width;
 		for(;;) {
-			line_char_width = gr_maxExW(curr_line.c_str(), fontResource, mConsoleW);
+			size_t line_char_width = gr_maxExW(curr_line.c_str(), fontResource, mConsoleW);
 			if (line_char_width < curr_line.size()) {
 				rConsole.push_back(curr_line.substr(0, line_char_width));
 				rConsoleColor.push_back(curr_color);
@@ -237,7 +236,7 @@
 	// Find the start point
 	int start;
 	int curLine = mCurrentLine; // Thread-safing (Another thread updates this value)
-	if (curLine == -1)
+	if (curLine == -1) // follow tail
 	{
 		start = RenderCount - mMaxRows;
 	}
@@ -250,20 +249,21 @@
 		start = curLine - mMaxRows;
 	}
 
-	unsigned int line;
-	for (line = 0; line < mMaxRows; line++)
+	// note: start can be negative here
+	for (int line = 0; line < mMaxRows; line++)
 	{
-		if ((start + (int) line) >= 0 && (start + (int) line) < (int) RenderCount) {
-			if (rConsoleColor[start + line] == "normal") {
+		int index = start + line;
+		if (index >= 0 && index < (int) RenderCount) {
+			if (rConsoleColor[index] == "normal") {
 				gr_color(mForegroundColor.red, mForegroundColor.green, mForegroundColor.blue, mForegroundColor.alpha);
 			} else {
 				COLOR mFontColor;
-				std::string color = rConsoleColor[start + line];
+				std::string color = rConsoleColor[index];
 				ConvertStrToColor(color, &mFontColor);
 				mFontColor.alpha = 255;
 				gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha);
 			}
-			gr_textExW(mConsoleX, mStartY + (line * mFontHeight), rConsole[start + line].c_str(), fontResource, mConsoleW + mConsoleX);
+			gr_textExW(mConsoleX, mStartY + (line * mFontHeight), rConsole[index].c_str(), fontResource, mConsoleW + mConsoleX);
 		}
 	}
 	return (mSlideout ? RenderSlideout() : 0);
@@ -382,7 +382,7 @@
 	}
 
 	// If we don't have enough lines to scroll, throw this away.
-	if (RenderCount < mMaxRows)   return 1;
+	if ((int)RenderCount < mMaxRows)   return 1;
 
 	// We are scrolling!!!
 	switch (state)
diff --git a/gui/objects.hpp b/gui/objects.hpp
index 0928f30..c286567 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -407,11 +407,11 @@
 	COLOR mForegroundColor;
 	COLOR mBackgroundColor;
 	COLOR mScrollColor;
-	unsigned int mFontHeight;
-	int mCurrentLine;
-	unsigned int mLastCount;
-	unsigned int RenderCount;
-	unsigned int mMaxRows;
+	int mFontHeight;
+	int mCurrentLine; // index of last line to show; -1 to keep tracking last line
+	size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
+	size_t RenderCount; // total number of lines after wrapping
+	int mMaxRows; // height of console in text rows
 	int mStartY;
 	int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
 	int mSlideinX, mSlideinY, mSlideinW, mSlideinH;