Commit 7811a233 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add the global 'margin' and 'font-size' options

parent 5eef61ef
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#include "sexpr_util.h"
#include "graphics/font_lookup.h"

#include <functional>

using namespace std::placeholders;

namespace fviz {
@@ -58,10 +60,40 @@ ReturnCode environment_set(Environment* env, const Expr* expr) {
    return expr_to_float64(args[1], &env->dpi);
  }

  if (expr_is_value(args[0], "font-size")) {
    return expr_to_measure(args[1], &env->font_size);
  }

  if (expr_is_value(args[0], "margin-top")) {
    return expr_to_measure(args[1], &env->margins[0]);
  }

  if (expr_is_value(args[0], "margin-right")) {
    return expr_to_measure(args[1], &env->margins[1]);
  }

  if (expr_is_value(args[0], "margin-bottom")) {
    return expr_to_measure(args[1], &env->margins[2]);
  }

  if (expr_is_value(args[0], "margin-left")) {
    return expr_to_measure(args[1], &env->margins[3]);
  }

  if (expr_is_value(args[0], "margin")) {
    return expr_calln(args[1], {
      bind(&expr_to_measure, _1, &env->margins[0]),
      bind(&expr_to_measure, _1, &env->margins[1]),
      bind(&expr_to_measure, _1, &env->margins[2]),
      bind(&expr_to_measure, _1, &env->margins[3]),
    });
  }

  return errorf(ERROR, "invalid property: {}", expr_get_value(args[0]));
}

ReturnCode environment_configure(Environment* env, const Expr* expr) {
  /* parse options */
  for (; expr; expr = expr_next(expr)) {
    if (!expr || !expr_is_list(expr)) {
      return errorf(ERROR, "expected a list but got: {}", expr_inspect(expr));
@@ -80,6 +112,13 @@ ReturnCode environment_configure(Environment* env, const Expr* expr) {
    }
  }

  /* convert units */
  convert_unit_typographic(env->dpi, env->font_size, &env->font_size);

  for (auto& m : env->margins) {
    convert_unit_typographic(env->dpi, env->font_size, &m);
  }

  return OK;
}

+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ struct Environment {
  Color background_color;
  Color text_color;
  Color border_color;
  std::array<Measure, 4> margins;
  ElementMap element_map;
};

+6 −1
Original line number Diff line number Diff line
@@ -117,7 +117,12 @@ int fviz_render_to(fviz_t* ctx, void* backend) {
  auto layer = static_cast<Layer*>(backend);

  LayoutInfo layout;
  layout.content_box = Rectangle(0, 0, layer->width, layer->height);
  layout.content_box = layout_margin_box(
      Rectangle(0, 0, layer->width, layer->height),
      ctx->env.margins[0],
      ctx->env.margins[1],
      ctx->env.margins[2],
      ctx->env.margins[3]);

  std::vector<ElementRef> roots;
  auto rc = try_chain({