anchor.diff:        }
       }
   
  -    new io.File(_imagePrefix +
  -        new DateTime.now().toString() +
  -        '_${areaX.min},${areaX.max}_${areaY.min},${areaY.max}' +
  -        '.png').create(recursive: true).then((io.File file) {
  +    String filename = _outputFolder;
  +    if (_outputFilename == null) {
  +      filename = filename +
  +          new DateTime.now().toString() +
  +          '_${areaX.min},${areaX.max}_${areaY.min},${areaY.max}' +
  +          '.png';
  +    } else {
  +      filename = filename + _outputFilename;
  +    }
  +    new io.File(filename).create(recursive: true).then((io.File file) {
         file.writeAsBytesSync(encodePng(image));
       });
     }
  
positive.code:   Range valueRange;
    bool transformsApplied;
  
    Visualisation() {
      xRange = new Range(double.INFINITY, double.NEGATIVE_INFINITY);
      yRange = new Range(double.INFINITY, double.NEGATIVE_INFINITY);
      valueRange = new Range(double.INFINITY, double.NEGATIVE_INFINITY);
    }
  
    /// Add a data point defined by the [x] and [y] coordinates and its [value].
  
negative.code:     if (width != -1) {
        image = copyResize(image, width, height, NEAREST);
      }
      String filename = _outputFolder;
      if (_outputFilename == null) {
        filename = filename + new DateTime.now().toString() + '.png';
      } else {
        filename = filename + _outputFilename;
      }
      new io.File(filename).create(recursive: true).then((io.File file) {
        file.writeAsBytesSync(encodePng(image));
      });
    }
  