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

move the element ctor map into the environment struct

parent f8af14f1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -32,12 +32,12 @@
#include <memory>
#include <string>
#include <functional>
#include "environment.h"
#include "graphics/layer.h"
#include "sexpr.h"
#include "utils/return_code.h"

namespace plotfx {
struct Environment;
struct LayoutInfo;

struct Element;
+4 −5
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include "element_factory.h"
#include "environment.h"

#include <unordered_map>

@@ -35,7 +36,6 @@ namespace plotfx {

ReturnCode element_build(
    const Environment& env,
    const ElementMap& factory,
    const Expr* expr,
    ElementRef* elem) {
  if (!expr || !expr_is_value(expr)) {
@@ -43,8 +43,8 @@ ReturnCode element_build(
  }

  auto elem_name = expr_get_value(expr);
  auto elem_iter = factory.elements.find(elem_name);
  if (elem_iter == factory.elements.end()) {
  auto elem_iter = env.element_map.elements.find(elem_name);
  if (elem_iter == env.element_map.elements.end()) {
    return ReturnCode::errorf("EARG", "no such element: $0", elem_name);
  }

@@ -53,7 +53,6 @@ ReturnCode element_build(

ReturnCode element_build_all(
    const Environment& env,
    const ElementMap& factory,
    const Expr* expr,
    std::vector<ElementRef>* elems) {
  for (; expr; expr = expr_next(expr)) {
@@ -62,7 +61,7 @@ ReturnCode element_build_all(
    }

    ElementRef elem;
    if (auto rc = element_build(env, factory, expr_get_list(expr), &elem); !rc) {
    if (auto rc = element_build(env, expr_get_list(expr), &elem); !rc) {
      return rc;
    }

+0 −2
Original line number Diff line number Diff line
@@ -41,13 +41,11 @@ struct ElementMap {

ReturnCode element_build(
    const Environment& env,
    const ElementMap& factory,
    const Expr* expr,
    ElementRef* elem);

ReturnCode element_build_all(
    const Environment& env,
    const ElementMap& factory,
    const Expr* expr,
    std::vector<ElementRef>* elems);

+2 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include "graphics/color.h"
#include "graphics/text.h"
#include "sexpr.h"
#include "element_factory.h"

namespace plotfx {
class Layer;
@@ -50,6 +51,7 @@ struct Environment {
  Color background_color;
  Color text_color;
  Color border_color;
  ElementMap element_map;
};

ReturnCode environment_setup_defaults(Environment* env);
+7 −6
Original line number Diff line number Diff line
@@ -54,11 +54,12 @@ struct plotfx_s {

plotfx_t* plotfx_init() {
  auto ctx = std::make_unique<plotfx_t>();
  element_bind(&ctx->elements, "text", bind(elements::text::build, _1, _2, _3));
  element_bind(&ctx->elements, "chart/axis-top", bind(elements::chart::axis::build, _1, _2, _3));
  element_bind(&ctx->elements, "chart/axis-right", bind(elements::chart::axis::build, _1, _2, _3));
  element_bind(&ctx->elements, "chart/axis-bottom", bind(elements::chart::axis::build, _1, _2, _3));
  element_bind(&ctx->elements, "chart/axis-left", bind(elements::chart::axis::build, _1, _2, _3));
  auto elems = &ctx->env.element_map;
  element_bind(elems, "text", bind(elements::text::build, _1, _2, _3));
  element_bind(elems, "chart/axis-top", bind(elements::chart::axis::build, _1, _2, _3));
  element_bind(elems, "chart/axis-right", bind(elements::chart::axis::build, _1, _2, _3));
  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));
  return ctx.release();
}

@@ -120,7 +121,7 @@ int plotfx_render_to(plotfx_t* ctx, void* backend) {

  std::vector<ElementRef> roots;
  auto rc = try_chain({
    [&] { return element_build_all(ctx->env, ctx->elements, ctx->expr.get(), &roots); },
    [&] { return element_build_all(ctx->env, ctx->expr.get(), &roots); },
    [&] () -> ReturnCode {
      for (const auto& e : roots) {
        if (auto rc = e->draw(layout, layer); !rc) {
Loading