109 lines
2.1 KiB
C
109 lines
2.1 KiB
C
|
#include <TeX/node.h>
|
||
|
#include <TeX/flow.h>
|
||
|
#include <TeX/env.h>
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
//---
|
||
|
// Primary environment: a simple flow
|
||
|
//
|
||
|
// This environment ignores separators and breaks and concatenates all
|
||
|
// nodes in a single flow. It is the type of the outermost environment of
|
||
|
// any formula.
|
||
|
//---
|
||
|
|
||
|
struct TeX_Env_Primary
|
||
|
{
|
||
|
struct TeX_Env env;
|
||
|
|
||
|
struct TeX_Flow *flow;
|
||
|
};
|
||
|
|
||
|
static void primary_free(struct TeX_Env *env)
|
||
|
{
|
||
|
struct TeX_Env_Primary *p = (void *)env;
|
||
|
TeX_flow_free(p->flow);
|
||
|
}
|
||
|
|
||
|
static void primary_add_node(struct TeX_Env *env, struct TeX_Node *node)
|
||
|
{
|
||
|
struct TeX_Env_Primary *p = (void *)env;
|
||
|
p->flow = TeX_flow_add_node(p->flow, node);
|
||
|
}
|
||
|
|
||
|
static void primary_size(struct TeX_Env *env)
|
||
|
{
|
||
|
struct TeX_Env_Primary *p = (void *)env;
|
||
|
TeX_flow_layout(p->flow);
|
||
|
|
||
|
p->env.width = p->flow->width;
|
||
|
p->env.height = p->flow->height;
|
||
|
p->env.line = p->flow->line;
|
||
|
}
|
||
|
|
||
|
static void primary_render(struct TeX_Env *env, int x, int y, int color)
|
||
|
{
|
||
|
struct TeX_Env_Primary *p = (void *)env;
|
||
|
TeX_flow_render(p->flow, x, y, color);
|
||
|
}
|
||
|
|
||
|
struct TeX_Env *TeX_env_primary(void)
|
||
|
{
|
||
|
struct TeX_Env_Primary *p = malloc(sizeof *p);
|
||
|
struct TeX_Env *env = (void *)p;
|
||
|
|
||
|
env->name = "primary";
|
||
|
env->free = primary_free;
|
||
|
env->add_node = primary_add_node;
|
||
|
env->add_separator = NULL;
|
||
|
env->add_break = NULL;
|
||
|
env->size = primary_size;
|
||
|
env->render = primary_render;
|
||
|
|
||
|
p->flow = NULL;
|
||
|
|
||
|
return env;
|
||
|
}
|
||
|
|
||
|
//---
|
||
|
// Matrix environment.
|
||
|
//---
|
||
|
|
||
|
/* TODO */
|
||
|
|
||
|
//---
|
||
|
// Environment printers
|
||
|
//---
|
||
|
|
||
|
#ifdef TEX_PRINT
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <TeX/print.h>
|
||
|
|
||
|
/* TeX_print_env_primary(): Print a primary environment to stdout */
|
||
|
void TeX_print_env_primary(struct TeX_Env *env, int indent)
|
||
|
{
|
||
|
struct TeX_Env_Primary *p = (void *)env;
|
||
|
|
||
|
printf("%*s", indent, "");
|
||
|
printf("{primary}\n");
|
||
|
|
||
|
TeX_print_flow(p->flow, indent + 2);
|
||
|
}
|
||
|
|
||
|
/* TeX_print_env(): Recursively print an environment */
|
||
|
void TeX_print_env(struct TeX_Env *env, int indent)
|
||
|
{
|
||
|
if(!strcmp(env->name, "primary"))
|
||
|
{
|
||
|
TeX_print_env_primary(env, indent);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("%*s{%s} (?)\n", indent, "", env->name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif /* TEX_PRINT */
|