Commit 5c0acdde authored by Paul Asmuth's avatar Paul Asmuth
Browse files

update the 'chart/gridlines' element

parent e0ef1f0f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ include_directories(${CAIRO_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS} ${HARFBUZZ_IN

# Build: fviz Library
# -----------------------------------------------------------------------------
file(GLOB source_files "core/**/*.cc" "core/*.cc" "elements/*.cc"  "elements/layout/*.cc" "elements/chart/axis.cc" "elements/chart/layout.cc" "elements/chart/points.cc" "elements/chart/lines.cc" "elements/chart/areas.cc" "elements/chart/labels.cc" "elements/chart/bars.cc")
file(GLOB source_files "core/**/*.cc" "core/*.cc" "elements/*.cc"  "elements/layout/*.cc" "elements/chart/axis.cc" "elements/chart/layout.cc" "elements/chart/points.cc" "elements/chart/lines.cc" "elements/chart/areas.cc" "elements/chart/labels.cc" "elements/chart/bars.cc" "elements/chart/gridlines.cc")
list(REMOVE_ITEM source_files "core/cli.cc")
add_library(fviz STATIC ${source_files})
set_target_properties(fviz PROPERTIES PUBLIC_HEADER "source/fviz.h;source/fviz_sdl.h")
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include "elements/chart/areas.h"
#include "elements/chart/axis.h"
#include "elements/chart/bars.h"
#include "elements/chart/gridlines.h"
#include "elements/chart/labels.h"
#include "elements/chart/lines.h"
#include "elements/chart/points.h"
@@ -54,6 +55,7 @@ fviz_t* fviz_init() {
  element_bind(elems, "chart/layout", bind(elements::chart::layout::build, _1, _2, _3));
  element_bind(elems, "chart/areas", bind(elements::chart::areas::build, _1, _2, _3));
  element_bind(elems, "chart/bars", bind(elements::chart::bars::build, _1, _2, _3));
  element_bind(elems, "chart/gridlines", bind(elements::chart::gridlines::build, _1, _2, _3));
  element_bind(elems, "chart/labels", bind(elements::chart::labels::build, _1, _2, _3));
  element_bind(elems, "chart/lines", bind(elements::chart::lines::build, _1, _2, _3));
  element_bind(elems, "chart/points", bind(elements::chart::points::build, _1, _2, _3));
+52 −37
Original line number Diff line number Diff line
@@ -12,32 +12,50 @@
 * limitations under the License.
 */
#include "gridlines.h"
#include "core/environment.h"
#include "core/layout.h"
#include "utils/algo.h"
#include "environment.h"
#include "format.h"
#include "layout.h"
#include "graphics/text.h"
#include "graphics/layout.h"
#include "graphics/brush.h"
#include "scale.h"
#include "sexpr_conv.h"
#include "sexpr_util.h"

using namespace std::placeholders;

namespace fviz {
namespace gridlines {
namespace fviz::elements::chart::gridlines {

static const double kDefaultLineWidthPT = 1;

using GridlineLayout = std::function<ReturnCode (
    const ScaleConfig& domain,
    std::vector<double>*)>;

struct GridlineDefinition {
  ScaleConfig scale_x;
  ScaleConfig scale_y;
  ScaleLayoutFn layout_x;
  ScaleLayoutFn layout_y;
  Measure line_width;
  Color line_color;
};

ReturnCode draw(
    const GridlineDefinition& grid,
    std::shared_ptr<GridlineDefinition> config,
    const LayoutInfo& layout,
    Layer* layer) {
  const auto& bbox = layout.content_box;

  StrokeStyle style;
  style.line_width = grid.line_width;
  style.color = grid.line_color;
  style.line_width = config->line_width;
  style.color = config->line_color;

  ScaleLayout slayout_x;
  grid.layout_x(grid.scale_x, &slayout_x);
  config->layout_x(config->scale_x, &slayout_x);

  ScaleLayout slayout_y;
  grid.layout_y(grid.scale_y, &slayout_y);
  config->layout_y(config->scale_y, &slayout_y);

  for (const auto& tick : slayout_x.ticks) {
    auto line_x = bbox.x + bbox.w * tick;
@@ -62,41 +80,38 @@ ReturnCode draw(
  return OK;
}

ReturnCode configure(
    const plist::PropertyList& plist,
    const Environment& env,
    GridlineDefinition* config) {
ReturnCode build(const Environment& env, const Expr* expr, ElementRef* elem) {
  /* set defaults from environment */
  config->scale_x = env.scale_x;
  config->scale_y = env.scale_y;
  config->layout_x = env.scale_layout_x;
  config->layout_y = env.scale_layout_y;
  auto config = std::make_shared<GridlineDefinition>();
  config->line_width = from_pt(1);
  config->line_color = Color::fromRGB(.9, .9, .9); // TODO
  config->layout_x = bind(&scale_layout_subdivide, _1, _2, 6);
  config->layout_y = bind(&scale_layout_subdivide, _1, _2, 6);

  /* parse properties */
  ParserDefinitions pdefs = {
    {"scale-x", bind(&domain_configure, _1, &config->scale_x)},
    {"scale-x-min", bind(&configure_float_opt, _1, &config->scale_x.min)},
    {"scale-x-max", bind(&configure_float_opt, _1, &config->scale_x.max)},
    {"scale-x-padding", bind(&configure_float, _1, &config->scale_x.padding)},
    {"scale-y", bind(&domain_configure, _1, &config->scale_y)},
    {"scale-y-min", bind(&configure_float_opt, _1, &config->scale_y.min)},
    {"scale-y-max", bind(&configure_float_opt, _1, &config->scale_y.max)},
    {"scale-y-padding", bind(&configure_float, _1, &config->scale_y.padding)},
    {"layout-x", bind(&configure_scale_layout, _1, &config->layout_x)},
    {"layout-y", bind(&configure_scale_layout, _1, &config->layout_y)},
    {"stroke", bind(&configure_measure, _1, &config->line_width)},
    {"color", bind(&configure_color, _1, &config->line_color)},
  };

  if (auto rc = parseAll(plist, pdefs); !rc) {
    return rc;
  auto config_rc = expr_walk_map(expr_next(expr), {
    {"xmin", bind(&expr_to_float64_opt, _1, &config->scale_x.min)},
    {"xmax", bind(&expr_to_float64_opt, _1, &config->scale_x.max)},
    {"xlayout", bind(&scale_configure_layout, _1, &config->layout_x)},
    {"xscale", bind(&scale_configure_kind, _1, &config->scale_x)},
    {"xscale-padding", bind(&expr_to_float64, _1, &config->scale_x.padding)},
    {"ymin", bind(&expr_to_float64_opt, _1, &config->scale_y.min)},
    {"ymax", bind(&expr_to_float64_opt, _1, &config->scale_y.max)},
    {"ylayout", bind(&scale_configure_layout, _1, &config->layout_y)},
    {"yscale", bind(&scale_configure_kind, _1, &config->scale_y)},
    {"yscale-padding", bind(&expr_to_float64, _1, &config->scale_y.padding)},
    {"color", bind(&expr_to_color, _1, &config->line_color)},
    {"stroke", bind(&expr_to_measure, _1, &config->line_width)},
  });

  if (!config_rc) {
    return config_rc;
  }

  *elem = std::make_shared<Element>();
  (*elem)->draw = bind(&draw, config, _1, _2);
  return OK;
}

} // namespace gridlines
} // namespace fviz
} // namespace fviz::elements::chart::gridlines
+6 −32
Original line number Diff line number Diff line
@@ -12,40 +12,14 @@
 * limitations under the License.
 */
#pragma once
#include <stdlib.h>
#include <sexpr.h>
#include <graphics/layer.h>
#include <core/scale.h>
#include <element.h>
#include <config_helpers.h>
#include "element.h"

namespace fviz {
namespace gridlines {
namespace fviz::elements::chart::gridlines {

using GridlineLayout = std::function<ReturnCode (
    const DomainConfig& domain,
    std::vector<double>*)>;

struct GridlineDefinition {
  DomainConfig scale_x;
  DomainConfig scale_y;
  ScaleLayoutFn layout_x;
  ScaleLayoutFn layout_y;
  Measure line_width;
  Color line_color;
  LayoutSettings layout;
};

ReturnCode draw(
    const GridlineDefinition& config,
    const LayoutInfo& layout,
    Layer* layer);

ReturnCode configure(
    const plist::PropertyList& plist,
ReturnCode build(
    const Environment& env,
    GridlineDefinition* config);
    const Expr* expr,
    ElementRef* elem);

} // namespace gridlines
} // namespace fviz
} // namespace fviz::elements::chart::gridlines
+7 −0
Original line number Diff line number Diff line
(layout/box
  margin 1em
  body (
    (chart/gridlines
      xlayout (linear 1)
      xmin 0
      xmax 16)))
Loading