docs: @Pure
  	public int computeCrossings(
  			int crossings,
  			double x0, double y0, double z0,
  			double x1, double y1, double z1) {
  
          if (this.bounds == null) {
              return crossings;
          }
  
  		int numCrosses =
  				Segment3afp.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,
  					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.hasX4ymin()) {
  				++inc;
  			}
              if (data.hasX4ymax()) {
  				++inc;
  			}
  
              if (y0 < y1) {
                  numCrosses += inc;
              } else {
                  numCrosses -= inc;
              }
  
  			// Apply the previously computed crossings
  			numCrosses += crossings;
  		}
  
  		return numCrosses;
  	}