Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SoImageWriter.cc
Go to the documentation of this file.
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#ifdef G4VIS_BUILD_OI_DRIVER
27
28/*----------------------------HEPVis----------------------------------------*/
29/* */
30/* Node: SoImageWriter */
31/* Author: Guy Barrand */
32/* */
33/*--------------------------------------------------------------------------*/
34
35// this :
37
38#include <Inventor/errors/SoDebugError.h>
39#include <Inventor/elements/SoViewportRegionElement.h>
40#include <Inventor/actions/SoGLRenderAction.h>
41
42#include <HEPVis/SbGL.h>
43#include <HEPVis/SbPainterPS.h>
44//#include <HEPVis/SbGIF.h>
45
46#include <stdlib.h>
47
48typedef struct {
49 unsigned char red;
50 unsigned char green;
51 unsigned char blue;
52} Pixel;
53typedef unsigned char Uchar;
54
55//static void getImagePixels(int,int,float*,int&,
56// Uchar*&,Uchar*&,Uchar*&,Uchar*&);
57
58static int sWidth = 0;
59static int sHeight = 0;
60static float* sImage = 0;
61static int getRGB(unsigned int,unsigned int,double&,double&,double&);
62
63SO_NODE_SOURCE(SoImageWriter)
64//////////////////////////////////////////////////////////////////////////////
66)
67//////////////////////////////////////////////////////////////////////////////
68//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
69{
70 SO_NODE_INIT_CLASS(SoImageWriter,SoNode,"Node");
71}
72//////////////////////////////////////////////////////////////////////////////
74)
75:fEnabled(FALSE)
76,fStatus(FALSE)
77//////////////////////////////////////////////////////////////////////////////
78//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
79{
80 SO_NODE_CONSTRUCTOR(SoImageWriter);
81 //SO_NODE_ADD_FIELD(format,(POST_SCRIPT));
82 SO_NODE_ADD_FIELD(fileName,("out.ps"));
83
84 //SO_NODE_DEFINE_ENUM_VALUE(Format,POST_SCRIPT);
85 //SO_NODE_DEFINE_ENUM_VALUE(Format,GIF);
86
87 //SO_NODE_SET_SF_ENUM_TYPE(format,Format);
88}
89//////////////////////////////////////////////////////////////////////////////
91)
92//////////////////////////////////////////////////////////////////////////////
93//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
94{
95}
96//////////////////////////////////////////////////////////////////////////////
98)
99//////////////////////////////////////////////////////////////////////////////
100//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
101{
102 fEnabled = TRUE;
103}
104//////////////////////////////////////////////////////////////////////////////
106)
107//////////////////////////////////////////////////////////////////////////////
108//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
109{
110 fEnabled = FALSE;
111}
112//////////////////////////////////////////////////////////////////////////////
114) const
115//////////////////////////////////////////////////////////////////////////////
116//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
117{
118 return fStatus;
119}
120//////////////////////////////////////////////////////////////////////////////
122 SoGLRenderAction* aAction
123)
124//////////////////////////////////////////////////////////////////////////////
125//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
126{
127 fStatus = FALSE;
128 //printf("debug : SoImageWriter::GLRender : enabled : %d\n",fEnabled);
129 if(!fEnabled) return;
130 SbViewportRegion vpr = SoViewportRegionElement::get(aAction->getState());
131 const SbVec2s& win = vpr.getWindowSize();
132 int w = win[0];
133 int h = win[1];
134 if((w*h)<=0) {
135 SoDebugError::postInfo("SoImageWriter::GLRender","null area window !");
136 return;
137 }
138
139 int x = 0;
140 int y = 0;
141 int s = 3 * w * h;
142 float* image = new float[s];
143 if(!image) return;
144
145 //printf("debug : SoImageWriter::GLRender : %d %d %d %d\n",x,y,w,h);
146
147 //glReadPixels(x,y,w,h,GL_RGB,GL_UNSIGNED_BYTE,image); Don't work !
148 glReadPixels(x,y,w,h,GL_RGB,GL_FLOAT,image);
149
150 //Format fm = (Format)format.getValue();
151 //if(fm==GIF) {
152/*
153 FILE* file = fopen(fileName.getValue().getString(),"wb");
154 if(!file) {
155 SoDebugError::postInfo("SoImageWriter::GLRender",
156 "can't open file \"%s\".",fileName.getValue().getString());
157 } else {
158 int coln;
159 Uchar* rs;
160 Uchar* gs;
161 Uchar* bs;
162 Uchar* data;
163 getImagePixels(w,h,image,coln,rs,gs,bs,data);
164
165 SbGIF::putBytesInStream(file,data,w,h,coln,rs,gs,bs);
166
167 delete [] data;
168
169 if(rs) free(rs);
170 if(gs) free(gs);
171 if(bs) free(bs);
172
173 fclose(file);
174
175 fStatus = TRUE;
176 }
177 } else {
178*/
179
180 SbPainterPS painterPS;
181 painterPS.openFileForWriting(fileName.getValue().getString());
182 if(!painterPS.getStream()) {
183 SoDebugError::postInfo("SoImageWriter::GLRender",
184 "can't open file \"%s\".",fileName.getValue().getString());
185 } else {
186 painterPS.setWindowSize(w,h);
187 //painterPS.setBitsPerPixel(8);
188 painterPS.setBitsPerPixel(4);
189 painterPS.beginTraversal();
190 painterPS.clearColorBuffer(1.,1.,1.);
191
192 sWidth = w;
193 sHeight = h;
194 sImage = image;
195 painterPS.putImageInStream((unsigned int)w,(unsigned int)h,getRGB);
196
197 painterPS.endTraversal();
198
199 painterPS.closeStream();
200
201 fStatus = TRUE;
202 }
203 //}
204 delete [] image;
205
206}
207/*
208//////////////////////////////////////////////////////////////////////////////
209void getImagePixels (
210 int aWidth
211,int aHeight
212,float* aImage
213,int& aColorn
214,Uchar*& aReds
215,Uchar*& aGreens
216,Uchar*& aBlues
217,Uchar*& aData
218)
219//////////////////////////////////////////////////////////////////////////////
220//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
221{
222 aColorn = 0;
223 aReds = 0;
224 aGreens = 0;
225 aBlues = 0;
226 aData = 0;
227 if( (aWidth * aHeight) <=0) return;
228 int size = 256;
229 Uchar* rs = (Uchar*)malloc(size * sizeof(Uchar));
230 Uchar* gs = (Uchar*)malloc(size * sizeof(Uchar));
231 Uchar* bs = (Uchar*)malloc(size * sizeof(Uchar));
232 Uchar* data = new Uchar[aWidth * aHeight];
233 if( !rs || !gs || !bs || !data ) {
234 if(rs) free(rs);
235 if(gs) free(gs);
236 if(bs) free(bs);
237 delete [] data;
238 return;
239 }
240 int pixeln = 0;
241 int row,col;
242 Uchar red,green,blue;
243 Uchar ored = 0,ogreen = 0,oblue = 0;
244 float* pimag = aImage;
245 Uchar* pdata = 0;
246 Uchar index = 0;
247 int status = 0;
248 for(row=0;row<aHeight;row++) {
249 pdata = data + (aHeight - 1 - row) * aWidth;
250 for(col=0;col<aWidth;col++){
251 red = (Uchar)(255 * (*pimag));pimag++;
252 green = (Uchar)(255 * (*pimag));pimag++;
253 blue = (Uchar)(255 * (*pimag));pimag++;
254 //printf("debug : %d %d : %d %d %d\n",row,col,red,green,blue);
255 if( (pixeln==0) || (red!=ored) || (green!=ogreen) || (blue!=oblue) ){
256 // Search exact color :
257 int found = 0;
258 for(int count=0;count<pixeln;count++){
259 if( (red==rs[count]) && (green==gs[count]) && (blue==bs[count]) ){
260 found = 1;
261 index = count;
262 break;
263 }
264 }
265 if(found==0){
266 if(pixeln>=256) {
267 // We can't store more than 256 on an Uchar.
268 // Search closest color :
269 int dr,dg,db;
270 int PRECISION = 20;
271 int closest = 0;
272 for(int count=0;count<pixeln;count++){
273 dr = red - rs[count];dr = dr<0 ? -dr : dr;
274 dg = green - gs[count];dg = dg<0 ? -dg : dg;
275 db = blue - bs[count];db = db<0 ? -db : db;
276 if( (dr<=PRECISION) && (dg<=PRECISION) && (db<=PRECISION) ){
277 closest = 1;
278 index = count;
279 break;
280 }
281 }
282 if(closest==0) {
283 index = 0;
284 status = 1;
285 }
286 } else {
287 if(pixeln>=size){
288 size += 256;
289 rs = (Uchar*)realloc(rs,size * sizeof(Uchar));
290 gs = (Uchar*)realloc(gs,size * sizeof(Uchar));
291 bs = (Uchar*)realloc(bs,size * sizeof(Uchar));
292 if( !rs || !gs || !bs ) {
293 if(rs) free(rs);
294 if(gs) free(gs);
295 if(bs) free(bs);
296 delete [] data;
297 return;
298 }
299 }
300 //printf("debug : SoImageWriter pixeln %d : %d %d %d\n",
301 // pixeln,red,green,blue);
302 rs[pixeln] = red;
303 gs[pixeln] = green;
304 bs[pixeln] = blue;
305 index = pixeln;
306 pixeln++;
307 }
308 }
309 }
310 *pdata = index;
311 pdata++;
312 ored = red;
313 ogreen = green;
314 oblue = blue;
315 }
316 }
317 if(status==1)
318 printf("SoImageWriter : more than 256 colors in picture ; some colors approximated.\n");
319 aColorn = pixeln;
320 aReds = rs;
321 aGreens = gs;
322 aBlues = bs;
323 aData = data;
324}
325*/
326//////////////////////////////////////////////////////////////////////////////
327int getRGB(
328 unsigned int aX
329,unsigned int aY
330,double& aRed
331,double& aGreen
332,double& aBlue
333)
334//////////////////////////////////////////////////////////////////////////////
335// OpenGL image is from down to up.
336// PS image is up to down.
337//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
338{
339 float* pimag = sImage + 3 * (sWidth * (sHeight - 1 - aY) + aX);
340 aRed = *pimag;pimag++;
341 aGreen = *pimag;pimag++;
342 aBlue = *pimag;pimag++;
343 return 1;
344}
345
346#endif
void endTraversal()
void beginTraversal()
void putImageInStream(unsigned int, unsigned int, GetRGB_Function)
void setBitsPerPixel(int)
void clearColorBuffer(float, float, float)
void openFileForWriting(const char *)
void * getStream()
void closeStream()
void setWindowSize(int, int)
virtual void GLRender(SoGLRenderAction *)
virtual ~SoImageWriter()
static void initClass()
SbBool getStatus() const
SoSFString fileName
Definition: SoImageWriter.h:50
#define TRUE
Definition: globals.hh:55
#define FALSE
Definition: globals.hh:52
#define const
Definition: zconf.h:118