This file is indexed.

/usr/include/plplot/plstrm.h is in libplplot-dev 5.10.0+dfsg-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
// $Id: plstrm.h 12288 2013-01-30 04:40:35Z airwin $
//
//	Contains declarations for PLStream and PLDev structs.
//	Also prototypes for stream & device utility functions.
//
//  Copyright (C) 2004  Andrew Ross
//  Copyright (C) 2004  Andrew Roach
//
//  This file is part of PLplot.
//
//  PLplot is free software; you can redistribute it and/or modify
//  it under the terms of the GNU Library General Public License as published
//  by the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.
//
//  PLplot 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 Library General Public License for more details.
//
//  You should have received a copy of the GNU Library General Public License
//  along with PLplot; if not, write to the Free Software
//  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//

#include "pdf.h"

#ifndef __PLSTRM_H__
#define __PLSTRM_H__

#include "disptab.h"
#include "pldll.h"
#include "qsastime.h"

//--------------------------------------------------------------------------
// Define the PLDev data structure.
//
// These are all quantities that must be saved on a per-device basis.
// Some drivers (xwin, tk) allocate structures defined internally.
//--------------------------------------------------------------------------

typedef struct
{
    PLFLT pxlx, pxly;
    PLINT xold, yold;

    PLINT xmin, xmax, xlen;
    PLINT ymin, ymax, ylen;

    PLINT xmin_dev, xmax_dev, xlen_dev;
    PLINT ymin_dev, ymax_dev, ylen_dev;

    PLFLT xscale_dev, yscale_dev;
} PLDev;

