Commit 50381038 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add support for custom dash patterns and dash offsets

parent e35d1184
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -122,7 +122,8 @@ Status svg_stroke_path(
        dash_pattern += fmt::format("{} ", v);
      }

      dash_opts = svg_attr("stroke-dasharray", dash_pattern);
      dash_opts += svg_attr("stroke-dasharray", dash_pattern);
      dash_opts += svg_attr("stroke-dashoffset", style.dash_offset);
      break;
    }
  }
+5 −1
Original line number Diff line number Diff line
@@ -107,7 +107,11 @@ Status Rasterizer::strokePath(const layer_ops::BrushStrokeOp& op) {
        dash_pattern.push_back(v);
      }

      cairo_set_dash(cr_ctx, dash_pattern.data(), dash_pattern.size(), 0);
      cairo_set_dash(
          cr_ctx,
          dash_pattern.data(),
          dash_pattern.size(),
          style.dash_offset);
      break;
    }
  }
+3 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ ReturnCode expr_tov(
    return errorf(
        ERROR,
        "argument error; expected a list, got: {}",
        "..."); // FIXME
        expr_inspect(expr));
  }

  return expr_tov_flat<T>(expr_get_list(expr), conv, values);
@@ -81,6 +81,8 @@ ReturnCode expr_tov_flat(
    const Expr* expr,
    ExprConvTo<T> conv,
    std::vector<T>* values) {
  values->clear();

  for (; expr; expr = expr_next(expr)) {
    T v;
    if (auto rc = conv(expr, &v); !rc) {
+1 −0
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ struct StrokeStyle {
  Measure line_width;
  Color color;
  DashType dash_type;
  Measure dash_offset;
  std::vector<Measure> dash_pattern;
};

+25 −9
Original line number Diff line number Diff line
@@ -20,28 +20,44 @@ using namespace std::placeholders;

namespace fviz {

ReturnCode stroke_style_read(
ReturnCode stroke_style_read_dash(
    const Environment& env,
    const Expr* expr,
    StrokeStyle* style) {
  if (expr_is_list(expr)) {
    expr = expr_get_list(expr);
  style->dash_type = StrokeStyle::DASH;
  style->dash_pattern = {from_pt(2, env.dpi), from_pt(2, env.dpi)};

  if (!expr) {
    return OK;
  }

  if (expr_is_value(expr, "none")) {
  return expr_walk_map(expr_next(expr), {
    {"pattern", expr_tov_fn<Measure>(bind(&measure_readn, env, _1, _2), &style->dash_pattern)},
    {"offset", bind(&measure_readn, env, _1, &style->dash_offset)},
  });
}

ReturnCode stroke_style_read(
    const Environment& env,
    const Expr* expr,
    StrokeStyle* style) {
  if (expr_is_value(expr, "none") ||
      expr_is_list(expr, "none")) {
    style->line_width = from_unit(0);
    return OK;
  }

  if (expr_is_value(expr, "solid")) {
  if (expr_is_value(expr, "solid") ||
      expr_is_list(expr, "solid")) {
    style->dash_type = StrokeStyle::SOLID;
    return OK;
  }

  if (expr_is_value(expr, "dash") || expr_is_value(expr, "dashed")) {
    style->dash_type = StrokeStyle::DASH;
    style->dash_pattern = {from_pt(2, env.dpi), from_pt(2, env.dpi)};
    return OK;
  if (expr_is_value(expr, "dash") ||
      expr_is_value(expr, "dashed") ||
      expr_is_list(expr, "dash") ||
      expr_is_list(expr, "dashed")) {
    return stroke_style_read_dash(env, expr_get_list(expr), style);
  }

  return errorf(
Loading