Commit 032cb21d authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add document_render{,_png,_svg} helper methods

parent b67f96d2
Loading
Loading
Loading
Loading
+75 −0
Original line number Diff line number Diff line
@@ -31,9 +31,12 @@
#include "plist/plist_parser.h"
#include "element_factory.h"
#include "graphics/layer.h"
#include "graphics/layer_svg.h"
#include "graphics/layer_pixmap.h"
#include "graphics/layout.h"
#include "graphics/font_lookup.h"
#include "common/config_helpers.h"
#include "utils/fileutil.h"

namespace plotfx {

@@ -137,6 +140,78 @@ ReturnCode renderElements(
  return ReturnCode::success();
}

ReturnCode document_render(
    const Document& doc,
    const std::string& format,
    const std::string& filename) {
  if (format == "svg")
    return document_render_svg(doc, filename);
  if (format == "png")
    return document_render_png(doc, filename);

  return ReturnCode::errorf("EARG", "invalid output format: $0", format);
}

ReturnCode document_render_svg(
    const Document& doc,
    const std::string& filename) {
  LayerRef layer;

  auto rc = layer_bind_svg(
      to_px(doc.measures, doc.width).value,
      to_px(doc.measures, doc.height).value,
      doc.measures,
      [filename] (auto svg) {
        FileUtil::write(filename, Buffer(svg.data(), svg.size()));
        return OK;
      },
      &layer);

  if (!rc.isSuccess()) {
    return rc;
  }

  if (auto rc = renderElements(doc, layer.get()); !rc.isSuccess()) {
    return rc;
  }

  if (auto rc = layer_submit(layer.get()); !rc.isSuccess()) {
    return rc;
  }

  return OK;
}

ReturnCode document_render_png(
    const Document& doc,
    const std::string& filename) {
  LayerRef layer;

  auto rc = layer_bind_png(
      to_px(doc.measures, doc.width).value,
      to_px(doc.measures, doc.height).value,
      doc.measures,
      doc.background_colour,
      [filename] (auto png) {
        FileUtil::write(filename, Buffer(png.data(), png.size()));
        return OK;
      },
      &layer);

  if (!rc.isSuccess()) {
    return rc;
  }

  if (auto rc = renderElements(doc, layer.get()); !rc.isSuccess()) {
    return rc;
  }

  if (auto rc = layer_submit(layer.get()); !rc.isSuccess()) {
    return rc;
  }

  return OK;
}

} // namespace plotfx
+13 −0
Original line number Diff line number Diff line
@@ -68,5 +68,18 @@ ReturnCode renderElements(
    const Document& tree,
    Layer* frame);

ReturnCode document_render(
    const Document& doc,
    const std::string& format,
    const std::string& filename);

ReturnCode document_render_svg(
    const Document& doc,
    const std::string& filename);

ReturnCode document_render_png(
    const Document& doc,
    const std::string& filename);

} // namespace plotfx
+7 −53
Original line number Diff line number Diff line
@@ -115,62 +115,16 @@ int main(int argc, const char** argv) {
    return EXIT_FAILURE;
  }

  std::string layer_fmt = flag_out_fmt;
  if (layer_fmt.empty()) {
    if (StringUtil::endsWith(flag_out, ".svg")) { layer_fmt = "svg"; }
    if (StringUtil::endsWith(flag_out, ".png")) { layer_fmt = "png"; }
  std::string fmt = flag_out_fmt;
  if (fmt.empty()) {
    if (StringUtil::endsWith(flag_out, ".svg")) { fmt = "svg"; }
    if (StringUtil::endsWith(flag_out, ".png")) { fmt = "png"; }
  }

  LayerRef layer;
  if (layer_fmt == "svg") {
    auto rc = layer_bind_svg(
        to_px(doc.measures, doc.width).value,
        to_px(doc.measures, doc.height).value,
        doc.measures,
        [flag_out] (auto svg) {
          FileUtil::write(flag_out, Buffer(svg.data(), svg.size()));
          return OK;
        },
        &layer);

    if (!rc.isSuccess()) {
      printError(rc);
      return EXIT_FAILURE;
    }
  }

  if (layer_fmt == "png") {
    auto rc = layer_bind_png(
        to_px(doc.measures, doc.width).value,
        to_px(doc.measures, doc.height).value,
        doc.measures,
        doc.background_colour,
        [flag_out] (auto png) {
          FileUtil::write(flag_out, Buffer(png.data(), png.size()));
          return OK;
        },
        &layer);

    if (!rc.isSuccess()) {
      printError(rc);
      return EXIT_FAILURE;
    }
  }

  if (!layer) {
    std::cerr << "ERROR: unknown output format: " << layer_fmt << std::endl;
    return EXIT_FAILURE;
  }

  if (auto rc = renderElements(doc, layer.get()); !rc.isSuccess()) {
    printError(rc);
    return EXIT_FAILURE;
  }

  if (auto rc = layer_submit(layer.get()); !rc.isSuccess()) {
  if (auto rc = document_render(doc, fmt, flag_out); rc.isSuccess()) {
    return EXIT_SUCCESS;
  } else {
    printError(rc);
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}