[clip-stack] Internally track model space clip rects as (x0,y0)(x1,y1) pairs

Don't track the rectangles as x0,y0,width,height. This is in preparation
for some API tidy up.
This commit is contained in:
Robert Bragg 2009-11-04 20:17:56 +00:00
parent 6ca49145f4
commit 1af8be2f70

View File

@ -66,10 +66,10 @@ struct _CoglClipStackEntryRect
CoglClipStackEntryType type;
/* The rectangle for this clip */
float x_offset;
float y_offset;
float width;
float height;
float x0;
float y0;
float x1;
float y1;
/* The matrix that was current when the clip was set */
CoglMatrix matrix;
@ -178,10 +178,10 @@ set_clip_plane (GLint plane_num,
}
static void
set_clip_planes (float x_offset,
float y_offset,
float width,
float height)
set_clip_planes (float x_1,
float y_1,
float x_2,
float y_2)
{
CoglHandle draw_buffer = _cogl_get_draw_buffer ();
CoglMatrixStack *modelview_stack =
@ -191,11 +191,10 @@ set_clip_planes (float x_offset,
_cogl_draw_buffer_get_projection_stack (draw_buffer);
CoglMatrix projection_matrix;
float vertex_tl[4] = { x_offset, y_offset, 0, 1.0 };
float vertex_tr[4] = { x_offset + width, y_offset, 0, 1.0 };
float vertex_bl[4] = { x_offset, y_offset + height, 0, 1.0 };
float vertex_br[4] = { x_offset + width, y_offset + height,
0, 1.0 };
float vertex_tl[4] = { x_1, y_1, 0, 1.0 };
float vertex_tr[4] = { x_2, y_1, 0, 1.0 };
float vertex_bl[4] = { x_1, y_2, 0, 1.0 };
float vertex_br[4] = { x_2, y_2, 0, 1.0 };
_cogl_matrix_stack_get (projection_stack, &projection_matrix);
_cogl_matrix_stack_get (modelview_stack, &modelview_matrix);
@ -229,10 +228,10 @@ set_clip_planes (float x_offset,
}
void
add_stencil_clip_rectangle (float x_offset,
float y_offset,
float width,
float height,
add_stencil_clip_rectangle (float x_1,
float y_1,
float x_2,
float y_2,
gboolean first)
{
CoglHandle current_source;
@ -262,8 +261,7 @@ add_stencil_clip_rectangle (float x_offset,
GE( glStencilFunc (GL_NEVER, 0x1, 0x1) );
GE( glStencilOp (GL_REPLACE, GL_REPLACE, GL_REPLACE) );
cogl_rectangle (x_offset, y_offset,
x_offset + width, y_offset + height);
cogl_rectangle (x_1, y_1, x_2, y_2);
}
else
{
@ -276,8 +274,7 @@ add_stencil_clip_rectangle (float x_offset,
rectangle */
GE( glStencilFunc (GL_NEVER, 0x1, 0x3) );
GE( glStencilOp (GL_INCR, GL_INCR, GL_INCR) );
cogl_rectangle (x_offset, y_offset,
x_offset + width, y_offset + height);
cogl_rectangle (x_1, y_1, x_2, y_2);
/* make sure our rectangle hits the stencil buffer before we
* change the stencil operation */
@ -441,18 +438,14 @@ transform_point (CoglMatrix *matrix_mv,
/* Try to push a rectangle given in object coordinates as a rectangle in window
* coordinates instead of object coordinates */
gboolean
try_pushing_rect_as_window_rect (float x_offset,
float y_offset,
float width,
float height)
try_pushing_rect_as_window_rect (float x_1,
float y_1,
float x_2,
float y_2)
{
CoglMatrix matrix;
CoglMatrix matrix_p;
float v[4];
float _x0 = x_offset;
float _y0 = y_offset;
float _x1 = x_offset + width;
float _y1 = y_offset + height;
cogl_get_modelview_matrix (&matrix);
@ -473,27 +466,27 @@ try_pushing_rect_as_window_rect (float x_offset,
cogl_get_projection_matrix (&matrix_p);
cogl_get_viewport (v);
transform_point (&matrix, &matrix_p, v, &_x0, &_y0);
transform_point (&matrix, &matrix_p, v, &_x1, &_y1);
transform_point (&matrix, &matrix_p, v, &x_1, &y_1);
transform_point (&matrix, &matrix_p, v, &x_2, &y_2);
/* Consider that the modelview matrix may flip the rectangle
* along the x or y axis... */
#define SWAP(A,B) do { float tmp = B; B = A; A = tmp; } while (0)
if (_x0 > _x1)
SWAP (_x0, _x1);
if (_y0 > _y1)
SWAP (_y0, _y1);
if (x_1 > x_2)
SWAP (x_1, x_2);
if (y_1 > y_2)
SWAP (y_1, y_2);
#undef SWAP
cogl_clip_push_window_rect (_x0, _y0, _x1 - _x0, _y1 - _y0);
cogl_clip_push_window_rect (x_1, y_1, x_2 - x_1, y_2 - y_1);
return TRUE;
}
void
cogl_clip_push (float x_offset,
float y_offset,
float width,
float height)
static void
_cogl_clip_push_rectangle (float x_1,
float y_1,
float x_2,
float y_2)
{
CoglHandle draw_buffer;
CoglClipStackState *clip_state;
@ -508,7 +501,7 @@ cogl_clip_push (float x_offset,
/* Try and catch window space rectangles so we can redirect to
* cogl_clip_push_window_rect which will use scissoring. */
if (try_pushing_rect_as_window_rect (x_offset, y_offset, width, height))
if (try_pushing_rect_as_window_rect (x_1, y_1, x_2, y_2))
return;
draw_buffer = _cogl_get_draw_buffer ();
@ -520,10 +513,10 @@ cogl_clip_push (float x_offset,
/* Make a new entry */
entry->type = COGL_CLIP_STACK_RECT;
entry->x_offset = x_offset;
entry->y_offset = y_offset;
entry->width = width;
entry->height = height;
entry->x0 = x_1;
entry->y0 = y_1;
entry->x1 = x_2;
entry->y1 = y_2;
cogl_get_modelview_matrix (&entry->matrix);
@ -533,6 +526,18 @@ cogl_clip_push (float x_offset,
clip_state->stack_dirty = TRUE;
}
void
cogl_clip_push (float x_offset,
float y_offset,
float width,
float height)
{
_cogl_clip_push_rectangle (x_offset,
y_offset,
x_offset + width,
y_offset + height);
}
void
cogl_clip_push_from_path_preserve (void)
{
@ -707,20 +712,20 @@ _cogl_flush_clip_state (CoglClipStackState *clip_state)
that instead */
if (has_clip_planes)
{
set_clip_planes (rect->x_offset,
rect->y_offset,
rect->width,
rect->height);
set_clip_planes (rect->x0,
rect->y0,
rect->x1,
rect->y1);
using_clip_planes = TRUE;
/* We can't use clip planes a second time */
has_clip_planes = FALSE;
}
else
{
add_stencil_clip_rectangle (rect->x_offset,
rect->y_offset,
rect->width,
rect->height,
add_stencil_clip_rectangle (rect->x0,
rect->y0,
rect->x1,
rect->y1,
!using_stencil_buffer);
using_stencil_buffer = TRUE;
}