Commit 047c1faa authored by Paul Asmuth's avatar Paul Asmuth
Browse files

re-enable gridline drawing

parent ed5a541e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ add_definitions(-DFNORDMETRIC_VERSION="unstable")
add_library(plotfxlib STATIC
    source/plot.cc
    source/plot_axis.cc
    source/plot_gridlines.cc
    source/plot_labels.cc
    source/plot_lines.cc
    source/plot_points.cc
+10 −1
Original line number Diff line number Diff line
@@ -83,7 +83,12 @@ ReturnCode draw(
    return rc;
  }

  // render layer
  // render grid
  if (auto rc = grid_draw(config.grid, bbox, layer); !rc) {
    return rc;
  }

  // render layers
  for (const auto& e : config.layers) {
    if (auto rc = e->draw(bbox, layer); !rc) {
      return rc;
@@ -406,6 +411,10 @@ ReturnCode configure(
        ref(scales),
        &legend_items,
        config),
    bind(&grid_configure,
        ref(plist),
        doc,
        &config->grid),
    bind(&legend_configure_all,
        doc,
        ref(plist),
+2 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#include <source/document.h>
#include <source/data_model.h>
#include "plot_axis.h"
#include "plot_gridlines.h"
#include "legend.h"
#include "dimension.h"

@@ -50,6 +51,7 @@ struct PlotConfig {
  AxisDefinition axis_right;
  AxisDefinition axis_bottom;
  AxisDefinition axis_left;
  GridlineDefinition grid;
  Measure margins[4];
  std::vector<ElementRef> layers;
  LegendMap legends;
+48 −51
Original line number Diff line number Diff line
@@ -28,70 +28,67 @@
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include <stdlib.h>
#include "graphics/layer.h"
#include "graphics/brush.h"
#include "graphics/text.h"
#include "gridlines.h"
#include "plot_gridlines.h"
#include "document.h"

using namespace std::placeholders;

namespace plotfx {
namespace chart {
namespace plot {

GridDefinition::GridDefinition(
    kPlacement placement) :
    placement_(placement) {}
static const double kDefaultLineWidthPT = 1;

GridDefinition::kPlacement GridDefinition::placement() const {
  return placement_;
}
ReturnCode grid_configure(
    const PropertyList& plist,
    const Document& doc,
    GridlineDefinition* grid) {
  Measure line_width;
  Color line_color = Color::fromRGB(.9, .9, .9); // TODO

void GridDefinition::addTick(double tick_position) {
  ticks_.push_back(tick_position);
  static const ParserDefinitions pdefs = {
    {"grid-stroke", bind(&configure_measure_rel, _1, doc.dpi, doc.font_size, &line_width)},
  };

  if (auto rc = parseAll(plist, pdefs); !rc) {
    return rc;
  }

const std::vector<double> GridDefinition::ticks() const {
  return ticks_;
  grid->line_width = measure_or(line_width, from_pt(kDefaultLineWidthPT, doc.dpi));
  grid->line_color = line_color;
  return OK;
}

void renderGrid(
    const GridDefinition& grid,
    const Viewport& viewport,
    Layer* target) {
ReturnCode grid_draw(
    const GridlineDefinition& grid,
    const Rectangle& bbox,
    Layer* layer) {
  StrokeStyle style;
  style.line_width = grid.line_width;
  style.color = grid.line_color;

  switch (grid.placement()) {

    case GridDefinition::GRID_HORIZONTAL:
      for (const auto& tick : grid.ticks()) {
        auto line_y = viewport.paddingTop() +
            viewport.innerHeight() * (1.0 - tick);
  for (const auto& tick : grid.ticks_horiz) {
    auto line_y = bbox.y + bbox.h * (1.0 - tick);

    strokeLine(
            target,
            viewport.paddingLeft(),
            line_y,
            viewport.paddingLeft() + viewport.innerWidth(),
            line_y,
        layer,
        Point(bbox.x, line_y),
        Point(bbox.x + bbox.w, line_y),
        style);
  }
      break;

    case GridDefinition::GRID_VERTICAL:
      for (const auto& tick : grid.ticks()) {
        auto line_x = viewport.paddingLeft() + viewport.innerWidth() * tick;
  for (const auto& tick : grid.ticks_vert) {
    auto line_x = bbox.x + bbox.w * tick;

    strokeLine(
            target,
            line_x,
            viewport.paddingTop(),
            line_x,
            viewport.paddingTop() + viewport.innerHeight(),
        layer,
        Point(line_x, bbox.y),
        Point(line_x, bbox.y + bbox.h),
        style);
  }
      break;

  }
  return OK;
}

}
}
} // namespace plot
} // namespace plotfx
+23 −42
Original line number Diff line number Diff line
/**
 * This file is part of the "plotfx" project
 *   Copyright (c) 2018 Paul Asmuth
 *   Copyright (c) 2011-2014 Paul Asmuth, Google Inc.
 *   Copyright (c) 2014 Paul Asmuth, Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
@@ -29,53 +29,34 @@
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#pragma once
#include <memory>
#include <vector>
#include <string>
#include <tuple>
#include <stdlib.h>
#include <plist/plist.h>
#include <graphics/layer.h>
#include <graphics/viewport.h>
#include <domain.h>
#include <element.h>
#include <config_helpers.h>

namespace plotfx {
namespace chart {
namespace plot {

class GridDefinition {
public:

  enum kPlacement {
    GRID_HORIZONTAL = 0,
    GRID_VERTICAL = 1
struct GridlineDefinition {
  std::vector<double> ticks_horiz;
  std::vector<double> ticks_vert;
  Measure line_width;
  Color line_color;
};

  /**
   * Create a new grid definition
   */
  GridDefinition(kPlacement placement);

  /**
   * Add a "tick" to this axis
   *
   * @param tick_position the position of the tick [0.0-1.0]
   */
  void addTick(double tick_position);
ReturnCode grid_draw(
    const GridlineDefinition& grid,
    const Rectangle& bbox,
    Layer* layer);

  kPlacement placement() const;

  const std::vector<double> ticks() const;

protected:
  kPlacement placement_;
  std::vector<double> ticks_;
};

/**
 * Render the grid
 */
void renderGrid(
    const GridDefinition& grid_config,
    const Viewport& viewport,
    Layer* target);
ReturnCode grid_configure(
    const PropertyList& plist,
    const Document& doc,
    GridlineDefinition* grid);

}
}
} // namespace plot
} // namespace plotfx