00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifdef G4VIS_BUILD_OI_DRIVER
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <HEPVis/SbPainterPS.h>
00036
00037
00038 #define STRDUP(str) ((str) != NULL ? (::strcpy((char*)::malloc((unsigned)::strlen(str) + 1), str)) : (char*)NULL)
00039 #define STRDEL(str) {if((str)!=NULL) {::free(str);str=NULL;}}
00040
00041
00042 #include <stdlib.h>
00043 #include <string.h>
00044 #include <stdio.h>
00045 #include <stdarg.h>
00046 #include <time.h>
00047 #include <locale.h>
00048
00049 #define METAFILE_DEFAULT "out.ps"
00050 #define METAFILE_SCALE 1.
00051
00052 static char* GetDate();
00053 static double ConvertRGB_ToGrey(double,double,double);
00055 SbPainterPS::SbPainterPS(
00056 )
00057 :fDeviceWidth((8.5-1.) * 72. * METAFILE_SCALE)
00058 ,fDeviceHeight(11. * 72. * METAFILE_SCALE)
00059 ,fPageNumber(0)
00060 ,fPagePos(0)
00061 ,fMarkerSize(2.)
00062 ,fFile(NULL)
00063 ,fFileName(NULL)
00064 ,fGSave(0)
00065 ,fBufferCount(0)
00066 ,fBufferString(NULL)
00069 {
00070 fParams.shade = Color;
00071 fParams.portrait = 1;
00072 fParams.nbit = 2;
00073 fParams.doBack = 1;
00074 fParams.lineWidth = -1.;
00075 #ifdef WIN32
00076 ::setlocale(LC_NUMERIC,"USA");
00077 #endif
00078 }
00080 SbPainterPS::~SbPainterPS(
00081 )
00084 {
00085 if(fFile!=NULL) closeStream ();
00086 if(fBufferString!=NULL) ::free(fBufferString);
00087 fBufferString = NULL;
00088 if(fGSave!=0) {
00089 ::printf("SbPainterPS : bad gsave/grestore balance : %d.\n",fGSave);
00090 }
00091 }
00095 void SbPainterPS::beginTraversal (
00096 )
00099 {
00100 if(fFile==NULL) openFileForWriting(NULL);
00101 if(fFile==NULL) return;
00102 putBeginPageInStream();
00103 putPageScaleInStream((float)fWindowWidth,(float)fWindowHeight);
00104 putSaveStateInStream();
00105 }
00107 void SbPainterPS::endTraversal(
00108 )
00111 {
00112 if(fFile==NULL) return;
00113 putFrameInStream(0.0,0.0,0.0,(float)fWindowWidth,(float)fWindowHeight);
00114 putRestoreStateInStream();
00115 putEndPageInStream();
00116 }
00118 void SbPainterPS::clearColorBuffer(
00119 float aRed
00120 ,float aGreen
00121 ,float aBlue
00122 )
00125 {
00126 if(fFile==NULL) return;
00127 putBackgroundInStream(aRed,aGreen,aBlue,
00128 (float)fWindowWidth,(float)fWindowHeight);
00129 }
00130
00132
00133
00134
00135
00136
00137
00138
00139
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00169
00170
00171
00172
00173
00174
00175
00176
00177
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00292 void SbPainterPS::setColorScheme(
00293 int aShade
00294 )
00297 {
00298 fParams.shade = aShade;
00299 }
00301 void SbPainterPS::setOrientation(
00302 int aPortrait
00303 )
00306 {
00307 fParams.portrait = aPortrait;
00308 }
00310 void SbPainterPS::setBackgroundDrawn(
00311 int aDoback
00312 )
00315 {
00316 fParams.doBack = aDoback;
00317 }
00319 void SbPainterPS::setBitsPerPixel(
00320 int aNbit
00321 )
00324 {
00325 if( (aNbit==2) || (aNbit==4) || (aNbit==8) )
00326 fParams.nbit = aNbit;
00327 else
00328 fParams.nbit = 2;
00329 }
00331 void SbPainterPS::setLineWidth(
00332 int aWidth
00333 )
00336 {
00337 fParams.lineWidth = (float)aWidth;
00338 }
00342 void SbPainterPS::setFileName(
00343 const char* aString
00344 )
00347 {
00348 STRDEL(fFileName);
00349 fFileName = STRDUP(aString);
00350 }
00352 const char* SbPainterPS::getFileName(
00353 ) const
00356 {
00357 return fFileName;
00358 }
00360 void* SbPainterPS::getStream(
00361 )
00364 {
00365 return fFile;
00366 }
00368 void SbPainterPS::openFileForWriting(
00369 const char* aString
00370 )
00373 {
00374 if(fFile!=NULL) closeStream ();
00375 if( (aString==NULL) || (*aString=='\0') ) {
00376 if( (fFileName==NULL) || (*fFileName=='\0') ) {
00377 fFile = ::fopen(METAFILE_DEFAULT,"wb");
00378 STRDEL(fFileName);
00379 fFileName = STRDUP(METAFILE_DEFAULT);
00380 } else {
00381 fFile = ::fopen(fFileName,"wb");
00382 }
00383 } else {
00384 fFile = ::fopen(aString,"wb");
00385 STRDEL(fFileName);
00386 fFileName = STRDUP(aString);
00387 }
00388 if(fFile==NULL) return;
00389
00390 fBufferCount = 0;
00391 fBufferPointer[METAFILE_RECORD_LENGTH] = '\0';
00392 fPageNumber = 0;
00393
00394 printFLN ("%%!PS-Adobe-2.0");
00395 printFLN ("%%%%Creator: HEPVis::SbPainterPS.");
00396 printFLN("%%%%CreationDate: %s",GetDate());
00397 printFLN("%%%%Title: %s",fFileName);
00398 printFLN("%%%%Pages: (atend)");
00399 printFLN("%%%%BoundingBox: 0 0 %d %d",
00400 (int)fDeviceWidth,(int)fDeviceHeight);
00401 printFLN("%%%%DocumentFonts: Courier-Bold");
00402 printFLN("%%%%DocumentPaperSizes: a4");
00403 printFLN("%%%%EndComments");
00404
00405 putSaveStateInStream ();
00406
00407 putInStreamF("/n {newpath} def ");
00408 putInStreamF("/cl {closepath} def ");
00409 putInStreamF("/s {stroke} def ");
00410 putInStreamF("/f {fill} def ");
00411
00412 putInStreamF("/m {moveto} def ");
00413 putInStreamF("/rm {rmoveto} def ");
00414 putInStreamF("/rl {rlineto} def ");
00415
00416 putInStreamF("/lc {setlinecap} def ");
00417 putInStreamF("/lw {setlinewidth} def ");
00418 putInStreamF("/rgb {setrgbcolor} def ");
00419 putInStreamF("/ss {[] 0 setdash} def ") ;
00420 putInStreamF("/sd {[12 6] 0 setdash} def ");
00421 putInStreamF("/so {[6 12] 0 setdash} def ");
00422 putInStreamF("/sdo {[18 12 6 12] 0 setdash} def ");
00423
00424 fMarkerSize = 2.;
00425 putInStreamF("/ms 2. def /msi .5 def ");
00426 putInStreamF("/cross {ms ms scale -1. -1. rm ");
00427 putInStreamF("2. 2. rl 0. -2. rm -2. 2. rl msi msi scale} def ");
00428 putInStreamF("/plus {ms ms scale -1. 0. rm 2. 0. rl ");
00429 putInStreamF("-1. 1. rm 0. -2. rl msi msi scale} def ");
00430 putInStreamF("/asterisk {ms ms scale -1. 0. rm 2. 0. rl -1. 1. rm ");
00431 putInStreamF("0. -2. rl 0. 1. rm -0.707 -0.707 rm 1.414 1.414 rl ");
00432 putInStreamF("0. -1.414 rm -1.414 1.414 rl msi msi scale} def ");
00433 putInStreamF("/triangle {ms ms scale 0. 1. rm -0.6 -1.5 rl ");
00434 putInStreamF("1.2 0. rl -0.6 1.5 rl msi msi scale} def ");
00435
00436 putInStreamF("/sh {show} def ");
00437 putInStreamF("/df {/Courier-Bold findfont} def ");
00438 putInStreamF("/mf {makefont setfont} def ");
00439 printFLN("%%%%EndProlog");
00440 }
00442 void SbPainterPS::closeStream(
00443 )
00446 {
00447 if(fFile==NULL) return;
00448 putRestoreStateInStream ();
00449 printFLN("%%%%Trailer");
00450 printFLN("%%%%Pages: %d",fPageNumber);
00451 printFLN("%%%%EOF");
00452 if(fFile!=NULL) ::fclose(fFile);
00453 fFile = NULL;
00454 STRDEL(fFileName);
00455 fFileName = NULL;
00456 }
00458 void SbPainterPS::putInStreamF(
00459 const char* aFormat
00460 ,...
00461 )
00464 {
00465 if(fFile==NULL) return;
00466 va_list args;
00467 va_start(args,aFormat);
00468 printV(aFormat,args);
00469 va_end(args);
00470 int length = ::strlen(fBufferString);
00471 if(length>METAFILE_RECORD_LENGTH) {
00472 ::printf("SoPostScript::putInStreamF overflow\n");
00473 return;
00474 }
00475 int nlength = fBufferCount + length;
00476 if(nlength>METAFILE_RECORD_LENGTH) {
00477 fBufferPointer[fBufferCount] = '\0';
00478 if(::fprintf(fFile,"%s\n",(char*)fBufferPointer)<0) {
00479 ::printf("SoPostScript::putInStreamF fprintf error\n");
00480 }
00481 fBufferCount = 0;
00482 nlength = length;
00483 }
00484 unsigned char* pointer = fBufferPointer + fBufferCount;
00485 ::strcpy((char*)pointer,fBufferString);
00486 fBufferCount = nlength;
00487 }
00489 void SbPainterPS::printFLN(
00490 const char* aFormat
00491 ,...
00492 )
00495 {
00496 if(fFile==NULL) return;
00497 va_list args;
00498 va_start(args,aFormat);
00499 printV(aFormat,args);
00500 va_end(args);
00501
00502 if(fBufferCount>0) {
00503 fBufferPointer[fBufferCount] = '\0';
00504 if(::fprintf (fFile,"%s\n",(char*)fBufferPointer)<0) {
00505 ::printf("SbPainterPS::printFLN fprintf error\n");
00506 }
00507 fBufferCount = 0;
00508 }
00509
00510 if(::fprintf (fFile,"%s\n",fBufferString)<0) {
00511 ::printf("SbPainterPS::printFLN fprintf error\n");
00512 }
00513 }
00515 void SbPainterPS::printV(
00516 const char* This
00517 ,va_list aArgs
00518 )
00521 {
00522 #define MAX_STR 2048
00523 if(fBufferString==NULL) {
00524 fBufferString = (char*)::malloc(MAX_STR * sizeof(char));
00525 if(fBufferString==NULL) return;
00526 }
00527 fBufferString[MAX_STR-1] = '\0';
00528 ::vsprintf(fBufferString,This,aArgs);
00529 if(fBufferString[MAX_STR-1]!='\0') {
00530 ::printf("SbPainterPS::printV overflow\n");
00531 fBufferString[0] = '\0';
00532 }
00533 }
00538 void SbPainterPS::putPageScaleInStream(
00539 float aWidth
00540 ,float aHeight
00541 )
00544 {
00545 if(aWidth <=0.) aWidth = 100.;
00546 if(aHeight<=0.) aHeight = 100.;
00547
00548 putScaleInStream (1./METAFILE_SCALE,1./METAFILE_SCALE);
00549 putTranslationInStream ((float)(fDeviceWidth/20.),
00550 (float)(fDeviceHeight/30.));
00551
00552 float scale;
00553 if(fDeviceWidth<=fDeviceHeight)
00554 scale = (aHeight<=aWidth ?
00555 fDeviceWidth /aWidth : fDeviceWidth /aHeight );
00556 else
00557 scale = (aHeight<=aWidth ?
00558 fDeviceHeight /aWidth : fDeviceHeight /aHeight );
00559
00560 float xtra,ytra;
00561 if(fParams.portrait==1) {
00562 xtra = (fDeviceWidth - scale * aWidth)/2;
00563 ytra = (fDeviceHeight - scale * aHeight)/2;
00564 } else {
00565 putTranslationInStream(fDeviceWidth,0.);
00566 putRotateInStream(90);
00567 xtra = (fDeviceHeight - scale * aWidth)/2;
00568 ytra = (fDeviceWidth - scale * aHeight)/2;
00569 }
00570 putTranslationInStream (xtra,ytra);
00571
00572 putScaleInStream (scale,scale);
00573 }
00578 void SbPainterPS::putSaveStateInStream(
00579 )
00582 {
00583 putInStreamF("gsave ");
00584 fGSave++;
00585 }
00587 void SbPainterPS::putRestoreStateInStream(
00588 )
00591 {
00592 putInStreamF("grestore ");
00593 fGSave--;
00594 }
00596 void SbPainterPS::putTranslationInStream(
00597 float aX
00598 ,float aY
00599 )
00602 {
00603 putInStreamF("%.2f %.2f translate ",aX,aY);
00604 }
00606 void SbPainterPS::putScaleInStream(
00607 float aX
00608 ,float aY
00609 )
00612 {
00613 putInStreamF("%.2f %.2f scale ",aX,aY);
00614 }
00616 void SbPainterPS::putBeginPageInStream(
00617 )
00620 {
00621 fPageNumber++;
00622 printFLN("%%%%Page: %d %d",fPageNumber,fPageNumber);
00623 putSaveStateInStream();
00624 }
00626 void SbPainterPS::putEndPageInStream (
00627 )
00630 {
00631 putInStreamF("showpage ");
00632 putRestoreStateInStream();
00633 }
00635 void SbPainterPS::putRGB_InStream (
00636 float aR
00637 ,float aG
00638 ,float aB
00639 )
00642 {
00643 if(fParams.shade==Color)
00644 putInStreamF("%.2f %.2f %.2f rgb ",aR,aG,aB);
00645 else if(fParams.shade==Grey)
00646 putInStreamF("%.2f setgray ",convertRGB_ToGrey(aR,aG,aB));
00647 else if(fParams.shade==BlackWhite)
00648 putInStreamF("0. setgray ",convertRGB_ToGrey(aR,aG,aB));
00649 }
00651 void SbPainterPS::putLineWidthInStream(
00652 int aWidth
00653 )
00656 {
00657 if(fParams.lineWidth<0.) {
00658 if(aWidth==1) {
00659 putInStreamF("%.1f lw ",0.5);
00660 } else {
00661 putInStreamF("%.1f lw ",(float)(aWidth));
00662 }
00663 } else {
00664 putInStreamF("%.1f lw ",fParams.lineWidth);
00665 }
00666 }
00668 void SbPainterPS::putMarkerSizeInStream (
00669 float aSize
00670 )
00673 {
00674 if(aSize==fMarkerSize) return;
00675 fMarkerSize = aSize;
00676 putInStreamF("/ms %g def /msi %g def ",aSize,1./aSize);
00677 }
00678
00680
00681
00682
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00707 void SbPainterPS::putBackgroundInStream (
00708 float aR
00709 ,float aG
00710 ,float aB
00711 ,float aWidth
00712 ,float aHeight
00713 )
00716 {
00717 putNewPathInStream();
00718 putMoveInStream(0.,0.);
00719 putLineToInStream(aWidth,0.);
00720 putLineToInStream(0.,aHeight);
00721 putLineToInStream(-aWidth,0.);
00722 putLineToInStream(0.,-aHeight);
00723 putClosePathInStream();
00724 if(fParams.doBack==1) {
00725
00726 putSaveStateInStream();
00727 putRGB_InStream(aR,aG,aB);
00728 putFillInStream();
00729 putRestoreStateInStream();
00730 }
00731
00732 putInStreamF("clip ");
00733 }
00735 void SbPainterPS::putFrameInStream (
00736 float aR
00737 ,float aG
00738 ,float aB
00739 ,float aWidth
00740 ,float aHeight
00741 )
00744 {
00745 putNewPathInStream();
00746 putMoveInStream(0.,0.);
00747 putLineToInStream(aWidth,0.);
00748 putLineToInStream(0.,aHeight);
00749 putLineToInStream(-aWidth,0.);
00750 putLineToInStream(0.,-aHeight);
00751 putClosePathInStream();
00752 putRGB_InStream(aR,aG,aB);
00753 putLineWidthInStream(1);
00754 putCapInStream(1);
00755 putInStreamF("ss ");
00756 putStrokeInStream();
00757 }
00759 float SbPainterPS::convertRGB_ToGrey (
00760 float aRed
00761 ,float aGreen
00762 ,float aBlue
00763 )
00766 {
00767 return (0.3F * aRed + 0.59F * aGreen + 0.11F * aBlue);
00768 }
00770 void SbPainterPS::putRotateInStream(
00771 float aX
00772 )
00775 {
00776 putInStreamF("%.2f rotate ",aX);
00777 }
00779 void SbPainterPS::putNewPathInStream(
00780 )
00783 {
00784 putInStreamF("n ");
00785 }
00787 void SbPainterPS::putStrokeInStream(
00788 )
00791 {
00792 putInStreamF("s ");
00793 }
00795 void SbPainterPS::putFillInStream(
00796 )
00799 {
00800 putInStreamF("f ");
00801 }
00803 void SbPainterPS::putClosePathInStream(
00804 )
00807 {
00808 putInStreamF("cl ");
00809 }
00811 void SbPainterPS::putCapInStream(
00812 int aX
00813 )
00816 {
00817 putInStreamF("%1d lc ",aX);
00818 }
00820 void SbPainterPS::putLineToInStream(
00821 float aX
00822 ,float aY
00823 )
00826 {
00827 putInStreamF ("%.2f %.2f rl ",aX,aY);
00828 }
00830 void SbPainterPS::putMoveInStream(
00831 float aX
00832 ,float aY
00833 )
00836 {
00837 putInStreamF ("%.2f %.2f m ",aX,aY);
00838 }
00840 void SbPainterPS::putCircleInStream(
00841 float aX
00842 ,float aY
00843 ,float aR
00844 )
00847 {
00848 putInStreamF("%.2f %.2f %.2f 0 360 arc s ",aX,aY,aR);
00849 }
00850
00852
00853
00854
00857
00858
00859
00860
00861
00862
00863
00864
00865
00871 void SbPainterPS::putImageInStream (
00872 unsigned int aWidth
00873 ,unsigned int aHeight
00874 ,GetRGB_Function aProc
00875 )
00878 {
00879 if((aWidth<=0)||(aHeight<=0)) return;
00880 if(!aProc) return;
00881
00882 putSaveStateInStream ();
00883 putInStreamF ("%d %d scale ", aWidth, aHeight );
00884 int status = 1;
00885 int nbhex;
00886 unsigned int row,col,col_max;
00887 double dr,dg,db;
00888 typedef unsigned char Uchar;
00889 Uchar red,green,blue,b;
00890 if(fParams.shade!=0) {
00891 putInStreamF ("/picstr %d string def ",aWidth);
00892 putInStreamF ("%d %d %d ",aWidth,aHeight,8);
00893 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",aWidth,aHeight,aHeight);
00894 putInStreamF ("{ currentfile picstr readhexstring pop } " );
00895 printFLN ("image " );
00896 for ( row = 0; row < aHeight; row++ ){
00897 for ( col = 0; col < aWidth; col++){
00898 double fgrey;
00899 Uchar grey;
00900 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
00901 fgrey = ConvertRGB_ToGrey(dr,dg,db);
00902 grey = (Uchar) ( 255. * fgrey);
00903 writeByte (grey);
00904 }
00905 }
00906 nbhex = aWidth * aHeight * 2;
00907 printFLN ("%%%% nbhex digit :%d ",nbhex);
00908 printFLN ("%%%% nbhex/record_length :%d ",nbhex/METAFILE_RECORD_LENGTH);
00909 printFLN ("%%%% nbhex%%record_length :%d ",nbhex%METAFILE_RECORD_LENGTH);
00910 }else if(fParams.nbit==2){
00911 int nbyte2;
00912 nbyte2 = (aWidth * 3)/4;
00913 nbyte2 /=3;
00914 nbyte2 *=3;
00915 col_max = (nbyte2 * 4)/3;
00916
00917
00918 putInStreamF ("/rgbstr %d string def ",nbyte2);
00919 putInStreamF ("%d %d %d ",col_max,aHeight,2);
00920 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",col_max,aHeight,aHeight);
00921 putInStreamF ("{ currentfile rgbstr readhexstring pop } " );
00922 putInStreamF ("false 3 " );
00923 printFLN ("colorimage " );
00924 for ( row = 0; row < aHeight; row++ ){
00925 for ( col = 0; col < col_max; col+=4){
00926 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
00927 red = (Uchar) ( 3. * dr);
00928 green = (Uchar) ( 3. * dg);
00929 blue = (Uchar) ( 3. * db);
00930 b = red;
00931 b = (b<<2)+green;
00932 b = (b<<2)+blue;
00933 status = aProc(col+1,row,dr,dg,db)==0 ? 0 : status;
00934 red = (Uchar) ( 3. * dr);
00935 green = (Uchar) ( 3. * dg);
00936 blue = (Uchar) ( 3. * db);
00937 b = (b<<2)+red;
00938 writeByte (b);
00939
00940 b = green;
00941 b = (b<<2)+blue;
00942 status = aProc(col+2,row,dr,dg,db)==0 ? 0 : status;
00943 red = (Uchar) ( 3. * dr);
00944 green = (Uchar) ( 3. * dg);
00945 blue = (Uchar) ( 3. * db);
00946 b = (b<<2)+red;
00947 b = (b<<2)+green;
00948 writeByte (b);
00949
00950 b = blue;
00951 status = aProc(col+3,row,dr,dg,db)==0 ? 0 : status;
00952 red = (Uchar) ( 3. * dr);
00953 green = (Uchar) ( 3. * dg);
00954 blue = (Uchar) ( 3. * db);
00955 b = (b<<2)+red;
00956 b = (b<<2)+green;
00957 b = (b<<2)+blue;
00958 writeByte (b);
00959 }
00960 }
00961 }else if(fParams.nbit==4){
00962 int nbyte4;
00963 nbyte4 = (aWidth * 3)/2;
00964 nbyte4 /=3;
00965 nbyte4 *=3;
00966 col_max = (nbyte4 * 2)/3;
00967
00968
00969 putInStreamF ("/rgbstr %d string def ",nbyte4);
00970 putInStreamF ("%d %d %d ",col_max,aHeight,4);
00971 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",col_max,aHeight,aHeight);
00972 putInStreamF ("{ currentfile rgbstr readhexstring pop } " );
00973 putInStreamF ("false 3 " );
00974 printFLN ("colorimage " );
00975 for ( row = 0; row < aHeight; row++ ){
00976 for ( col = 0; col < col_max; col+=2){
00977 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
00978 red = (Uchar) ( 15. * dr);
00979 green = (Uchar) ( 15. * dg);
00980 putInStreamF ("%x%x",red,green);
00981 blue = (Uchar) ( 15. * db);
00982
00983 status = aProc(col+1,row,dr,dg,db)==0 ? 0 : status;
00984 red = (Uchar) ( 15. * dr);
00985 putInStreamF ("%x%x",blue,red);
00986 green = (Uchar) ( 15. * dg);
00987 blue = (Uchar) ( 15. * db);
00988 putInStreamF ("%x%x",green,blue);
00989 }
00990 }
00991 }else{
00992 int nbyte8;
00993 nbyte8 = aWidth * 3;
00994
00995 putInStreamF ("/rgbstr %d string def ",nbyte8);
00996 putInStreamF ("%d %d %d ",aWidth,aHeight,8);
00997 putInStreamF ("[ %d 0 0 -%d 0 %d ] ",aWidth,aHeight,aHeight);
00998 putInStreamF ("{ currentfile rgbstr readhexstring pop } " );
00999 putInStreamF ("false 3 " );
01000 printFLN ("colorimage " );
01001 for ( row = 0; row < aHeight; row++ ){
01002 for ( col = 0; col < aWidth; col++){
01003 status = aProc(col,row,dr,dg,db)==0 ? 0 : status;
01004 red = (Uchar) ( 255. * dr);
01005 writeByte (red);
01006 green = (Uchar) ( 255. * dg);
01007 writeByte (green);
01008 blue = (Uchar) ( 255. * db);
01009 writeByte (blue);
01010 }
01011 }
01012 }
01013 if(status==0)
01014 ::printf("SbPainterPS::putImageInStream: problem to retreive some pixel rgb.\n");
01015 putRestoreStateInStream();
01016 }
01018 void SbPainterPS::writeByte (
01019 unsigned char a_byte
01020 )
01023 {
01024 unsigned char h = a_byte / 16;
01025 unsigned char l = a_byte % 16;
01026 putInStreamF ("%x%x",h,l);
01027 }
01031 char* GetDate (
01032 )
01034
01036 {
01037 time_t d;
01038 time(&d);
01039 char* string = ctime(&d);
01040 string[24] = '\0';
01041 return string;
01042 }
01044 double ConvertRGB_ToGrey(
01045 double a_red
01046 ,double a_green
01047 ,double a_blue
01048 )
01051 {
01052 return (0.30 * a_red + 0.59 * a_green + 0.11 * a_blue);
01053 }
01054
01055 #endif