1 // Contains declarations for core plplot data structures. This file 2 // should be included only by plcore.c. 3 // 4 // Copyright (C) 2004 Andrew Roach 5 // Copyright (C) 2005 Thomas J. Duck 6 // 7 // This file is part of PLplot. 8 // 9 // PLplot is free software; you can redistribute it and/or modify 10 // it under the terms of the GNU Library General Public License as published 11 // by the Free Software Foundation; either version 2 of the License, or 12 // (at your option) any later version. 13 // 14 // PLplot is distributed in the hope that it will be useful, 15 // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU Library General Public License for more details. 18 // 19 // You should have received a copy of the GNU Library General Public License 20 // along with PLplot; if not, write to the Free Software 21 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 // 23 // 24 25 #ifndef __PLCORE_H__ 26 #define __PLCORE_H__ 27 28 #include "plplotP.h" 29 #include "drivers.h" 30 #include "plDevs.h" 31 #include "disptab.h" 32 33 #ifdef ENABLE_DYNDRIVERS 34 #ifndef LTDL_WIN32 35 #include <ltdl.h> 36 #else 37 #include "ltdl_win32.h" 38 #endif 39 typedef lt_ptr ( *PLDispatchInit )( PLDispatchTable *pdt ); 40 #else 41 typedef void ( *PLDispatchInit )( PLDispatchTable *pdt ); 42 #endif 43 44 #ifdef HAVE_LIBUNICODE 45 #include <unicode.h> 46 #endif 47 48 49 // Static function prototypes 50 51 static const char *utf8_to_ucs4( const char *ptr, PLUNICODE *unichar ); 52 static void grline( short *, short *, PLINT ); 53 static void grpolyline( short *, short *, PLINT ); 54 static void grfill( short *, short *, PLINT ); 55 static void grgradient( short *, short *, PLINT ); 56 static void plSelectDev( void ); 57 static void pldi_ini( void ); 58 static void calc_diplt( void ); 59 static void calc_didev( void ); 60 static void calc_diori( void ); 61 static void calc_dimap( void ); 62 static void plgdevlst( const char **, const char **, int *, int ); 63 64 static void plInitDispatchTable( void ); 65 66 static void plLoadDriver( void ); 67 68 // Static variables 69 70 static PLINT xscl[PL_MAXPOLY], yscl[PL_MAXPOLY]; 71 72 static PLINT initfont = 1; // initial font: extended by default 73 74 static PLINT lib_initialized = 0; 75 76 //-------------------------------------------------------------------------- 77 // Allocate a PLStream data structure (defined in plstrm.h). 78 // 79 // This struct contains a copy of every variable that is stream dependent. 80 // Only the first [index=0] stream is statically allocated; the rest 81 // are dynamically allocated when you switch streams (yes, it is legal 82 // to only initialize the first element of the array of pointers). 83 //-------------------------------------------------------------------------- 84 85 static PLStream pls0; // preallocated stream 86 static PLINT ipls; // current stream number 87 88 static PLStream *pls[PL_NSTREAMS] = { &pls0 }; // Array of stream pointers 89 90 // Current stream pointer. Global, for easier access to state info 91 92 PLDLLIMPEXP_DATA( PLStream ) * plsc = &pls0; 93 94 // Only now can we include this 95 96 #include "pldebug.h" 97 98 //-------------------------------------------------------------------------- 99 // Initialize dispatch table. 100 // 101 // Each device is selected by the appropriate define, passed in from the 102 // makefile. When installing plplot you may wish to exclude devices not 103 // present on your system in order to reduce screen clutter. 104 // 105 // If you hit a <CR> in response to the plinit() prompt, you get the FIRST 106 // one active below, so arrange them accordingly for your system (i.e. all 107 // the system-specific ones should go first, since they won't appear on 108 // most systems.) 109 //-------------------------------------------------------------------------- 110 111 static PLDispatchTable **dispatch_table = 0; 112 static int npldrivers = 0; 113 114 static PLDispatchInit static_device_initializers[] = { 115 // Same order (by source filename and by device) as in drivers.h. 116 // ps and psttf are special cases where two devices are handled with 117 // one PLD macro. 118 // xwin is special case where the macro name is PLD_xwin but the 119 // function name in drivers.h is plD_dispatch_init_xw 120 121 #if defined ( PLD_aqt ) && !defined ( ENABLE_DYNDRIVERS ) 122 plD_dispatch_init_aqt, 123 #endif 124 #if defined ( PLD_epscairo ) && !defined ( ENABLE_DYNDRIVERS ) 125 plD_dispatch_init_epscairo, 126 #endif 127 #if defined ( PLD_extcairo ) && !defined ( ENABLE_DYNDRIVERS ) 128 plD_dispatch_init_extcairo, 129 #endif 130 #if defined ( PLD_memcairo ) && !defined ( ENABLE_DYNDRIVERS ) 131 plD_dispatch_init_memcairo, 132 #endif 133 #if defined ( PLD_pdfcairo ) && !defined ( ENABLE_DYNDRIVERS ) 134 plD_dispatch_init_pdfcairo, 135 #endif 136 #if defined ( PLD_pngcairo ) && !defined ( ENABLE_DYNDRIVERS ) 137 plD_dispatch_init_pngcairo, 138 #endif 139 #if defined ( PLD_pscairo ) && !defined ( ENABLE_DYNDRIVERS ) 140 plD_dispatch_init_pscairo, 141 #endif 142 #if defined ( PLD_svgcairo ) && !defined ( ENABLE_DYNDRIVERS ) 143 plD_dispatch_init_svgcairo, 144 #endif 145 #if defined ( PLD_wincairo ) && !defined ( ENABLE_DYNDRIVERS ) 146 plD_dispatch_init_wincairo, 147 #endif 148 #if defined ( PLD_xcairo ) && !defined ( ENABLE_DYNDRIVERS ) 149 plD_dispatch_init_xcairo, 150 #endif 151 #if defined ( PLD_cgm ) && !defined ( ENABLE_DYNDRIVERS ) 152 plD_dispatch_init_cgm, 153 #endif 154 #if defined ( PLD_gif ) && !defined ( ENABLE_DYNDRIVERS ) 155 plD_dispatch_init_gif, 156 #endif 157 #if defined ( PLD_jpeg ) && !defined ( ENABLE_DYNDRIVERS ) 158 plD_dispatch_init_jpeg, 159 #endif 160 #if defined ( PLD_png ) && !defined ( ENABLE_DYNDRIVERS ) 161 plD_dispatch_init_png, 162 #endif 163 #if defined ( PLD_mem ) && !defined ( ENABLE_DYNDRIVERS ) 164 plD_dispatch_init_mem, 165 #endif 166 #if defined ( PLD_ntk ) && !defined ( ENABLE_DYNDRIVERS ) 167 plD_dispatch_init_ntk, 168 #endif 169 #if defined ( PLD_null ) && !defined ( ENABLE_DYNDRIVERS ) 170 plD_dispatch_init_null, 171 #endif 172 #if defined ( PLD_pdf ) && !defined ( ENABLE_DYNDRIVERS ) 173 plD_dispatch_init_pdf, 174 #endif 175 #if defined ( PLD_plm ) && !defined ( ENABLE_DYNDRIVERS ) 176 plD_dispatch_init_plm, 177 #endif 178 #if defined ( PLD_ps ) && !defined ( ENABLE_DYNDRIVERS ) 179 plD_dispatch_init_ps, 180 #endif 181 #if defined ( PLD_psc ) && !defined ( ENABLE_DYNDRIVERS ) 182 plD_dispatch_init_psc, 183 #endif 184 #if defined ( PLD_pstex ) && !defined ( ENABLE_DYNDRIVERS ) 185 plD_dispatch_init_pstex, 186 #endif 187 #if defined ( PLD_psttf ) && !defined ( ENABLE_DYNDRIVERS ) 188 plD_dispatch_init_psttf, 189 #endif 190 #if defined ( PLD_psttfc ) && !defined ( ENABLE_DYNDRIVERS ) 191 plD_dispatch_init_psttfc, 192 #endif 193 #if defined ( PLD_bmpqt ) && !defined ( ENABLE_DYNDRIVERS ) 194 plD_dispatch_init_bmpqt, 195 #endif 196 #if defined ( PLD_epsqt ) && !defined ( ENABLE_DYNDRIVERS ) 197 plD_dispatch_init_epsqt, 198 #endif 199 #if defined ( PLD_extqt ) && !defined ( ENABLE_DYNDRIVERS ) 200 plD_dispatch_init_extqt, 201 #endif 202 #if defined ( PLD_jpgqt ) && !defined ( ENABLE_DYNDRIVERS ) 203 plD_dispatch_init_jpgqt, 204 #endif 205 #if defined ( PLD_memqt ) && !defined ( ENABLE_DYNDRIVERS ) 206 plD_dispatch_init_memqt, 207 #endif 208 #if defined ( PLD_pdfqt ) && !defined ( ENABLE_DYNDRIVERS ) 209 plD_dispatch_init_pdfqt, 210 #endif 211 #if defined ( PLD_pngqt ) && !defined ( ENABLE_DYNDRIVERS ) 212 plD_dispatch_init_pngqt, 213 #endif 214 #if defined ( PLD_ppmqt ) && !defined ( ENABLE_DYNDRIVERS ) 215 plD_dispatch_init_ppmqt, 216 #endif 217 #if defined ( PLD_qtwidget ) && !defined ( ENABLE_DYNDRIVERS ) 218 plD_dispatch_init_qtwidget, 219 #endif 220 #if defined ( PLD_svgqt ) && !defined ( ENABLE_DYNDRIVERS ) 221 plD_dispatch_init_svgqt, 222 #endif 223 #if defined ( PLD_tiffqt ) && !defined ( ENABLE_DYNDRIVERS ) 224 plD_dispatch_init_tiffqt, 225 #endif 226 #if defined ( PLD_svg ) && !defined ( ENABLE_DYNDRIVERS ) 227 plD_dispatch_init_svg, 228 #endif 229 #if defined ( PLD_tk ) && !defined ( ENABLE_DYNDRIVERS ) 230 plD_dispatch_init_tk, 231 #endif 232 #if defined ( PLD_tkwin ) && !defined ( ENABLE_DYNDRIVERS ) 233 plD_dispatch_init_tkwin, 234 #endif 235 #if defined ( PLD_wingcc ) && !defined ( ENABLE_DYNDRIVERS ) 236 plD_dispatch_init_wingcc, 237 #endif 238 #if defined ( PLD_wxpng ) && !defined ( ENABLE_DYNDRIVERS ) 239 plD_dispatch_init_wxpng, 240 #endif 241 #if defined ( PLD_wxwidgets ) && !defined ( ENABLE_DYNDRIVERS ) 242 plD_dispatch_init_wxwidgets, 243 #endif 244 #if defined ( PLD_xfig ) && !defined ( ENABLE_DYNDRIVERS ) 245 plD_dispatch_init_xfig, 246 #endif 247 #if defined ( PLD_xwin ) && !defined ( ENABLE_DYNDRIVERS ) 248 plD_dispatch_init_xw, 249 #endif 250 #if defined ( PLD_wingdi ) && !defined ( ENABLE_DYNDRIVERS ) 251 plD_dispatch_init_wingdi, 252 #endif 253 NULL 254 }; 255 256 static int nplstaticdevices = ( sizeof ( static_device_initializers ) / 257 sizeof ( PLDispatchInit ) ) - 1; 258 static int npldynamicdevices = 0; 259 260 //-------------------------------------------------------------------------- 261 // Stuff to support the loadable device drivers. 262 //-------------------------------------------------------------------------- 263 264 #ifdef ENABLE_DYNDRIVERS 265 typedef struct 266 { 267 char *devnam; 268 char *description; 269 char *drvnam; 270 char *tag; 271 int drvidx; 272 } PLLoadableDevice; 273 274 typedef struct 275 { 276 char *drvnam; 277 lt_dlhandle dlhand; 278 } PLLoadableDriver; 279 280 static PLLoadableDevice *loadable_device_list; 281 static PLLoadableDriver *loadable_driver_list; 282 283 static int nloadabledrivers = 0; 284 285 #endif 286 287 #endif // __PLCORE_H__ 288