//--------------------------------------------------------------------------
// Define the PLStream data structure.
//
// This contains a copy of every variable that is stream dependent, which
// tends to be those which are settable by the user and persist for longer
// than one plot.
//
// Only those quantities listed in the PLStream struct will be preserved
// for an individual stream.  Note that the lack of every plplot constant
// means that one should only switch streams at a fairly high level, i.e.
// on the scale of an entire plot.  Otherwise intermediate quantities
// will be confused between the streams, possibly resulting in garbage plots.
// This structure may be expanded in time to improve intra-stream independence,
// but it is doubtful streams will ever be fully independent (perhaps
// neither necessary nor desirable? -- time will tell).
//
// There are undoubtably some inconsistencies in the declaration & use of
// the variables below.  This is a result of the continuing evolution of
// plplot and the numerous authors involved.  Hopefully in time the function
// of all variables can be fully documented and made more consistent.
//
// The quantities in each stream are as follows:
//
//--------------------------------------------------------------------------
//
// Misc control variables
//
// ipls		PLINT	Stream number
// level	PLINT	Initialization level
// program	char*	Program name
// verbose	PLINT	Be more verbose than usual
// debug	PLINT	Generate debugging output
// initialized	PLINT	Set if the stream has been initialized
// dev_initialized PLINT Set if the device driver has been loaded
// stream_closed PLBOOL  Set if the stream was closed or if there
//                       was some sort of error
//
//--------------------------------------------------------------------------
//
// Palettes (two of them)
//
// Color map 0 is intended for static objects, such as boxes, lines, points,
// labels, etc.  These should be allocated before calling plinit (else you
// get 16 by default, which can be undesirable on some platforms).  These
// are then explicitly selected by number (in order of allocation).  The
// lowest number is 0, but this is used for the background color, so all
// color drivers start with 1 as the default color.
//
// Color map 1 is for continuous-tone plots, where color is used to
// represent function value or intensity.  These are set in a relative way
// only, for increased portability and flexibility.  The actual number of
// colors used to represent intensity levels is determined by the driver.
// Note that it is only necessary to specify intensity (on a scale from 0
// to 1) to get an appropriate color.  Drivers incapable of fine shading
// will do the best job they can.
//
// A palette selection tool for both palettes is available for the Tk
// driver.  Direct writing of RGB values (i.e.  banging on the hardware) is
// supported but highly discouraged (colors so written will be affected
// unpredictably by the palette tools).
//
// icol0	PLINT	Color map 0 entry, current color (0 <= icol0 <= ncol0)
// ncol0	PLINT	Number of colors allocated in color map 0.
// icol1	PLINT	Color map 1 entry, current color (0 <= icol1 <= ncol1)
// ncol1	PLINT	Number of colors allocated in color map 1.
// ncol1cp	PLINT	Number of control points in cmap1 allocation (max PL_MAX_CMAP1CP)
// lcol1cp	PLFLT	Locations of control points in cmap1 [0,1]
// curcmap	PLINT	Current color map
// curcolor	RGB[]	Current color
// tmpcolor	RGB[]	Temporary color storage
// cmap0        RGB[]	Color map 0: maximum of ncol0 RGB 8-bit values
// cmap1        RGB[]	Color map 1: maximum of ncol1 RGB 8-bit values
// cmap1_min    PLFLT   Minimum color map 1 color to use in continuous tone plots
// cmap1_max    PLFLT   Maximum color map 1 color to use in continuous tone plots
//
//--------------------------------------------------------------------------
//
// Variables governing pen width
//
// width	Current pen width
// widthset	Set if pen width was specified
// widthlock	Set if pen width is locked
//
//--------------------------------------------------------------------------
//
// Variables governing arrow type
//
// arrow_x      x coordinates of points in arrow
// arrow_y      y coordinates of points in arrow
// arrow_npts   number of points in arrow_x, arrow_y
// arrow_fill   whether the arrow should be filled or not
//
//--------------------------------------------------------------------------
//
// Variables used to pass information between the core and the driver
//
// It would be nice to use the "dev_" prefix uniformly but changing
// all that old code would be quite a lot of work..
//
// device	PLINT	Graphics device id number
// dev_minor	PLINT	Minor device id (for variations on one type)
// color	PLINT	Set if color is available
// colorset	PLINT	Set if "color" was set prior to calling plinit
// plbuf_read	PLINT	Set during a plot buffer redraw
// plbuf_write	PLINT	Set if driver needs to use the plot buffer
// dev_fill0	PLINT	Set if driver can do solid area fills
// dev_gradient	PLINT	Set if driver can do (linear) gradients
// dev_text	PLINT	Set if driver want to do it's only text drawing
// dev_unicode	PLINT	Set if driver wants unicode
// dev_hrshsym	PLINT	Set for Hershey symbols to be used
// dev_fill1	PLINT	Set if driver can do pattern area fills
// dev_dash     PLINT   Set if driver can do dashed lines
// dev_di	PLINT	Set if driver wants to handle DI commands
// dev_flush	PLINT	Set if driver wants to handle flushes itself
// dev_swin	PLINT	Set if driver wants to handle 'set window' commands
// dev_fastimg  PLINT   Set if driver has fast image drawing capabilities
// dev_xor      PLINT   Set if driver supports xor mode.
// dev_clear    PLINT   Set if driver support clear.
// termin	PLINT	Set for interactive devices
// graphx	PLINT	Set if currently in graphics mode
// nopause	PLINT	Set if we are skipping the pause between frames
// family	PLINT	Set if familying is enabled
// member	PLINT	Number of current family member file open
// finc		PLINT	Number to increment between member files
// fflen	PLINT	Minimum field length to use in member file number
// bytemax	PLINT	Number of bytes maximum per member file
// famadv	PLINT	Set to advance to the next family member
// DevName	char*	Device name
// OutFile	FILE	Output file pointer
// BaseName	char*	Output base name (i.e. family)
// FileName	char*	Output file name
// output_type	int	0 for file, 1 for stream
// bytecnt	PLINT	Byte count for output stream
// page		PLINT	Page count for output stream
// linepos	PLINT	Line count for output stream
// pdfs		PDFstrm* PDF stream pointer
// dev_mem_alpha     PLINT  The user supplied memory buffer supports alpha values
// has_string_length PLINT  The driver can calculate the lengths of strings
// string_length     PLFLT  Set to the length of the current string (in mm) by the driver
// get_string_length PLINT  Tells the driver to calculate the length of the string
//                             but not to render it.
//
// These are used by the escape function (for area fill, etc).
//
// dev_npts	PLINT	Number of points we are plotting
// dev_x	short*	Pointer to array of x values
// dev_y	short*	Pointer to array of x values
// For the case where the boundary of the filled region is
// self-intersecting, use the even-odd fill rule rather than the
// default nonzero fill rule.
// dev_eofill   PLINT
//
// For images
// dev_nptsX	PLINT	Number of points we are plotting in X
// dev_nptsY	PLINT	Number of points we are plotting in Y
// dev_z	ushort*	Pointer to array of z values for the color
// dev_zmin,
// dev_zmax     ushort  Min and max values of z to plot
//
// The following pointer is for drivers that require device-specific
// data.  At initialization the driver should malloc the necessary
// space and set pls->dev to point to this area.  This way there can
// be multiple streams using the same driver without conflict.
//
// dev		void*	pointer to device-specific data (malloc'ed)
//
// User-supplied event handlers for use by interactive drivers (e.g. X).
// Can be used to take various actions depending on input.  Currently
// only a keyboard event handler is supported.
//
// KeyEH	void*	Keyboard event handler
// KeyEH_data	void*	Pointer to client data to pass
//
// ButtonEH	void*	(Mouse) Button event handler
// ButtonEH_data void*	Pointer to client data to pass
//
// bop_handler	void*	bop handler
// bop_data	void*	Pointer to client data to pass
//
// eop_handler	void*	eop handler
// eop_data	void*	Pointer to client data to pass
//
// Variables used for direct specification of device characteristics
// Not supported by all drivers (or even very many)
//
// xdpi..	PLFLT	Device DPI settings in x and y
// xlength..	PLINT	Device output lengths in x and y
// xoffset..	PLINT	Device offsets from upper left hand corner
// pageset	PLINT	Set if page dimensions were specified
// hack		PLINT	Enables driver-specific hack(s) if set
//
//--------------------------------------------------------------------------
//
// User customization tidy routine.  This is called before closing a stream
// to do any program specific cleanup.
//
// tidy		void*   pointer to cleanup routine
// tidy_data	void*   pointer to client data to pass
//
//--------------------------------------------------------------------------
//
// User error control variables.  Pass in a pointer for either to be set
// in exceptional conditions.  The caller is responsible for clearing the
// error code.
//
// errcode	PLINT*	pointer to variable to assign error code
// errmsg	char*	pointer to error message buffer (must be >= 160 bytes)
//
//--------------------------------------------------------------------------
//
// Stuff used by Xlib driver
//
// geometry	char*	Window geometry (malloc'ed)
// window_id	long	X-window window ID
// nopixmap	int	Set if you want to forbid allocation of pixmaps
// db		int	Set if you want to double buffer output
//			(only pixmap is drawn to directly; it is blitted
//			to output window on EOP or an Expose)
// ext_resize_draw int  Set if you want to control the redraw caused by a
//                      window resize by an external agent.
//--------------------------------------------------------------------------
//
// These are for support of the TK driver.
//
// server_name	char*	Main window name of server
// server_host	char*	Name of host to run server on
// server_port	char*	Port to talk to server on
// user		char*	Your user name on remote host (for remsh command)
// plserver	char*	Name of server
// plwindow	char*	Name of reference server window (malloc'ed)
// tk_file	char*   File for plserver use with its -file option
// auto_path	char*	Additional directories to autoload
// bufmax	int	Number of bytes sent before output buffer is flushed
// dp		int	Use Tcl-DP for communication, if set
// server_nokill int	Don't kill plserver on a ^C if set
//
//--------------------------------------------------------------------------
//
// Variables for use by the plot buffer
//
// For BUFFERED_FILE
// plbufFile	FILE	Plot buffer file pointer
//
// For Memory Buffer (default)
// plbuf_buffer_grow	size_t		Memory buffer growth step
// plbuf_buffer_size	size_t		Current size of memory buffer
// plbuf_buffer			void *		Pointer to memory buffer
// plbuf_top			size_t		Offset to the top of used area/start of free area
// plbuf_readpos		size_t		Offset to current position being read
//
// plbufOwner	int	Typically set; only zero if current stream is cloned.
//
//--------------------------------------------------------------------------
//
// Driver interface (DI)
//
// difilt	PLINT	Driver interface filter flag
//
// dipxmin	PLFLT
// dipymin	PLFLT	Min, max relative plot coordinates
// dipxmax	PLFLT
// dipymax	PLFLT
// dipxax       PLFLT	Plot window transformation:
// dipxb        PLFLT	  x' = dipxax * x + dipxb
// dipyay       PLFLT
// dipyb        PLFLT	  y' = dipyay * y + dipyb
//
// aspdev	PLFLT	Original device aspect ratio
// aspect	PLFLT	Page aspect ratio
// aspori	PLFLT	Rotation-induced aspect ratio
// caspfactor	PLFLT	Factor applied to preserve character aspect ratio
// freeaspect	PLINT	Allow aspect ratio to adjust to orientation swaps
//                      when overall aspect ratio is changed.
// portrait	PLINT	Portrait mode (orientation and aspect ratio)
// mar		PLFLT	Page margin (minimum)
// jx		PLFLT	Page justification in x
// jy		PLFLT	Page justification in y
//
// didxax       PLFLT	Device window transformation:
// didxb        PLFLT	  x' = didxax * x + didxb
// didyay       PLFLT
// didyb        PLFLT	  y' = didyay * y + didyb
//
// diclpxmi	PLINT
// diclpxma	PLINT	Device clip limits
// diclpymi	PLINT
// diclpyma	PLINT
//
// diorot	PLFLT	Rotation angle (in units of pi/2)
// dioxax	PLFLT	Orientation transformation:
// dioxay	PLFLT	  x' = dioxax * x + dioxay * y + dioxb
// dioxb        PLFLT
// dioyax	PLFLT	  y' = dioyax * x + dioyay * y + dioyb
// dioyay	PLFLT
// dioyb        PLFLT
//
// dimxmin	PLFLT
// dimymin	PLFLT	Target coordinate system parameters.
// dimxmax	PLFLT
// dimymax	PLFLT
// dimxpmm	PLFLT
// dimypmm	PLFLT
// dimxax       PLFLT	Map meta to physical coordinates:
// dimxb        PLFLT	  x' = dimxax * x + dimxb
// dimyay       PLFLT
// dimyb        PLFLT	  y' = dimyay * y + dimyb
//
// page_status	PLINT	Flag to indicate current action
//
//--------------------------------------------------------------------------
//
// Fill pattern state information.
// patt < 0: Hardware fill, if available (not implemented yet)
// patt ==0: Hardware fill, if available, solid
// patt > 0: Software fill
//
// patt		Fill pattern number
// inclin	Array of inclinations in tenths of degree for fill lines
// delta	Array of spacings in micrometers between fill lines
// nps		Number of distinct line styles for fills
//
//--------------------------------------------------------------------------
//
// Variables used in line drawing
//
// currx	Physical x-coordinate of current point
// curry	Physical y-coordinate of current point
// line_style	index of last call to pllsty
// mark		Array of mark lengths in micrometers for broken lines
// space	Array of space lengths in micrometers for broken lines
// nms		Number of elements for current broken line style
// timecnt	Timer for broken lines
// alarm	Alarm indicating change of broken line status
// pendn	Flag indicating if pen is up or down
// curel	Current element within broken line
//
//--------------------------------------------------------------------------
//
// Variables governing character strings
//
// esc		Text string escape character
//
//--------------------------------------------------------------------------
//
// Scale factors for characters, symbols, and tick marks.
//
// scale	Scaling factor for chr, sym, maj, min.
// chr...	Character default height and current (scaled) height
// sym...	Symbol    default height and current (scaled) height
// maj...	Major tick default height and current (scaled) height
// min...	Minor tick default height and current (scaled) height
//
//--------------------------------------------------------------------------
//
// Variables governing numeric axis label appearance
//
// setpre	Non-zero to set precision using "prec"
// precis	User-specified precision
// xdigmax..	Allowed #digits in axes labels
// xdigits..	Actual field widths (returned)
// timefmt      Format string (for strftime)
//
//--------------------------------------------------------------------------
//
// Variables governing physical coordinate system
//
// vpp..	Viewport boundaries in physical coordinates
// spp..	Subpage  boundaries in physical coordinates
// clp..	Clip     boundaries in physical coordinates
// phy...	Physical device limits in physical coordinates
// um.		Number of micrometers in a pixel
// pmm		Number of pixels to a millimeter
//
//--------------------------------------------------------------------------
//
// State variables for 3d plots
//
// base3.	World coordinate size of base for 3-d plot
// basec.	Position of centre of base for 3-d plot
// dom...	Minimum and maximum values for domain
// zzscl	Vertical (z) scale for 3-d plot
// ran..	Minimum and maximum z values for 3-d plot
// c..		Coordinate transformation from 3-d to 2-d
//
//--------------------------------------------------------------------------
//
// Variables for keeping track of world coordinate windows on a page.
//
// nCWindows	Number of coordinate windows on current page
// windows	Array of plCWindow's for current page
//
//--------------------------------------------------------------------------
//
// Variables governing subpages and viewports.
//
// nsub...	Number of subpages on physical device
// cursub	Current subpage
// spd...	Subpage  boundaries in normalized device coordinates
// vpd...	Viewport boundaries in normalized device coordinates
// vpw...	Viewport boundaries in world coordinates
//
//--------------------------------------------------------------------------
//
// Transformation variables
//
// wp....	Transformation variables for world  to physical conversion
// wm....	Transformation variables for world coordinates to mm
//
//--------------------------------------------------------------------------
//
// Other variables
//
// dev_compression Compression level for supporting devices
//
//--------------------------------------------------------------------------
//
// Font related variables
//
// cfont           Current font number, replaces global 'font' in plsym.c
//                 This can be latter extended for font shape, series, family and size
// fci             FCI (font characterization integer)
// An FCI is sometimes inserted in the middle of a stream of
// unicode glyph indices.  Thus to distinguish it from those, the FCI is marked
// by 0x8 in the most significant 4 bits.  The remaining 7 hex digits
// stored in the 32-bit integer characterize 7 different font attributes.
// The font attributes are interpreted as follows:
// hexdigit =>                    0        1          2        3       4        5
// hexpower   Font attribute               Possible attribute values
//    0       font-family     sans-serif  serif    monospace  script  symbol |fantasy
//    1       font-style        upright   italic    oblique |
//    2       font-weight       medium     bold  |   bolder    light  lighter
//    3       font-variant      normal | small caps
//
// Everything to the right of the vertical bars is not implemented and is
// subject to change.  The four font attributes (font-family, font-style,
// font-weight, and font-variant are stored in the FCI in the order of
// hexpower, the left shift that is applied to the hex digit to place the
// hexdigit in the FCI.  The hexpower = 3 position is essentially undefined
// since there is currently only one hexdigit (0) defined, and similarly
// for hexpower = 4-6 so there is room for expansion of this scheme into more
// font attributes if required.  (hexpower = 7 is reserved for the 0x8 marker
// of the FCI.)
//
//--------------------------------------------------------------------------
//
// Time related variable
//
// qsasconfig is a pointer to a struct that keeps track of the details
// of the transformation between broken-down and continuous time used
// in the qsastime library.
//
//--------------------------------------------------------------------------
//
// Variables used in plgradient software fallback to communicate the polygon
// to the gradient_define callback used by plshades.
//
// n_polygon       Number of vertex points in the polygon defining the
//                 boundary of the gradient.
// x_polygon       Pointer to array of x vertex points in the polygon
//                 defining the boundary of the gradient.
// y_polygon       Pointer to array of y vertex points in the polygon
//                 defining the boundary of the gradient.
//--------------------------------------------------------------------------
//
// Variables used to store gradient information for device drivers.
//
// xgradient       Pointer to array of x coordinates of gradient vector.
// ygradient       Pointer to array of y coordinates of gradient vector.
// ngradient       Number of points (two) in gradient vector.
//--------------------------------------------------------------------------

