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

pipe through clipping rectangle, improved chart margin configuration

parent 1a4607e0
Loading
Loading
Loading
Loading
+22 −27
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <graphics/path.h>
#include <graphics/brush.h>
#include <graphics/text.h>
#include <graphics/layout.h>
#include "linechart.h"
#include "common/config_helpers.h"

@@ -192,43 +193,37 @@ void LineChart::render(
  }

}

AnyDomain* LineChart::getDomain(AnyDomain::kDimension dimension) {
  switch (dimension) {
    case AnyDomain::DIM_X:
      return x_domain_.get();

    case AnyDomain::DIM_Y:
      return y_domain_.get();

    case AnyDomain::DIM_Z:
      RAISE(kRuntimeError, "LineChart does not have a Z domain");
      return nullptr;
  }
}

void LineChart::setLabels(bool show_labels) {
  show_labels_ = show_labels;
}

*/

LinechartConfig::LinechartConfig() :
    x_domain(PlotDomain::LINEAR),
    y_domain(PlotDomain::LINEAR) {}

ReturnCode draw(const LinechartConfig& config, Layer* frame) {
    y_domain(PlotDomain::LINEAR),
    margin_rem(4.0f),
    padding_rem(0.0f) {}

ReturnCode draw(
    const LinechartConfig& config,
    const Rectangle& clip,
    Layer* layer) {
  // setup domains
  DomainConfig domain_x;
  DomainConfig domain_y;

  // setup layout
  auto border_box = layout_margin_box(
      clip,
      from_rem(*layer, config.margin_rem),
      from_rem(*layer, config.margin_rem),
      from_rem(*layer, config.margin_rem),
      from_rem(*layer, config.margin_rem));

  // render axes
  AxisDefinition axis_top;
  if (auto rc = axis_expand_auto(config.axis_top, AxisPosition::TOP, domain_x, &axis_top); !rc) {
    return rc;
  }

  if (auto rc = renderAxis(axis_top, AxisPosition::TOP, frame); rc) {
  if (auto rc = renderAxis(axis_top, border_box, AxisPosition::TOP, layer); rc) {
    return rc;
  }

@@ -237,7 +232,7 @@ ReturnCode draw(const LinechartConfig& config, Layer* frame) {
    return rc;
  }

  if (auto rc = renderAxis(axis_right, AxisPosition::RIGHT, frame); rc) {
  if (auto rc = renderAxis(axis_right, border_box, AxisPosition::RIGHT, layer); rc) {
    return rc;
  }

@@ -246,7 +241,7 @@ ReturnCode draw(const LinechartConfig& config, Layer* frame) {
    return rc;
  }

  if (auto rc = renderAxis(axis_bottom, AxisPosition::BOTTOM, frame); rc) {
  if (auto rc = renderAxis(axis_bottom, border_box, AxisPosition::BOTTOM, layer); rc) {
    return rc;
  }

@@ -255,7 +250,7 @@ ReturnCode draw(const LinechartConfig& config, Layer* frame) {
    return rc;
  }

  if (auto rc = renderAxis(axis_left, AxisPosition::LEFT, frame); rc) {
  if (auto rc = renderAxis(axis_left, border_box, AxisPosition::LEFT, layer); rc) {
    return rc;
  }

@@ -320,7 +315,7 @@ ReturnCode configure(const plist::PropertyList& plist, ElementRef* elem) {
  }

  auto e = std::make_unique<Element>();
  e->draw = std::bind(&draw, config, std::placeholders::_1);
  e->draw = std::bind(&draw, config, std::placeholders::_1, std::placeholders::_2);
  *elem = std::move(e);

  return ReturnCode::success();
+3 −1
Original line number Diff line number Diff line
@@ -48,9 +48,11 @@ struct LinechartConfig {
  AxisDefinition axis_right;
  AxisDefinition axis_bottom;
  AxisDefinition axis_left;
  double margin_rem;
  double padding_rem;
};

ReturnCode draw(const LinechartConfig& config, Layer* frame);
ReturnCode draw(const LinechartConfig& config, const Rectangle& clip, Layer* frame);

ReturnCode configure(
    const plist::PropertyList& plist,
+15 −14
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <iostream>
#include <common/config_helpers.h>
#include <graphics/text.h>
#include <graphics/layout.h>
#include <graphics/brush.h>

namespace plotfx {
@@ -39,7 +40,6 @@ namespace plotfx {
AxisDefinition::AxisDefinition() :
    mode(AxisMode::OFF),
    label_placement(AxisLabelPlacement::OUTSIDE),
    padding_rem(4.0f),
    label_padding_rem(1.0f),
    label_font_size_rem(1.0f),
    tick_length_rem(0.4f) {}
@@ -168,6 +168,7 @@ static Status renderAxisHorizontal(

Status renderAxis(
    const AxisDefinition& axis,
    const Rectangle& clip,
    AxisPosition axis_position,
    Layer* frame) {
  switch (axis.mode) {
@@ -177,40 +178,40 @@ Status renderAxis(
      break;
  };

  auto padding = from_rem(*frame, axis.padding_rem);
  auto padding = from_rem(*frame, 1); // FIXME

  Status rc;
  switch (axis_position) {
    case AxisPosition::LEFT:
      rc = renderAxisVertical(
          axis,
          padding,
          padding,
          frame->height - padding,
          clip.x,
          clip.y,
          clip.y + clip.h,
          frame);
      break;
    case AxisPosition::RIGHT:
      rc = renderAxisVertical(
          axis,
          frame->width - padding,
          padding,
          frame->height - padding,
          clip.x + clip.w,
          clip.y,
          clip.y + clip.h,
          frame);
      break;
    case AxisPosition::TOP:
      rc = renderAxisHorizontal(
          axis,
          padding,
          padding,
          frame->width - padding,
          clip.y,
          clip.x,
          clip.x + clip.w,
          frame);
      break;
    case AxisPosition::BOTTOM:
      rc = renderAxisHorizontal(
          axis,
          frame->height - padding,
          padding,
          frame->width - padding,
          clip.y + clip.h,
          clip.x,
          clip.x + clip.w,
          frame);
      break;
  }
+2 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@

namespace plotfx {
struct DomainConfig;
struct Rectangle;

enum class AxisPosition {
  TOP,
@@ -69,7 +70,6 @@ struct AxisDefinition {
  std::vector<double> ticks;
  std::vector<std::pair<double, std::string>> labels;
  AxisLabelPlacement label_placement;
  double padding_rem;
  double label_padding_rem;
  double label_font_size_rem;
  double tick_length_rem;
@@ -81,6 +81,7 @@ ReturnCode parseAxisMode(

Status renderAxis(
    const AxisDefinition& axis,
    const Rectangle& clip,
    AxisPosition axis_position,
    Layer* frame);

+2 −1
Original line number Diff line number Diff line
@@ -37,11 +37,12 @@

namespace plotfx {
class Layer;
class Rectangle;

using plist::PropertyList;

struct Element {
  std::function<ReturnCode (Layer*)> draw;
  std::function<ReturnCode (const Rectangle&, Layer*)> draw;
};

using ElementRef = std::unique_ptr<Element>;
Loading