private ImageData createFileInternal(
      OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
      throws IOException, InterruptedException {
    if (diagram.getUmlDiagramType() == UmlDiagramType.ACTIVITY) {
      new CucaDiagramSimplifierActivity(diagram, dotStrings);
    } else if (diagram.getUmlDiagramType() == UmlDiagramType.STATE) {
      new CucaDiagramSimplifierState(diagram, dotStrings);
    }

    CucaDiagramFileMakerSvek2 svek2 = buildCucaDiagramFileMakerSvek2(DotMode.NORMAL);
    TextBlockBackcolored result = svek2.createFile(diagram.getDotStringSkek());
    if (result instanceof GraphvizCrash) {
      svek2 = buildCucaDiagramFileMakerSvek2(DotMode.NO_LEFT_RIGHT);
      result = svek2.createFile(diagram.getDotStringSkek());
    }
    result = addLegend(result);
    result = addTitle(result);
    result = addHeaderAndFooter(result);

    final String widthwarning = diagram.getSkinParam().getValue("widthwarning");
    if (widthwarning != null && widthwarning.matches("\\d+")) {
      this.warningOrError =
          svek2.getBibliotekon().getWarningOrError(Integer.parseInt(widthwarning));
    } else {
      this.warningOrError = null;
    }
    final Dimension2D dim = result.calculateDimension(stringBounder);
    final double scale = getScale(fileFormatOption, dim);

    final ImageBuilder imageBuilder =
        new ImageBuilder(
            diagram.getSkinParam().getColorMapper(),
            scale,
            result.getBackcolor(),
            fileFormatOption.isWithMetadata() ? diagram.getMetadata() : null,
            warningOrError,
            0,
            10,
            diagram.getAnimation(),
            diagram.getSkinParam().handwritten());
    imageBuilder.addUDrawable(result);
    return imageBuilder.writeImageTOBEMOVED(fileFormatOption, os);
  }