#define PL_MAX_CMAP1CP    256

typedef struct
{
// Misc control information

    PLINT ipls, level, verbose, debug, initialized, dev_initialized;
    //CONSTANT SOVERSION FIX
    //    PLBOOL     stream_closed;
    char  *program;

// Plot-wide coordinate transform

    void ( *coordinate_transform )( PLFLT, PLFLT, PLFLT*, PLFLT*, PLPointer );
    PLPointer coordinate_transform_data;

// Colormaps

    PLINT       icol0, ncol0, icol1, ncol1, ncp1, curcmap;

    PLFLT       cmap1_min, cmap1_max;

    PLColor     curcolor, tmpcolor;
    PLColor     *cmap0;
    PLColor     *cmap1;

    PLControlPt cmap1cp[PL_MAX_CMAP1CP];

// Variables governing pen width

    PLFLT width;
    PLINT widthset, widthlock;

// Variables governing arrow
    PLFLT *arrow_x;
    PLFLT *arrow_y;
    PLINT arrow_npts;
    PLINT arrow_fill;

// Driver dispatch table, obsoletes "device" member below.

    PLDispatchTable *dispatch_table;

// Variables used for interacting with or by device driver

    PLINT   plbuf_read, plbuf_write;
    PLINT   device, dev_minor, termin, graphx, nopause;
    PLINT   color, colorset;
    PLINT   family, member, finc, fflen, bytemax, famadv;
    PLINT   dev_fill0, dev_fill1, dev_dash, dev_di, dev_flush, dev_swin;
    PLINT   dev_text, dev_xor, dev_clear, dev_fastimg, dev_arc;

    char    DevName[80];
    FILE    *OutFile;
    char    *BaseName, *FileName;
    int     output_type;
    PLINT   bytecnt, page, linepos;
    PDFstrm *pdfs;

    PLINT   dev_npts;
    short   *dev_x, *dev_y;

    // variables for plimage()

    PLINT          dev_nptsX, dev_nptsY;
    short          *dev_ix, *dev_iy;
    unsigned short *dev_z;
    unsigned short dev_zmin, dev_zmax;
    PLINT          imclxmin, imclxmax, imclymin, imclymax;

    // end of variables for plimage()

    void *dev;

    void ( *KeyEH )( PLGraphicsIn *gin, void *KeyEH_data,
                     int *exit_eventloop );
    void *KeyEH_data;

    void ( *ButtonEH )( PLGraphicsIn *gin, void *ButtonEH_data,
                        int *exit_eventloop );
    void *ButtonEH_data;

    void ( *LocateEH )( PLGraphicsIn *gin, void *LocateEH_data,
                        int *locate_mode );
    void  *LocateEH_data;

    void ( *bop_handler )( void *bop_data, int *skip_driver_bop );
    void  *bop_data;

    void ( *eop_handler )( void *eop_data, int *skip_driver_eop );
    void  *eop_data;

    PLFLT xdpi, ydpi;
    PLINT xlength, ylength;
    PLINT xoffset, yoffset;
    PLINT pageset, hack;

// Per stream tidy function.

    void ( *tidy )( void * );
    void *tidy_data;

// Error info

    PLINT *errcode;
    char  *errmsg;

// Stuff used by Xlib driver

    char *geometry;
    long window_id;
    int  nopixmap, db, ext_resize_draw;

// Stuff used by TK, DP drivers

    char *server_name, *server_host, *server_port, *user;
    char *plserver, *plwindow;
    char *auto_path;
    char *tk_file;  // plserver -file option
    int  bufmax, dp, server_nokill;

// Plot buffer settings

#ifdef BUFFERED_FILE
    FILE   *plbufFile;
#else
    size_t plbuf_buffer_grow;
    size_t plbuf_buffer_size;
    void   *plbuf_buffer;
    size_t plbuf_top;
    size_t plbuf_readpos;
#endif
    int    plbufOwner;

// Driver interface (DI)

    PLINT difilt, diclpxmi, diclpxma, diclpymi, diclpyma;
    PLFLT dipxmin, dipymin, dipxmax, dipymax;
    PLFLT dipxax, dipxb, dipyay, dipyb;
    PLFLT aspdev, aspect, aspori, caspfactor, mar, jx, jy;
    PLFLT didxax, didxb, didyay, didyb;
    PLFLT diorot;
    PLFLT dioxax, dioxay, dioxb, dioyax, dioyay, dioyb;
    PLFLT dimxax, dimxb, dimyay, dimyb;
    PLFLT dimxmin, dimymin, dimxmax, dimymax, dimxpmm, dimypmm;
    PLINT page_status, freeaspect, portrait;

// Fill pattern info

    PLINT patt, inclin[2], delta[2], nps;

// Variables used in line drawing

    PLINT currx, curry;
    //CONSTANT SOVERSION FIX
    //PLINT line_style;
    PLINT mark[10], space[10], nms;
    PLINT timecnt, alarm, pendn, curel;

// Variables governing character strings

    char esc;

// Scale factors for characters, symbols, and tick marks.

    PLFLT scale;
    PLFLT chrdef, chrht;
    PLFLT symdef, symht;
    PLFLT majdef, majht;
    PLFLT mindef, minht;

// Variables governing numeric axis label appearance

    PLINT     setpre, precis;
    PLINT     xdigmax, ydigmax, zdigmax;
    PLINT     xdigits, ydigits, zdigits;
    char      *timefmt;
    void ( *label_func )( PLINT, PLFLT, char *, PLINT, PLPointer );
    PLPointer label_data;

// Variables governing physical coordinate system

    PLINT vppxmi, vppxma, vppymi, vppyma;
    PLINT sppxmi, sppxma, sppymi, sppyma;
    PLINT clpxmi, clpxma, clpymi, clpyma;
    PLINT phyxmi, phyxma, phyxlen, phyymi, phyyma, phyylen;
    PLINT umx, umy;
    PLFLT xpmm, ypmm;

// State variables for 3d plots

    PLFLT base3x, base3y, basecx, basecy;
    PLFLT domxmi, domxma, domymi, domyma;
    PLFLT zzscl, ranmi, ranma;
    PLFLT cxx, cxy, cyx, cyy, cyz, czx, czy, czz;

// Variables for keeping track of windows on a page.

    int      nplwin;
    PLWindow plwin[PL_MAXWINDOWS];

// Variables governing subpages and viewports.

    PLINT nsubx, nsuby, cursub;
    PLFLT spdxmi, spdxma, spdymi, spdyma;
    PLFLT vpdxmi, vpdxma, vpdymi, vpdyma;
    PLFLT vpwxmi, vpwxma, vpwymi, vpwyma;

// Transformation variables

    PLFLT wpxscl, wpxoff, wpyscl, wpyoff;
    PLFLT wmxscl, wmxoff, wmyscl, wmyoff;
    PLFLT wdxscl, wdxoff, wdyscl, wdyoff;

// Other variables

    PLINT            dev_compression;
    PLINT            cfont;

    void             *FT;

// Stuff used by the Tkwin driver for Plframe
    struct PlPlotter *plPlotterPtr;


// Unicode section

    PLINT     dev_unicode;

    PLINT     alt_unicode; // The alternative interface for unicode text rendering.

    PLUNICODE fci;

    PLINT     dev_hrshsym;

// Used to keep a hold of a temporary copy of the original character height
// which I overload as a quick hack to fix up a bug in freetype an plsym()
//

    PLFLT original_chrdef, original_chrht;

    //
    // Pointer to postscript document class used by psttf
    //
    void *psdoc;

    // pointer to a struct that keeps track of the details of the
    // transformation between broken-down and continuous time used in
    // the qsastime library.

    QSASConfig  *qsasconfig;

    // Gradient section.
    PLINT       dev_gradient;
    PLINT       ngradient;
    PLINT       *xgradient, *ygradient;
    // The next three variables define the polygon boundary used
    // in the software fallback for the gradient.
    PLINT       n_polygon;
    const PLFLT *x_polygon, *y_polygon;

    //CONSTANT SOVERSION FIX
    PLBOOL      stream_closed;
    PLINT       line_style;
    PLINT       dev_mem_alpha;
    PLINT       has_string_length;
    PLFLT       string_length;
    PLINT       get_string_length;
    PLINT       dev_eofill;

    // Drawing mode section
    PLINT       dev_modeset;

    // Calculate bounding-box limits rather than plot box?
    PLBOOL      if_boxbb;
    // Bounding box limits in mm for box including decorations
    // (inverted tick marks and numerical tick labels if either is
    // present).
    PLFLT boxbb_xmin, boxbb_xmax, boxbb_ymin, boxbb_ymax;
} PLStream;

