Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenInventor/src/SoImageWriter.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/OpenInventor/src/SoImageWriter.cc (Version 11.3.0) and /visualization/OpenInventor/src/SoImageWriter.cc (Version 3.2)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26                                                   
 27 /*----------------------------HEPVis----------    
 28 /*                                                
 29 /* Node:             SoImageWriter                
 30 /* Author:           Guy Barrand                  
 31 /*                                                
 32 /*--------------------------------------------    
 33                                                   
 34 // this :                                         
 35 #include <HEPVis/nodes/SoImageWriter.h>           
 36                                                   
 37 #include <Inventor/errors/SoDebugError.h>         
 38 #include <Inventor/elements/SoViewportRegionEl    
 39 #include <Inventor/actions/SoGLRenderAction.h>    
 40                                                   
 41 #include <HEPVis/SbGL.h>                          
 42 #include <HEPVis/SbPainterPS.h>                   
 43 //#include <HEPVis/SbGIF.h>                       
 44                                                   
 45 #include <stdlib.h>                               
 46                                                   
 47 typedef struct {                                  
 48   unsigned char red;                              
 49   unsigned char green;                            
 50   unsigned char blue;                             
 51 } Pixel;                                          
 52 typedef unsigned char Uchar;                      
 53                                                   
 54 //static void getImagePixels(int,int,float*,in    
 55 //                         Uchar*&,Uchar*&,Uch    
 56                                                   
 57 static int sWidth = 0;                            
 58 static int sHeight = 0;                           
 59 static float* sImage = 0;                         
 60 static int getRGB(unsigned int,unsigned int,do    
 61                                                   
 62 SO_NODE_SOURCE(SoImageWriter)                     
 63 //////////////////////////////////////////////    
 64 void SoImageWriter::initClass (                   
 65 )                                                 
 66 //////////////////////////////////////////////    
 67 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
 68 {                                                 
 69   static bool first = true;                       
 70   if (first) {                                    
 71     first = false;                                
 72     SO_NODE_INIT_CLASS(SoImageWriter,SoNode,"N    
 73   }                                               
 74 }                                                 
 75 //////////////////////////////////////////////    
 76 SoImageWriter::SoImageWriter(                     
 77 )                                                 
 78 :fEnabled(FALSE)                                  
 79 ,fStatus(FALSE)                                   
 80 //////////////////////////////////////////////    
 81 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
 82 {                                                 
 83   SO_NODE_CONSTRUCTOR(SoImageWriter);             
 84   //SO_NODE_ADD_FIELD(format,(POST_SCRIPT));      
 85   SO_NODE_ADD_FIELD(fileName,("out.ps"));         
 86                                                   
 87   //SO_NODE_DEFINE_ENUM_VALUE(Format,POST_SCRI    
 88   //SO_NODE_DEFINE_ENUM_VALUE(Format,GIF);        
 89                                                   
 90   //SO_NODE_SET_SF_ENUM_TYPE(format,Format);      
 91 }                                                 
 92 //////////////////////////////////////////////    
 93 SoImageWriter::~SoImageWriter (                   
 94 )                                                 
 95 //////////////////////////////////////////////    
 96 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
 97 {                                                 
 98 }                                                 
 99 //////////////////////////////////////////////    
100 void SoImageWriter::enable(                       
101 )                                                 
102 //////////////////////////////////////////////    
103 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
104 {                                                 
105   fEnabled = TRUE;                                
106 }                                                 
107 //////////////////////////////////////////////    
108 void SoImageWriter::disable(                      
109 )                                                 
110 //////////////////////////////////////////////    
111 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
112 {                                                 
113   fEnabled = FALSE;                               
114 }                                                 
115 //////////////////////////////////////////////    
116 SbBool SoImageWriter::getStatus(                  
117 ) const                                           
118 //////////////////////////////////////////////    
119 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
120 {                                                 
121   return fStatus;                                 
122 }                                                 
123 //////////////////////////////////////////////    
124 void SoImageWriter::GLRender(                     
125  SoGLRenderAction* aAction                        
126 )                                                 
127 //////////////////////////////////////////////    
128 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
129 {                                                 
130   fStatus = FALSE;                                
131   //printf("debug : SoImageWriter::GLRender :     
132   if(!fEnabled) return;                           
133   SbViewportRegion vpr = SoViewportRegionEleme    
134   const SbVec2s& win = vpr.getWindowSize();       
135   int w = win[0];                                 
136   int h = win[1];                                 
137   if((w*h)<=0) {                                  
138     SoDebugError::postInfo("SoImageWriter::GLR    
139     return;                                       
140   }                                               
141                                                   
142   int x = 0;                                      
143   int y = 0;                                      
144   int s = 3 * w * h;                              
145   float* image = new float[s];                    
146   if(!image) return;                              
147                                                   
148   //printf("debug : SoImageWriter::GLRender :     
149                                                   
150   //glReadPixels(x,y,w,h,GL_RGB,GL_UNSIGNED_BY    
151   glReadPixels(x,y,w,h,GL_RGB,GL_FLOAT,image);    
152                                                   
153   //Format fm = (Format)format.getValue();        
154   //if(fm==GIF) {                                 
155 /*                                                
156     FILE* file = fopen(fileName.getValue().get    
157     if(!file) {                                   
158       SoDebugError::postInfo("SoImageWriter::G    
159         "can't open file \"%s\".",fileName.get    
160     } else {                                      
161       int coln;                                   
162       Uchar* rs;                                  
163       Uchar* gs;                                  
164       Uchar* bs;                                  
165       Uchar* data;                                
166       getImagePixels(w,h,image,coln,rs,gs,bs,d    
167                                                   
168       SbGIF::putBytesInStream(file,data,w,h,co    
169                                                   
170       delete [] data;                             
171                                                   
172       if(rs) free(rs);                            
173       if(gs) free(gs);                            
174       if(bs) free(bs);                            
175                                                   
176       fclose(file);                               
177                                                   
178       fStatus = TRUE;                             
179     }                                             
180   } else {                                        
181 */                                                
182                                                   
183     SbPainterPS painterPS;                        
184     painterPS.openFileForWriting(fileName.getV    
185     if(!painterPS.getStream()) {                  
186       SoDebugError::postInfo("SoImageWriter::G    
187         "can't open file \"%s\".",fileName.get    
188     } else {                                      
189       painterPS.setWindowSize(w,h);               
190       //painterPS.setBitsPerPixel(8);             
191       painterPS.setBitsPerPixel(4);               
192       painterPS.beginTraversal();                 
193       painterPS.clearColorBuffer(1.,1.,1.);       
194                                                   
195       sWidth = w;                                 
196       sHeight = h;                                
197       sImage = image;                             
198       painterPS.putImageInStream((unsigned int    
199                                                   
200       painterPS.endTraversal();                   
201                                                   
202       painterPS.closeStream();                    
203                                                   
204       fStatus = TRUE;                             
205     }                                             
206   //}                                             
207   delete [] image;                                
208                                                   
209 }                                                 
210 /*                                                
211 //////////////////////////////////////////////    
212 void getImagePixels (                             
213  int aWidth                                       
214 ,int aHeight                                      
215 ,float* aImage                                    
216 ,int& aColorn                                     
217 ,Uchar*& aReds                                    
218 ,Uchar*& aGreens                                  
219 ,Uchar*& aBlues                                   
220 ,Uchar*& aData                                    
221 )                                                 
222 //////////////////////////////////////////////    
223 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
224 {                                                 
225   aColorn = 0;                                    
226   aReds = 0;                                      
227   aGreens = 0;                                    
228   aBlues = 0;                                     
229   aData = 0;                                      
230   if( (aWidth * aHeight) <=0) return;             
231   int size = 256;                                 
232   Uchar* rs = (Uchar*)malloc(size * sizeof(Uch    
233   Uchar* gs = (Uchar*)malloc(size * sizeof(Uch    
234   Uchar* bs = (Uchar*)malloc(size * sizeof(Uch    
235   Uchar* data = new Uchar[aWidth * aHeight];      
236   if( !rs || !gs || !bs || !data ) {              
237     if(rs) free(rs);                              
238     if(gs) free(gs);                              
239     if(bs) free(bs);                              
240     delete [] data;                               
241     return;                                       
242   }                                               
243   int pixeln = 0;                                 
244   int row,col;                                    
245   Uchar red,green,blue;                           
246   Uchar ored = 0,ogreen = 0,oblue = 0;            
247   float* pimag = aImage;                          
248   Uchar* pdata = 0;                               
249   Uchar index = 0;                                
250   int status = 0;                                 
251   for(row=0;row<aHeight;row++) {                  
252     pdata = data + (aHeight - 1 - row) * aWidt    
253     for(col=0;col<aWidth;col++){                  
254       red   = (Uchar)(255 * (*pimag));pimag++;    
255       green = (Uchar)(255 * (*pimag));pimag++;    
256       blue  = (Uchar)(255 * (*pimag));pimag++;    
257       //printf("debug : %d %d : %d %d %d\n",ro    
258       if( (pixeln==0) || (red!=ored) || (green    
259         // Search exact color :                   
260         int found = 0;                            
261         for(int count=0;count<pixeln;count++){    
262           if( (red==rs[count]) && (green==gs[c    
263             found = 1;                            
264             index = count;                        
265             break;                                
266           }                                       
267         }                                         
268         if(found==0){                             
269           if(pixeln>=256) {                       
270             // We can't store more than 256 on    
271             // Search closest color :             
272             int dr,dg,db;                         
273             int PRECISION = 20;                   
274             int closest = 0;                      
275             for(int count=0;count<pixeln;count    
276               dr = red   - rs[count];dr = dr<0    
277               dg = green - gs[count];dg = dg<0    
278               db = blue  - bs[count];db = db<0    
279               if( (dr<=PRECISION) && (dg<=PREC    
280                 closest = 1;                      
281                 index = count;                    
282                 break;                            
283               }                                   
284             }                                     
285             if(closest==0) {                      
286               index = 0;                          
287               status  = 1;                        
288             }                                     
289           } else {                                
290             if(pixeln>=size){                     
291               size += 256;                        
292               rs = (Uchar*)realloc(rs,size * s    
293               gs = (Uchar*)realloc(gs,size * s    
294               bs = (Uchar*)realloc(bs,size * s    
295               if( !rs || !gs || !bs ) {           
296                 if(rs) free(rs);                  
297                 if(gs) free(gs);                  
298                 if(bs) free(bs);                  
299                 delete [] data;                   
300                 return;                           
301               }                                   
302             }                                     
303             //printf("debug : SoImageWriter pi    
304             //   pixeln,red,green,blue);          
305             rs[pixeln] = red;                     
306             gs[pixeln] = green;                   
307             bs[pixeln] = blue;                    
308             index = pixeln;                       
309             pixeln++;                             
310           }                                       
311         }                                         
312       }                                           
313       *pdata = index;                             
314       pdata++;                                    
315       ored = red;                                 
316       ogreen = green;                             
317       oblue = blue;                               
318     }                                             
319   }                                               
320   if(status==1)                                   
321     printf("SoImageWriter : more than 256 colo    
322   aColorn = pixeln;                               
323   aReds = rs;                                     
324   aGreens = gs;                                   
325   aBlues = bs;                                    
326   aData = data;                                   
327 }                                                 
328 */                                                
329 //////////////////////////////////////////////    
330 int getRGB(                                       
331  unsigned int aX                                  
332 ,unsigned int aY                                  
333 ,double& aRed                                     
334 ,double& aGreen                                   
335 ,double& aBlue                                    
336 )                                                 
337 //////////////////////////////////////////////    
338 // OpenGL image is from down to up.               
339 // PS image is up to down.                        
340 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
341 {                                                 
342   float* pimag = sImage + 3 * (sWidth * (sHeig    
343   aRed   = *pimag;pimag++;                        
344   aGreen = *pimag;pimag++;                        
345   aBlue  = *pimag;pimag++;                        
346   return 1;                                       
347 }                                                 
348