Commit 2ef464ba authored by Paul Asmuth's avatar Paul Asmuth
Browse files

improved typographic unit conversion

parent 8146b627
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ Environment::Environment() :
    background_color(Color::fromRGB(1,1,1)),
    foreground_color(Color::fromRGB(0,0,0)),
    text_color(Color::fromRGB(0,0,0)),
    font_size(from_pt(11, dpi)) {}
    font_size(from_pt(11)) {}

ReturnCode environment_setup_defaults(Environment* env) {
  return try_chain({
+7 −5
Original line number Diff line number Diff line
@@ -176,6 +176,7 @@ Status svg_text_span_native(

Status svg_text_span_embed(
    const layer_ops::TextSpanOp& op,
    double dpi,
    SVGDataRef svg) {
  const auto& style = op.style;

@@ -185,7 +186,7 @@ Status svg_text_span_embed(
    auto rc = font_get_glyph_path(
        op.style.font.font,
        op.style.font_size,
        96, // FIXME
        dpi,
        g.codepoint,
        &gp);

@@ -210,9 +211,10 @@ Status svg_text_span_embed(

Status svg_text_span(
    const layer_ops::TextSpanOp& op,
    double dpi,
    SVGDataRef svg) {
  if (op.style.font.font_family_css.empty()) {
    return svg_text_span_embed(op, svg);
    return svg_text_span_embed(op, dpi, svg);
  } else {
    return svg_text_span_native(op, svg);
  }
@@ -259,15 +261,15 @@ ReturnCode layer_bind_svg(
    .dpi = dpi,
    .font_size = font_size,
    .text_shaper = std::make_shared<text::TextShaper>(),
    .apply = [svg, submit] (const auto& op) {
      return std::visit([svg, submit] (auto&& op) {
    .apply = [dpi, svg, submit] (const auto& op) {
      return std::visit([dpi, svg, submit] (auto&& op) {
        using T = std::decay_t<decltype(op)>;
        if constexpr (std::is_same_v<T, layer_ops::BrushStrokeOp>)
          return svg_stroke_path(op, svg);
        if constexpr (std::is_same_v<T, layer_ops::BrushFillOp>)
          return svg_fill_path(op, svg);
        if constexpr (std::is_same_v<T, layer_ops::TextSpanOp>)
          return svg_text_span(op, svg);
          return svg_text_span(op, dpi, svg);
        if constexpr (std::is_same_v<T, layer_ops::SubmitOp>)
          return submit(svg->to_svg());
        else
+75 −2
Original line number Diff line number Diff line
@@ -128,15 +128,23 @@ void convert_units(

void convert_unit_typographic(
    double dpi,
    double font_size,
    Measure font_size,
    Measure* measure) {
  switch (font_size.unit) {
    case Unit::PT:
      font_size.value = (double(font_size) / 72.0) * dpi;
      break;
    case Unit::UNIT:
      break;
  }

  switch (measure->unit) {
    case Unit::PT:
      measure->value = (measure->value / 72.0) * dpi;
      measure->unit = Unit::UNIT;
      break;
    case Unit::REM:
      measure->value = (measure->value / 72.0) * dpi * font_size;
      measure->value = measure->value * font_size;
      measure->unit = Unit::UNIT;
      break;
  }
@@ -164,5 +172,70 @@ void convert_unit_user(
  }
}

void measure_normalize(const MeasureConv& conv, Measure* measure) {
  double parent_size = 0;
  switch (conv.parent_size.unit) {
    case Unit::PT:
      parent_size = (double(conv.parent_size) / 72.0) * conv.dpi;
      break;
    case Unit::REM:
    case Unit::REL:
      parent_size = 0;
      break;
    case Unit::UNIT:
    case Unit::PX:
    case Unit::USER:
      parent_size = double(conv.parent_size);
      break;
  }

  double font_size = 0;
  switch (conv.font_size.unit) {
    case Unit::PT:
      font_size = (double(conv.font_size) / 72.0) * conv.dpi;
      break;
    case Unit::REM:
      font_size = 0;
      break;
    case Unit::REL:
      font_size = parent_size * double(conv.font_size);
      break;
    case Unit::UNIT:
    case Unit::PX:
    case Unit::USER:
      font_size = double(conv.font_size);
      break;
  }

  switch (measure->unit) {
    case Unit::PT:
      measure->value = (measure->value / 72.0) * conv.dpi;
      measure->unit = Unit::UNIT;
      break;
    case Unit::REM:
      measure->value = measure->value * font_size;
      measure->unit = Unit::UNIT;
      break;
    case Unit::REL:
      measure->value = measure->value * parent_size;
      measure->unit = Unit::UNIT;
      break;
    case Unit::UNIT:
    case Unit::PX:
    case Unit::USER:
      measure->unit = Unit::UNIT;
      break;
  }
}

void measure_normalizev(
    const MeasureConv& conv,
    Measure* begin,
    Measure* end) {
  for (; begin != end; ++begin) {
    measure_normalize(conv, begin);
  }
}

} // namespace fviz
+14 −1
Original line number Diff line number Diff line
@@ -37,6 +37,12 @@ struct Measure {
  operator double() const;
};

struct MeasureConv {
  double dpi;
  Measure font_size;
  Measure parent_size;
};

Measure from_unit(double v);
Measure from_px(double v);
Measure from_pt(double v, double dpi);
@@ -61,7 +67,7 @@ void convert_units(

void convert_unit_typographic(
    double dpi,
    double font_size_pt,
    Measure font_size,
    Measure* measure);

void convert_unit_relative(
@@ -72,5 +78,12 @@ void convert_unit_user(
    std::function<double (double)> converter,
    Measure* measure);

void measure_normalize(const MeasureConv& conv, Measure* measure);

void measure_normalizev(
    const MeasureConv& conv,
    Measure* begin,
    Measure* end);

} // namespace fviz
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ Status drawTextLabel(
      text,
      style.font,
      style.font_size,
      96, // FIXME
      layer->dpi,
      style.direction,
      layer->text_shaper.get(),
      &glyphs,
Loading