//--------------------------------------------------------------------------
// Prototypes for stream & device utility functions.
//--------------------------------------------------------------------------

#ifdef __cplusplus
extern "C" {
#endif

// Get the current stream pointer

void PLDLLIMPEXP
plgpls( PLStream **p_pls );

// Initializes device cmap 1 entry by interpolation from pls->cmap1 entries

PLDLLIMPEXP void
plcol_interp( PLStream *pls, PLColor *newcolor, int i, int ncol );

// Opens file for output, prompting if not set.

PLDLLIMPEXP void
plOpenFile( PLStream *pls );

// Close output file

PLDLLIMPEXP void
plCloseFile( PLStream *pls );

// Sets up next file member name (in pls->FileName), but does not open it.

void
plP_getmember( PLStream *pls );

// Sets up file name & family stem name.

void
plP_sfnam( PLStream *pls, const char *fnam );

// Initializes family file parameters.

PLDLLIMPEXP void
plFamInit( PLStream *pls );

// Starts new member file of family file set if necessary.

PLDLLIMPEXP void
plGetFam( PLStream *pls );

// Rotates physical coordinates if necessary for given orientation.

PLDLLIMPEXP void
plRotPhy( PLINT orient, PLINT xmin, PLINT ymin, PLINT xmax, PLINT ymax,
          PLINT *px, PLINT *py );

// Allocates a standard PLDev structure for device-specific data

PLDLLIMPEXP PLDev *
plAllocDev( PLStream *pls );

// Just fills in the PLGraphicsIn with appropriate initial values.

PLDLLIMPEXP void
plGinInit( PLGraphicsIn *gin );

#ifdef __cplusplus
}
#endif

#endif  // __PLSTRM_H__