00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00028 #include "plplotP.h"
00029
00030
00031
00036 void
00037 c_pladv(PLINT page)
00038 {
00039 if (plsc->level < 1) {
00040 plabort("pladv: Please call plinit first");
00041 return;
00042 }
00043
00044 if (page > 0 && page <= plsc->nsubx * plsc->nsuby)
00045 plsc->cursub = page;
00046
00047 else if (page == 0) {
00048 if (plsc->cursub >= plsc->nsubx * plsc->nsuby) {
00049 plP_eop();
00050 plP_bop();
00051 plsc->cursub = 1;
00052 }
00053 else
00054 plsc->cursub++;
00055 }
00056 else {
00057 plabort("pladv: Invalid subpage number");
00058 return;
00059 }
00060
00061 plP_setsub();
00062 }
00063
00064
00065
00069 void
00070 c_plclear(void)
00071 {
00072 if (plsc->level < 1) {
00073 plabort("plclear: Please call plinit first");
00074 return;
00075 }
00076
00077 if (plsc->dev_clear)
00078 plP_esc(PLESC_CLEAR, NULL);
00079 else {
00080
00081 short x[5], y[5];
00082 int ocolor = plsc->icol0;
00083
00084 x[0] = x[3] = x[4] = plsc->sppxmi;
00085 x[1] = x[2] = plsc->sppxma;
00086 y[0] = y[1] = y[4] = plsc->sppymi;
00087 y[2] = y[3] = plsc->sppyma;
00088 plcol0(0);
00089 plP_fill(x, y, 5);
00090 plcol0(ocolor);
00091 }
00092 }
00093
00094
00095
00098 void
00099 c_pleop(void)
00100 {
00101 if (plsc->level < 1) {
00102 plabort("pleop: Please call plinit first");
00103 return;
00104 }
00105
00106 plsc->cursub = plsc->nsubx * plsc->nsuby;
00107 plP_eop();
00108 }
00109
00110
00111
00114 void
00115 c_plbop(void)
00116 {
00117 if (plsc->level < 1) {
00118 plabort("plbop: Please call plinit first");
00119 return;
00120 }
00121 plP_bop();
00122 plsc->cursub = 1;
00123 plP_setsub();
00124 }
00125
00126
00127
00130 void
00131 plP_subpInit(void)
00132 {
00133 PLFLT scale, size_chr, size_sym, size_maj, size_min, theta, rat;
00134
00135
00136
00137 if (plsc->nsubx <= 0)
00138 plsc->nsubx = 1;
00139 if (plsc->nsuby <= 0)
00140 plsc->nsuby = 1;
00141
00142 plsc->cursub = 0;
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 scale = 0.5 *
00154 ((plsc->phyxma - plsc->phyxmi) / plsc->xpmm +
00155 (plsc->phyyma - plsc->phyymi) / plsc->ypmm) / 200.0;
00156
00157
00158 if (plsc->difilt && PLDI_ORI) {
00159 theta = 0.5*M_PI*plsc->diorot;
00160 rat = ( (plsc->phyxma - plsc->phyxmi) / plsc->xpmm ) /
00161 ( (plsc->phyyma - plsc->phyymi) / plsc->ypmm );
00162 rat = MAX(rat,1.0/rat);
00163 rat = fabs(cos(theta)) + rat*fabs(sin(theta));
00164 scale /= rat;
00165 }
00166
00167 if (plsc->nsuby > 1)
00168 scale /= sqrt((double) plsc->nsuby);
00169
00170 size_chr = 4.0;
00171 size_sym = 4.0;
00172 size_maj = 3.0;
00173 size_min = 1.5;
00174
00175 plsc->chrdef = plsc->chrht = size_chr * scale;
00176 plsc->symdef = plsc->symht = size_sym * scale;
00177 plsc->majdef = plsc->majht = size_maj * scale;
00178 plsc->mindef = plsc->minht = size_min * scale;
00179 }
00180
00181
00182
00185 void
00186 plP_setsub(void)
00187 {
00188 PLINT ix, iy;
00189
00190 ix = (plsc->cursub - 1) % plsc->nsubx;
00191 iy = plsc->nsuby - (plsc->cursub - 1) / plsc->nsubx;
00192
00193 plsc->spdxmi = (PLFLT) (ix) / (PLFLT) (plsc->nsubx);
00194 plsc->spdxma = (PLFLT) (ix + 1) / (PLFLT) (plsc->nsubx);
00195 plsc->spdymi = (PLFLT) (iy - 1) / (PLFLT) (plsc->nsuby);
00196 plsc->spdyma = (PLFLT) (iy) / (PLFLT) (plsc->nsuby);
00197
00198 plsc->sppxmi = plP_dcpcx(plsc->spdxmi);
00199 plsc->sppxma = plP_dcpcx(plsc->spdxma);
00200 plsc->sppymi = plP_dcpcy(plsc->spdymi);
00201 plsc->sppyma = plP_dcpcy(plsc->spdyma);
00202
00203 plP_sclp(plsc->sppxmi, plsc->sppxma, plsc->sppymi, plsc->sppyma);
00204 }
00205
00206
00207
00216 void
00217 c_plgspa(PLFLT *xmin, PLFLT *xmax, PLFLT *ymin, PLFLT *ymax)
00218 {
00219 if (plsc->level < 1) {
00220 plabort("plgspa: Please call plinit first");
00221 return;
00222 }
00223 *xmin = plP_dcmmx(plsc->spdxmi);
00224 *xmax = plP_dcmmx(plsc->spdxma);
00225 *ymin = plP_dcmmy(plsc->spdymi);
00226 *ymax = plP_dcmmy(plsc->spdyma);
00227 }
00228
00229
00230
00238 int
00239 plGetCursor(PLGraphicsIn *plg)
00240 {
00241 plP_esc(PLESC_GETC, plg);
00242 return plTranslateCursor(plg);
00243 }
00244
00245
00246
00254 int
00255 plTranslateCursor(PLGraphicsIn *plg)
00256 {
00257 int window;
00258 c_plcalc_world(plg->dX, plg->dY, &plg->wX, &plg->wY,
00259 (PLINT *) &window);
00260 if ( window >= 0 ) {
00261 plg->subwindow = window;
00262 return 1;
00263 }
00264 else
00265 return 0;
00266 }
00267
00268
00269
00283 void
00284 c_plcalc_world(PLFLT rx, PLFLT ry, PLFLT *wx, PLFLT *wy, PLINT *window)
00285 {
00286 int i;
00287 int lastwin = plsc->nplwin - 1;
00288 int firstwin = MAX(plsc->nplwin - PL_MAXWINDOWS, 0);
00289 PLWindow *w;
00290
00291 for (i = lastwin; i >= firstwin; i--) {
00292 w = &plsc->plwin[i % PL_MAXWINDOWS];
00293 if ((rx >= w->dxmi) &&
00294 (rx <= w->dxma) &&
00295 (ry >= w->dymi) &&
00296 (ry <= w->dyma) ) {
00297
00298 *wx = w->wxmi + (rx - w->dxmi) *
00299 (w->wxma - w->wxmi) / (w->dxma - w->dxmi);
00300
00301 *wy = w->wymi + (ry - w->dymi) *
00302 (w->wyma - w->wymi) / (w->dyma - w->dymi);
00303
00304 *window = i;
00305
00306 return;
00307 }
00308 }
00309
00310 *wx = 0.;
00311 *wy = 0.;
00312 *window = -1;
00313 return;
00314 }