docs: @Override
  	public void draw(final Canvas canvas, final Projection pj) {
  
  		final int size = this.mPoints.size();
  		if (size < 2) {
  			// nothing to paint
  			return;
  		}
  
  		// precompute new points to the intermediate projection.
  		while (this.mPointsPrecomputed < size) {
  			final PointL pt = this.mPoints.get(this.mPointsPrecomputed);
  			pj.toProjectedPixels(pt.x, pt.y, pt);
  
  			this.mPointsPrecomputed++;
  		}
  
  		Point screenPoint0 = null; // points on screen
  		Point screenPoint1;
  		PointL projectedPoint0; // points from the points list
  		PointL projectedPoint1;
  
  		// clipping rectangle in the intermediate projection, to avoid performing projection.
  		BoundingBox boundingBox = pj.getBoundingBox();
  		PointL topLeft = pj.toProjectedPixels(boundingBox.getLatNorth(),
  				boundingBox.getLonWest(), null);
  		PointL bottomRight = pj.toProjectedPixels(boundingBox.getLatSouth(),
  				boundingBox.getLonEast(), null);
  		final RectL clipBounds = new RectL(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y);
  
  		mPath.rewind();
  		projectedPoint0 = this.mPoints.get(size - 1);
  		mLineBounds.set(projectedPoint0.x, projectedPoint0.y, projectedPoint0.x, projectedPoint0.y);
  
  		final double powerDifference = pj.getProjectedPowerDifference();
  		for (int i = size - 2; i >= 0; i--) {
  			// compute next points
  			projectedPoint1 = this.mPoints.get(i);
  			mLineBounds.union(projectedPoint1.x, projectedPoint1.y);
  
  			if (!RectL.intersects(clipBounds, mLineBounds)) {
  				// skip this line, move to next point
  				projectedPoint0 = projectedPoint1;
  				screenPoint0 = null;
  				continue;
  			}
  
  			// the starting point may be not calculated, because previous segment was out of clip
  			// bounds
  			if (screenPoint0 == null) {
  				screenPoint0 = pj.getPixelsFromProjected(projectedPoint0, powerDifference, mTempPoint1);
  				mPath.moveTo(screenPoint0.x, screenPoint0.y);
  			}
  
  			screenPoint1 = pj.getPixelsFromProjected(projectedPoint1, powerDifference, mTempPoint2);
  
  			// skip this point, too close to previous point
  			if (Math.abs(screenPoint1.x - screenPoint0.x) + Math.abs(screenPoint1.y - screenPoint0.y) <= 1) {
  				continue;
  			}
  
  			mPath.lineTo(screenPoint1.x, screenPoint1.y);
  
  			// update starting point to next position
  			projectedPoint0 = projectedPoint1;
  			screenPoint0.x = screenPoint1.x;
  			screenPoint0.y = screenPoint1.y;
  			mLineBounds.set(projectedPoint0.x, projectedPoint0.y, projectedPoint0.x, projectedPoint0.y);
  		}
  
  		canvas.drawPath(mPath, this.mPaint);
  	}