26 #ifdef G4VIS_BUILD_OI_DRIVER
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;}}
49 #define METAFILE_DEFAULT "out.ps"
50 #define METAFILE_SCALE 1.
52 static char* GetDate();
53 static double ConvertRGB_ToGrey(
double,
double,
double);
57 :fDeviceWidth((8.5-1.) * 72. * METAFILE_SCALE)
58 ,fDeviceHeight(11. * 72. * METAFILE_SCALE)
69 fParams.shade =
Color;
73 fParams.lineWidth = -1.;
74 fBufferPointer[0] =
'\0';
76 ::setlocale(LC_NUMERIC,
"USA");
86 if(fBufferString!=NULL)
::free(fBufferString);
89 ::printf(
"SbPainterPS : bad gsave/grestore balance : %d.\n",fGSave);
101 if(fFile==NULL)
return;
112 if(fFile==NULL)
return;
126 if(fFile==NULL)
return;
132 void SbPainterPS::drawPrimitive (
133 SbPrimitiveType aType
138 ,const SbPainterContext& aAtb
143 if(fFile==NULL) return;
145 case SbPrimitivePoints:
148 aAtb.fRed,aAtb.fGreen,aAtb.fBlue,
149 aAtb.fMarkerStyle,aAtb.fMarkerSize);
151 case SbPrimitiveLineStrip:
152 case SbPrimitiveLineLoop:
155 aAtb.fRed,aAtb.fGreen,aAtb.fBlue,
156 aAtb.fLineStyle,aAtb.fLineWidth);
158 case SbPrimitivePolygon:
161 aAtb.fRed,aAtb.fGreen,aAtb.fBlue,
169 void SbPainterPS::drawPolygon(
176 ,const SbAreaStyle& //aStyle
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]);
189 if ( (aXs[0]==aXs[aPointn-1]) &&
190 (aYs[0]==aYs[aPointn-1]) )
191 putClosePathInStream();
192 putRGB_InStream(aRed,aGreen,aBlue);
196 void SbPainterPS::drawLines(
203 ,const SbLineStyle& aStyle
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]);
216 if ( (aXs[0]==aXs[aPointn-1]) &&
217 (aYs[0]==aYs[aPointn-1]) )
218 putClosePathInStream();
219 putRGB_InStream(aRed,aGreen,aBlue);
220 putLineWidthInStream(aWidth);
222 putLineStyleInStream(aStyle);
226 void SbPainterPS::drawMarkers (
233 ,const SbMarkerStyle& aStyle
239 if(fFile==NULL) return;
240 float mark_size = (float)(aSize <=0 ? 1. : aSize);
242 if(aStyle==SbMarkerCircleLine) {
243 putNewPathInStream();
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);
254 if(count!=aPointn-1) putNewPathInStream();
259 putRGB_InStream(aRed,aGreen,aBlue);
260 putLineWidthInStream(1);
264 putNewPathInStream();
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);
276 if(count!=aPointn-1) putNewPathInStream();
281 putRGB_InStream(aRed,aGreen,aBlue);
282 putLineWidthInStream(1);
298 fParams.shade = aShade;
307 fParams.portrait = aPortrait;
316 fParams.doBack = aDoback;
325 if( (aNbit==2) || (aNbit==4) || (aNbit==8) )
326 fParams.nbit = aNbit;
337 fParams.lineWidth = (float)aWidth;
349 fFileName =
STRDUP(aString);
375 if( (aString==NULL) || (*aString==
'\0') ) {
376 if( (fFileName==NULL) || (*fFileName==
'\0') ) {
377 fFile = ::fopen(METAFILE_DEFAULT,
"wb");
379 fFileName =
STRDUP(METAFILE_DEFAULT);
381 fFile = ::fopen(fFileName,
"wb");
384 fFile = ::fopen(aString,
"wb");
386 fFileName =
STRDUP(aString);
388 if(fFile==NULL)
return;
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");
407 putInStreamF(
"/n {newpath} def ");
408 putInStreamF(
"/cl {closepath} def ");
409 putInStreamF(
"/s {stroke} def ");
410 putInStreamF(
"/f {fill} def ");
412 putInStreamF(
"/m {moveto} def ");
413 putInStreamF(
"/rm {rmoveto} def ");
414 putInStreamF(
"/rl {rlineto} def ");
416 putInStreamF(
"/lc {setlinecap} def ");
417 putInStreamF(
"/lw {setlinewidth} def ");
418 putInStreamF(
"/rgb {setrgbcolor} def ");
419 putInStreamF(
"/ss {[] 0 setdash} def ") ;
420 putInStreamF(
"/sd {[12 6] 0 setdash} def ");
421 putInStreamF(
"/so {[6 12] 0 setdash} def ");
422 putInStreamF(
"/sdo {[18 12 6 12] 0 setdash} def ");
425 putInStreamF(
"/ms 2. def /msi .5 def ");
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 ");
436 putInStreamF(
"/sh {show} def ");
437 putInStreamF(
"/df {/Courier-Bold findfont} def ");
438 putInStreamF(
"/mf {makefont setfont} def ");
439 printFLN(
"%%%%EndProlog");
447 if(fFile==NULL)
return;
449 printFLN(
"%%%%Trailer");
450 printFLN(
"%%%%Pages: %d",fPageNumber);
452 if(fFile!=NULL) ::fclose(fFile);
458 void SbPainterPS::putInStreamF(
465 if(fFile==NULL)
return;
467 va_start(args,aFormat);
468 printV(aFormat,args);
470 int length = ::strlen(fBufferString);
472 ::printf(
"SoPostScript::putInStreamF overflow\n");
475 int nlength = fBufferCount + length;
477 fBufferPointer[fBufferCount] =
'\0';
478 if(::fprintf(fFile,
"%s\n",(
char*)fBufferPointer)<0) {
479 ::printf(
"SoPostScript::putInStreamF fprintf error\n");
484 unsigned char* pointer = fBufferPointer + fBufferCount;
485 ::strcpy((
char*)pointer,fBufferString);
486 fBufferCount = nlength;
489 void SbPainterPS::printFLN(
496 if(fFile==NULL)
return;
498 va_start(args,aFormat);
499 printV(aFormat,args);
503 fBufferPointer[fBufferCount] =
'\0';
504 if(::fprintf (fFile,
"%s\n",(
char*)fBufferPointer)<0) {
505 ::printf(
"SbPainterPS::printFLN fprintf error\n");
510 if(::fprintf (fFile,
"%s\n",fBufferString)<0) {
511 ::printf(
"SbPainterPS::printFLN fprintf error\n");
515 void SbPainterPS::printV(
523 if(fBufferString==NULL) {
524 fBufferString = (
char*)::
malloc(MAX_STR *
sizeof(
char));
525 if(fBufferString==NULL)
return;
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';
545 if(aWidth <=0.) aWidth = 100.;
546 if(aHeight<=0.) aHeight = 100.;
550 (
float)(fDeviceHeight/30.));
553 if(fDeviceWidth<=fDeviceHeight)
554 scale = (aHeight<=aWidth ?
555 fDeviceWidth /aWidth : fDeviceWidth /aHeight );
557 scale = (aHeight<=aWidth ?
558 fDeviceHeight /aWidth : fDeviceHeight /aHeight );
561 if(fParams.portrait==1) {
562 xtra = (fDeviceWidth - scale * aWidth)/2;
563 ytra = (fDeviceHeight - scale * aHeight)/2;
567 xtra = (fDeviceHeight - scale * aWidth)/2;
568 ytra = (fDeviceWidth - scale * aHeight)/2;
583 putInStreamF(
"gsave ");
592 putInStreamF(
"grestore ");
603 putInStreamF(
"%.2f %.2f translate ",aX,aY);
613 putInStreamF(
"%.2f %.2f scale ",aX,aY);
622 printFLN(
"%%%%Page: %d %d",fPageNumber,fPageNumber);
631 putInStreamF(
"showpage ");
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));
657 if(fParams.lineWidth<0.) {
659 putInStreamF(
"%.1f lw ",0.5);
661 putInStreamF(
"%.1f lw ",(
float)(aWidth));
664 putInStreamF(
"%.1f lw ",fParams.lineWidth);
674 if(aSize==fMarkerSize)
return;
676 putInStreamF(
"/ms %g def /msi %g def ",aSize,1./aSize);
680 void SbPainterPS::putMarkerStyleInStream (
688 putInStreamF("plus ");
690 case SbMarkerAsterisk:
692 putInStreamF("asterisk ");
695 putInStreamF("cross ");
697 case SbMarkerTriangleUpLine:
698 putInStreamF("triangle ");
701 putLineToInStream(0.,0.);
724 if(fParams.doBack==1) {
732 putInStreamF(
"clip ");
759 float SbPainterPS::convertRGB_ToGrey (
767 return (0.3F * aRed + 0.59F * aGreen + 0.11F * aBlue);
776 putInStreamF(
"%.2f rotate ",aX);
817 putInStreamF(
"%1d lc ",aX);
827 putInStreamF (
"%.2f %.2f rl ",aX,aY);
837 putInStreamF (
"%.2f %.2f m ",aX,aY);
848 putInStreamF(
"%.2f %.2f %.2f 0 360 arc s ",aX,aY,aR);
852 void SbPainterPS::putLineStyleInStream(
859 case SbLineSolid:putInStreamF("ss ") ;break;
860 case SbLineDashed:putInStreamF("sd ") ;break;
861 case SbLineDotted:putInStreamF("so ") ;break;
862 case SbLineDashDotted:putInStreamF("sdo ");break;
873 ,
unsigned int aHeight
874 ,GetRGB_Function aProc
879 if((aWidth<=0)||(aHeight<=0))
return;
883 putInStreamF (
"%d %d scale ", aWidth, aHeight );
886 unsigned int row,col,col_max;
888 typedef unsigned char Uchar;
890 if(fParams.shade!=0) {
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++){
900 status = aProc(col,row,dr,dg,db)==0 ? 0 :
status;
901 fgrey = ConvertRGB_ToGrey(dr,dg,db);
902 grey = (Uchar) ( 255. * fgrey);
906 nbhex = aWidth * aHeight * 2;
907 printFLN (
"%%%% nbhex digit :%d ",nbhex);
910 }
else if(fParams.nbit==2){
912 nbyte2 = (aWidth * 3)/4;
915 col_max = (nbyte2 * 4)/3;
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);
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);
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);
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);
961 }
else if(fParams.nbit==4){
963 nbyte4 = (aWidth * 3)/2;
966 col_max = (nbyte4 * 2)/3;
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);
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);
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);
1006 green = (Uchar) ( 255. * dg);
1008 blue = (Uchar) ( 255. * db);
1014 ::printf(
"SbPainterPS::putImageInStream: problem to retreive some pixel rgb.\n");
1018 void SbPainterPS::writeByte (
1019 unsigned char a_byte
1024 unsigned char h = a_byte / 16;
1025 unsigned char l = a_byte % 16;
1026 putInStreamF (
"%x%x",h,l);
1039 char*
string = ctime(&d);
1044 double ConvertRGB_ToGrey(
1052 return (0.30 * a_red + 0.59 * a_green + 0.11 * a_blue);
void putBeginPageInStream()
void putRestoreStateInStream()
void putNewPathInStream()
void putScaleInStream(float, float)
void clearColorBuffer(float, float, float)
void putMarkerSizeInStream(float)
void putImageInStream(unsigned int, unsigned int, GetRGB_Function)
#define METAFILE_RECORD_LENGTH
void openFileForWriting(const char *)
void putPageScaleInStream(float, float)
void setFileName(const char *)
const char * getFileName() const
void putRGB_InStream(float, float, float)
void putTranslationInStream(float, float)
void setBackgroundDrawn(int)
void putCircleInStream(float, float, float)
void putFrameInStream(float, float, float, float, float)
void putClosePathInStream()
void putRotateInStream(float)
void putLineWidthInStream(int)
void putBackgroundInStream(float, float, float, float, float)
void putSaveStateInStream()
void putEndPageInStream()
void putMoveInStream(float, float)
void putLineToInStream(float, float)
void * malloc(size_t __size)
void setBitsPerPixel(int)