Geant4-11
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
27/*----------------------------HEPVis----------------------------------------*/
28/* */
29/* Node: SoImageWriter */
30/* Author: Guy Barrand */
31/* */
32/*--------------------------------------------------------------------------*/
33
34// this :
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
47typedef struct {
48 unsigned char red;
49 unsigned char green;
50 unsigned char blue;
51} Pixel;
52typedef unsigned char Uchar;
53
54//static void getImagePixels(int,int,float*,int&,
55// Uchar*&,Uchar*&,Uchar*&,Uchar*&);
56
57static int sWidth = 0;
58static int sHeight = 0;
59static float* sImage = 0;
60static int getRGB(unsigned int,unsigned int,double&,double&,double&);
61
62SO_NODE_SOURCE(SoImageWriter)
64void SoImageWriter::initClass (
65)
68{
69 static bool first = true;
70 if (first) {
71 first = false;
72 SO_NODE_INIT_CLASS(SoImageWriter,SoNode,"Node");
73 }
74}
77)
78:fEnabled(FALSE)
79,fStatus(FALSE)
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}
94)
97{
98}
101)
104{
105 fEnabled = TRUE;
106}
109)
112{
113 fEnabled = FALSE;
114}
117) const
120{
121 return fStatus;
122}
125 SoGLRenderAction* aAction
126)
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/*
212void 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)
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*/
331 unsigned int aX
332,unsigned int aY
333,double& aRed
334,double& aGreen
335,double& aBlue
336)
338// OpenGL image is from down to up.
339// PS image is up to down.
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}
static constexpr double s
Definition: G4SIunits.hh:154
#define TRUE
Definition: Globals.hh:27
#define FALSE
Definition: Globals.hh:23
static int sHeight
unsigned char Uchar
static float * sImage
static int getRGB(unsigned int, unsigned int, double &, double &, double &)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
static int sWidth
void endTraversal()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:105
void beginTraversal()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:93
void putImageInStream(unsigned int, unsigned int, GetRGB_Function)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:869
void setBitsPerPixel(int)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:317
void clearColorBuffer(float, float, float)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:116
void openFileForWriting(const char *)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:366
void * getStream()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:358
void closeStream()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainterPS.cc:440
void setWindowSize(int, int)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Definition: SbPainter.cc:58
virtual ~SoImageWriter()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
virtual void GLRender(SoGLRenderAction *)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
SbBool getStatus() const
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void disable()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
SoSFString fileName
Definition: SoImageWriter.h:50
void enable()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
auto get(Tuple< Elements... > &t) -> decltype(get_height< sizeof...(Elements) - I - 1 >(t))
Definition: Tuple.hh:139
unsigned char blue
unsigned char green
unsigned char red