using std::min;
using std::max;
-Curve::Curve (Group* parent)
- : Item (parent)
- , PolyItem (parent)
- , Fill (parent)
+Curve::Curve (Canvas* c)
+ : PolyItem (c)
+ , n_samples (0)
+ , points_per_segment (16)
+ , curve_fill (None)
+{
+}
+
+Curve::Curve (Item* parent)
+ : PolyItem (parent)
, n_samples (0)
, points_per_segment (16)
- , curve_type (CatmullRomCentripetal)
, curve_fill (None)
{
}
* section of the curve. For now we rely on cairo clipping to help
* with this.
*/
-
+
setup_outline_context (context);
draw = draw.expand (4.0);
/* now clip it to the actual points in the curve */
-
+
if (draw.x0 < w1.x) {
draw.x0 = w1.x;
}
/* draw line between samples */
window_space = item_to_window (Duple (samples[left].x, samples[left].y));
context->move_to (window_space.x, window_space.y);
- Coord last_x = round(window_space.x);
- Coord last_y = round(window_space.y);
for (uint32_t idx = left + 1; idx < right; ++idx) {
window_space = item_to_window (Duple (samples[idx].x, samples[idx].y));
- if (last_x == round(window_space.x)) continue;
- if (last_y == round(window_space.y)) continue;
- last_x = round(window_space.x);
- last_y = round(window_space.y);
- context->line_to (last_x - .5 , last_y + .5);
- }
- if (last_x != round(window_space.x) || last_y != round(window_space.y)) {
- context->line_to (window_space.x - .5 , window_space.y + .5);
+ context->line_to (window_space.x, window_space.y);
}
switch (curve_fill) {
bool
Curve::covers (Duple const & pc) const
{
- Duple point = canvas_to_item (pc);
+ Duple point = window_to_item (pc);
/* O(N) N = number of points, and not accurate */