Update procedures
[shapes.git] / source / globals.cc
blob489e897282570bc45d88b8b65cf2df6c0472a6c4
1 /* This file is part of Shapes.
3 * Shapes is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * any later version.
8 * Shapes is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with Shapes. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright 2008, 2010, 2013, 2014 Henrik Tidefelt
19 #include "globals.h"
21 #include "shapesscanner.h"
22 #include "shapestypes.h"
23 #include "ast.h"
24 #include "astfun.h"
25 #include "refcount.h"
26 #include "texlabelmanager.h"
27 #include "statetypes.h"
28 #include "pdfstructure.h"
29 #include "functiontypes.h"
30 #include "containertypes.h"
31 #include "shapescore.h"
32 #include "consts.h"
33 #include "basicsimplex.h"
34 #include "debuglog.h"
35 #include "shapesexceptions.h"
37 #include <climits>
39 using namespace std;
40 using namespace Shapes;
42 ShapesScanner Ast::theShapesScanner;
43 Kernel::PassedEnv Kernel::theGlobalEnvironment = 0;
44 std::list< Kernel::Environment * > Kernel::theEnvironmentList;
45 SimplePDF::PDF_Version Kernel::the_PDF_version;
46 bool Kernel::allowTransparency = true;
47 bool Kernel::allowSingletonPaths = true;
48 size_t Kernel::theIndirectObjectCount = 1; /* Never use 0! */
49 SimplePDF::DocumentInfo Kernel::theDocInfo;
50 Kernel::Import Kernel::thePDFImporter;
51 Kernel::DebugLog Kernel::theDebugLog;
52 Kernel::TeXLabelManager Kernel::theTeXLabelManager;
53 RefCountPtr< const Kernel::GraphicsState > Kernel::THE_NO_STATE = NullPtr< const Kernel::GraphicsState >( );
54 RefCountPtr< const Lang::Function > Kernel::THE_NO_FUNCTION = NullPtr< const Lang::Function >( );
56 Concrete::Length Computation::the_arcdelta( 0.1 ); /* that is, 0.1bp */
57 double Computation::the_dtMin = 1e-4;
58 bool Computation::dtMinIsError = true;
59 Concrete::Length Computation::theDistanceTol( 1e-3 );
60 Concrete::Length Computation::theTrixelizeSplicingTol( 1e-5 );
61 Concrete::Length Computation::theTrixelizeOverlapTol( 1e-3 );
62 RefCountPtr< const Computation::PaintedPolygon3D > Computation::THE_NULL_POLYGON3D( new Computation::NullPolygon3D( ) );
63 bool Computation::fontMetricGuessIsError = false;
64 Computation::BasicSimplex Computation::theTwoTriangleSimplex( 3, 6 ); /* 3 variables ( x, y, r ), 6 equations. */
66 Ast::Expression * Ast::theProgram;
67 std::list< Ast::Node * > * Ast::theInteractiveInput;
68 PtrOwner_back_Access< std::list< Ast::AnalysisEnvironment * > > Ast::theAnalysisEnvironmentList;
69 Ast::AnalysisEnvironment * Ast::theGlobalAnalysisEnvironment;
70 const Ast::FileID * Ast::SourceLocation::UNKNOWN_FILE = Ast::FileID::build_internal( "*uninitialized*" );
71 const Ast::SourceLocation Ast::THE_UNKNOWN_LOCATION( Ast::SourceLocation::UNKNOWN_FILE ); /* This is a special value. See SourceLocation. */
72 Ast::SourceLocationFactory Ast::theSourceLocationFactory;
73 Ast::DummyExpression Ast::THE_CORE_DEFAULT_VALUE_EXPRESSION( Ast::theSourceLocationFactory.construct_internal( "< core function default value >" ) );
74 Ast::DummyExpression Ast::THE_INTERNAL_VALUE_EXPRESSION( Ast::theSourceLocationFactory.construct_internal( "< internally passed value >" ) );
76 PtrOwner_back_Access< std::list< Exceptions::Exception * > > Kernel::thePostCheckErrorsList;
77 PtrOwner_back_Access< std::list< Exceptions::Exception * > > Ast::theAnalysisErrorsList;
79 #ifdef HAVE_FT2
80 FT_Library Kernel::theFreeType;
81 const char *
82 Kernel::FreeTypeErrorMessage( FT_Error code )
84 #undef __FTERRORS_H__
85 #define FT_ERRORDEF( e, v, s ) case e: return s;
86 #define FT_ERROR_START_LIST {
87 #define FT_ERROR_END_LIST default: return "(Bad FreeType error code.)"; }
88 switch( code )
89 #include FT_ERRORS_H
92 #endif
95 bool Interaction::debugBacktrace = true;
96 bool Interaction::debugSystem = false;
97 size_t Interaction::debugStep = INT_MAX;
98 const char * Interaction::displayUnitName = "cm";
99 Concrete::Length Interaction::displayUnit( 72 / 2.54 );
100 double Interaction::displayUnitFactor = -1;
101 bool Interaction::fontMetricMessages = false;
102 bool Interaction::fontMetricDebug = false;
103 bool Interaction::characterColumnInBytes = false;
104 bool Interaction::pdfLaTeXInteractionTo_stderr = false;
105 bool Interaction::logGlobals = false;
106 Interaction::WarningAction Interaction::warningAction = Interaction::WARNING_DISPLAY;
107 bool Interaction::blankMode = false;
109 RefCountPtr< const Lang::GroupNull2D > Lang::THE_NULL2D( new Lang::GroupNull2D( ) );
110 RefCountPtr< const Lang::GroupNull3D > Lang::THE_NULL3D( new Lang::GroupNull3D( ) );
111 RefCountPtr< const Lang::DynamicBindings > Lang::THE_NULL_DYNAMIC_BINDINGS( new Lang::DynamicBindingsNull( ) );
112 RefCountPtr< const Lang::LightGroup > Lang::THE_NULL_LIGHTS( new Lang::LightNull( ) );
113 RefCountPtr< const Lang::SingleListNull > Lang::THE_CONS_NULL( new Lang::SingleListNull( ) );
114 RefCountPtr< const Lang::SpecularReflectionNull > Lang::THE_SPECULARREFLECTION_NULL( new Lang::SpecularReflectionNull( ) );
115 //RefCountPtr< const Lang::PaintedPolygon2D > Computation::THE_NULL_POLYGON2D( new Computation::NullPolygon2D( ) );
116 RefCountPtr< const Lang::ColorSpace > Lang::THE_INHERITED_COLOR_SPACE( new Lang::InheritedColorSpace( ) );
117 RefCountPtr< const Lang::ColorSpace > Lang::THE_COLOR_SPACE_DEVICE_GRAY( new Lang::DeviceColorSpace< Lang::Gray >( "DeviceGray", 1 ) );
118 RefCountPtr< const Lang::ColorSpace > Lang::THE_COLOR_SPACE_DEVICE_RGB( new Lang::DeviceColorSpace< Lang::RGB >( "DeviceRGB", 3 ) );
119 RefCountPtr< const Lang::ColorSpace > Lang::THE_COLOR_SPACE_DEVICE_CMYK( new Lang::DeviceColorSpace< Lang::CMYK >( "DeviceCMYK", 4 ) );
120 RefCountPtr< const Lang::Drawable2D > Lang::THE_POINTPICTURE = NullPtr< const Lang::Drawable2D >( );
121 RefCountPtr< const Lang::Void > Lang::THE_VOID( new Lang::Void( ) );
122 RefCountPtr< const Lang::ElementaryPath2D > Lang::THE_EMPTYPATH2D( new Lang::ElementaryPath2D( ) );
123 RefCountPtr< const Lang::ElementaryPath3D > Lang::THE_EMPTYPATH3D( new Lang::ElementaryPath3D( ) );
124 RefCountPtr< const Lang::Boolean > Lang::THE_FALSE( new Lang::Boolean( false ) );
125 RefCountPtr< const Lang::Boolean > Lang::THE_TRUE( new Lang::Boolean( true ) );
126 RefCountPtr< const Lang::Gray > Lang::THE_BLACK( new Lang::Gray( Concrete::Gray( 0 ) ) );
127 RefCountPtr< const Lang::Gray > Lang::THE_OCCLUDING_WHITE( new Lang::Gray( Concrete::Gray( 1 ) ) );
128 RefCountPtr< const Lang::Alpha > Lang::THE_OPAQUE( new Lang::Alpha( false, 1 ) );
129 RefCountPtr< const Lang::Class > Lang::THE_OBJECT( new Lang::Object( ) );
130 RefCountPtr< const Lang::Dash > Lang::THE_SOLID_DASH( new Lang::Dash( ) );
131 RefCountPtr< const Lang::SoftMask > Lang::THE_NONE_MASK( new Lang::SoftMask( ) );
132 RefCountPtr< const Lang::SoftMask > Lang::THE_SAME_MASK( new Lang::SoftMask( ) );
134 RefCountPtr< const char > BuiltInFonts::HELVETICA = strrefdup( "Helvetica" );
135 RefCountPtr< const Lang::Font > Lang::THE_FONT_HELVETICA( new Lang::PDFStandardFont( BuiltInFonts::HELVETICA ) );
137 Kernel::Arguments Kernel::EMPTY_ARGLIST( new Kernel::EvaluatedFormals( Ast::FileID::build_internal( "< the empty arg list >" ) ) );
138 RefCountPtr< const Lang::Structure > Lang::THE_EMPTY_STRUCT( new Lang::Structure( new Ast::ArgListExprs( true ), Lang::THE_CONS_NULL, true ) );
139 Kernel::VariableHandle Kernel::THE_SLOT_VARIABLE( new Kernel::Variable( Lang::THE_VOID ) );
140 Kernel::VariableHandle Kernel::THE_VOID_VARIABLE( new Kernel::Variable( Lang::THE_VOID ) );
141 Kernel::VariableHandle Kernel::THE_FALSE_VARIABLE( new Kernel::Variable( Lang::THE_FALSE ) );
142 Kernel::VariableHandle Kernel::THE_TRUE_VARIABLE( new Kernel::Variable( Lang::THE_TRUE ) );
143 Kernel::VariableHandle Kernel::THE_NIL_VARIABLE( new Kernel::Variable( Lang::THE_CONS_NULL ) );
144 Kernel::StateHandle Kernel::THE_SLOT_STATE = Kernel::StateHandle( NullPtr< Kernel::State >( ) );
147 * Two global Symbol objects were moved to elementarytypes.cc to ensure they get initialized after the static variables in Lang::Symbol.
149 Lang::Transform2D Lang::THE_2D_IDENTITY( 1, 0,
150 0, 1,
151 Concrete::ZERO_LENGTH, Concrete::ZERO_LENGTH );
152 Lang::Transform3D Lang::THE_3D_IDENTITY( 1, 0, 0,
153 0, 1, 0,
154 0, 0, 1,
155 Concrete::ZERO_LENGTH, Concrete::ZERO_LENGTH, Concrete::ZERO_LENGTH );
158 * Be sure to initiate this after globals that it relies on!
160 RefCountPtr< const Kernel::GraphicsState > Kernel::THE_DEFAULT_STATE( new Kernel::GraphicsState( true ) );
163 void
164 Shapes::Kernel::registerGlobals( Kernel::Environment * env )
166 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Cap, "BUTT", RefCountPtr< const Lang::CapStyle >( new Lang::CapStyle( Lang::CapStyle::CAP_BUTT ) ) );
167 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Cap, "ROUND", RefCountPtr< const Lang::CapStyle >( new Lang::CapStyle( Lang::CapStyle::CAP_ROUND ) ) );
168 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Cap, "SQUARE", RefCountPtr< const Lang::CapStyle >( new Lang::CapStyle( Lang::CapStyle::CAP_SQUARE ) ) );
169 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Join, "MITER", RefCountPtr< const Lang::JoinStyle >( new Lang::JoinStyle( Lang::JoinStyle::JOIN_MITER ) ) );
170 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Join, "ROUND", RefCountPtr< const Lang::JoinStyle >( new Lang::JoinStyle( Lang::JoinStyle::JOIN_ROUND ) ) );
171 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Join, "BEVEL", RefCountPtr< const Lang::JoinStyle >( new Lang::JoinStyle( Lang::JoinStyle::JOIN_BEVEL ) ) );
172 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_BW, "BLACK", Lang::THE_BLACK );
173 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_BW, "OCCLUDING", Lang::THE_OCCLUDING_WHITE );
174 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_BW, "WHITE", RefCountPtr< const Lang::Gray >( new Lang::Gray( Concrete::Gray( 1 ) ) ) );
175 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "BLACK", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 0, 0, 0 ) ) ) );
176 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "WHITE", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 1, 1, 1 ) ) ) );
177 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "RED", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 1, 0, 0 ) ) ) );
178 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "GREEN", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 0, 1, 0 ) ) ) );
179 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "BLUE", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 0, 0, 1 ) ) ) );
180 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "YELLOW", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 1, 1, 0 ) ) ) );
181 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "CYAN", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 0, 1, 1 ) ) ) );
182 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_RGB, "MAGENTA", RefCountPtr< const Lang::RGB >( new Lang::RGB( Concrete::RGB( 1, 0, 1 ) ) ) );
183 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "NORMAL", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::NORMAL ) ) );
184 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "MULTIPLY", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::MULTIPLY ) ) );
185 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "SCREEN", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::SCREEN ) ) );
186 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "OVERLAY", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::OVERLAY ) ) );
187 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "DARKEN", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::DARKEN ) ) );
188 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "LIGHTEN", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::LIGHTEN ) ) );
189 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "COLOR_DODGE", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::COLOR_DODGE ) ) );
190 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "COLOR_BURN", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::COLOR_BURN ) ) );
191 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "HARD_LIGHT", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::HARD_LIGHT ) ) );
192 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "SOFT_LIGHT", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::SOFT_LIGHT ) ) );
193 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "DIFFERENCE", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::DIFFERENCE ) ) );
194 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "EXCLUSION", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::EXCLUSION ) ) );
195 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "HUE", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::HUE ) ) );
196 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "SATURATION", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::SATURATION ) ) );
197 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "COLOR", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::COLOR ) ) );
198 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Blend, "LUMINOSITY", RefCountPtr< const Lang::BlendMode >( new Lang::BlendMode( Lang::BlendMode::LUMINOSITY ) ) );
199 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Device, "GRAY", Lang::THE_COLOR_SPACE_DEVICE_GRAY );
200 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Device, "RGB", Lang::THE_COLOR_SPACE_DEVICE_RGB );
201 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits_Device, "CMYK", RefCountPtr< const Lang::ColorSpace >( new Lang::DeviceColorSpace< Lang::CMYK >( "DeviceCMYK", 4 ) ) );
203 env->initDefineDynamicHandler( Lang::HANDLER_NO_INTERSECTION, "Failed to find intersection." );
205 env->initDefine( Lang::THE_NAMESPACE_Shapes, "void", Lang::THE_VOID );
206 env->initDefine( Lang::THE_NAMESPACE_Shapes_Data, "nil", Lang::THE_CONS_NULL );
207 env->initDefine( Lang::THE_NAMESPACE_Shapes_Graphics, "null", static_cast< RefCountPtr< const Lang::Geometric2D > >( Lang::THE_NULL2D ) );
208 env->initDefine( Lang::THE_NAMESPACE_Shapes_Graphics3D, "null", static_cast< RefCountPtr< const Lang::Geometric3D > >( Lang::THE_NULL3D ) );
209 env->initDefine( Lang::THE_NAMESPACE_Shapes, "nullbind", Lang::THE_NULL_DYNAMIC_BINDINGS );
210 env->initDefine( Lang::THE_NAMESPACE_Shapes_Geometry, "emptypath", Lang::THE_EMPTYPATH2D );
211 env->initDefine( Lang::THE_NAMESPACE_Shapes_Geometry3D, "emptypath", Lang::THE_EMPTYPATH3D );
212 env->initDefine( Lang::THE_NAMESPACE_Shapes_Graphics, "pointpicture", static_cast< RefCountPtr< const Lang::Geometric2D > >( Lang::THE_POINTPICTURE ) );
213 env->initDefine( Lang::THE_NAMESPACE_Shapes_Traits, "NO_MASK", Lang::THE_NONE_MASK );
215 env->initDefine( Lang::THE_NAMESPACE_Shapes_Geometry, "arcdelta", static_cast< RefCountPtr< const Lang::Length > >( new Lang::Length( Computation::the_arcdelta ) ) );
217 env->initDefineCoreFunction( Lang::THE_NO_ARROW );
218 env->initDefineCoreFunction( Lang::THE_IDENTITY );
220 env->initDefineCoreFunction( Ast::THE_FUNCTION_coords2D );
221 env->initDefineCoreFunction( Ast::THE_FUNCTION_cornercoords2D );
222 env->initDefineCoreFunction( Ast::THE_FUNCTION_coords3D );
223 env->initDefineCoreFunction( Ast::THE_FUNCTION_TeX );
224 env->initDefineCoreFunction( Ast::THE_FUNCTION_fcons );