void old_body(EnvT* e, GDLGStream* actStream) { int clippingix=e->KeywordIx("CLIP"); DFloatGDL* clipBox=NULL; enum { DATA=0, NORMAL, DEVICE } coordinateSystem=DATA; //check presence of DATA,DEVICE and NORMAL options if ( e->KeywordSet("DATA") ) coordinateSystem=DATA; if ( e->KeywordSet("DEVICE") ) coordinateSystem=DEVICE; if ( e->KeywordSet("NORMAL") ) coordinateSystem=NORMAL; // get_axis_type gdlGetAxisType("X", xLog); gdlGetAxisType("Y", yLog); // get ![XY].CRANGE GetCurrentUserLimits(e, actStream, xStart, xEnd, yStart, yEnd); if ((yStart == yEnd) || (xStart == xEnd)) { if (yStart != 0.0 && yStart == yEnd) Message("POLYFILL: !Y.CRANGE ERROR, setting to [0,1]"); yStart = 0; yEnd = 1; if (xStart != 0.0 && xStart == xEnd) Message("POLYFILL: !X.CRANGE ERROR, setting to [0,1]"); xStart = 0; xEnd = 1; } restoreClipBox=false; int noclipvalue=1; e->AssureLongScalarKWIfPresent( "NOCLIP", noclipvalue); doClip=(noclipvalue==0); //PLOTS by default does not clip, even if clip is defined by CLIP= or !P.CLIP clipBox=e->IfDefGetKWAs<DFloatGDL>(clippingix); if (doClip && clipBox!=NULL && clipBox->N_Elements()>=4 ) //clipbox exist, will be used: convert to device coords //and save in !P.CLIP... { restoreClipBox=true; //restore later // save current !P.CLIP box, replace by our current clipbox in whatever coordinates, will // give back the !P.CLIP box at end... static DStructGDL* pStruct=SysVar::P(); static unsigned clipTag=pStruct->Desc()->TagIndex("CLIP"); //must be in device coordinates static PLFLT tempbox[4]; for ( int i=0; i<4; ++i ) savebox[i]=(*static_cast<DLongGDL*>(pStruct->GetTag(clipTag, 0)))[i]; if ( coordinateSystem==DEVICE ) { for ( int i=0; i<4; ++i ) tempbox[i]=(*clipBox)[i]; } else if ( coordinateSystem==DATA ) { //handle log: if existing box is already in log, use log of clipbox values. PLFLT worldbox[4]; for ( int i=0; i<4; ++i ) worldbox[i]=(*clipBox)[i]; if (xLog) {worldbox[0]=log10(worldbox[0]); worldbox[2]=log10(worldbox[2]);} if (yLog) {worldbox[1]=log10(worldbox[1]); worldbox[3]=log10(worldbox[3]);} bool okClipBox=true; for ( int i=0; i<4; ++i ) { if (!isfinite(worldbox[i])) //NaN { okClipBox=false;restoreClipBox=false;doClip=false; } } if (okClipBox) { actStream->WorldToDevice(worldbox[0], worldbox[1], tempbox[0], tempbox[1]); actStream->WorldToDevice(worldbox[2], worldbox[3], tempbox[2], tempbox[3]); } } else { actStream->NormedDeviceToDevice((*clipBox)[0],(*clipBox)[1], tempbox[0], tempbox[1]); actStream->NormedDeviceToDevice((*clipBox)[2],(*clipBox)[3], tempbox[2], tempbox[3]); } //place in !P.CLIP for ( int i=0; i<4; ++i ) (*static_cast<DLongGDL*>(pStruct->GetTag(clipTag, 0)))[i]=tempbox[i]; } mapSet=false; actStream->OnePageSaveLayout(); // one page #ifdef USE_LIBPROJ4 get_mapset(mapSet); mapSet=(mapSet && coordinateSystem==DATA); if ( mapSet ) { ref=map_init(); if ( ref==NULL ) { e->Throw("Projection initialization failed."); } DDouble *sx, *sy; GetSFromPlotStructs( &sx, &sy ); DFloat *wx, *wy; GetWFromPlotStructs( &wx, &wy ); DDouble pxStart, pxEnd, pyStart, pyEnd; DataCoordLimits( sx, sy, wx, wy, &pxStart, &pxEnd, &pyStart, &pyEnd, true ); actStream->wind( pxStart, pxEnd, pyStart, pyEnd ); } #endif PLFLT wun, wdeux, wtrois, wquatre; if ( coordinateSystem==DATA) //with POLYFILL, we can plot *outside* the box(e)s in DATA coordinates. // convert to device coords in this case { actStream->pageWorldCoordinates(wun, wdeux, wtrois, wquatre); } actStream->vpor(0, 1, 0, 1); //ALL PAGE if ( coordinateSystem==DEVICE ) { actStream->wind(0.0, actStream->xPageSize(), 0.0, actStream->yPageSize()); xLog=false; yLog=false; } else if ( coordinateSystem==NORMAL ) { actStream->wind(0, 1, 0, 1); xLog=false; yLog=false; } else //with POLYFILL, we can plot *outside* the box(e)s in DATA coordinates. { actStream->wind(wun, wdeux, wtrois, wquatre); } }
void old_body(EnvT* e, GDLGStream* actStream) { //check presence of DATA,DEVICE and NORMAL options static int DATAIx=e->KeywordIx("DATA"); static int DEVICEIx=e->KeywordIx("DEVICE"); static int NORMALIx=e->KeywordIx("NORMAL"); coordinateSystem = DATA; //check presence of DATA,DEVICE and NORMAL options if (e->KeywordSet(DATAIx)) coordinateSystem = DATA; if (e->KeywordSet(DEVICEIx)) coordinateSystem = DEVICE; if (e->KeywordSet(NORMALIx)) coordinateSystem = NORMAL; //T3D incompatible with DEVICE option. if (coordinateSystem == DEVICE) doT3d =false; // get_axis_type gdlGetAxisType("X", xLog); gdlGetAxisType("Y", yLog); gdlGetAxisType("Z", zLog); //get DATA limits (not necessary CRANGE, see AXIS / SAVE behaviour!) GetCurrentUserLimits(actStream, xStart, xEnd, yStart, yEnd); // get !Z.CRANGE gdlGetCurrentAxisRange("Z", zStart, zEnd); if (zStart != 0.0 && zStart == zEnd) { Message("PLOTS: !Z.CRANGE ERROR, setting to [0,1]"); zStart = 0; zEnd = 1; } // it is important to fix symsize before changing vpor or win gdlSetSymsize(e, actStream); //SYMSIZE int noclipvalue=1; static int NOCLIPIx = e->KeywordIx("NOCLIP"); e->AssureLongScalarKWIfPresent( NOCLIPIx, noclipvalue); doClip=(noclipvalue==0); //PLOTS by default does not clip, even if clip is defined by CLIP= restorelayout=true; mapSet=false; #ifdef USE_LIBPROJ4 get_mapset(mapSet); mapSet=(mapSet && coordinateSystem==DATA); if ( mapSet ) { ref=map_init(); if ( ref==NULL ) { e->Throw("Projection initialization failed."); } restorelayout=true; } #endif if ( doT3d && !real3d) { doClip=false; //impossible to clip in 3d using plplot. we should do it ourselves. restorelayout=false; if ( coordinateSystem==NORMAL ){ xLog=false; yLog=false;} } else { if (restorelayout) actStream->OnePageSaveLayout(); // one page actStream->vpor(0, 1, 0, 1); //ALL PAGE if ( coordinateSystem==DEVICE ) { actStream->wind(0.0, actStream->xPageSize(), 0.0, actStream->yPageSize()); xLog=false; yLog=false; } else if ( coordinateSystem==NORMAL ) { actStream->wind(0, 1, 0, 1); xLog=false; yLog=false; } else //with PLOTS, we can plot *outside* the box(e)s in DATA coordinates. { setPlplotScale(actStream); } } actStream->setSymbolSizeConversionFactors(); }