* clutter/cogl/gles/cogl-primitives.c: (_cogl_path_fill_nodes):
keep track of direction we are drawing in and make sure we leave two intersection points when we have changed direction.
This commit is contained in:
parent
6562d30ab0
commit
98f5b6a0c9
@ -1,3 +1,9 @@
|
|||||||
|
2008-04-30 Øyvind Kolås <pippin@o-hand.com>
|
||||||
|
|
||||||
|
* clutter/cogl/gles/cogl-primitives.c: (_cogl_path_fill_nodes):
|
||||||
|
keep track of direction we are drawing in and make sure we leave
|
||||||
|
two intersection points when we have changed direction.
|
||||||
|
|
||||||
2008-04-30 Øyvind Kolås <pippin@o-hand.com>
|
2008-04-30 Øyvind Kolås <pippin@o-hand.com>
|
||||||
|
|
||||||
* clutter/cogl/gles/cogl-primitives.c: (_cogl_path_fill_nodes):
|
* clutter/cogl/gles/cogl-primitives.c: (_cogl_path_fill_nodes):
|
||||||
|
@ -254,6 +254,8 @@ _cogl_path_fill_nodes ()
|
|||||||
gint prev_y;
|
gint prev_y;
|
||||||
gint first_x;
|
gint first_x;
|
||||||
gint first_y;
|
gint first_y;
|
||||||
|
gint lastdir=-2; /* last direction we vere moving */
|
||||||
|
gint lastline=-1; /* the previous scanline we added to */
|
||||||
|
|
||||||
/* clear scanline intersection lists */
|
/* clear scanline intersection lists */
|
||||||
for (i=0; i < bounds_h; i++)
|
for (i=0; i < bounds_h; i++)
|
||||||
@ -278,14 +280,21 @@ fill_close:
|
|||||||
|
|
||||||
if (dy < 0)
|
if (dy < 0)
|
||||||
ydir = -1;
|
ydir = -1;
|
||||||
else
|
else if (dy > 0)
|
||||||
ydir = 1;
|
ydir = 1;
|
||||||
|
else
|
||||||
|
ydir = 0;
|
||||||
|
|
||||||
/* do linear interpolation between vertexes */
|
/* do linear interpolation between vertexes */
|
||||||
for (y=prev_y; y!= dest_y; y += ydir)
|
for (y=prev_y; y!= dest_y; y += ydir)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/* only add a point if the scanline has changed and we're
|
||||||
|
* within bounds.
|
||||||
|
*/
|
||||||
if (y-bounds_y >= 0 &&
|
if (y-bounds_y >= 0 &&
|
||||||
y-bounds_y < bounds_h)
|
y-bounds_y < bounds_h &&
|
||||||
|
lastline != y)
|
||||||
{
|
{
|
||||||
gint x = prev_x + (dx * (y-prev_y)) / dy;
|
gint x = prev_x + (dx * (y-prev_y)) / dy;
|
||||||
|
|
||||||
@ -293,6 +302,15 @@ fill_close:
|
|||||||
g_slist_insert_sorted (scanlines[ y - bounds_y],
|
g_slist_insert_sorted (scanlines[ y - bounds_y],
|
||||||
GINT_TO_POINTER(x),
|
GINT_TO_POINTER(x),
|
||||||
compare_ints);
|
compare_ints);
|
||||||
|
|
||||||
|
if (ydir != lastdir && /* add a double entry when changing */
|
||||||
|
lastdir!=-2) /* vertical direction */
|
||||||
|
scanlines[ y - bounds_y ]=
|
||||||
|
g_slist_insert_sorted (scanlines[ y - bounds_y],
|
||||||
|
GINT_TO_POINTER(x),
|
||||||
|
compare_ints);
|
||||||
|
lastdir = ydir;
|
||||||
|
lastline = y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user