#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern void Cancel_CB(Widget, XtPointer, XtPointer); extern SoXtExaminerViewer *myViewer; extern SoSeparator *root; extern SoMaterial *BGMaterial; // Hardcoded printer dpi ( as variable dpi ). int PixPerInch = 150; void WriteEPS( Widget menu_item , XtPointer, XtPointer call_data ) { char *file; int dpi = PixPerInch; FILE *fp; XmFileSelectionBoxCallbackStruct* cbs = (XmFileSelectionBoxCallbackStruct*)call_data; if (cbs) { if (!XmStringGetLtoR(cbs->value, XmSTRING_DEFAULT_CHARSET, &file)) { printf("WriteEPS: error\n"); return; } const SbViewportRegion &vp = myViewer->getViewportRegion(); const SbVec2s &imagePixSize = vp.getViewportSizePixels(); SbVec2f imageInches; float pixPerInch; pixPerInch = SoOffscreenRenderer::getScreenPixelsPerInch(); imageInches.setValue( (float)imagePixSize[0] / pixPerInch, (float)imagePixSize[1] / pixPerInch ); SbVec2s postScriptRes; postScriptRes.setValue( (short)(imageInches[0]) * dpi, (short)(imageInches[1]) * dpi ); SbViewportRegion myViewport; myViewport.setWindowSize( postScriptRes ); myViewport.setPixelsPerInch( (float) dpi ); SoOffscreenRenderer *myRenderer = new SoOffscreenRenderer( myViewport ); myRenderer->setComponents( SoOffscreenRenderer::RGB ); myRenderer->setBackgroundColor(*((BGMaterial->diffuseColor).getValues(0))); //myRenderer->setAntialiasing (TRUE, 20); SoDirectionalLight *light = myViewer->getHeadlight(); SoCamera *camera = myViewer->getCamera(); root->insertChild( camera , 0 ); root->insertChild( light , 0); if( !myRenderer->render( root ) ) { delete myRenderer; return; } root->removeChild( 0 ); root->removeChild( 0 ); if( ( fp = fopen( file , "w" ) ) == NULL ) { printf("WriteEPS: can't open file %s\n",file ); Cancel_CB( menu_item , NULL , NULL ); return; } printf("Writing to file %s. Please wait.\n",file ); // myRenderer->writeToRGB( fp ); myRenderer->writeToPostScript( fp ); delete myRenderer; XtFree( file ); fclose( fp ); Cancel_CB( menu_item , NULL , NULL ); } }