Commit 227f3af2 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

update the 'chart/points' element to the new expression api

parent 68ece789
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/graphics/*.cc" "core/utils/**.cc" "core/sexpr*.cc" "core/fviz.cc" "core/scale.cc" "core/environment.cc" "elements/text.cc" "core/element_factory.cc" "core/config_helpers.cc" "elements/chart/axis.cc" "core/format.cc" "core/layout.cc" "core/data_model.cc" "elements/chart/layout.cc" "elements/fill.cc")
file(GLOB source_files "core/graphics/*.cc" "core/utils/**.cc" "core/sexpr*.cc" "core/fviz.cc" "core/scale.cc" "core/environment.cc" "elements/text.cc" "core/element_factory.cc" "core/config_helpers.cc" "elements/chart/axis.cc" "core/format.cc" "core/layout.cc" "core/data_model.cc" "elements/chart/layout.cc" "elements/fill.cc" "elements/chart/points.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
@@ -24,6 +24,7 @@
#include "elements/text.h"
#include "elements/chart/axis.h"
#include "elements/chart/layout.h"
#include "elements/chart/points.h"

#include <iostream>
#include <string.h>
@@ -48,6 +49,7 @@ fviz_t* fviz_init() {
  element_bind(elems, "chart/axis-bottom", bind(elements::chart::axis::build, _1, _2, _3));
  element_bind(elems, "chart/axis-left", bind(elements::chart::axis::build, _1, _2, _3));
  element_bind(elems, "chart/layout", bind(elements::chart::layout::build, _1, _2, _3));
  element_bind(elems, "chart/points", bind(elements::chart::points::build, _1, _2, _3));
  return ctx.release();
}

+75 −60
Original line number Diff line number Diff line
@@ -14,28 +14,43 @@
#include "points.h"
#include <numeric>
#include "fviz.h"
#include "sexpr.h"
#include "sexpr_conv.h"
#include "sexpr_util.h"
#include "core/environment.h"
#include "core/layout.h"
#include "core/scale.h"
#include "graphics/path.h"
#include "graphics/brush.h"
#include "graphics/text.h"
#include "graphics/layout.h"
#include "source/utils/algo.h"
#include "source/config_helpers.h"

using namespace std::placeholders;

namespace fviz {
namespace plot {
namespace points {
namespace fviz::elements::chart::points {

static const double kDefaultPointSizePT = 3;
static const double kDefaultPointSizeMinPT = 1;
static const double kDefaultPointSizeMaxPT = 24;
static const double kDefaultLabelPaddingEM = 0.4;

struct PlotPointsConfig {
  std::vector<Measure> x;
  std::vector<Measure> y;
  DomainConfig scale_x;
  DomainConfig scale_y;
  std::vector<Color> colors;
  std::vector<Measure> sizes;
  std::vector<std::string> labels;
  FontInfo label_font;
  Measure label_padding;
  Measure label_font_size;
  Color label_color;
  LayoutSettings layout;
};

ReturnCode draw(
    PlotPointsConfig config,
    std::shared_ptr<PlotPointsConfig> config,
    const LayoutInfo& layout,
    Layer* layer) {
  const auto& clip = layout.content_box;
@@ -44,40 +59,40 @@ ReturnCode draw(
  convert_units(
      {
        bind(&convert_unit_typographic, layer->dpi, layer->font_size.value, _1),
        bind(&convert_unit_user, domain_translate_fn(config.scale_x), _1),
        bind(&convert_unit_user, domain_translate_fn(config->scale_x), _1),
        bind(&convert_unit_relative, clip.w, _1)
      },
      &*config.x.begin(),
      &*config.x.end());
      &*config->x.begin(),
      &*config->x.end());

  convert_units(
      {
        bind(&convert_unit_typographic, layer->dpi, layer->font_size.value, _1),
        bind(&convert_unit_user, domain_translate_fn(config.scale_y), _1),
        bind(&convert_unit_user, domain_translate_fn(config->scale_y), _1),
        bind(&convert_unit_relative, clip.h, _1)
      },
      &*config.y.begin(),
      &*config.y.end());
      &*config->y.begin(),
      &*config->y.end());

  convert_units(
      {
        bind(&convert_unit_typographic, layer->dpi, layer->font_size.value, _1)
      },
      &*config.sizes.begin(),
      &*config.sizes.end());
      &*config->sizes.begin(),
      &*config->sizes.end());

  /* draw points */
  for (size_t i = 0; i < config.x.size(); ++i) {
    auto sx = clip.x + config.x[i];
    auto sy = clip.y + clip.h - config.y[i];
  for (size_t i = 0; i < config->x.size(); ++i) {
    auto sx = clip.x + config->x[i];
    auto sy = clip.y + clip.h - config->y[i];

    const auto& color = config.colors.empty()
    const auto& color = config->colors.empty()
        ? Color{}
        : config.colors[i % config.colors.size()];
        : config->colors[i % config->colors.size()];

    auto size = config.sizes.empty()
    auto size = config->sizes.empty()
        ? from_pt(kDefaultPointSizePT, layer->dpi)
        : config.sizes[i % config.sizes.size()];
        : config->sizes[i % config->sizes.size()];

    FillStyle style;
    style.color = color;
@@ -90,25 +105,25 @@ ReturnCode draw(
  }

  /* draw labels */
  for (size_t i = 0; i < config.labels.size(); ++i) {
    const auto& label_text = config.labels[i];
  for (size_t i = 0; i < config->labels.size(); ++i) {
    const auto& label_text = config->labels[i];

    auto size = config.sizes.empty()
    auto size = config->sizes.empty()
        ? 0
        : config.sizes[i % config.sizes.size()].value;
        : config->sizes[i % config->sizes.size()].value;

    auto label_padding = size + measure_or(
        config.label_padding,
        from_em(kDefaultLabelPaddingEM, config.label_font_size));
        config->label_padding,
        from_em(kDefaultLabelPaddingEM, config->label_font_size));

    Point p(
        clip.x + config.x[i],
        clip.y + clip.h - config.y[i] - label_padding);
        clip.x + config->x[i],
        clip.y + clip.h - config->y[i] - label_padding);

    TextStyle style;
    style.font = config.label_font;
    style.color = config.label_color;
    style.font_size = config.label_font_size;
    style.font = config->label_font;
    style.color = config->label_color;
    style.font_size = config->label_font_size;

    auto ax = HAlign::CENTER;
    auto ay = VAlign::BOTTOM;
@@ -120,37 +135,37 @@ ReturnCode draw(
  return OK;
}

ReturnCode configure(
    const plist::PropertyList& plist,
ReturnCode build(
    const Environment& env,
    PlotPointsConfig* config) {
    const Expr* expr,
    ElementRef* elem) {
  /* set defaults from environment */
  config->scale_x = env.scale_x;
  config->scale_y = env.scale_y;
  auto config = std::make_shared<PlotPointsConfig>();
  config->label_font = env.font;
  config->label_font_size = env.font_size;

  /* parse properties */
  ParserDefinitions pdefs = {
    {"xs", bind(&configure_measures, _1, &config->x)},
    {"ys", bind(&configure_measures, _1, &config->y)},
    {"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)},
    {"size", bind(&configure_measures, _1, &config->sizes)},
    {"sizes", bind(&configure_measures, _1, &config->sizes)},
    {"color", configure_vec<Color>(bind(&configure_color, _1, _2), &config->colors)},
    {"colors", configure_vec<Color>(bind(&configure_color, _1, _2), &config->colors)},
    {"labels", bind(&configure_strings, _1, &config->labels)},
  };

  if (auto rc = parseAll(plist, pdefs); !rc) {
    return rc;
  auto config_rc = expr_walk_map(expr_next(expr), {
    {"xdata", bind(&expr_to_measures, _1, &config->x)},
    {"ydata", bind(&expr_to_measures, _1, &config->y)},
    //{"scale-x", bind(&domain_configure, _1, &config->scale_x)},
    //{"scale-x-min", bind(&expr_to_float_opt, _1, &config->scale_x.min)},
    //{"scale-x-max", bind(&expr_to_float_opt, _1, &config->scale_x.max)},
    //{"scale-x-padding", bind(&expr_to_float, _1, &config->scale_x.padding)},
    //{"scale-y", bind(&domain_configure, _1, &config->scale_y)},
    //{"scale-y-min", bind(&expr_to_float_opt, _1, &config->scale_y.min)},
    //{"scale-y-max", bind(&expr_to_float_opt, _1, &config->scale_y.max)},
    //{"scale-y-padding", bind(&expr_to_float, _1, &config->scale_y.padding)},
    {"size", bind(&expr_to_measures, _1, &config->sizes)},
    {"sizes", bind(&expr_to_measures, _1, &config->sizes)},
    {"color", expr_tov_fn<Color>(bind(&expr_to_color, _1, _2), &config->colors)},
    {"colors", expr_tov_fn<Color>(bind(&expr_to_color, _1, _2), &config->colors)},
    {"labels", bind(&expr_to_strings, _1, &config->labels)},
    {"label-font-size", bind(&expr_to_measure, _1, &config->label_font_size)},
  });

  if (!config_rc) {
    return config_rc;
  }

  /* check configuraton */
@@ -173,10 +188,10 @@ ReturnCode configure(
    }
  }

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

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

namespace fviz {
namespace plot {
namespace points {
namespace fviz::elements::chart::points {

struct PlotPointsConfig {
  std::vector<Measure> x;
  std::vector<Measure> y;
  DomainConfig scale_x;
  DomainConfig scale_y;
  std::vector<Color> colors;
  std::vector<Measure> sizes;
  std::vector<std::string> labels;
  FontInfo label_font;
  Measure label_padding;
  Measure label_font_size;
  Color label_color;
  LayoutSettings layout;
};

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

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

} // namespace points
} // namespace plot
} // namespace fviz
} // namespace fviz::elements::chart::points
+7 −0
Original line number Diff line number Diff line
(chart/points
    xdata (100px 500px 700px 900px 300px)
    ydata (200px 300px 200px 300px 100px)
    labels (A B A B A)
    label-font-size 18pt
    colors (#00c #c00)
    sizes (8px))
Loading