-void MaskEngine::draw_edge(MaskEdge &edge, MaskPointSet &points)
-{
- if( points.size() < 2 ) return;
- edge.remove_all();
- for( int i=0; i<points.size(); ++i ) {
- MaskPoint *ap = points[i];
- MaskPoint *bp = (i>=points.size()-1) ?
- points[0] : points[i+1];
- int dx = ap->x - bp->x, dy = ap->y - bp->y;
- int segments = (int)(sqrt(dx*dx + dy*dy));
- if( !segments ) continue;
- if( ap->control_x2 == 0 && ap->control_y2 == 0 &&
- bp->control_x1 == 0 && bp->control_y1 == 0 )
- segments = 1;
- float x0 = ap->x, y0 = ap->y;
- float x1 = ap->x + ap->control_x2;
- float y1 = ap->y + ap->control_y2;
- float x2 = bp->x + bp->control_x1;
- float y2 = bp->y + bp->control_y1;
- float x3 = bp->x, y3 = bp->y;
-
- for( int j = 0; j <= segments; ++j ) {
- float t = (float)j / segments;
- float tpow2 = t * t;
- float tpow3 = t * t * t;
- float invt = 1 - t;
- float invtpow2 = invt * invt;
- float invtpow3 = invt * invt * invt;
-
- int x = (invtpow3 * x0
- + 3 * t * invtpow2 * x1
- + 3 * tpow2 * invt * x2
- + tpow3 * x3);
- int y = (invtpow3 * y0
- + 3 * t * invtpow2 * y1
- + 3 * tpow2 * invt * y2
- + tpow3 * y3);
- edge.append(x, y);
- }
- }
-}
-