# Code coverage report for src/geometry/PolyUtil.js

## Statements: 100% (23 / 23) Branches: 100% (6 / 6) Functions: 100% (1 / 1) Lines: 100% (23 / 23)

All files » src/geometry/ » PolyUtil.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56

    1

    1
    1

    1
    3

    1
    4
    4

    4
    13
    13

    13

    10
    2
    2
    2

    10

    3
    2
    2
    2

    4

    1

     /*
     * L.PolyUtil contains utility functions for polygons (clipping, etc.).
     */

    /*jshint bitwise:false */ // allow bitwise operations here

    L.PolyUtil = {};

    /*
     * Sutherland-Hodgeman polygon clipping algorithm.
     * Used to avoid rendering parts of a polygon that are not currently visible.
     */
    L.PolyUtil.clipPolygon = function (points, bounds) {
    	var clippedPoints,
    	    edges = [1, 4, 2, 8],
    	    i, j, k,
    	    a, b,
    	    len, edge, p,
    	    lu = L.LineUtil;

    	for (i = 0, len = points.length; i < len; i++) {
    		points[i]._code = lu._getBitCode(points[i], bounds);
    	}

    	// for each edge (left, bottom, right, top)
    	for (k = 0; k < 4; k++) {
    		edge = edges[k];
    		clippedPoints = [];

    		for (i = 0, len = points.length, j = len - 1; i < len; j = i++) {
    			a = points[i];
    			b = points[j];

    			// if a is inside the clip window
    			if (!(a._code & edge)) {
    				// if b is outside the clip window (a->b goes out of screen)
    				if (b._code & edge) {
    					p = lu._getEdgeIntersection(b, a, edge, bounds);
    					p._code = lu._getBitCode(p, bounds);
    					clippedPoints.push(p);
    				}
    				clippedPoints.push(a);

    			// else if b is inside the clip window (a->b enters the screen)
    			} else if (!(b._code & edge)) {
    				p = lu._getEdgeIntersection(b, a, edge, bounds);
    				p._code = lu._getBitCode(p, bounds);
    				clippedPoints.push(p);
    			}
    		}
    		points = clippedPoints;
    	}

    	return points;
    };