/** 
 | 
 * 直线 
 | 
 * @module zrender/graphic/shape/Line 
 | 
 */ 
 | 
  
 | 
import Path, { PathProps } from '../Path'; 
 | 
import {subPixelOptimizeLine} from '../helper/subPixelOptimize'; 
 | 
import { VectorArray } from '../../core/vector'; 
 | 
  
 | 
// Avoid create repeatly. 
 | 
const subPixelOptimizeOutputShape = {}; 
 | 
  
 | 
export class LineShape { 
 | 
    // Start point 
 | 
    x1 = 0 
 | 
    y1 = 0 
 | 
    // End point 
 | 
    x2 = 0 
 | 
    y2 = 0 
 | 
  
 | 
    percent = 1 
 | 
} 
 | 
  
 | 
export interface LineProps extends PathProps { 
 | 
    shape?: Partial<LineShape> 
 | 
} 
 | 
class Line extends Path<LineProps> { 
 | 
  
 | 
    shape: LineShape 
 | 
  
 | 
    constructor(opts?: LineProps) { 
 | 
        super(opts); 
 | 
    } 
 | 
  
 | 
    getDefaultStyle() { 
 | 
        return { 
 | 
            stroke: '#000', 
 | 
            fill: null as string 
 | 
        }; 
 | 
    } 
 | 
  
 | 
    getDefaultShape() { 
 | 
        return new LineShape(); 
 | 
    } 
 | 
  
 | 
    buildPath(ctx: CanvasRenderingContext2D, shape: LineShape) { 
 | 
        let x1; 
 | 
        let y1; 
 | 
        let x2; 
 | 
        let y2; 
 | 
  
 | 
        if (this.subPixelOptimize) { 
 | 
            const optimizedShape = subPixelOptimizeLine( 
 | 
                subPixelOptimizeOutputShape, shape, this.style 
 | 
            ); 
 | 
            x1 = optimizedShape.x1; 
 | 
            y1 = optimizedShape.y1; 
 | 
            x2 = optimizedShape.x2; 
 | 
            y2 = optimizedShape.y2; 
 | 
        } 
 | 
        else { 
 | 
            x1 = shape.x1; 
 | 
            y1 = shape.y1; 
 | 
            x2 = shape.x2; 
 | 
            y2 = shape.y2; 
 | 
        } 
 | 
  
 | 
        const percent = shape.percent; 
 | 
  
 | 
        if (percent === 0) { 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        ctx.moveTo(x1, y1); 
 | 
  
 | 
        if (percent < 1) { 
 | 
            x2 = x1 * (1 - percent) + x2 * percent; 
 | 
            y2 = y1 * (1 - percent) + y2 * percent; 
 | 
        } 
 | 
        ctx.lineTo(x2, y2); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * Get point at percent 
 | 
     */ 
 | 
    pointAt(p: number): VectorArray { 
 | 
        const shape = this.shape; 
 | 
        return [ 
 | 
            shape.x1 * (1 - p) + shape.x2 * p, 
 | 
            shape.y1 * (1 - p) + shape.y2 * p 
 | 
        ]; 
 | 
    } 
 | 
} 
 | 
  
 | 
Line.prototype.type = 'line'; 
 | 
export default Line; 
 |