PLplot: plpage.c Source File

PLplot 5.15.0

plpage.c
Go to the documentation of this file.
1 // Copyright (C) 2004-2014 Alan W. Irwin
2 //
3 // This file is part of PLplot.
4 //
5 // PLplot is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Library General Public License as published
7 // by the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // PLplot is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Library General Public License for more details.
14 //
15 // You should have received a copy of the GNU Library General Public License
16 // along with PLplot; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 //
19
24
25 #include "plplotP.h"
26 #include "drivers.h"
27
28 //--------------------------------------------------------------------------
33 void
34 c_pladv( PLINT page )
35 {
36 if ( plsc->level < 1 )
37 {
38 plabort( "pladv: Please call plinit first" );
39 return;
40 }
41
42 if ( page > 0 && page <= plsc->nsubx * plsc->nsuby )
43 plsc->cursub = page;
44
45 else if ( page == 0 )
46 {
47 if ( plsc->cursub >= plsc->nsubx * plsc->nsuby )
48 {
49 plP_eop();
50 plP_wait();
51 plP_bop();
52 plsc->cursub = 1;
53 }
54 else
55 plsc->cursub++;
56 }
57 else
58 {
59 plabort( "pladv: Invalid subpage number" );
60 return;
61 }
62
63 plP_setsub();
64 }
65
66 //--------------------------------------------------------------------------
69 //
70 void
71 c_plclear( void )
72 {
73 if ( plsc->level < 1 )
74 {
75 plabort( "plclear: Please call plinit first" );
76 return;
77 }
78
79 if ( plsc->dev_clear )
80 plP_esc( PLESC_CLEAR, NULL );
81 else // driver does not support clear, fill using background color
82
83 {
84 short x[5], y[5];
85 int ocolor = plsc->icol0;
86
87 x[0] = x[3] = x[4] = (short) plsc->sppxmi;
88 x[1] = x[2] = (short) plsc->sppxma;
89 y[0] = y[1] = y[4] = (short) plsc->sppymi;
90 y[2] = y[3] = (short) plsc->sppyma;
91 plcol0( 0 );
92 plP_fill( x, y, 5 );
93 plcol0( ocolor );
94 }
95 }
96
97 //--------------------------------------------------------------------------
100 void
101 c_pleop( void )
102 {
103 if ( plsc->level < 1 )
104 {
105 plabort( "pleop: Please call plinit first" );
106 return;
107 }
108
109 plsc->cursub = plsc->nsubx * plsc->nsuby;
110 plP_eop();
111 plP_wait();
112 }
113
114 //--------------------------------------------------------------------------
117 void
118 c_plbop( void )
119 {
120 if ( plsc->level < 1 )
121 {
122 plabort( "plbop: Please call plinit first" );
123 return;
124 }
125 plP_bop();
126 plsc->cursub = 1;
127 plP_setsub();
128 }
129
130 //--------------------------------------------------------------------------
133 void
134 plP_subpInit( void )
135 {
136 PLFLT scale, size_chr, size_sym, size_maj, size_min, theta, rat;
137
138 // Subpage checks
139
140 if ( plsc->nsubx <= 0 )
141 plsc->nsubx = 1;
142 if ( plsc->nsuby <= 0 )
143 plsc->nsuby = 1;
144
145 plsc->cursub = 0;
146
147 //
148 // Set default sizes
149 // Global scaling:
150 // Normalize to the page length for more uniform results.
151 // A virtual page length of 200 mm is assumed.
152 // Subpage scaling:
153 // Reduce sizes with plot area (non-proportional, so that character
154 // size doesn't get too small).
155 //
156 scale = 0.5 *
157 ( ( plsc->phyxma - plsc->phyxmi ) / plsc->xpmm +
158 ( plsc->phyyma - plsc->phyymi ) / plsc->ypmm ) / 200.0;
159
160 // Take account of scaling caused by change of orientation
161 if ( plsc->difilt & PLDI_ORI )
162 {
163 theta = 0.5 * M_PI * plsc->diorot;
164 rat = ( ( plsc->phyxma - plsc->phyxmi ) / plsc->xpmm ) /
165 ( ( plsc->phyyma - plsc->phyymi ) / plsc->ypmm );
166 rat = MAX( rat, 1.0 / rat );
167 rat = fabs( cos( theta ) ) + rat * fabs( sin( theta ) );
168 scale /= rat;
169 }
170
171 if ( plsc->nsuby > 1 )
172 scale /= sqrt( (double) plsc->nsuby );
173
174 size_chr = 4.0;
175 size_sym = 4.0; // All these in virtual plot units
176 size_maj = 3.0;
177 size_min = 1.5;
178
179 plschr( size_chr * scale, 1.0 );
180 plssym( size_sym * scale, 1.0 );
181 plsmaj( size_maj * scale, 1.0 );
182 plsmin( size_min * scale, 1.0 );
183 }
184
185 //--------------------------------------------------------------------------
188 void
189 plP_setsub( void )
190 {
191 PLINT ix, iy;
192
193 ix = ( plsc->cursub - 1 ) % plsc->nsubx;
194 iy = plsc->nsuby - ( plsc->cursub - 1 ) / plsc->nsubx;
195
196 plsc->spdxmi = (PLFLT) ( ix ) / (PLFLT) ( plsc->nsubx );
197 plsc->spdxma = (PLFLT) ( ix + 1 ) / (PLFLT) ( plsc->nsubx );
198 plsc->spdymi = (PLFLT) ( iy - 1 ) / (PLFLT) ( plsc->nsuby );
199 plsc->spdyma = (PLFLT) ( iy ) / (PLFLT) ( plsc->nsuby );
200
201 plsc->sppxmi = plP_dcpcx( plsc->spdxmi );
202 plsc->sppxma = plP_dcpcx( plsc->spdxma );
203 plsc->sppymi = plP_dcpcy( plsc->spdymi );
204 plsc->sppyma = plP_dcpcy( plsc->spdyma );
205
206 plP_sclp( plsc->sppxmi, plsc->sppxma, plsc->sppymi, plsc->sppyma );
207
208 if ( plsc->plbuf_write )
209 plbuf_setsub( plsc );
210 }
211
212 //--------------------------------------------------------------------------
221 void
222 c_plgspa( PLFLT *xmin, PLFLT *xmax, PLFLT *ymin, PLFLT *ymax )
223 {
224 if ( plsc->level < 1 )
225 {
226 plabort( "plgspa: Please call plinit first" );
227 return;
228 }
229 *xmin = plP_dcmmx( plsc->spdxmi );
230 *xmax = plP_dcmmx( plsc->spdxma );
231 *ymin = plP_dcmmy( plsc->spdymi );
232 *ymax = plP_dcmmy( plsc->spdyma );
233 }
234
235 //--------------------------------------------------------------------------
243 PLINT
244 plGetCursor( PLGraphicsIn *plg )
245 {
246 plP_esc( PLESC_GETC, plg );
247 return plTranslateCursor( plg );
248 }
249
250 //--------------------------------------------------------------------------
258 PLINT
259 plTranslateCursor( PLGraphicsIn *plg )
260 {
261 int window;
262 c_plcalc_world( plg->dX, plg->dY, &plg->wX, &plg->wY,
263 (PLINT *) &window );
264 if ( window >= 0 )
265 {
266 plg->subwindow = window;
267 return 1;
268 }
269 else
270 return 0;
271 }
272
273 //--------------------------------------------------------------------------
288 void
289 c_plcalc_world( PLFLT rx, PLFLT ry, PLFLT *wx, PLFLT *wy, PLINT *window )
290 {
291 int i;
292 int lastwin = plsc->nplwin - 1;
293 int firstwin = MAX( plsc->nplwin - PL_MAXWINDOWS, 0 );
294 PLWindow *w;
295
296 for ( i = lastwin; i >= firstwin; i-- )
297 {
298 w = &plsc->plwin[i % PL_MAXWINDOWS];
299 if ( ( rx >= w->dxmi ) &&
300 ( rx <= w->dxma ) &&
301 ( ry >= w->dymi ) &&
302 ( ry <= w->dyma ) )
303 {
304 *wx = w->wxmi + ( rx - w->dxmi ) *
305 ( w->wxma - w->wxmi ) / ( w->dxma - w->dxmi );
306
307 *wy = w->wymi + ( ry - w->dymi ) *
308 ( w->wyma - w->wymi ) / ( w->dyma - w->dymi );
309
310 *window = i;
311
312 return;
313 }
314 }
315 // No valid window found with these relative coordinates.
316 *wx = 0.;
317 *wy = 0.;
318 *window = -1;
319 return;
320 }
plplotP.h
PLWindow::dymi
PLFLT dymi
Definition: plplot.h:452
plGetCursor
PLINT plGetCursor(PLGraphicsIn *plg)
Definition: plpage.c:244
plP_esc
void plP_esc(PLINT op, void *ptr)
Definition: plcore.c:273
plschr
#define plschr
Definition: plplot.h:790
PLGraphicsIn::dX
PLFLT dX
Definition: plplot.h:442
PLWindow::dxma
PLFLT dxma
Definition: plplot.h:452
c_plcalc_world
void c_plcalc_world(PLFLT rx, PLFLT ry, PLFLT *wx, PLFLT *wy, PLINT *window)
Definition: plpage.c:289
PLWindow::dxmi
PLFLT dxmi
Definition: plplot.h:452
plsmin
#define plsmin
Definition: plplot.h:829
plP_dcpcx
PLINT plP_dcpcx(PLFLT x)
Definition: plcvt.c:31
PLWindow
Definition: plplot.h:450
c_pleop
void c_pleop(void)
Definition: plpage.c:101
MAX
#define MAX(a, b)
Definition: dsplint.c:28
plTranslateCursor
PLINT plTranslateCursor(PLGraphicsIn *plg)
Definition: plpage.c:259
plabort
void plabort(PLCHAR_VECTOR errormsg)
Definition: plctrl.c:1894
PLINT
int PLINT
Definition: plplot.h:181
plP_bop
void plP_bop(void)
Definition: plcore.c:198
plssym
#define plssym
Definition: plplot.h:837
PLWindow::wymi
PLFLT wymi
Definition: plplot.h:453
c_plclear
void c_plclear(void)
Definition: plpage.c:71
plP_dcmmy
PLFLT plP_dcmmy(PLFLT y)
Definition: plcvt.c:163
PL_MAXWINDOWS
#define PL_MAXWINDOWS
Definition: plplot.h:448
PLDI_ORI
#define PLDI_ORI
Definition: plplotP.h:379
c_plgspa
void c_plgspa(PLFLT *xmin, PLFLT *xmax, PLFLT *ymin, PLFLT *ymax)
Definition: plpage.c:222
plsmaj
#define plsmaj
Definition: plplot.h:826
PLESC_CLEAR
#define PLESC_CLEAR
Definition: plplot.h:288
drivers.h
PLWindow::dyma
PLFLT dyma
Definition: plplot.h:452
PLWindow::wyma
PLFLT wyma
Definition: plplot.h:453
PLWindow::wxmi
PLFLT wxmi
Definition: plplot.h:453
plP_subpInit
void plP_subpInit(void)
Definition: plpage.c:134
plP_setsub
void plP_setsub(void)
Definition: plpage.c:189
PLGraphicsIn::wX
PLFLT wX
Definition: plplot.h:443
PLGraphicsIn::subwindow
PLINT subwindow
Definition: plplot.h:439
plbuf_setsub
void plbuf_setsub(PLStream *pls)
Definition: plbuf.c:192
plP_fill
void plP_fill(short *x, short *y, PLINT npts)
Definition: plcore.c:451
PLFLT
float PLFLT
Definition: plplot.h:163
plP_eop
void plP_eop(void)
Definition: plcore.c:164
plP_dcpcy
PLINT plP_dcpcy(PLFLT y)
Definition: plcvt.c:39
plcol0
#define plcol0
Definition: plplot.h:702
PLWindow::wxma
PLFLT wxma
Definition: plplot.h:453
c_pladv
void c_pladv(PLINT page)
Definition: plpage.c:34
PLGraphicsIn::dY
PLFLT dY
Definition: plplot.h:442
plP_sclp
void plP_sclp(PLINT ixmin, PLINT ixmax, PLINT iymin, PLINT iymax)
Definition: plcore.c:4185
PLESC_GETC
#define PLESC_GETC
Definition: plplot.h:283
plP_wait
void plP_wait(void)
Definition: plcore.c:365
c_plbop
void c_plbop(void)
Definition: plpage.c:118
PLGraphicsIn::wY
PLFLT wY
Definition: plplot.h:443
M_PI
#define M_PI
Definition: plplotP.h:119
plP_dcmmx
PLFLT plP_dcmmx(PLFLT x)
Definition: plcvt.c:155
PLGraphicsIn
Definition: plplot.h:433