Prevent overflows and underflows in love.graphics.push and love.graphics.pop (bug #118)

Maximum is hardware maximum - 5, so the engine itself has a few matrices.
This commit is contained in:
Bart van Strien
2011-06-08 22:45:28 +02:00
parent 0179b53bb6
commit efb8efb45e
3 changed files with 32 additions and 5 deletions
+12 -1
View File
@@ -37,7 +37,7 @@ namespace opengl
{ {
Graphics::Graphics() Graphics::Graphics()
: currentFont(0), lineWidth(1) : currentFont(0), lineWidth(1), matrixLimit(0), userMatrices(0)
{ {
// Indicates that there is no screen // Indicates that there is no screen
// created yet. // created yet.
@@ -280,6 +280,11 @@ namespace opengl
// Restore the display state. // Restore the display state.
restoreState(tempState); restoreState(tempState);
// Get the maximum number of matrices
// subtract a few to give the engine some room.
glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &matrixLimit);
matrixLimit -= 5;
return true; return true;
} }
@@ -984,12 +989,18 @@ namespace opengl
void Graphics::push() void Graphics::push()
{ {
if (userMatrices == matrixLimit)
throw Exception("Maximum stack depth reached.");
glPushMatrix(); glPushMatrix();
++userMatrices;
} }
void Graphics::pop() void Graphics::pop()
{ {
if (userMatrices < 1)
throw Exception("Minimum stack depth reached. (More pops than pushes?)");
glPopMatrix(); glPopMatrix();
--userMatrices;
} }
void Graphics::rotate(float r) void Graphics::rotate(float r)
+2
View File
@@ -115,6 +115,8 @@ namespace opengl
DisplayMode currentMode; DisplayMode currentMode;
float lineWidth; float lineWidth;
GLint matrixLimit;
GLint userMatrices;
public: public:
+18 -4
View File
@@ -950,15 +950,29 @@ namespace opengl
return 0; return 0;
} }
int w_push(lua_State *) int w_push(lua_State *L)
{ {
instance->push(); try
{
instance->push();
}
catch (love::Exception e)
{
return luaL_error(L, e.what());
}
return 0; return 0;
} }
int w_pop(lua_State *) int w_pop(lua_State *L)
{ {
instance->pop(); try
{
instance->pop();
}
catch (love::Exception e)
{
return luaL_error(L, e.what());
}
return 0; return 0;
} }