Commit 28ea0da1 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

improved the font loading and selection mechanism

parent f781edb6
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "utils/flagparser.h"
#include "return_code.h"
#include "utils/stringutil.h"
#include "core/environment.h"

using namespace fviz;

@@ -47,6 +48,12 @@ int main(int argc, const char** argv) {
  bool flag_debug = true;
  flag_parser.defineSwitch("debug", &flag_debug);

  bool flag_font_defaults = true;
  flag_parser.defineSwitch("font-defaults", &flag_font_defaults);

  std::vector<std::string> flag_font_load;
  flag_parser.defineStringV("font-load", &flag_font_load);

  {
    auto rc = flag_parser.parseArgv(argc - 1, argv + 1);
    if (!rc) {
@@ -102,6 +109,10 @@ int main(int argc, const char** argv) {
    return EXIT_FAILURE;
  }

  Environment* env = static_cast<Environment*>(fviz_env(ctx));
  env->font_defaults = flag_font_defaults;
  env->font_load = flag_font_load;

  if (!fviz_configure_file(ctx, flag_in.c_str())) {
    fviz_printerror(ctx);
    return EXIT_FAILURE;
+17 −12
Original line number Diff line number Diff line
@@ -27,17 +27,26 @@ Environment::Environment() :
    screen_width(Unit::UNIT, 900),
    screen_height(Unit::UNIT, 480),
    dpi(96),
    font_defaults(true),
    background_color(Color::fromRGB(1,1,1)),
    foreground_color(Color::fromRGB(0,0,0)),
    text_color(Color::fromRGB(0,0,0)),
    font_size(from_pt(11)) {}

ReturnCode environment_setup_defaults(Environment* env) {
  return try_chain({
    std::bind(&font_find, DefaultFont::ROMAN_SANS_MEDIUM, &env->font),
    std::bind(&font_find, DefaultFont::ROMAN_SANS_BOLD, &env->font_em),
    std::bind(&font_find, DefaultFont::ROMAN_SANS_BOLD, &env->font_symbol),
  });
  if (env->font_defaults) {
    if (auto rc = font_load_defaults(&env->font); !rc) {
      return rc;
    }
  }

  for (const auto& f : env->font_load) {
    if (auto rc = font_load_best(f, &env->font); !rc) {
      return rc;
    }
  }

  return OK;
}

ReturnCode environment_set(Environment* env, const Expr* expr) {
@@ -71,15 +80,11 @@ ReturnCode environment_set(Environment* env, const Expr* expr) {
  }

  if (expr_is_value(args[0], "font")) {
    return font_find_expr(args[1], &env->font);
  }

  if (expr_is_value(args[0], "font-emphasis")) {
    return font_find_expr(args[1], &env->font_em);
    return expr_to_strings_flat(args[1], &env->font_load);
  }

  if (expr_is_value(args[0], "font-symbols")) {
    return font_find_expr(args[1], &env->font_symbol);
  if (expr_is_value(args[0], "font-defaults")) {
    return expr_to_switch(args[1], &env->font_defaults);
  }

  if (expr_is_value(args[0], "font-size")) {
+2 −2
Original line number Diff line number Diff line
@@ -29,9 +29,9 @@ struct Environment {
  Measure screen_width;
  Measure screen_height;
  double dpi;
  bool font_defaults;
  std::vector<std::string> font_load;
  FontInfo font;
  FontInfo font_em;
  FontInfo font_symbol;
  Measure font_size;
  ColorScheme color_scheme;
  Color background_color;
+6 −2
Original line number Diff line number Diff line
@@ -80,6 +80,10 @@ void fviz_seterr(fviz_t* ctx, const ReturnCode& err) {
  ctx->error = err;
}

void* fviz_env(fviz_t* ctx) {
  return &ctx->env;
}

int fviz_configure(
    fviz_t* ctx,
    const char* config) {
@@ -88,12 +92,12 @@ int fviz_configure(
    return ERROR;
  }

  if (auto rc = environment_setup_defaults(&ctx->env); !rc) {
  if (auto rc = environment_configure(&ctx->env, ctx->expr.get()); !rc) {
    fviz_seterr(ctx, rc);
    return rc;
  }

  if (auto rc = environment_configure(&ctx->env, ctx->expr.get()); !rc) {
  if (auto rc = environment_setup_defaults(&ctx->env); !rc) {
    fviz_seterr(ctx, rc);
    return rc;
  }
+2 −0
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@ const char* fviz_geterror(const fviz_t* ctx);
 */
void fviz_printerror(const fviz_t* ctx);

void* fviz_env(fviz_t* ctx);

/**
 * Set a user-defined parameter
 */
Loading