PLplot 5.15.0
Loading...
Searching...
No Matches
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//--------------------------------------------------------------------------
33void
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//
70void
71c_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//--------------------------------------------------------------------------
100void
101c_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//--------------------------------------------------------------------------
117void
118c_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//--------------------------------------------------------------------------
133void
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//--------------------------------------------------------------------------
188void
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//--------------------------------------------------------------------------
221void
222c_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//--------------------------------------------------------------------------
243PLINT
245{
246 plP_esc( PLESC_GETC, plg );
247 return plTranslateCursor( plg );
248}
249
250//--------------------------------------------------------------------------
258PLINT
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//--------------------------------------------------------------------------
288void
289c_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}
#define MAX(a, b)
Definition dsplint.c:28
void plbuf_setsub(PLStream *pls)
Definition plbuf.c:192
void plP_bop(void)
Definition plcore.c:198
void plP_eop(void)
Definition plcore.c:164
void plP_wait(void)
Definition plcore.c:365
void plP_sclp(PLINT ixmin, PLINT ixmax, PLINT iymin, PLINT iymax)
Definition plcore.c:4185
void plP_esc(PLINT op, void *ptr)
Definition plcore.c:273
void plP_fill(short *x, short *y, PLINT npts)
Definition plcore.c:451
void plabort(PLCHAR_VECTOR errormsg)
Definition plctrl.c:1894
PLINT plP_dcpcx(PLFLT x)
Definition plcvt.c:31
PLINT plP_dcpcy(PLFLT y)
Definition plcvt.c:39
PLFLT plP_dcmmy(PLFLT y)
Definition plcvt.c:163
PLFLT plP_dcmmx(PLFLT x)
Definition plcvt.c:155
PLINT plTranslateCursor(PLGraphicsIn *plg)
Definition plpage.c:259
PLINT plGetCursor(PLGraphicsIn *plg)
Definition plpage.c:244
void c_plbop(void)
Definition plpage.c:118
void plP_subpInit(void)
Definition plpage.c:134
void c_plcalc_world(PLFLT rx, PLFLT ry, PLFLT *wx, PLFLT *wy, PLINT *window)
Definition plpage.c:289
void plP_setsub(void)
Definition plpage.c:189
void c_pleop(void)
Definition plpage.c:101
void c_plgspa(PLFLT *xmin, PLFLT *xmax, PLFLT *ymin, PLFLT *ymax)
Definition plpage.c:222
void c_plclear(void)
Definition plpage.c:71
void c_pladv(PLINT page)
Definition plpage.c:34
#define PLDI_ORI
Definition plplotP.h:379
#define M_PI
Definition plplotP.h:119
#define plschr
Definition plplot.h:790
#define plsmaj
Definition plplot.h:826
#define PLESC_GETC
Definition plplot.h:283
#define plsmin
Definition plplot.h:829
float PLFLT
Definition plplot.h:163
#define PLESC_CLEAR
Definition plplot.h:288
#define plssym
Definition plplot.h:837
#define plcol0
Definition plplot.h:702
#define PL_MAXWINDOWS
Definition plplot.h:448
int PLINT
Definition plplot.h:181
PLFLT dyma
Definition plplot.h:452
PLFLT wymi
Definition plplot.h:453
PLFLT wxmi
Definition plplot.h:453
PLFLT wyma
Definition plplot.h:453
PLFLT dxma
Definition plplot.h:452
PLFLT wxma
Definition plplot.h:453
PLFLT dymi
Definition plplot.h:452
PLFLT dxmi
Definition plplot.h:452