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 ]

  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:             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/SoViewportRegionElement.h>
 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*,int&,
 55 //                         Uchar*&,Uchar*&,Uchar*&,Uchar*&);
 56 
 57 static int sWidth = 0;
 58 static int sHeight = 0;
 59 static float* sImage = 0;
 60 static int getRGB(unsigned int,unsigned int,double&,double&,double&);
 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,"Node");
 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_SCRIPT);
 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 : enabled : %d\n",fEnabled);
132   if(!fEnabled) return;
133   SbViewportRegion vpr = SoViewportRegionElement::get(aAction->getState());
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::GLRender","null area window !");
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 : %d %d %d %d\n",x,y,w,h);
149 
150   //glReadPixels(x,y,w,h,GL_RGB,GL_UNSIGNED_BYTE,image); Don't work !
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().getString(),"wb");
157     if(!file) {
158       SoDebugError::postInfo("SoImageWriter::GLRender",
159         "can't open file \"%s\".",fileName.getValue().getString());
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,data);
167       
168       SbGIF::putBytesInStream(file,data,w,h,coln,rs,gs,bs);
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.getValue().getString());
185     if(!painterPS.getStream()) {
186       SoDebugError::postInfo("SoImageWriter::GLRender",
187         "can't open file \"%s\".",fileName.getValue().getString());
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)w,(unsigned int)h,getRGB);
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(Uchar));
233   Uchar* gs = (Uchar*)malloc(size * sizeof(Uchar));
234   Uchar* bs = (Uchar*)malloc(size * sizeof(Uchar));
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) * aWidth;
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",row,col,red,green,blue);
258       if( (pixeln==0) || (red!=ored) || (green!=ogreen) || (blue!=oblue) ){
259         // Search exact color :
260         int found = 0;
261         for(int count=0;count<pixeln;count++){
262           if( (red==rs[count]) && (green==gs[count]) && (blue==bs[count]) ){
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 an Uchar.
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 ? -dr : dr;
277               dg = green - gs[count];dg = dg<0 ? -dg : dg;
278               db = blue  - bs[count];db = db<0 ? -db : db;
279               if( (dr<=PRECISION) && (dg<=PRECISION) && (db<=PRECISION) ){
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 * sizeof(Uchar));
293               gs = (Uchar*)realloc(gs,size * sizeof(Uchar));
294               bs = (Uchar*)realloc(bs,size * sizeof(Uchar));
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 pixeln %d : %d %d %d\n",
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 colors in picture ; some colors approximated.\n");
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 * (sHeight - 1 - aY) + aX);
343   aRed   = *pimag;pimag++;
344   aGreen = *pimag;pimag++;
345   aBlue  = *pimag;pimag++;
346   return 1;
347 }
348