Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 27 /*----------------------------HEPVis----------------------------------------*/ 28 /* */ 29 /* Node: SoGL2PSAction */ 30 /* Author: Guy Barrand */ 31 /* */ 32 /*--------------------------------------------------------------------------*/ 33 34 // this : 35 #include <HEPVis/actions/SoGL2PSAction.h> 36 37 // Inventor : 38 #include <Inventor/elements/SoViewportRegionElement.h> 39 #include <Inventor/errors/SoDebugError.h> 40 41 #include <Inventor/system/gl.h> 42 43 #include <stdio.h> 44 45 SO_ACTION_SOURCE(SoGL2PSAction) 46 ////////////////////////////////////////////////////////////////////////////// 47 void SoGL2PSAction::initClass( 48 ) 49 ////////////////////////////////////////////////////////////////////////////// 50 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 51 { 52 static bool first = true; 53 if (first) { 54 first = false; 55 SO_ACTION_INIT_CLASS(SoGL2PSAction,SoGLRenderAction); 56 } 57 } 58 ////////////////////////////////////////////////////////////////////////////// 59 SoGL2PSAction::SoGL2PSAction( 60 const SbViewportRegion& aViewPortRegion 61 ) 62 :SoGLRenderAction(aViewPortRegion) 63 ,fContext(0) 64 ,fFile(0) 65 ,fFileName("out.pdf") 66 ,fTitle("title") 67 ,fProducer("HEPVis::SoGL2PSAction") 68 ,fFormat(TOOLS_GL2PS_PDF) 69 ////////////////////////////////////////////////////////////////////////////// 70 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 71 { 72 SO_ACTION_CONSTRUCTOR(SoGL2PSAction); 73 } 74 75 ////////////////////////////////////////////////////////////////////////////// 76 SoGL2PSAction::~SoGL2PSAction() 77 ////////////////////////////////////////////////////////////////////////////// 78 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 79 { 80 closeFile(); 81 } 82 83 ////////////////////////////////////////////////////////////////////////////// 84 void SoGL2PSAction::setFileName(const std::string& aFileName) 85 ////////////////////////////////////////////////////////////////////////////// 86 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 87 { 88 fFileName = aFileName; 89 } 90 91 ////////////////////////////////////////////////////////////////////////////// 92 void SoGL2PSAction::setTitleAndProducer(const std::string& aTitle,const std::string& aProducer) 93 ////////////////////////////////////////////////////////////////////////////// 94 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 95 { 96 fTitle = aTitle; 97 fProducer = aProducer; 98 } 99 100 void SoGL2PSAction::setExportImageFormat_PS() {fFormat = TOOLS_GL2PS_PS;} 101 void SoGL2PSAction::setExportImageFormat_EPS() {fFormat = TOOLS_GL2PS_EPS;} 102 void SoGL2PSAction::setExportImageFormat_TEX() {fFormat = TOOLS_GL2PS_TEX;} 103 void SoGL2PSAction::setExportImageFormat_PDF() {fFormat = TOOLS_GL2PS_PDF;} 104 void SoGL2PSAction::setExportImageFormat_SVG() {fFormat = TOOLS_GL2PS_SVG;} 105 void SoGL2PSAction::setExportImageFormat_PGF() {fFormat = TOOLS_GL2PS_PGF;} 106 107 ////////////////////////////////////////////////////////////////////////////// 108 bool SoGL2PSAction::enableFileWriting() 109 ////////////////////////////////////////////////////////////////////////////// 110 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 111 { 112 if(!openFile()) { 113 SoDebugError::post("SoGL2PSAction::enableFileWriting", 114 "openFile() failed for fil %s", 115 fFileName.c_str()); 116 return false; 117 } 118 #ifdef __COIN__ 119 #else //SGI 120 const SbViewportRegion& vpr = getViewportRegion(); 121 SoViewportRegionElement::set(getState(),vpr); 122 SbVec2s origin = vpr.getViewportOriginPixels(); 123 SbVec2s size = vpr.getViewportSizePixels(); 124 if(!beginPage(origin[0],origin[1],size[0],size[1])) { 125 SoDebugError::post("SoGL2PSAction::enableFileWriting","beginPage() failed"); 126 return false; 127 } 128 #endif 129 return true; 130 } 131 ////////////////////////////////////////////////////////////////////////////// 132 void SoGL2PSAction::disableFileWriting( 133 ) 134 ////////////////////////////////////////////////////////////////////////////// 135 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 136 { 137 #ifdef __COIN__ 138 #else //SGI 139 endPage(); 140 #endif 141 closeFile(); 142 } 143 144 ////////////////////////////////////////////////////////////////////////////// 145 void SoGL2PSAction::beginTraversal( 146 SoNode* aNode 147 ) 148 ////////////////////////////////////////////////////////////////////////////// 149 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 150 { 151 if(fContext && fFile) { 152 #ifdef __COIN__ 153 const SbViewportRegion& vpr = getViewportRegion(); 154 SoViewportRegionElement::set(getState(),vpr); 155 SbVec2s origin = vpr.getViewportOriginPixels(); 156 SbVec2s size = vpr.getViewportSizePixels(); 157 if(!beginPage(origin[0],origin[1],size[0],size[1])) { 158 SoDebugError::post("SoGL2PSAction::beginTraversal","beginPage() failed"); 159 return; 160 } 161 traverse(aNode); 162 if(!endPage()) { 163 SoDebugError::post("SoGL2PSAction::beginTraversal","endPage() failed"); 164 return; 165 } 166 #else //SGI 167 SoGLRenderAction::beginTraversal(aNode); 168 #endif 169 } else { 170 SoGLRenderAction::beginTraversal(aNode); 171 } 172 } 173 174 #include <tools/gl2ps> 175 176 ////////////////////////////////////////////////////////////////////////////// 177 bool SoGL2PSAction::openFile() 178 ////////////////////////////////////////////////////////////////////////////// 179 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 180 { 181 if(fFile) { 182 ::fclose(fFile); 183 fFile = 0; 184 } 185 if(fContext) { 186 ::tools_gl2psDeleteContext(fContext); 187 fContext = 0; 188 } 189 190 fContext = ::tools_gl2psCreateContext(); 191 if(!fContext) return false; 192 193 tools_gl2ps_gl_funcs_t _funcs = { 194 (tools_glIsEnabled_func)glIsEnabled, 195 (tools_glBegin_func)glBegin, 196 (tools_glEnd_func)glEnd, 197 (tools_glGetFloatv_func)glGetFloatv, 198 (tools_glVertex3f_func)glVertex3f, 199 (tools_glGetBooleanv_func)glGetBooleanv, 200 (tools_glGetIntegerv_func)glGetIntegerv, 201 (tools_glRenderMode_func)glRenderMode, 202 (tools_glFeedbackBuffer_func)glFeedbackBuffer, 203 (tools_glPassThrough_func)glPassThrough 204 }; 205 ::tools_gl2ps_set_gl_funcs(fContext,&_funcs); 206 207 fFile = ::fopen(fFileName.c_str(),"wb"); 208 if(!fFile) { 209 ::tools_gl2psDeleteContext(fContext); 210 fContext = 0; 211 return false; 212 } 213 214 return true; 215 } 216 217 ////////////////////////////////////////////////////////////////////////////// 218 void SoGL2PSAction::closeFile() 219 ////////////////////////////////////////////////////////////////////////////// 220 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 221 { 222 if(fFile) { 223 ::fclose(fFile); 224 fFile = 0; 225 } 226 if(fContext) { 227 ::tools_gl2psDeleteContext(fContext); 228 fContext = 0; 229 } 230 } 231 232 ////////////////////////////////////////////////////////////////////////////// 233 bool SoGL2PSAction::beginPage(int a_x,int a_y,int a_w,int a_h) 234 ////////////////////////////////////////////////////////////////////////////// 235 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 236 { 237 if(!fContext) return false; 238 if(!fFile) return false; 239 240 if( (a_w<=0) || (a_h<=0) ) return false; 241 242 int options = 243 TOOLS_GL2PS_BEST_ROOT | 244 TOOLS_GL2PS_DRAW_BACKGROUND | 245 TOOLS_GL2PS_USE_CURRENT_VIEWPORT; 246 int sort = TOOLS_GL2PS_BSP_SORT; 247 248 int vp[4]; 249 vp[0] = a_x; 250 vp[1] = a_y; 251 vp[2] = a_w; 252 vp[3] = a_h; 253 254 int bufferSize = 0; 255 256 tools_GLint res = ::tools_gl2psBeginPage 257 (fContext,fTitle.c_str(),fProducer.c_str(), 258 vp,fFormat,sort,options,TOOLS_GL_RGBA,0, NULL,0,0,0, 259 bufferSize,fFile,fFileName.c_str()); 260 if (res == TOOLS_GL2PS_ERROR) return false; 261 262 // enable blending for all 263 ::tools_gl2psEnable(fContext,TOOLS_GL2PS_BLEND); 264 265 return true; 266 } 267 268 ////////////////////////////////////////////////////////////////////////////// 269 bool SoGL2PSAction::endPage() 270 ////////////////////////////////////////////////////////////////////////////// 271 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 272 { 273 int _status = 0; 274 if(fContext) { 275 _status = ::tools_gl2psEndPage(fContext); 276 } 277 if (_status == TOOLS_GL2PS_OVERFLOW) return false; 278 return true; 279 } 280 281 ////////////////////////////////////////////////////////////////////////////// 282 bool SoGL2PSAction::addBitmap( 283 int aWidth 284 ,int aHeight 285 ,float aXorig 286 ,float aYorig 287 ,float aXmove 288 ,float aYmove 289 ) 290 ///////////////////////////////////////////////////////////////////////////// 291 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// 292 { 293 if(!fContext) return false; 294 GLboolean valid; 295 ::glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID,&valid); 296 if(!valid) return false; 297 float pos[4]; 298 ::glGetFloatv(GL_CURRENT_RASTER_POSITION,pos); 299 int xoff = -(int)(aXmove + aXorig); 300 int yoff = -(int)(aYmove + aYorig); 301 int x = (int)(pos[0] + xoff); 302 int y = (int)(pos[1] + yoff); 303 // Should clip against viewport area : 304 GLint vp[4]; 305 ::glGetIntegerv(GL_VIEWPORT,vp); 306 GLsizei w = aWidth; 307 GLsizei h = aHeight; 308 if(x+w>(vp[0]+vp[2])) w = vp[0]+vp[2]-x; 309 if(y+h>(vp[1]+vp[3])) h = vp[1]+vp[3]-y; 310 int s = 3 * w * h; 311 if(s<=0) return false; 312 float* image = (float*)::malloc(s * sizeof(float)); 313 if(!image) return false; 314 ::glReadPixels(x,y,w,h,GL_RGB,GL_FLOAT,image); 315 GLint status = ::tools_gl2psDrawPixels(fContext,w,h,xoff,yoff,GL_RGB,GL_FLOAT,image); 316 ::free(image); 317 return (status!=TOOLS_GL2PS_SUCCESS ? false : true); 318 } 319 320