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
SbPainterPS.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: SbPainterPS */
31/* Author: Guy Barrand */
32/* */
33/*--------------------------------------------------------------------------*/
34// this :
35#include <HEPVis/SbPainterPS.h>
36
37//#include <HEPVis/SbString.h>
38#define STRDUP(str) ((str) != NULL ? (::strcpy((char*)::malloc((unsigned)::strlen(str) + 1), str)) : (char*)NULL)
39#define STRDEL(str) {if((str)!=NULL) {::free(str);str=NULL;}}
40
41//#define DEBUG
42#include <stdlib.h>
43#include <string.h>
44#include <stdio.h>
45#include <stdarg.h>
46#include <time.h>
47#include <locale.h>
48
49#define METAFILE_DEFAULT "out.ps"
50#define METAFILE_SCALE 1.
51
52static char* GetDate();
53static double ConvertRGB_ToGrey(double,double,double);
54//////////////////////////////////////////////////////////////////////////////
56)
57:fDeviceWidth((8.5-1.) * 72. * METAFILE_SCALE) /* 540. * METAFILE_SCALE */
58,fDeviceHeight(11. * 72. * METAFILE_SCALE) /* 792. * METAFILE_SCALE */
59,fPageNumber(0)
60,fPagePos(0)
61,fMarkerSize(2.)
62,fFile(NULL)
63,fFileName(NULL)
64,fGSave(0)
65,fBufferCount(0)
66,fBufferString(NULL)
67//////////////////////////////////////////////////////////////////////////////
68//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
69{
70 fParams.shade = Color;
71 fParams.portrait = 1;
72 fParams.nbit = 2;
73 fParams.doBack = 1;
74 fParams.lineWidth = -1.;
75#ifdef WIN32
76 ::setlocale(LC_NUMERIC,"USA");
77#endif
78}
79//////////////////////////////////////////////////////////////////////////////
81)
82//////////////////////////////////////////////////////////////////////////////
83//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
84{
85 if(fFile!=NULL) closeStream ();
86 if(fBufferString!=NULL) ::free(fBufferString);
87 fBufferString = NULL;
88 if(fGSave!=0) {
89 ::printf("SbPainterPS : bad gsave/grestore balance : %d.\n",fGSave);
90 }
91}
92//////////////////////////////////////////////////////////////////////////////
93//////////////////////////////////////////////////////////////////////////////
94//////////////////////////////////////////////////////////////////////////////
96)
97//////////////////////////////////////////////////////////////////////////////
98//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
99{
100 if(fFile==NULL) openFileForWriting(NULL);
101 if(fFile==NULL) return;
103 putPageScaleInStream((float)fWindowWidth,(float)fWindowHeight);
105}
106//////////////////////////////////////////////////////////////////////////////
108)
109//////////////////////////////////////////////////////////////////////////////
110//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
111{
112 if(fFile==NULL) return;
113 putFrameInStream(0.0,0.0,0.0,(float)fWindowWidth,(float)fWindowHeight);
116}
117//////////////////////////////////////////////////////////////////////////////
119 float aRed
120,float aGreen
121,float aBlue
122)
123//////////////////////////////////////////////////////////////////////////////
124//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
125{
126 if(fFile==NULL) return;
127 putBackgroundInStream(aRed,aGreen,aBlue,
128 (float)fWindowWidth,(float)fWindowHeight);
129}
130/*
131//////////////////////////////////////////////////////////////////////////////
132void SbPainterPS::drawPrimitive (
133 SbPrimitiveType aType
134,int aPointn
135,float* aXs
136,float* aYs
137,float* //aZs
138,const SbPainterContext& aAtb
139)
140//////////////////////////////////////////////////////////////////////////////
141//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
142{
143 if(fFile==NULL) return;
144 switch(aType) {
145 case SbPrimitivePoints:
146 drawMarkers(aPointn,
147 aXs,aYs,
148 aAtb.fRed,aAtb.fGreen,aAtb.fBlue,
149 aAtb.fMarkerStyle,aAtb.fMarkerSize);
150 break;
151 case SbPrimitiveLineStrip:
152 case SbPrimitiveLineLoop:
153 drawLines(aPointn,
154 aXs,aYs,
155 aAtb.fRed,aAtb.fGreen,aAtb.fBlue,
156 aAtb.fLineStyle,aAtb.fLineWidth);
157 break;
158 case SbPrimitivePolygon:
159 drawPolygon(aPointn,
160 aXs,aYs,
161 aAtb.fRed,aAtb.fGreen,aAtb.fBlue,
162 aAtb.fAreaStyle);
163 break;
164 default:
165 break;
166 }
167}
168//////////////////////////////////////////////////////////////////////////////
169void SbPainterPS::drawPolygon(
170 int aPointn
171,float* aXs
172,float* aYs
173,float aRed
174,float aGreen
175,float aBlue
176,const SbAreaStyle& //aStyle
177)
178//////////////////////////////////////////////////////////////////////////////
179//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
180{
181 if(fFile==NULL) return;
182 if(aPointn<=0) return;
183 putNewPathInStream();
184 putMoveInStream(aXs[0],aYs[0]);
185 for(int count=1;count<aPointn;count++) {
186 putLineToInStream(aXs[count] - aXs[count-1],
187 aYs[count] - aYs[count-1]);
188 }
189 if ( (aXs[0]==aXs[aPointn-1]) &&
190 (aYs[0]==aYs[aPointn-1]) )
191 putClosePathInStream();
192 putRGB_InStream(aRed,aGreen,aBlue);
193 putFillInStream();
194}
195//////////////////////////////////////////////////////////////////////////////
196void SbPainterPS::drawLines(
197 int aPointn
198,float* aXs
199,float* aYs
200,float aRed
201,float aGreen
202,float aBlue
203,const SbLineStyle& aStyle
204,int aWidth
205)
206//////////////////////////////////////////////////////////////////////////////
207//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
208{
209 if(fFile==NULL) return;
210 if(aPointn<=0) return;
211 putMoveInStream(aXs[0],aYs[0]);
212 for(int count=1;count<aPointn;count++) {
213 putLineToInStream(aXs[count] - aXs[count-1],
214 aYs[count] - aYs[count-1]);
215 }
216 if ( (aXs[0]==aXs[aPointn-1]) &&
217 (aYs[0]==aYs[aPointn-1]) )
218 putClosePathInStream();
219 putRGB_InStream(aRed,aGreen,aBlue);
220 putLineWidthInStream(aWidth);
221 putCapInStream(1);
222 putLineStyleInStream(aStyle);
223 putStrokeInStream();
224}
225//////////////////////////////////////////////////////////////////////////////
226void SbPainterPS::drawMarkers (
227 int aPointn
228,float* aXs
229,float* aYs
230,float aRed
231,float aGreen
232,float aBlue
233,const SbMarkerStyle& aStyle
234,int aSize
235)
236//////////////////////////////////////////////////////////////////////////////
237//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
238{
239 if(fFile==NULL) return;
240 float mark_size = (float)(aSize <=0 ? 1. : aSize);
241 mark_size *= 0.6F;
242 if(aStyle==SbMarkerCircleLine) {
243 putNewPathInStream();
244 int icount = 1;
245 for(int count=0;count<aPointn;count++) {
246 putCircleInStream(aXs[count],aYs[count],mark_size);
247#define MAX_PATH_POINT 100
248 if(icount==MAX_PATH_POINT) {
249 putRGB_InStream(aRed,aGreen,aBlue);
250 putLineWidthInStream(1);
251 putCapInStream(1);
252 putStrokeInStream();
253 icount = 1;
254 if(count!=aPointn-1) putNewPathInStream();
255 } else {
256 icount++;
257 }
258 }
259 putRGB_InStream(aRed,aGreen,aBlue);
260 putLineWidthInStream(1);
261 putCapInStream(1);
262 putStrokeInStream();
263 } else {
264 putNewPathInStream();
265 int icount = 1;
266 for(int count=0;count<aPointn;count++) {
267 putMoveInStream(aXs[count],aYs[count]);
268 putMarkerSizeInStream(mark_size);
269 putMarkerStyleInStream(aStyle);
270 if(icount==MAX_PATH_POINT) {
271 putRGB_InStream(aRed,aGreen,aBlue);
272 putLineWidthInStream(1);
273 putCapInStream(1);
274 putStrokeInStream();
275 icount = 1;
276 if(count!=aPointn-1) putNewPathInStream();
277 } else {
278 icount++;
279 }
280 }
281 putRGB_InStream(aRed,aGreen,aBlue);
282 putLineWidthInStream(1);
283 putCapInStream(1);
284 putStrokeInStream();
285 }
286}
287*/
288//////////////////////////////////////////////////////////////////////////////
289//////////////////////////////////////////////////////////////////////////////
290//////////////////////////////////////////////////////////////////////////////
291//////////////////////////////////////////////////////////////////////////////
293 int aShade
294)
295//////////////////////////////////////////////////////////////////////////////
296//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
297{
298 fParams.shade = aShade;
299}
300//////////////////////////////////////////////////////////////////////////////
302 int aPortrait
303)
304//////////////////////////////////////////////////////////////////////////////
305//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
306{
307 fParams.portrait = aPortrait;
308}
309//////////////////////////////////////////////////////////////////////////////
311 int aDoback
312)
313//////////////////////////////////////////////////////////////////////////////
314//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
315{
316 fParams.doBack = aDoback;
317}
318//////////////////////////////////////////////////////////////////////////////
320 int aNbit
321)
322//////////////////////////////////////////////////////////////////////////////
323//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
324{
325 if( (aNbit==2) || (aNbit==4) || (aNbit==8) )
326 fParams.nbit = aNbit;
327 else
328 fParams.nbit = 2;
329}
330//////////////////////////////////////////////////////////////////////////////
332 int aWidth
333)
334//////////////////////////////////////////////////////////////////////////////
335//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
336{
337 fParams.lineWidth = (float)aWidth;
338}
339//////////////////////////////////////////////////////////////////////////////
340//////////////////////////////////////////////////////////////////////////////
341//////////////////////////////////////////////////////////////////////////////
343 const char* aString
344)
345//////////////////////////////////////////////////////////////////////////////
346//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
347{
348 STRDEL(fFileName);
349 fFileName = STRDUP(aString);
350}
351//////////////////////////////////////////////////////////////////////////////
352const char* SbPainterPS::getFileName(
353) const
354//////////////////////////////////////////////////////////////////////////////
355//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
356{
357 return fFileName;
358}
359//////////////////////////////////////////////////////////////////////////////
361)
362//////////////////////////////////////////////////////////////////////////////
363//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
364{
365 return fFile;
366}
367//////////////////////////////////////////////////////////////////////////////
369 const char* aString
370)
371//////////////////////////////////////////////////////////////////////////////
372//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
373{
374 if(fFile!=NULL) closeStream ();
375 if( (aString==NULL) || (*aString=='\0') ) {
376 if( (fFileName==NULL) || (*fFileName=='\0') ) { // Take default name :
377 fFile = ::fopen(METAFILE_DEFAULT,"wb");
378 STRDEL(fFileName);
379 fFileName = STRDUP(METAFILE_DEFAULT);
380 } else {
381 fFile = ::fopen(fFileName,"wb");
382 }
383 } else {
384 fFile = ::fopen(aString,"wb");
385 STRDEL(fFileName);
386 fFileName = STRDUP(aString);
387 }
388 if(fFile==NULL) return;
389
390 fBufferCount = 0;
391 fBufferPointer[METAFILE_RECORD_LENGTH] = '\0';
392 fPageNumber = 0;
393 // Header :
394 printFLN ("%%!PS-Adobe-2.0");
395 printFLN ("%%%%Creator: HEPVis::SbPainterPS.");
396 printFLN("%%%%CreationDate: %s",GetDate());
397 printFLN("%%%%Title: %s",fFileName);
398 printFLN("%%%%Pages: (atend)");
399 printFLN("%%%%BoundingBox: 0 0 %d %d",
400 (int)fDeviceWidth,(int)fDeviceHeight);
401 printFLN("%%%%DocumentFonts: Courier-Bold");
402 printFLN("%%%%DocumentPaperSizes: a4");
403 printFLN("%%%%EndComments");
404 // PostScript :
406 // General :
407 putInStreamF("/n {newpath} def ");
408 putInStreamF("/cl {closepath} def ");
409 putInStreamF("/s {stroke} def ");
410 putInStreamF("/f {fill} def ");
411 // Move :
412 putInStreamF("/m {moveto} def ");
413 putInStreamF("/rm {rmoveto} def ");
414 putInStreamF("/rl {rlineto} def ");
415 // Line :
416 putInStreamF("/lc {setlinecap} def ");
417 putInStreamF("/lw {setlinewidth} def ");
418 putInStreamF("/rgb {setrgbcolor} def ");
419 putInStreamF("/ss {[] 0 setdash} def ") ; /* style solid */
420 putInStreamF("/sd {[12 6] 0 setdash} def "); /* style dashed */
421 putInStreamF("/so {[6 12] 0 setdash} def "); /* style dotted */
422 putInStreamF("/sdo {[18 12 6 12] 0 setdash} def "); /* style dash dotted */
423 // Mark :
424 fMarkerSize = 2.;
425 putInStreamF("/ms 2. def /msi .5 def "); /* mark size */
426 putInStreamF("/cross {ms ms scale -1. -1. rm ");
427 putInStreamF("2. 2. rl 0. -2. rm -2. 2. rl msi msi scale} def ");
428 putInStreamF("/plus {ms ms scale -1. 0. rm 2. 0. rl ");
429 putInStreamF("-1. 1. rm 0. -2. rl msi msi scale} def ");
430 putInStreamF("/asterisk {ms ms scale -1. 0. rm 2. 0. rl -1. 1. rm ");
431 putInStreamF("0. -2. rl 0. 1. rm -0.707 -0.707 rm 1.414 1.414 rl ");
432 putInStreamF("0. -1.414 rm -1.414 1.414 rl msi msi scale} def ");
433 putInStreamF("/triangle {ms ms scale 0. 1. rm -0.6 -1.5 rl ");
434 putInStreamF("1.2 0. rl -0.6 1.5 rl msi msi scale} def ");
435 // Text :
436 putInStreamF("/sh {show} def ");
437 putInStreamF("/df {/Courier-Bold findfont} def ");
438 putInStreamF("/mf {makefont setfont} def ");
439 printFLN("%%%%EndProlog");
440}
441//////////////////////////////////////////////////////////////////////////////
443)
444//////////////////////////////////////////////////////////////////////////////
445//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
446{
447 if(fFile==NULL) return;
449 printFLN("%%%%Trailer");
450 printFLN("%%%%Pages: %d",fPageNumber);
451 printFLN("%%%%EOF");
452 if(fFile!=NULL) ::fclose(fFile);
453 fFile = NULL;
454 STRDEL(fFileName);
455 fFileName = NULL;
456}
457//////////////////////////////////////////////////////////////////////////////
458void SbPainterPS::putInStreamF(
459 const char* aFormat
460,...
461)
462//////////////////////////////////////////////////////////////////////////////
463//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
464{
465 if(fFile==NULL) return;
466 va_list args;
467 va_start(args,aFormat);
468 printV(aFormat,args);
469 va_end(args);
470 int length = ::strlen(fBufferString);
471 if(length>METAFILE_RECORD_LENGTH) {
472 ::printf("SoPostScript::putInStreamF overflow\n");
473 return;
474 }
475 int nlength = fBufferCount + length;
476 if(nlength>METAFILE_RECORD_LENGTH) {
477 fBufferPointer[fBufferCount] = '\0';
478 if(::fprintf(fFile,"%s\n",(char*)fBufferPointer)<0) {
479 ::printf("SoPostScript::putInStreamF fprintf error\n");
480 }
481 fBufferCount = 0;
482 nlength = length;
483 }
484 unsigned char* pointer = fBufferPointer + fBufferCount;
485 ::strcpy((char*)pointer,fBufferString);
486 fBufferCount = nlength;
487}
488//////////////////////////////////////////////////////////////////////////////
489void SbPainterPS::printFLN(
490 const char* aFormat
491,...
492)
493//////////////////////////////////////////////////////////////////////////////
494//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
495{
496 if(fFile==NULL) return;
497 va_list args;
498 va_start(args,aFormat);
499 printV(aFormat,args);
500 va_end(args);
501/* put buffer in file */
502 if(fBufferCount>0) {
503 fBufferPointer[fBufferCount] = '\0';
504 if(::fprintf (fFile,"%s\n",(char*)fBufferPointer)<0) {
505 ::printf("SbPainterPS::printFLN fprintf error\n");
506 }
507 fBufferCount = 0;
508 }
509/* put comment in file */
510 if(::fprintf (fFile,"%s\n",fBufferString)<0) {
511 ::printf("SbPainterPS::printFLN fprintf error\n");
512 }
513}
514//////////////////////////////////////////////////////////////////////////////
515void SbPainterPS::printV(
516 const char* This
517,va_list aArgs
518)
519//////////////////////////////////////////////////////////////////////////////
520//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
521{
522#define MAX_STR 2048
523 if(fBufferString==NULL) {
524 fBufferString = (char*)::malloc(MAX_STR * sizeof(char));
525 if(fBufferString==NULL) return;
526 }
527 fBufferString[MAX_STR-1] = '\0';
528 ::vsprintf(fBufferString,This,aArgs);
529 if(fBufferString[MAX_STR-1]!='\0') {
530 ::printf("SbPainterPS::printV overflow\n");
531 fBufferString[0] = '\0';
532 }
533}
534//////////////////////////////////////////////////////////////////////////////
535//////////////////////////////////////////////////////////////////////////////
536//////////////////////////////////////////////////////////////////////////////
537//////////////////////////////////////////////////////////////////////////////
539 float aWidth
540,float aHeight
541)
542//////////////////////////////////////////////////////////////////////////////
543//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
544{
545 if(aWidth <=0.) aWidth = 100.;
546 if(aHeight<=0.) aHeight = 100.;
547
548 putScaleInStream (1./METAFILE_SCALE,1./METAFILE_SCALE);
549 putTranslationInStream ((float)(fDeviceWidth/20.),
550 (float)(fDeviceHeight/30.));
551
552 float scale;
553 if(fDeviceWidth<=fDeviceHeight)
554 scale = (aHeight<=aWidth ?
555 fDeviceWidth /aWidth : fDeviceWidth /aHeight );
556 else
557 scale = (aHeight<=aWidth ?
558 fDeviceHeight /aWidth : fDeviceHeight /aHeight );
559
560 float xtra,ytra;
561 if(fParams.portrait==1) {
562 xtra = (fDeviceWidth - scale * aWidth)/2;
563 ytra = (fDeviceHeight - scale * aHeight)/2;
564 } else {
565 putTranslationInStream(fDeviceWidth,0.);
567 xtra = (fDeviceHeight - scale * aWidth)/2;
568 ytra = (fDeviceWidth - scale * aHeight)/2;
569 }
570 putTranslationInStream (xtra,ytra);
571
572 putScaleInStream (scale,scale);
573}
574//////////////////////////////////////////////////////////////////////////////
575//////////////////////////////////////////////////////////////////////////////
576//////////////////////////////////////////////////////////////////////////////
577//////////////////////////////////////////////////////////////////////////////
579)
580//////////////////////////////////////////////////////////////////////////////
581//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
582{
583 putInStreamF("gsave ");
584 fGSave++;
585}
586//////////////////////////////////////////////////////////////////////////////
588)
589//////////////////////////////////////////////////////////////////////////////
590//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
591{
592 putInStreamF("grestore ");
593 fGSave--;
594}
595//////////////////////////////////////////////////////////////////////////////
597 float aX
598,float aY
599)
600//////////////////////////////////////////////////////////////////////////////
601//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
602{
603 putInStreamF("%.2f %.2f translate ",aX,aY);
604}
605//////////////////////////////////////////////////////////////////////////////
607 float aX
608,float aY
609)
610//////////////////////////////////////////////////////////////////////////////
611//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
612{
613 putInStreamF("%.2f %.2f scale ",aX,aY);
614}
615//////////////////////////////////////////////////////////////////////////////
617)
618//////////////////////////////////////////////////////////////////////////////
619//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
620{
621 fPageNumber++;
622 printFLN("%%%%Page: %d %d",fPageNumber,fPageNumber);
624}
625//////////////////////////////////////////////////////////////////////////////
627)
628//////////////////////////////////////////////////////////////////////////////
629//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
630{
631 putInStreamF("showpage ");
633}
634//////////////////////////////////////////////////////////////////////////////
636 float aR
637,float aG
638,float aB
639)
640//////////////////////////////////////////////////////////////////////////////
641//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
642{
643 if(fParams.shade==Color)
644 putInStreamF("%.2f %.2f %.2f rgb ",aR,aG,aB);
645 else if(fParams.shade==Grey)
646 putInStreamF("%.2f setgray ",convertRGB_ToGrey(aR,aG,aB));
647 else if(fParams.shade==BlackWhite)
648 putInStreamF("0. setgray ",convertRGB_ToGrey(aR,aG,aB));
649}
650//////////////////////////////////////////////////////////////////////////////
652 int aWidth
653)
654//////////////////////////////////////////////////////////////////////////////
655//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
656{
657 if(fParams.lineWidth<0.) {
658 if(aWidth==1) {
659 putInStreamF("%.1f lw ",0.5); // For a better rendering.
660 } else {
661 putInStreamF("%.1f lw ",(float)(aWidth));
662 }
663 } else {
664 putInStreamF("%.1f lw ",fParams.lineWidth);
665 }
666}
667//////////////////////////////////////////////////////////////////////////////
669 float aSize
670)
671//////////////////////////////////////////////////////////////////////////////
672//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
673{
674 if(aSize==fMarkerSize) return;
675 fMarkerSize = aSize;
676 putInStreamF("/ms %g def /msi %g def ",aSize,1./aSize);
677}
678/*
679//////////////////////////////////////////////////////////////////////////////
680void SbPainterPS::putMarkerStyleInStream (
681 SbMarkerStyle aStyle
682)
683//////////////////////////////////////////////////////////////////////////////
684//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
685{
686 switch (aStyle) {
687 case SbMarkerPlus:
688 putInStreamF("plus ");
689 break;
690 case SbMarkerAsterisk:
691 case SbMarkerStar:
692 putInStreamF("asterisk ");
693 break;
694 case SbMarkerCross:
695 putInStreamF("cross ");
696 break;
697 case SbMarkerTriangleUpLine:
698 putInStreamF("triangle ");
699 break;
700 default:
701 putLineToInStream(0.,0.);
702 break;
703 }
704}
705*/
706//////////////////////////////////////////////////////////////////////////////
708 float aR
709,float aG
710,float aB
711,float aWidth
712,float aHeight
713)
714//////////////////////////////////////////////////////////////////////////////
715//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
716{
718 putMoveInStream(0.,0.);
719 putLineToInStream(aWidth,0.);
720 putLineToInStream(0.,aHeight);
721 putLineToInStream(-aWidth,0.);
722 putLineToInStream(0.,-aHeight);
724 if(fParams.doBack==1) {
725 // Back :
727 putRGB_InStream(aR,aG,aB);
730 }
731 // Clip :
732 putInStreamF("clip ");
733}
734//////////////////////////////////////////////////////////////////////////////
736 float aR
737,float aG
738,float aB
739,float aWidth
740,float aHeight
741)
742//////////////////////////////////////////////////////////////////////////////
743//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
744{
746 putMoveInStream(0.,0.);
747 putLineToInStream(aWidth,0.);
748 putLineToInStream(0.,aHeight);
749 putLineToInStream(-aWidth,0.);
750 putLineToInStream(0.,-aHeight);
752 putRGB_InStream(aR,aG,aB);
755 putInStreamF("ss ");
757}
758//////////////////////////////////////////////////////////////////////////////
759float SbPainterPS::convertRGB_ToGrey (
760 float aRed
761,float aGreen
762,float aBlue
763)
764//////////////////////////////////////////////////////////////////////////////
765//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
766{
767 return (0.3F * aRed + 0.59F * aGreen + 0.11F * aBlue);
768}
769//////////////////////////////////////////////////////////////////////////////
771 float aX
772)
773//////////////////////////////////////////////////////////////////////////////
774//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
775{
776 putInStreamF("%.2f rotate ",aX);
777}
778//////////////////////////////////////////////////////////////////////////////
780)
781//////////////////////////////////////////////////////////////////////////////
782//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
783{
784 putInStreamF("n ");
785}
786//////////////////////////////////////////////////////////////////////////////
788)
789//////////////////////////////////////////////////////////////////////////////
790//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
791{
792 putInStreamF("s ");
793}
794//////////////////////////////////////////////////////////////////////////////
796)
797//////////////////////////////////////////////////////////////////////////////
798//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
799{
800 putInStreamF("f ");
801}
802//////////////////////////////////////////////////////////////////////////////
804)
805//////////////////////////////////////////////////////////////////////////////
806//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
807{
808 putInStreamF("cl ");
809}
810//////////////////////////////////////////////////////////////////////////////
812 int aX
813)
814//////////////////////////////////////////////////////////////////////////////
815//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
816{
817 putInStreamF("%1d lc ",aX);
818}
819//////////////////////////////////////////////////////////////////////////////
821 float aX
822,float aY
823)
824//////////////////////////////////////////////////////////////////////////////
825//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
826{
827 putInStreamF ("%.2f %.2f rl ",aX,aY);
828}
829//////////////////////////////////////////////////////////////////////////////
831 float aX
832,float aY
833)
834//////////////////////////////////////////////////////////////////////////////
835//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
836{
837 putInStreamF ("%.2f %.2f m ",aX,aY);
838}
839//////////////////////////////////////////////////////////////////////////////
841 float aX
842,float aY
843,float aR
844)
845//////////////////////////////////////////////////////////////////////////////
846//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
847{
848 putInStreamF("%.2f %.2f %.2f 0 360 arc s ",aX,aY,aR);
849}
850/*
851//////////////////////////////////////////////////////////////////////////////
852void SbPainterPS::putLineStyleInStream(
853 SbLineStyle aStyle
854)
855//////////////////////////////////////////////////////////////////////////////
856//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
857{
858 switch(aStyle) {
859 case SbLineSolid:putInStreamF("ss ") ;break;
860 case SbLineDashed:putInStreamF("sd ") ;break;
861 case SbLineDotted:putInStreamF("so ") ;break;
862 case SbLineDashDotted:putInStreamF("sdo ");break;
863 }
864}
865*/
866//////////////////////////////////////////////////////////////////////////////
867//////////////////////////////////////////////////////////////////////////////
868/////// Image ////////////////////////////////////////////////////////////////
869//////////////////////////////////////////////////////////////////////////////
870//////////////////////////////////////////////////////////////////////////////
872 unsigned int aWidth
873,unsigned int aHeight
874,GetRGB_Function aProc
875)
876//////////////////////////////////////////////////////////////////////////////
877//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
878{
879 if((aWidth<=0)||(aHeight<=0)) return;
880 if(!aProc) return;
881
883 putInStreamF ("%d %d scale ", aWidth, aHeight );
884 int status = 1;
885 int nbhex;
886 unsigned int row,col,col_max;
887 double dr,dg,db;
888 typedef unsigned char Uchar;
889 Uchar red,green,blue,b;
890 if(fParams.shade!=0) { /*grey*/
891 putInStreamF ("/picstr %d string def ",aWidth);
892 putInStreamF ("%d %d %d ",aWidth,aHeight,8);
893 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",aWidth,aHeight,aHeight);
894 putInStreamF ("{ currentfile picstr readhexstring pop } " );
895 printFLN ("image " );
896 for ( row = 0; row < aHeight; row++ ){
897 for ( col = 0; col < aWidth; col++){
898 double fgrey;
899 Uchar grey;
900 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
901 fgrey = ConvertRGB_ToGrey(dr,dg,db);
902 grey = (Uchar) ( 255. * fgrey);
903 writeByte (grey);
904 }
905 }
906 nbhex = aWidth * aHeight * 2;
907 printFLN ("%%%% nbhex digit :%d ",nbhex);
908 printFLN ("%%%% nbhex/record_length :%d ",nbhex/METAFILE_RECORD_LENGTH);
909 printFLN ("%%%% nbhex%%record_length :%d ",nbhex%METAFILE_RECORD_LENGTH);
910 }else if(fParams.nbit==2){
911 int nbyte2;
912 nbyte2 = (aWidth * 3)/4;
913 nbyte2 /=3;
914 nbyte2 *=3;
915 col_max = (nbyte2 * 4)/3;
916 /* 2 bit for r and g and b */
917 /* rgbs following each other */
918 putInStreamF ("/rgbstr %d string def ",nbyte2);
919 putInStreamF ("%d %d %d ",col_max,aHeight,2);
920 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",col_max,aHeight,aHeight);
921 putInStreamF ("{ currentfile rgbstr readhexstring pop } " );
922 putInStreamF ("false 3 " );
923 printFLN ("colorimage " );
924 for ( row = 0; row < aHeight; row++ ){
925 for ( col = 0; col < col_max; col+=4){
926 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
927 red = (Uchar) ( 3. * dr);
928 green = (Uchar) ( 3. * dg);
929 blue = (Uchar) ( 3. * db);
930 b = red;
931 b = (b<<2)+green;
932 b = (b<<2)+blue;
933 status = aProc(col+1,row,dr,dg,db)==0 ? 0 : status;
934 red = (Uchar) ( 3. * dr);
935 green = (Uchar) ( 3. * dg);
936 blue = (Uchar) ( 3. * db);
937 b = (b<<2)+red;
938 writeByte (b);
939
940 b = green;
941 b = (b<<2)+blue;
942 status = aProc(col+2,row,dr,dg,db)==0 ? 0 : status;
943 red = (Uchar) ( 3. * dr);
944 green = (Uchar) ( 3. * dg);
945 blue = (Uchar) ( 3. * db);
946 b = (b<<2)+red;
947 b = (b<<2)+green;
948 writeByte (b);
949
950 b = blue;
951 status = aProc(col+3,row,dr,dg,db)==0 ? 0 : status;
952 red = (Uchar) ( 3. * dr);
953 green = (Uchar) ( 3. * dg);
954 blue = (Uchar) ( 3. * db);
955 b = (b<<2)+red;
956 b = (b<<2)+green;
957 b = (b<<2)+blue;
958 writeByte (b);
959 }
960 }
961 }else if(fParams.nbit==4){
962 int nbyte4;
963 nbyte4 = (aWidth * 3)/2;
964 nbyte4 /=3;
965 nbyte4 *=3;
966 col_max = (nbyte4 * 2)/3;
967 /* 4 bit for r and g and b */
968 /* rgbs following each other */
969 putInStreamF ("/rgbstr %d string def ",nbyte4);
970 putInStreamF ("%d %d %d ",col_max,aHeight,4);
971 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",col_max,aHeight,aHeight);
972 putInStreamF ("{ currentfile rgbstr readhexstring pop } " );
973 putInStreamF ("false 3 " );
974 printFLN ("colorimage " );
975 for ( row = 0; row < aHeight; row++ ){
976 for ( col = 0; col < col_max; col+=2){
977 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
978 red = (Uchar) ( 15. * dr);
979 green = (Uchar) ( 15. * dg);
980 putInStreamF ("%x%x",red,green);
981 blue = (Uchar) ( 15. * db);
982
983 status = aProc(col+1,row,dr,dg,db)==0 ? 0 : status;
984 red = (Uchar) ( 15. * dr);
985 putInStreamF ("%x%x",blue,red);
986 green = (Uchar) ( 15. * dg);
987 blue = (Uchar) ( 15. * db);
988 putInStreamF ("%x%x",green,blue);
989 }
990 }
991 }else{
992 int nbyte8;
993 nbyte8 = aWidth * 3;
994 /* 8 bit for r and g and b */
995 putInStreamF ("/rgbstr %d string def ",nbyte8);
996 putInStreamF ("%d %d %d ",aWidth,aHeight,8);
997 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",aWidth,aHeight,aHeight);
998 putInStreamF ("{ currentfile rgbstr readhexstring pop } " );
999 putInStreamF ("false 3 " );
1000 printFLN ("colorimage " );
1001 for ( row = 0; row < aHeight; row++ ){
1002 for ( col = 0; col < aWidth; col++){
1003 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
1004 red = (Uchar) ( 255. * dr);
1005 writeByte (red);
1006 green = (Uchar) ( 255. * dg);
1007 writeByte (green);
1008 blue = (Uchar) ( 255. * db);
1009 writeByte (blue);
1010 }
1011 }
1012 }
1013 if(status==0)
1014 ::printf("SbPainterPS::putImageInStream: problem to retreive some pixel rgb.\n");
1016}
1017//////////////////////////////////////////////////////////////////////////////
1018void SbPainterPS::writeByte (
1019 unsigned char a_byte
1020)
1021//////////////////////////////////////////////////////////////////////////////
1022//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
1023{
1024 unsigned char h = a_byte / 16;
1025 unsigned char l = a_byte % 16;
1026 putInStreamF ("%x%x",h,l);
1027}
1028//////////////////////////////////////////////////////////////////////////////
1029//////////////////////////////////////////////////////////////////////////////
1030//////////////////////////////////////////////////////////////////////////////
1031char* GetDate (
1032)
1033//////////////////////////////////////////////////////////////////////////////
1034// Return local date.
1035//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
1036{
1037 time_t d;
1038 time(&d);
1039 char* string = ctime(&d);
1040 string[24] = '\0';
1041 return string;
1042}
1043//////////////////////////////////////////////////////////////////////////////
1044double ConvertRGB_ToGrey(
1045 double a_red
1046,double a_green
1047,double a_blue
1048)
1049//////////////////////////////////////////////////////////////////////////////
1050//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
1051{
1052 return (0.30 * a_red + 0.59 * a_green + 0.11 * a_blue);
1053}
1054
1055#endif
#define STRDUP(str)
#define STRDEL(str)
#define METAFILE_RECORD_LENGTH
Definition: SbPainterPS.h:115
void putMoveInStream(float, float)
void endTraversal()
void putStrokeInStream()
void putCircleInStream(float, float, float)
void putBeginPageInStream()
void putClosePathInStream()
void setOrientation(int)
void beginTraversal()
void putSaveStateInStream()
void putImageInStream(unsigned int, unsigned int, GetRGB_Function)
void setBackgroundDrawn(int)
void putNewPathInStream()
void setFileName(const char *)
void putCapInStream(int)
void setBitsPerPixel(int)
void clearColorBuffer(float, float, float)
void setColorScheme(int)
void putPageScaleInStream(float, float)
void putLineToInStream(float, float)
void openFileForWriting(const char *)
void setLineWidth(int)
void putRestoreStateInStream()
void putEndPageInStream()
void * getStream()
void putRotateInStream(float)
void putLineWidthInStream(int)
void putMarkerSizeInStream(float)
void putRGB_InStream(float, float, float)
void putFillInStream()
void putBackgroundInStream(float, float, float, float, float)
void putFrameInStream(float, float, float, float, float)
const char * getFileName() const
void putScaleInStream(float, float)
void putTranslationInStream(float, float)
void closeStream()
#define const
Definition: zconf.h:118