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

implement rudimentary horizontal vertical alginment

parent 52ec457d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ namespace signaltk {
TextStyle::TextStyle() :
    direction(TextDirection::LTR),
    halign(TextHAlign::LEFT),
    valign(TextVAlign::CENTER),
    valign(TextVAlign::BASELINE),
    font_size(32) {}

Status drawText(
+3 −1
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ enum class TextHAlign {
};

enum class TextVAlign {
  TOP, CENTER, BOTTOM
  BASELINE, MIDDLE, TOP, BOTTOM
};

struct TextStyle {
@@ -43,6 +43,8 @@ struct GlyphInfo {
  uint32_t codepoint;
  double advance_y;
  double advance_x;
  double metrics_ascender;
  double metrics_descender;
};

struct GlyphPlacement {
+18 −1
Original line number Diff line number Diff line
@@ -51,11 +51,28 @@ Status layoutTextLTR(
  }

  for (const auto& gi : glyphs) {
    // FIXME: this is constant for every glpyh in the same font
    double baseline_offset = 0;

    switch (valign) {
      case TextVAlign::BASELINE:
        break;
      case TextVAlign::TOP:
        baseline_offset = gi.metrics_ascender;
        break;
      case TextVAlign::MIDDLE:
        baseline_offset = gi.metrics_ascender - (gi.metrics_ascender + -gi.metrics_descender) / 2;
        break;
      case TextVAlign::BOTTOM:
        baseline_offset = gi.metrics_descender;
        break;
    }

    GlyphPlacement g;
    glyph_cb(GlyphPlacement {
      .codepoint = gi.codepoint,
      .x = gx,
      .y = gy
      .y = gy + baseline_offset
    });

    gx += gi.advance_x;
+2 −0
Original line number Diff line number Diff line
@@ -64,6 +64,8 @@ Status TextShaper::shapeText(
    g.codepoint = glyph_infos[i].codepoint;
    g.advance_x = glyph_positions[i].x_advance / 64.0;
    g.advance_y = glyph_positions[i].y_advance / 64.0;
    g.metrics_ascender = ft_font->size->metrics.ascender / 64.0; // FIXME this is constant for all glyphs
    g.metrics_descender = ft_font->size->metrics.descender / 64.0; // FIXME this is constant for all glyphs
    glyph_cb(g);
  }

+14 −19
Original line number Diff line number Diff line
@@ -17,102 +17,97 @@ Status drawTestAt(Layer* l, uint32_t x, uint32_t y, TextStyle s) {
  StrokeStyle ss;
  strokeLine(l, x - 10, y, x + 10, y, ss);
  strokeLine(l, x, y - 10, x, y + 10, ss);
  drawText("Teststring", x, y, s, l);
  drawText("Ijsselmeerdijk", x, y, s, l);
}

int main(int argc, char** argv) {
  Layer l(800, 600);
  Layer l(800, 500);
  l.clear(Colour{1, 1, 1, 1});


  {
    TextStyle s;
    s.halign = TextHAlign::LEFT;
    s.valign = TextVAlign::BASELINE;
    drawTestAt(&l, 100,  100, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::CENTER;
    s.valign = TextVAlign::BASELINE;
    drawTestAt(&l, 400,  100, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::RIGHT;
    s.valign = TextVAlign::BASELINE;
    drawTestAt(&l, 700,  100, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::LEFT;
    s.valign = TextVAlign::TOP;
    drawTestAt(&l, 100,  200, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::CENTER;
    s.valign = TextVAlign::TOP;
    drawTestAt(&l, 400,  200, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::RIGHT;
    s.valign = TextVAlign::TOP;
    drawTestAt(&l, 700,  200, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::LEFT;
    s.valign = TextVAlign::MIDDLE;
    drawTestAt(&l, 100,  300, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::CENTER;
    s.valign = TextVAlign::MIDDLE;
    drawTestAt(&l, 400,  300, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::RIGHT;
    s.valign = TextVAlign::MIDDLE;
    drawTestAt(&l, 700,  300, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::LEFT;
    s.valign = TextVAlign::BOTTOM;
    drawTestAt(&l, 100,  400, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::CENTER;
    s.valign = TextVAlign::BOTTOM;
    drawTestAt(&l, 400,  400, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::RIGHT;
    s.valign = TextVAlign::BOTTOM;
    drawTestAt(&l, 700,  400, s);
  }
  {
    TextStyle s;
    s.halign = TextHAlign::LEFT;
    drawTestAt(&l, 100,  500, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::CENTER;
    drawTestAt(&l, 400,  500, s);
  }

  {
    TextStyle s;
    s.halign = TextHAlign::RIGHT;
    drawTestAt(&l, 700,  500, s);
  }

  CHECK_RC(l.writeToFile(std::string(argv[0]) + ".png"));
}
Loading