docs: @Pure
  	public int computeCrossings(
  			int crossings,
  			int x0, int y0, int z0,
  			int x1, int y1, int z1) {
  		int numCrosses =
  				Segment3ai.computeCrossingsFromRect(crossings,
  						this.bounds.getMinX(),
  						this.bounds.getMinY(),
  						this.bounds.getMinZ(),
  						this.bounds.getMaxX(),
  						this.bounds.getMaxY(),
  						this.bounds.getMaxZ(),
  						x0, y0, z0,
  						x1, y1, z1);
  
  		if (numCrosses == GeomConstants.SHAPE_INTERSECTS) {
  			// The segment is intersecting the bounds of the shadow path.
  			// We must consider the shape of shadow path now.
  			final PathShadowData data = new PathShadowData(
  					this.bounds.getMaxX(),
  					this.bounds.getMinY(),
  					this.bounds.getMaxY());
  
  			computeCrossings1(
  					this.path.getPathIterator(this.path.getGeomFactory().getSplineApproximationRatio()),
  					x0, y0, z0, x1, y1, z1,
  					false,
  					this.path.getWindingRule(),
  					this.path.getGeomFactory(),
  					data);
  			numCrosses = data.getCrossings();
  
  			final int mask = this.path.getWindingRule() == PathWindingRule.NON_ZERO ? -1 : 2;
  			if (numCrosses == GeomConstants.SHAPE_INTERSECTS || (numCrosses & mask) != 0) {
  				// The given line is intersecting the path shape
  				return GeomConstants.SHAPE_INTERSECTS;
  			}
  
  			// There is no intersection with the shadow path's shape.
  			int inc = 0;
  			if (data.isHasX4ymin() && data.getX4ymin() >= data.getXmin4ymin()) {
  				++inc;
  			}
  			if (data.isHasX4ymax() && data.getX4ymax() >= data.getXmin4ymax()) {
  				++inc;
  			}
  
  			if (y0 < y1) {
  				numCrosses += inc;
  			} else {
  				numCrosses -= inc;
  			}
  
  			// Apply the previously computed crossings
  			numCrosses += crossings;
  		}
  
  		return numCrosses;
  	}