Index: code/freespace2/freespace.cpp
===================================================================
--- code/freespace2/freespace.cpp	(revision 4831)
+++ code/freespace2/freespace.cpp	(working copy)
@@ -6283,21 +6283,23 @@
 		else
 			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
 
-		//Set rectangles
-		gr_set_color(0,0,0);
-		gr_rect(0, 0, gr_screen.max_w, yborder, false);
-		gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
-		//Set teh clipping
-		//gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
+		//Set scissors
+		gr_set_scissor(0, 0, gr_screen.max_w, yborder);
+		gr_clear();
+		gr_set_scissor(0, gr_screen.max_h - yborder, gr_screen.max_w, gr_screen.max_h);
+		gr_clear();
+		gr_unset_scissor();
 	}
 	else if(Cutscene_bar_flags & CUB_CUTSCENE)
 	{
 		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
 
-		gr_set_color(0,0,0);
-		gr_rect(0, 0, gr_screen.max_w, yborder, false);
-		gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
-		//gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );	
+		//Set scissors
+		gr_set_scissor(0, 0, gr_screen.max_w, yborder);
+		gr_clear();
+		gr_set_scissor(0, gr_screen.max_h - yborder, gr_screen.max_w, gr_screen.max_h);
+		gr_clear();
+		gr_unset_scissor();
 	}
 }
 
Index: code/graphics/2d.h
===================================================================
--- code/graphics/2d.h	(revision 4831)
+++ code/graphics/2d.h	(working copy)
@@ -928,7 +928,13 @@
 
 	// resets the clipping region to entire screen
 	void (*gf_reset_clip)();
+ 
+	// sets the scissor region
+	void (*gf_set_scissor)(int x, int y, int w, int h);
 
+	// resets the scissor region to entire screen
+	void (*gf_unset_scissor)();
+
 	//void (*gf_set_color)( int r, int g, int b );
 	//void (*gf_get_color)( int * r, int * g, int * b );
 	//void (*gf_init_color)( color * dst, int r, int g, int b );
@@ -1229,6 +1235,12 @@
 	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
 }
 #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
+
+__inline void gr_set_scissor(int x, int y, int w, int h)
+{
+	(*gr_screen.gf_set_scissor)(x,y,w,h);
+}
+#define gr_unset_scissor		GR_CALL(gr_screen.gf_unset_scissor)
 //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
 
 //#define gr_init_color		GR_CALL(gr_screen.gf_init_color)
Index: code/graphics/grd3d.cpp
===================================================================
--- code/graphics/grd3d.cpp	(revision 4831)
+++ code/graphics/grd3d.cpp	(working copy)
@@ -1582,6 +1582,48 @@
 
 }
 
+void gr_d3d_set_scissor(int x, int y, int w, int h)
+{
+	// check for sanity of parameters
+	if (x < 0)
+		x = 0;
+	if (y < 0)
+		y = 0;
+
+	int max_w = gr_screen.max_w;
+	int max_h = gr_screen.max_h;
+
+	if (x >= max_w)
+		x = max_w - 1;
+	if (y >= max_h)
+		y = max_h - 1;
+
+	if (x + w > max_w)
+		w = max_w - x;
+	if (y + h > max_h)
+		h = max_h - y;
+
+	if (w > max_w)
+		w = max_w;
+	if (h > max_h)
+		h = max_h;
+
+	// just return early if we aren't actually going to need the scissor test
+	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
+		GlobalD3DVars::lpD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE , FALSE);
+		return;
+	}
+
+	RECT rect = {x, y, w, h};
+	GlobalD3DVars::lpD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE);
+	GlobalD3DVars::lpD3DDevice->SetScissorRect(&rect);
+}
+
+void gr_d3d_unset_scissor()
+{
+	GlobalD3DVars::lpD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE , FALSE);
+}
+
 void gr_d3d_flip_cleanup()
 {
 	d3d_stop_frame();
Index: code/graphics/grd3dsetup.cpp
===================================================================
--- code/graphics/grd3dsetup.cpp	(revision 4831)
+++ code/graphics/grd3dsetup.cpp	(working copy)
@@ -799,6 +799,8 @@
 {
 		// Set all the pointer to functions to the correct D3D functions
 	gr_screen.gf_flip = gr_d3d_flip;
+	gr_screen.gf_set_scissor = gr_d3d_set_scissor;
+	gr_screen.gf_unset_scissor = gr_d3d_unset_scissor;
 	gr_screen.gf_set_clip = gr_d3d_set_clip;
 	gr_screen.gf_reset_clip = gr_d3d_reset_clip;
 
Index: code/graphics/gropengl.cpp
===================================================================
--- code/graphics/gropengl.cpp	(revision 4831)
+++ code/graphics/gropengl.cpp	(working copy)
@@ -1510,6 +1510,47 @@
 #endif
 }
 
+void gr_opengl_set_scissor(int x, int y, int w, int h)
+{
+	// check for sanity of parameters
+	if (x < 0)
+		x = 0;
+	if (y < 0)
+		y = 0;
+
+	int max_w = gr_screen.max_w;
+	int max_h = gr_screen.max_h;
+
+	if (x >= max_w)
+		x = max_w - 1;
+	if (y >= max_h)
+		y = max_h - 1;
+
+	if (x + w > max_w)
+		w = max_w - x;
+	if (y + h > max_h)
+		h = max_h - y;
+
+	if (w > max_w)
+		w = max_w;
+	if (h > max_h)
+		h = max_h;
+
+	// just return early if we aren't actually going to need the scissor test
+	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
+		glDisable(GL_SCISSOR_TEST);
+		return;
+	}
+
+	glEnable(GL_SCISSOR_TEST);
+	glScissor(x, gr_screen.max_h - y - h, w, h);
+}
+
+void gr_opengl_unset_scissor()
+{
+	glDisable(GL_SCISSOR_TEST);
+}
+
 void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
 {
 	// check for sanity of parameters
@@ -2824,6 +2865,8 @@
 	//       if they shouldn't be run in non-HTL mode, Don't keep separate entries.
 
 	gr_screen.gf_flip				= gr_opengl_flip;
+	gr_screen.gf_set_scissor        = gr_opengl_set_scissor;
+	gr_screen.gf_unset_scissor      = gr_opengl_unset_scissor;
 	gr_screen.gf_set_clip			= gr_opengl_set_clip;
 	gr_screen.gf_reset_clip			= gr_opengl_reset_clip;
 	
