/* global.c
Copyright (C) 2005,2006,2007 Eugene K. Ressler, Jr.
This file is part of Sketch, a small, simple system for making
3d drawings with LaTeX and the PSTricks or TikZ package.
Sketch is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
Sketch is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Sketch; see the file COPYING.txt. If not, see
http://www.gnu.org/copyleft */
#include "global.h"
GLOBAL_ENV __the_global_env[1];
// must match GEOL_lang definitions in global.h
char *output_language_str[] = {
"PSTricks,LaTeX",
"PGF/TikZ,LaTeX",
"PSTricks,ConTeXt",
"PGF/TikZ,ConTeXt",
};
void
init_global_env (GLOBAL_ENV * env, PST_VERSION *pst_version)
{
env->set_p_mask = 0;
set_ident (env->camera);
copy_pt_3d (env->bb1, origin_3d);
copy_pt_3d (env->bb2, origin_3d);
init_opts (env->opts);
env->baseline = 0;
env->output_language = GEOL_PSTRICKS | GEOL_LATEX;
*env->pst_version = *pst_version;
}
void
set_global_baseline (GLOBAL_ENV * env, FLOAT baseline, SRC_LINE line)
{
if (baseline == NO_BASELINE)
return;
if (global_env_is_set_p (env, GE_BASELINE))
{
err (line, "baseline is already set");
return;
}
env->set_p_mask |= bit (GE_BASELINE);
env->baseline = baseline;
}
void
set_global_env_extent (GLOBAL_ENV * env, POINT_3D p1, POINT_3D p2,
SRC_LINE line)
{
if (global_env_is_set_p (env, GE_EXTENT))
{
err (line, "bounding box is already set");
return;
}
env->set_p_mask |= bit (GE_EXTENT);
copy_pt_3d (env->bb1, p1);
copy_pt_3d (env->bb2, p2);
}
int
get_transformed_global_env_extent (BOX_3D * extent, GLOBAL_ENV * env)
{
POINT_3D t;
int i;
if (!global_env_is_set_p (env, GE_EXTENT))
return 0;
init_box_3d (extent);
if (global_env_is_set_p (env, GE_CAMERA))
{
for (i = 0; i < 8; i++)
{
t[X] = (i & 1) ? env->bb1[X] : env->bb2[X];
t[Y] = (i & 2) ? env->bb1[Y] : env->bb2[Y];
t[Z] = (i & 4) ? env->bb1[Z] : env->bb2[Z];
transform_pt_3d (t, env->camera, t);
fold_min_max_pt_3d (extent, t);
}
}
else
{
fold_min_max_pt_3d (extent, env->bb1);
fold_min_max_pt_3d (extent, env->bb2);
}
return 1;
}
void
set_global_env_opts (GLOBAL_ENV * env, char *opt_str, SRC_LINE line)
{
if (global_env_is_set_p (env, GE_OPTS))
{
err (line, "global options are already set");
return;
}
env->set_p_mask |= bit (GE_OPTS);
setup_opts (env->opts, opt_str, no_line);
}
void
set_global_env_frame (GLOBAL_ENV * env, char *opt_str, SRC_LINE line)
{
if (global_env_is_set_p (env, GE_FRAME))
{
err (line, "frame is already set");
return;
}
env->set_p_mask |= bit (GE_FRAME);
safe_free (env->frame_opts);
env->frame_opts = opt_str ? safe_strdup (opt_str) : NULL;
}
void
set_global_env_camera (GLOBAL_ENV * env, TRANSFORM camera, SRC_LINE line)
{
if (global_env_is_set_p (env, GE_CAMERA))
{
err (line, "camera is already set");
return;
}
env->set_p_mask |= bit (GE_CAMERA);
copy_transform (env->camera, camera);
}
void
set_global_output_language (GLOBAL_ENV * env, int output_language,
SRC_LINE line)
{
if (global_env_is_set_p (env, GE_OUTPUT_LANGUAGE))
{
err (line, "output language is already set");
return;
}
env->set_p_mask |= bit (GE_OUTPUT_LANGUAGE);
env->output_language = output_language;
}
int
get_global_output_language (int * output_language, GLOBAL_ENV * env)
{
*output_language = env->output_language;
return global_env_is_set_p (env, GE_OUTPUT_LANGUAGE);
}
int cmp_with_global_pst_version(GLOBAL_ENV * env,
char * version_str,
SRC_LINE line)
{
PST_VERSION v[1];
parse_pst_version(v, version_str, line);
return pst_version_cmp(env->pst_version, v);
}