public BooleanGridList offset(LayerRules lc, boolean outline) {
    boolean foundation = lc.getLayingSupport();
    if (outline && foundation) Debug.e("Offsetting a foundation outline!");

    BooleanGridList result = new BooleanGridList();
    for (int i = 0; i < size(); i++) {
      Attributes att = attribute(i);
      if (att == null) Debug.e("BooleanGridList.offset(): null attribute!");
      else {
        Extruder[] es = lc.getPrinter().getExtruders();
        Extruder e;
        int shells;
        if (foundation) {
          e = es[0]; // By convention extruder 0 builds the foundation
          shells = 1;
        } else {
          e = att.getExtruder();
          shells = e.getShells();
        }
        if (outline) {
          for (int shell = 0; shell < shells; shell++)
            result.add(get(i).offset(-((double) shell + 0.5) * e.getExtrusionSize()), att);
        } else {
          // Must be a hatch.  Only do it if the gap is +ve or we're building the foundation
          double offSize;
          if (foundation) offSize = 3;
          else offSize = -((double) shells + 0.5) * e.getExtrusionSize() + e.getInfillOverlap();
          if (e.getExtrusionInfillWidth() > 0 || foundation) // Z valuesn't mattere here
          result.add(get(i).offset(offSize), att);
        }
      }
    }
    return result;
  }
  /**
   * Make a list with a single entry: the union of all the entries. Set its attributes to that of
   * extruder 0 in the extruder list.
   *
   * @param a
   * @return
   */
  public BooleanGridList union(Extruder[] es) {
    BooleanGridList result = new BooleanGridList();
    if (size() <= 0) return result;

    BooleanGrid contents = get(0);

    Attributes att = attribute(0);
    Boolean foundAttribute0 = false;
    if (att.getExtruder() == es[0]) foundAttribute0 = true;
    for (int i = 1; i < size(); i++) {
      if (!foundAttribute0) {
        if (attribute(i).getExtruder() == es[0]) {
          att = attribute(i);
          foundAttribute0 = true;
        }
      }
      contents = BooleanGrid.union(contents, get(i));
    }
    if (!foundAttribute0) Debug.e("RrCSGPolygonList.union(): Attribute of extruder 0 not found.");
    result.add(contents, att);
    return result;
  }
 /**
  * Add another list of shapes on the end
  *
  * @param a
  */
 public void add(BooleanGridList aa) {
   for (int i = 0; i < a.size(); i++) add(aa.get(i), aa.attribute(i));
 }