for (i=0; i < pen->num_vertices; i++) { if ((_cairo_slope_compare (slope, &pen->vertices[i].slope_ccw) < 0) &&
(_cairo_slope_compare (slope, &pen->vertices[i].slope_cw) >= 0)) break;
}
/* If the desired slope cannot be found between any of the pen *vertices,thenwemusthaveadegeneratepen,(suchasapen *that'sbeentransformedtoaline).Inthatcase,weconsider *thefirstpenvertexastheappropriateclockwisevertex.
*/ if (i == pen->num_vertices)
i = 0;
return i;
}
/* Find active pen vertex for counterclockwise edge of stroke at the given slope. * *Note:Seethecommentsfor_cairo_pen_find_active_cw_vertex_index *forsomedetailsaboutthestrictnessoftheinequalitieshere.
*/ int
_cairo_pen_find_active_ccw_vertex_index (const cairo_pen_t *pen, const cairo_slope_t *slope)
{
cairo_slope_t slope_reverse; int i;
for (i=pen->num_vertices-1; i >= 0; i--) { if ((_cairo_slope_compare (&pen->vertices[i].slope_ccw, &slope_reverse) >= 0) &&
(_cairo_slope_compare (&pen->vertices[i].slope_cw, &slope_reverse) < 0)) break;
}
/* If the desired slope cannot be found between any of the pen *vertices,thenwemusthaveadegeneratepen,(suchasapen *that'sbeentransformedtoaline).Inthatcase,weconsider *thelastpenvertexastheappropriatecounterclockwisevertex.
*/ if (i < 0)
i = pen->num_vertices - 1;
return i;
}
void
_cairo_pen_find_active_cw_vertices (const cairo_pen_t *pen, const cairo_slope_t *in, const cairo_slope_t *out, int *start, int *stop)
{
int lo = 0, hi = pen->num_vertices; int i;
i = (lo + hi) >> 1; do { if (_cairo_slope_compare (&pen->vertices[i].slope_cw, in) < 0)
lo = i; else
hi = i;
i = (lo + hi) >> 1;
} while (hi - lo > 1); if (_cairo_slope_compare (&pen->vertices[i].slope_cw, in) < 0) if (++i == pen->num_vertices)
i = 0;
*start = i;
if (_cairo_slope_compare (out, &pen->vertices[i].slope_ccw) >= 0) {
lo = i;
hi = i + pen->num_vertices;
i = (lo + hi) >> 1; do { int j = i; if (j >= pen->num_vertices)
j -= pen->num_vertices; if (_cairo_slope_compare (&pen->vertices[j].slope_cw, out) > 0)
hi = i; else
lo = i;
i = (lo + hi) >> 1;
} while (hi - lo > 1); if (i >= pen->num_vertices)
i -= pen->num_vertices;
}
*stop = i;
}
void
_cairo_pen_find_active_ccw_vertices (const cairo_pen_t *pen, const cairo_slope_t *in, const cairo_slope_t *out, int *start, int *stop)
{ int lo = 0, hi = pen->num_vertices; int i;
i = (lo + hi) >> 1; do { if (_cairo_slope_compare (in, &pen->vertices[i].slope_ccw) < 0)
lo = i; else
hi = i;
i = (lo + hi) >> 1;
} while (hi - lo > 1); if (_cairo_slope_compare (in, &pen->vertices[i].slope_ccw) < 0) if (++i == pen->num_vertices)
i = 0;
*start = i;
if (_cairo_slope_compare (&pen->vertices[i].slope_cw, out) <= 0) {
lo = i;
hi = i + pen->num_vertices;
i = (lo + hi) >> 1; do { int j = i; if (j >= pen->num_vertices)
j -= pen->num_vertices; if (_cairo_slope_compare (out, &pen->vertices[j].slope_ccw) > 0)
hi = i; else
lo = i;
i = (lo + hi) >> 1;
} while (hi - lo > 1); if (i >= pen->num_vertices)
i -= pen->num_vertices;
}
*stop = i;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.