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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifdef WIN32
00052 #pragma optimize("",off)
00053 #endif
00054
00055 #include <stdlib.h>
00056 #include <string.h>
00057 #include <ctype.h>
00058
00059 #include "Riostream.h"
00060 #include "TROOT.h"
00061 #include "TColor.h"
00062 #include "TVirtualPad.h"
00063 #include "TPoints.h"
00064 #include "TPDF.h"
00065 #include "TStyle.h"
00066 #include "TMath.h"
00067 #include "TStorage.h"
00068 #include "TText.h"
00069 #include "zlib.h"
00070 #include "TObjString.h"
00071 #include "TClass.h"
00072 #include "TObjArray.h"
00073
00074
00075 const Float_t kScale = 0.93376068;
00076
00077
00078 const Int_t kObjRoot = 1;
00079 const Int_t kObjInfo = 2;
00080 const Int_t kObjOutlines = 3;
00081 const Int_t kObjPages = 4;
00082 const Int_t kObjPageResources = 5;
00083 const Int_t kObjContents = 6;
00084 const Int_t kObjFont = 7;
00085 const Int_t kObjColorSpace = 22;
00086 const Int_t kObjPatternResourses = 23;
00087 const Int_t kObjPatternList = 24;
00088 const Int_t kObjPattern = 25;
00089 const Int_t kObjFirstPage = 50;
00090
00091
00092 const Int_t kNumberOfFonts = 15;
00093
00094 ClassImp(TPDF)
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 TPDF::TPDF() : TVirtualPS()
00105 {
00106
00107
00108 fStream = 0;
00109 fCompress = kFALSE;
00110 fPageNotEmpty = kFALSE;
00111 gVirtualPS = this;
00112 fRed = 0.;
00113 fGreen = 0.;
00114 fBlue = 0.;
00115 fXsize = 0.;
00116 fYsize = 0.;
00117 fType = 0;
00118 fPageFormat = 0;
00119 fPageOrientation = 0;
00120 fStartStream = 0;
00121 fLineScale = 0.;
00122 fObjPosSize = 0;
00123 fNbObj = 0;
00124 fNbPage = 0;
00125 fRange = kFALSE;
00126 SetTitle("PDF");
00127 }
00128
00129
00130
00131 TPDF::TPDF(const char *fname, Int_t wtype) : TVirtualPS(fname, wtype)
00132 {
00133
00134
00135
00136
00137
00138
00139
00140
00141 fStream = 0;
00142 fCompress = kFALSE;
00143 fPageNotEmpty = kFALSE;
00144 fRed = 0.;
00145 fGreen = 0.;
00146 fBlue = 0.;
00147 fXsize = 0.;
00148 fYsize = 0.;
00149 fType = 0;
00150 fPageFormat = 0;
00151 fPageOrientation = 0;
00152 fStartStream = 0;
00153 fLineScale = 0.;
00154 fObjPosSize = 0;
00155 fNbObj = 0;
00156 fNbPage = 0;
00157 fRange = kFALSE;
00158 SetTitle("PDF");
00159 Open(fname, wtype);
00160 }
00161
00162
00163
00164 TPDF::~TPDF()
00165 {
00166
00167
00168 Close();
00169
00170 if (fObjPos) delete [] fObjPos;
00171 }
00172
00173
00174
00175 void TPDF::CellArrayBegin(Int_t, Int_t, Double_t, Double_t, Double_t,
00176 Double_t)
00177 {
00178
00179 Warning("TPDF::CellArrayBegin", "not yet implemented");
00180 }
00181
00182
00183
00184 void TPDF::CellArrayFill(Int_t, Int_t, Int_t)
00185 {
00186
00187 Warning("TPDF::CellArrayFill", "not yet implemented");
00188 }
00189
00190
00191
00192 void TPDF::CellArrayEnd()
00193 {
00194
00195 Warning("TPDF::CellArrayEnd", "not yet implemented");
00196 }
00197
00198
00199
00200 void TPDF::Close(Option_t *)
00201 {
00202
00203
00204 Int_t i;
00205
00206 if (!gVirtualPS) return;
00207 if (!fStream) return;
00208 if (gPad) gPad->Update();
00209
00210
00211 WriteCompressedBuffer();
00212 PrintStr("endstream@");
00213 Int_t streamLength = fNByte-fStartStream-10;
00214 PrintStr("endobj@");
00215 NewObject(4*(fNbPage-1)+kObjFirstPage+2);
00216 WriteInteger(streamLength, 0);
00217 PrintStr("@");
00218 PrintStr("endobj@");
00219 NewObject(4*(fNbPage-1)+kObjFirstPage+3);
00220 PrintStr("<<@");
00221 if (!strstr(GetTitle(),"PDF")) {
00222 PrintStr("/Title (");
00223 PrintStr(GetTitle());
00224 PrintStr(")@");
00225 } else {
00226 PrintStr("/Title (Page");
00227 WriteInteger(fNbPage);
00228 PrintStr(")@");
00229 }
00230 PrintStr("/Dest [");
00231 WriteInteger(4*(fNbPage-1)+kObjFirstPage);
00232 PrintStr(" 0 R /XYZ null null 0]@");
00233 PrintStr("/Parent");
00234 WriteInteger(kObjContents);
00235 PrintStr(" 0 R");
00236 PrintStr("@");
00237 if (fNbPage > 1) {
00238 PrintStr("/Prev");
00239 WriteInteger(4*(fNbPage-2)+kObjFirstPage+3);
00240 PrintStr(" 0 R");
00241 PrintStr("@");
00242 }
00243 PrintStr(">>@");
00244
00245 NewObject(kObjOutlines);
00246 PrintStr("<<@");
00247 PrintStr("/Type /Outlines@");
00248 PrintStr("/Count");
00249 WriteInteger(fNbPage+1);
00250 PrintStr("@");
00251 PrintStr("/First");
00252 WriteInteger(kObjContents);
00253 PrintStr(" 0 R");
00254 PrintStr("@");
00255 PrintStr("/Last");
00256 WriteInteger(kObjContents);
00257 PrintStr(" 0 R");
00258 PrintStr("@");
00259 PrintStr(">>@");
00260 PrintStr("endobj@");
00261
00262 NewObject(kObjContents);
00263 PrintStr("<<@");
00264 PrintStr("/Title (Contents)@");
00265 PrintStr("/Dest [");
00266 WriteInteger(kObjFirstPage);
00267 PrintStr(" 0 R /XYZ null null 0]@");
00268 PrintStr("/Count");
00269 WriteInteger(fNbPage);
00270 PrintStr("@");
00271 PrintStr("/Parent");
00272 WriteInteger(kObjOutlines);
00273 PrintStr(" 0 R");
00274 PrintStr("@");
00275 PrintStr("/First");
00276 WriteInteger(kObjFirstPage+3);
00277 PrintStr(" 0 R");
00278 PrintStr("@");
00279 PrintStr("/Last");
00280 WriteInteger(4*(fNbPage-1)+kObjFirstPage+3);
00281 PrintStr(" 0 R");
00282 PrintStr("@");
00283 PrintStr(">>@");
00284
00285
00286 NewObject(kObjPages);
00287 PrintStr("<<@");
00288 PrintStr("/Type /Pages@");
00289 PrintStr("/Count");
00290 WriteInteger(fNbPage);
00291 PrintStr("@");
00292 PrintStr("/Kids [");
00293 for (i=1; i<=fNbPage; i++) {
00294 WriteInteger(4*(i-1)+kObjFirstPage);
00295 PrintStr(" 0 R");
00296 }
00297 PrintStr(" ]");
00298 PrintStr("@");
00299 PrintStr(">>@");
00300 PrintStr("endobj@");
00301
00302
00303 Int_t refInd = fNByte;
00304 PrintStr("xref@");
00305 PrintStr("0");
00306 WriteInteger(fNbObj+1);
00307 PrintStr("@");
00308 PrintStr("0000000000 65535 f @");
00309 char str[21];
00310 for (i=0; i<fNbObj; i++) {
00311 snprintf(str,21,"%10.10d 00000 n @",fObjPos[i]);
00312 PrintStr(str);
00313 }
00314
00315
00316 PrintStr("trailer@");
00317 PrintStr("<<@");
00318 PrintStr("/Size");
00319 WriteInteger(fNbObj+1);
00320 PrintStr("@");
00321 PrintStr("/Root");
00322 WriteInteger(kObjRoot);
00323 PrintStr(" 0 R");
00324 PrintStr("@");
00325 PrintStr("/Info");
00326 WriteInteger(kObjInfo);
00327 PrintStr(" 0 R@");
00328 PrintStr(">>@");
00329 PrintStr("startxref@");
00330 WriteInteger(refInd, 0);
00331 PrintStr("@");
00332 PrintStr("%%EOF@");
00333
00334
00335 if (fStream) { fStream->close(); delete fStream; fStream = 0;}
00336
00337 gVirtualPS = 0;
00338 }
00339
00340
00341
00342 void TPDF::DrawBox(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
00343 {
00344
00345
00346 static Double_t x[4], y[4];
00347 Double_t ix1 = XtoPDF(x1);
00348 Double_t ix2 = XtoPDF(x2);
00349 Double_t iy1 = YtoPDF(y1);
00350 Double_t iy2 = YtoPDF(y2);
00351 Int_t fillis = fFillStyle/1000;
00352 Int_t fillsi = fFillStyle%1000;
00353
00354 if (fillis == 3 || fillis == 2) {
00355 if (fillsi > 99) {
00356 x[0] = x1; y[0] = y1;
00357 x[1] = x2; y[1] = y1;
00358 x[2] = x2; y[2] = y2;
00359 x[3] = x1; y[3] = y2;
00360 return;
00361 }
00362 if (fillsi > 0 && fillsi < 26) {
00363 x[0] = x1; y[0] = y1;
00364 x[1] = x2; y[1] = y1;
00365 x[2] = x2; y[2] = y2;
00366 x[3] = x1; y[3] = y2;
00367 DrawPS(-4, &x[0], &y[0]);
00368 }
00369 if (fillsi == -3) {
00370 SetColor(5);
00371 WriteReal(ix1);
00372 WriteReal(iy1);
00373 WriteReal(ix2 - ix1);
00374 WriteReal(iy2 - iy1);
00375 PrintFast(6," re f*");
00376 }
00377 }
00378 if (fillis == 1) {
00379 SetColor(fFillColor);
00380 WriteReal(ix1);
00381 WriteReal(iy1);
00382 WriteReal(ix2 - ix1);
00383 WriteReal(iy2 - iy1);
00384 PrintFast(6," re f*");
00385 }
00386 if (fillis == 0) {
00387 SetColor(fLineColor);
00388 WriteReal(ix1);
00389 WriteReal(iy1);
00390 WriteReal(ix2 - ix1);
00391 WriteReal(iy2 - iy1);
00392 PrintFast(5," re S");
00393 }
00394 }
00395
00396
00397
00398 void TPDF::DrawFrame(Double_t xl, Double_t yl, Double_t xt, Double_t yt,
00399 Int_t mode, Int_t border, Int_t dark, Int_t light)
00400 {
00401
00402
00403
00404
00405
00406
00407
00408
00409 static Double_t xps[7], yps[7];
00410 Int_t i;
00411
00412
00413 if (mode == -1) SetColor(dark);
00414 else SetColor(light);
00415 xps[0] = XtoPDF(xl); yps[0] = YtoPDF(yl);
00416 xps[1] = xps[0] + border; yps[1] = yps[0] + border;
00417 xps[2] = xps[1]; yps[2] = YtoPDF(yt) - border;
00418 xps[3] = XtoPDF(xt) - border; yps[3] = yps[2];
00419 xps[4] = XtoPDF(xt); yps[4] = YtoPDF(yt);
00420 xps[5] = xps[0]; yps[5] = yps[4];
00421 xps[6] = xps[0]; yps[6] = yps[0];
00422
00423 MoveTo(xps[0], yps[0]);
00424 for (i=1;i<7;i++) LineTo(xps[i], yps[i]);
00425 PrintFast(3," f*");
00426
00427
00428 if (mode == -1) SetColor(light);
00429 else SetColor(dark);
00430 xps[0] = XtoPDF(xl); yps[0] = YtoPDF(yl);
00431 xps[1] = xps[0] + border; yps[1] = yps[0] + border;
00432 xps[2] = XtoPDF(xt) - border; yps[2] = yps[1];
00433 xps[3] = xps[2]; yps[3] = YtoPDF(yt) - border;
00434 xps[4] = XtoPDF(xt); yps[4] = YtoPDF(yt);
00435 xps[5] = xps[4]; yps[5] = yps[0];
00436 xps[6] = xps[0]; yps[6] = yps[0];
00437
00438 MoveTo(xps[0], yps[0]);
00439 for (i=1;i<7;i++) LineTo(xps[i], yps[i]);
00440 PrintFast(3," f*");
00441 }
00442
00443
00444
00445 void TPDF::DrawHatch(Float_t, Float_t, Int_t, Float_t *, Float_t *)
00446 {
00447
00448
00449 Warning("DrawHatch", "hatch fill style not yet implemented");
00450 }
00451
00452
00453
00454 void TPDF::DrawHatch(Float_t, Float_t, Int_t, Double_t *, Double_t *)
00455 {
00456
00457
00458 Warning("DrawHatch", "hatch fill style not yet implemented");
00459 }
00460
00461
00462
00463 void TPDF::DrawPolyLine(Int_t nn, TPoints *xy)
00464 {
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474 Int_t n;
00475
00476 Style_t linestylesav = fLineStyle;
00477 Width_t linewidthsav = fLineWidth;
00478
00479 if (nn > 0) {
00480 n = nn;
00481 SetLineStyle(fLineStyle);
00482 SetLineWidth(fLineWidth);
00483 SetColor(Int_t(fLineColor));
00484 } else {
00485 n = -nn;
00486 SetLineStyle(1);
00487 SetLineWidth(1);
00488 SetColor(Int_t(fLineColor));
00489 }
00490
00491 WriteReal(XtoPDF(xy[0].GetX()));
00492 WriteReal(YtoPDF(xy[0].GetY()));
00493 if( n <= 1) {
00494 if( n == 0) return;
00495 PrintFast(2," m");
00496 return;
00497 }
00498
00499 PrintFast(2," m");
00500
00501 for (Int_t i=1;i<n;i++) LineTo(XtoPDF(xy[i].GetX()), YtoPDF(xy[i].GetY()));
00502
00503 if (nn > 0 ) {
00504 if (xy[0].GetX() == xy[n-1].GetX() && xy[0].GetY() == xy[n-1].GetY()) PrintFast(3," cl");
00505 PrintFast(2," S");
00506 } else {
00507 PrintFast(3," f*");
00508 }
00509
00510 SetLineStyle(linestylesav);
00511 SetLineWidth(linewidthsav);
00512 }
00513
00514
00515
00516 void TPDF::DrawPolyLineNDC(Int_t nn, TPoints *xy)
00517 {
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 Int_t n;
00528
00529 Style_t linestylesav = fLineStyle;
00530 Width_t linewidthsav = fLineWidth;
00531
00532 if (nn > 0) {
00533 n = nn;
00534 SetLineStyle(fLineStyle);
00535 SetLineWidth(fLineWidth);
00536 SetColor(Int_t(fLineColor));
00537 } else {
00538 n = -nn;
00539 SetLineStyle(1);
00540 SetLineWidth(1);
00541 SetColor(Int_t(fLineColor));
00542 }
00543
00544 WriteReal(UtoPDF(xy[0].GetX()));
00545 WriteReal(VtoPDF(xy[0].GetY()));
00546 if( n <= 1) {
00547 if( n == 0) return;
00548 PrintFast(2," m");
00549 return;
00550 }
00551
00552 PrintFast(2," m");
00553
00554 for (Int_t i=1;i<n;i++) LineTo(UtoPDF(xy[i].GetX()), VtoPDF(xy[i].GetY()));
00555
00556 if (nn > 0 ) {
00557 if (xy[0].GetX() == xy[n-1].GetX() && xy[0].GetY() == xy[n-1].GetY()) PrintFast(3," cl");
00558 PrintFast(2," S");
00559 } else {
00560 PrintFast(3," f*");
00561 }
00562
00563 SetLineStyle(linestylesav);
00564 SetLineWidth(linewidthsav);
00565 }
00566
00567
00568
00569 void TPDF::DrawPolyMarker(Int_t n, Float_t *xw, Float_t *yw)
00570 {
00571
00572
00573 Style_t linestylesav = fLineStyle;
00574 Width_t linewidthsav = fLineWidth;
00575 SetLineStyle(1);
00576 SetLineWidth(1);
00577 SetColor(Int_t(fMarkerColor));
00578 Int_t ms = abs(fMarkerStyle);
00579
00580 if (ms >= 6 && ms <= 19) ms = 20;
00581 if (ms == 4) ms = 24;
00582
00583
00584 Float_t msize = fMarkerSize;
00585 if (fMarkerStyle == 1) {
00586 msize = 1.;
00587 } else if (fMarkerStyle == 6) {
00588 msize = 1.5;
00589 } else if (fMarkerStyle == 7) {
00590 msize = 3.;
00591 } else {
00592 const Int_t kBASEMARKER = 8;
00593 Float_t sbase = msize*kBASEMARKER;
00594 Float_t s2x = sbase / Float_t(gPad->GetWw() * gPad->GetAbsWNDC());
00595 msize = this->UtoPDF(s2x) - this->UtoPDF(0);
00596 }
00597
00598 Double_t m = msize;
00599 Double_t m2 = m/2;
00600 Double_t m3 = m/3;
00601 Double_t m4 = m2*1.333333333333;
00602 Double_t m6 = m/6;
00603
00604
00605 Double_t ix,iy;
00606 for (Int_t i=0;i<n;i++) {
00607 ix = XtoPDF(xw[i]);
00608 iy = YtoPDF(yw[i]);
00609
00610 if (ms == 1) {
00611 MoveTo(ix-1, iy);
00612 LineTo(ix , iy);
00613
00614 } else if (ms == 2) {
00615 MoveTo(ix-m2, iy);
00616 LineTo(ix+m2, iy);
00617 MoveTo(ix , iy-m2);
00618 LineTo(ix , iy+m2);
00619
00620 } else if (ms == 5) {
00621 MoveTo(ix-m2, iy-m2);
00622 LineTo(ix+m2, iy+m2);
00623 MoveTo(ix-m2, iy+m2);
00624 LineTo(ix+m2, iy-m2);
00625
00626 } else if (ms == 3 || ms == 31) {
00627 MoveTo(ix-m2, iy);
00628 LineTo(ix+m2, iy);
00629 MoveTo(ix , iy-m2);
00630 LineTo(ix , iy+m2);
00631 MoveTo(ix-m2, iy-m2);
00632 LineTo(ix+m2, iy+m2);
00633 MoveTo(ix-m2, iy+m2);
00634 LineTo(ix+m2, iy-m2);
00635
00636 } else if (ms == 24 || ms == 20) {
00637 MoveTo(ix-m2, iy);
00638 WriteReal(ix-m2); WriteReal(iy+m4);
00639 WriteReal(ix+m2); WriteReal(iy+m4);
00640 WriteReal(ix+m2); WriteReal(iy) ; PrintFast(2," c");
00641 WriteReal(ix+m2); WriteReal(iy-m4);
00642 WriteReal(ix-m2); WriteReal(iy-m4);
00643 WriteReal(ix-m2); WriteReal(iy) ; PrintFast(4," c h");
00644
00645 } else if (ms == 25 || ms == 21) {
00646 WriteReal(ix-m2); WriteReal(iy-m2);
00647 WriteReal(m) ; WriteReal(m) ; PrintFast(3," re");
00648
00649 } else if (ms == 23 || ms == 32) {
00650 MoveTo(ix , iy-m2);
00651 LineTo(ix+m2, iy+m2);
00652 LineTo(ix-m2, iy+m2);
00653 PrintFast(2," h");
00654
00655 } else if (ms == 26 || ms == 22) {
00656 MoveTo(ix-m2, iy-m2);
00657 LineTo(ix+m2, iy-m2);
00658 LineTo(ix , iy+m2);
00659 PrintFast(2," h");
00660 } else if (ms == 27 || ms == 33) {
00661 MoveTo(ix , iy-m2);
00662 LineTo(ix+m3, iy);
00663 LineTo(ix , iy+m2);
00664 LineTo(ix-m3, iy) ;
00665 PrintFast(2," h");
00666 } else if (ms == 28 || ms == 34) {
00667 MoveTo(ix-m6, iy-m6);
00668 LineTo(ix-m6, iy-m2);
00669 LineTo(ix+m6, iy-m2);
00670 LineTo(ix+m6, iy-m6);
00671 LineTo(ix+m2, iy-m6);
00672 LineTo(ix+m2, iy+m6);
00673 LineTo(ix+m6, iy+m6);
00674 LineTo(ix+m6, iy+m2);
00675 LineTo(ix-m6, iy+m2);
00676 LineTo(ix-m6, iy+m6);
00677 LineTo(ix-m2, iy+m6);
00678 LineTo(ix-m2, iy-m6);
00679 PrintFast(2," h");
00680 } else if (ms == 29 || ms == 30) {
00681 MoveTo(ix , iy+m2);
00682 LineTo(ix+0.112255*m, iy+0.15451*m);
00683 LineTo(ix+0.47552*m , iy+0.15451*m);
00684 LineTo(ix+0.181635*m, iy-0.05902*m);
00685 LineTo(ix+0.29389*m , iy-0.40451*m);
00686 LineTo(ix , iy-0.19098*m);
00687 LineTo(ix-0.29389*m , iy-0.40451*m);
00688 LineTo(ix-0.181635*m, iy-0.05902*m);
00689 LineTo(ix-0.47552*m , iy+0.15451*m);
00690 LineTo(ix-0.112255*m, iy+0.15451*m);
00691 PrintFast(2," h");
00692 } else {
00693 MoveTo(ix-1, iy);
00694 LineTo(ix , iy);
00695 }
00696 }
00697
00698 if ((ms > 19 && ms < 24) || ms == 29 || ms == 33 || ms == 34) {
00699 PrintFast(2," f");
00700 } else {
00701 PrintFast(2," S");
00702 }
00703
00704 SetLineStyle(linestylesav);
00705 SetLineWidth(linewidthsav);
00706 }
00707
00708
00709
00710 void TPDF::DrawPolyMarker(Int_t n, Double_t *xw, Double_t *yw)
00711 {
00712
00713
00714 Style_t linestylesav = fLineStyle;
00715 Width_t linewidthsav = fLineWidth;
00716 SetLineStyle(1);
00717 SetLineWidth(1);
00718 SetColor(Int_t(fMarkerColor));
00719 Int_t ms = abs(fMarkerStyle);
00720
00721 if (ms >= 6 && ms <= 19) ms = 20;
00722 if (ms == 4) ms = 24;
00723
00724
00725 Float_t msize = fMarkerSize;
00726 if (fMarkerStyle == 1) {
00727 msize = 1.;
00728 } else if (fMarkerStyle == 6) {
00729 msize = 1.5;
00730 } else if (fMarkerStyle == 7) {
00731 msize = 3.;
00732 } else {
00733 const Int_t kBASEMARKER = 8;
00734 Float_t sbase = msize*kBASEMARKER;
00735 Float_t s2x = sbase / Float_t(gPad->GetWw() * gPad->GetAbsWNDC());
00736 msize = this->UtoPDF(s2x) - this->UtoPDF(0);
00737 }
00738
00739 Double_t m = msize;
00740 Double_t m2 = m/2;
00741 Double_t m3 = m/3;
00742 Double_t m4 = m2*1.333333333333;
00743 Double_t m6 = m/6;
00744
00745
00746 Double_t ix,iy;
00747 for (Int_t i=0;i<n;i++) {
00748 ix = XtoPDF(xw[i]);
00749 iy = YtoPDF(yw[i]);
00750
00751 if (ms == 1) {
00752 MoveTo(ix-1, iy);
00753 LineTo(ix , iy);
00754
00755 } else if (ms == 2) {
00756 MoveTo(ix-m2, iy);
00757 LineTo(ix+m2, iy);
00758 MoveTo(ix , iy-m2);
00759 LineTo(ix , iy+m2);
00760
00761 } else if (ms == 5) {
00762 MoveTo(ix-m2, iy-m2);
00763 LineTo(ix+m2, iy+m2);
00764 MoveTo(ix-m2, iy+m2);
00765 LineTo(ix+m2, iy-m2);
00766
00767 } else if (ms == 3 || ms == 31) {
00768 MoveTo(ix-m2, iy);
00769 LineTo(ix+m2, iy);
00770 MoveTo(ix , iy-m2);
00771 LineTo(ix , iy+m2);
00772 MoveTo(ix-m2, iy-m2);
00773 LineTo(ix+m2, iy+m2);
00774 MoveTo(ix-m2, iy+m2);
00775 LineTo(ix+m2, iy-m2);
00776
00777 } else if (ms == 24 || ms == 20) {
00778 MoveTo(ix-m2, iy);
00779 WriteReal(ix-m2); WriteReal(iy+m4);
00780 WriteReal(ix+m2); WriteReal(iy+m4);
00781 WriteReal(ix+m2); WriteReal(iy) ; PrintFast(2," c");
00782 WriteReal(ix+m2); WriteReal(iy-m4);
00783 WriteReal(ix-m2); WriteReal(iy-m4);
00784 WriteReal(ix-m2); WriteReal(iy) ; PrintFast(4," c h");
00785
00786 } else if (ms == 25 || ms == 21) {
00787 WriteReal(ix-m2); WriteReal(iy-m2);
00788 WriteReal(m) ; WriteReal(m) ; PrintFast(3," re");
00789
00790 } else if (ms == 23 || ms == 32) {
00791 MoveTo(ix , iy-m2);
00792 LineTo(ix+m2, iy+m2);
00793 LineTo(ix-m2, iy+m2);
00794 PrintFast(2," h");
00795
00796 } else if (ms == 26 || ms == 22) {
00797 MoveTo(ix-m2, iy-m2);
00798 LineTo(ix+m2, iy-m2);
00799 LineTo(ix , iy+m2);
00800 PrintFast(2," h");
00801 } else if (ms == 27 || ms == 33) {
00802 MoveTo(ix , iy-m2);
00803 LineTo(ix+m3, iy);
00804 LineTo(ix , iy+m2);
00805 LineTo(ix-m3, iy) ;
00806 PrintFast(2," h");
00807 } else if (ms == 28 || ms == 34) {
00808 MoveTo(ix-m6, iy-m6);
00809 LineTo(ix-m6, iy-m2);
00810 LineTo(ix+m6, iy-m2);
00811 LineTo(ix+m6, iy-m6);
00812 LineTo(ix+m2, iy-m6);
00813 LineTo(ix+m2, iy+m6);
00814 LineTo(ix+m6, iy+m6);
00815 LineTo(ix+m6, iy+m2);
00816 LineTo(ix-m6, iy+m2);
00817 LineTo(ix-m6, iy+m6);
00818 LineTo(ix-m2, iy+m6);
00819 LineTo(ix-m2, iy-m6);
00820 PrintFast(2," h");
00821 } else if (ms == 29 || ms == 30) {
00822 MoveTo(ix , iy+m2);
00823 LineTo(ix+0.112255*m, iy+0.15451*m);
00824 LineTo(ix+0.47552*m , iy+0.15451*m);
00825 LineTo(ix+0.181635*m, iy-0.05902*m);
00826 LineTo(ix+0.29389*m , iy-0.40451*m);
00827 LineTo(ix , iy-0.19098*m);
00828 LineTo(ix-0.29389*m , iy-0.40451*m);
00829 LineTo(ix-0.181635*m, iy-0.05902*m);
00830 LineTo(ix-0.47552*m , iy+0.15451*m);
00831 LineTo(ix-0.112255*m, iy+0.15451*m);
00832 PrintFast(2," h");
00833 } else {
00834 MoveTo(ix-1, iy);
00835 LineTo(ix , iy);
00836 }
00837 }
00838
00839 if ((ms > 19 && ms < 24) || ms == 29 || ms == 33 || ms == 34) {
00840 PrintFast(2," f");
00841 } else {
00842 PrintFast(2," S");
00843 }
00844
00845 SetLineStyle(linestylesav);
00846 SetLineWidth(linewidthsav);
00847 }
00848
00849
00850
00851 void TPDF::DrawPS(Int_t nn, Float_t *xw, Float_t *yw)
00852 {
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862 static Float_t dyhatch[24] = {.0075,.0075,.0075,.0075,.0075,.0075,.0075,.0075,
00863 .01 ,.01 ,.01 ,.01 ,.01 ,.01 ,.01 ,.01 ,
00864 .015 ,.015 ,.015 ,.015 ,.015 ,.015 ,.015 ,.015};
00865 static Float_t anglehatch[24] = {180, 90,135, 45,150, 30,120, 60,
00866 180, 90,135, 45,150, 30,120, 60,
00867 180, 90,135, 45,150, 30,120, 60};
00868 Int_t n = 0, fais = 0 , fasi = 0;
00869
00870 Style_t linestylesav = fLineStyle;
00871 Width_t linewidthsav = fLineWidth;
00872
00873 if (nn > 0) {
00874 n = nn;
00875 SetLineStyle(fLineStyle);
00876 SetLineWidth(fLineWidth);
00877 SetColor(Int_t(fLineColor));
00878 }
00879 if (nn < 0) {
00880 n = -nn;
00881 SetLineStyle(1);
00882 SetLineWidth(1);
00883 SetColor(Int_t(fFillColor));
00884 fais = fFillStyle/1000;
00885 fasi = fFillStyle%1000;
00886 if (fais == 3 || fais == 2) {
00887 if (fasi > 100 && fasi <125) {
00888 DrawHatch(dyhatch[fasi-101],anglehatch[fasi-101], n, xw, yw);
00889 SetLineStyle(linestylesav);
00890 SetLineWidth(linewidthsav);
00891 return;
00892 }
00893 if (fasi > 0 && fasi < 26) {
00894 SetFillPatterns(fasi, Int_t(fFillColor));
00895 }
00896 }
00897 }
00898
00899 WriteReal(XtoPDF(xw[0]));
00900 WriteReal(YtoPDF(yw[0]));
00901 if( n <= 1) {
00902 if( n == 0) return;
00903 PrintFast(2," m");
00904 return;
00905 }
00906
00907 PrintFast(2," m");
00908
00909 for (Int_t i=1;i<n;i++) LineTo(XtoPDF(xw[i]), YtoPDF(yw[i]));
00910
00911 if (nn > 0 ) {
00912 if (xw[0] == xw[n-1] && yw[0] == yw[n-1]) PrintFast(2," h");
00913 PrintFast(2," S");
00914 } else {
00915 if (fais == 0) {PrintFast(2," s"); return;}
00916 if (fais == 3 || fais == 2) {
00917 if (fasi > 0 && fasi < 26) {
00918 PrintFast(3," f*");
00919 fRed = -1;
00920 fGreen = -1;
00921 fBlue = -1;
00922 }
00923 SetLineStyle(linestylesav);
00924 SetLineWidth(linewidthsav);
00925 return;
00926 }
00927 PrintFast(3," f*");
00928 }
00929
00930 SetLineStyle(linestylesav);
00931 SetLineWidth(linewidthsav);
00932 }
00933
00934
00935
00936 void TPDF::DrawPS(Int_t nn, Double_t *xw, Double_t *yw)
00937 {
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947 static Float_t dyhatch[24] = {.0075,.0075,.0075,.0075,.0075,.0075,.0075,.0075,
00948 .01 ,.01 ,.01 ,.01 ,.01 ,.01 ,.01 ,.01 ,
00949 .015 ,.015 ,.015 ,.015 ,.015 ,.015 ,.015 ,.015};
00950 static Float_t anglehatch[24] = {180, 90,135, 45,150, 30,120, 60,
00951 180, 90,135, 45,150, 30,120, 60,
00952 180, 90,135, 45,150, 30,120, 60};
00953 Int_t n = 0, fais = 0, fasi = 0;
00954
00955 Style_t linestylesav = fLineStyle;
00956 Width_t linewidthsav = fLineWidth;
00957
00958 if (nn > 0) {
00959 n = nn;
00960 SetLineStyle(fLineStyle);
00961 SetLineWidth(fLineWidth);
00962 SetColor(Int_t(fLineColor));
00963 }
00964 if (nn < 0) {
00965 n = -nn;
00966 SetLineStyle(1);
00967 SetLineWidth(1);
00968 SetColor(Int_t(fFillColor));
00969 fais = fFillStyle/1000;
00970 fasi = fFillStyle%1000;
00971 if (fais == 3 || fais == 2) {
00972 if (fasi > 100 && fasi <125) {
00973 DrawHatch(dyhatch[fasi-101],anglehatch[fasi-101], n, xw, yw);
00974 SetLineStyle(linestylesav);
00975 SetLineWidth(linewidthsav);
00976 return;
00977 }
00978 if (fasi > 0 && fasi < 26) {
00979 SetFillPatterns(fasi, Int_t(fFillColor));
00980 }
00981 }
00982 }
00983
00984 WriteReal(XtoPDF(xw[0]));
00985 WriteReal(YtoPDF(yw[0]));
00986 if( n <= 1) {
00987 if( n == 0) return;
00988 PrintFast(2," m");
00989 return;
00990 }
00991
00992 PrintFast(2," m");
00993
00994 for (Int_t i=1;i<n;i++) LineTo(XtoPDF(xw[i]), YtoPDF(yw[i]));
00995
00996 if (nn > 0 ) {
00997 if (xw[0] == xw[n-1] && yw[0] == yw[n-1]) PrintFast(2," h");
00998 PrintFast(2," S");
00999 } else {
01000 if (fais == 0) {PrintFast(2," s"); return;}
01001 if (fais == 3 || fais == 2) {
01002 if (fasi > 0 && fasi < 26) {
01003 PrintFast(3," f*");
01004 fRed = -1;
01005 fGreen = -1;
01006 fBlue = -1;
01007 }
01008 SetLineStyle(linestylesav);
01009 SetLineWidth(linewidthsav);
01010 return;
01011 }
01012 PrintFast(3," f*");
01013 }
01014
01015 SetLineStyle(linestylesav);
01016 SetLineWidth(linewidthsav);
01017 }
01018
01019
01020
01021 void TPDF::FontEncode()
01022 {
01023
01024
01025 static const char *sdtfonts[] = {
01026 "/Times-Italic" , "/Times-Bold" , "/Times-BoldItalic",
01027 "/Helvetica" , "/Helvetica-Oblique" , "/Helvetica-Bold" ,
01028 "/Helvetica-BoldOblique", "/Courier" , "/Courier-Oblique" ,
01029 "/Courier-Bold" , "/Courier-BoldOblique", "/Symbol" ,
01030 "/Times-Roman" , "/ZapfDingbats" , "/Symbol"};
01031
01032 for (Int_t i=0; i<kNumberOfFonts; i++) {
01033 NewObject(kObjFont+i);
01034 PrintStr("<<@");
01035 PrintStr("/Type /Font@");
01036 PrintStr("/Subtype /Type1@");
01037 PrintStr("/Name /F");
01038 WriteInteger(i+1,0);
01039 PrintStr("@");
01040 PrintStr("/BaseFont ");
01041 PrintStr(sdtfonts[i]);
01042 PrintStr("@");
01043 if (i!=11 && i!=13 && i!=14) {
01044 PrintStr("/Encoding /WinAnsiEncoding");
01045 PrintStr("@");
01046 }
01047 PrintStr(">>@");
01048 PrintStr("endobj@");
01049 }
01050 }
01051
01052
01053
01054 void TPDF::LineTo(Double_t x, Double_t y)
01055 {
01056
01057
01058 WriteReal(x);
01059 WriteReal(y);
01060 PrintFast(2," l");
01061 }
01062
01063
01064
01065 void TPDF::MoveTo(Double_t x, Double_t y)
01066 {
01067
01068
01069 WriteReal(x);
01070 WriteReal(y);
01071 PrintFast(2," m");
01072 }
01073
01074
01075
01076 void TPDF::NewObject(Int_t n)
01077 {
01078
01079
01080 if (!fObjPos || n >= fObjPosSize) {
01081 Int_t newN = TMath::Max(2*fObjPosSize,n+1);
01082 Int_t *saveo = new Int_t [newN];
01083 if (fObjPos && fObjPosSize) {
01084 memcpy(saveo,fObjPos,fObjPosSize*sizeof(Int_t));
01085 memset(&saveo[fObjPosSize],0,(newN-fObjPosSize)*sizeof(Int_t));
01086 delete [] fObjPos;
01087 }
01088 fObjPos = saveo;
01089 fObjPosSize = newN;
01090 }
01091 fObjPos[n-1] = fNByte;
01092 fNbObj = TMath::Max(fNbObj,n);
01093 WriteInteger(n, 0);
01094 PrintStr(" 0 obj");
01095 PrintStr("@");
01096 }
01097
01098
01099
01100 void TPDF::NewPage()
01101 {
01102
01103
01104 if(!fPageNotEmpty)return;
01105
01106
01107 if (gPad) {
01108 Double_t ww = gPad->GetWw();
01109 Double_t wh = gPad->GetWh();
01110 fYsize = fXsize*wh/ww;
01111 } else {
01112 fYsize = 27;
01113 }
01114
01115 fNbPage++;
01116
01117 if (fNbPage>1) {
01118
01119 WriteCompressedBuffer();
01120 PrintStr("endstream@");
01121 Int_t streamLength = fNByte-fStartStream-10;
01122 PrintStr("endobj@");
01123 NewObject(4*(fNbPage-2)+kObjFirstPage+2);
01124 WriteInteger(streamLength, 0);
01125 PrintStr("@");
01126 PrintStr("endobj@");
01127 NewObject(4*(fNbPage-2)+kObjFirstPage+3);
01128 PrintStr("<<@");
01129 if (!strstr(GetTitle(),"PDF")) {
01130 PrintStr("/Title (");
01131 PrintStr(GetTitle());
01132 PrintStr(")@");
01133 } else {
01134 PrintStr("/Title (Page");
01135 WriteInteger(fNbPage-1);
01136 PrintStr(")@");
01137 }
01138 PrintStr("/Dest [");
01139 WriteInteger(4*(fNbPage-2)+kObjFirstPage);
01140 PrintStr(" 0 R /XYZ null null 0]@");
01141 PrintStr("/Parent");
01142 WriteInteger(kObjContents);
01143 PrintStr(" 0 R");
01144 PrintStr("@");
01145 PrintStr("/Next");
01146 WriteInteger(4*(fNbPage-1)+kObjFirstPage+3);
01147 PrintStr(" 0 R");
01148 PrintStr("@");
01149 if (fNbPage>2) {
01150 PrintStr("/Prev");
01151 WriteInteger(4*(fNbPage-3)+kObjFirstPage+3);
01152 PrintStr(" 0 R");
01153 PrintStr("@");
01154 }
01155 PrintStr(">>@");
01156 }
01157
01158
01159 NewObject(4*(fNbPage-1)+kObjFirstPage);
01160 PrintStr("<<@");
01161 PrintStr("/Type /Page@");
01162 PrintStr("@");
01163 PrintStr("/Parent");
01164 WriteInteger(kObjPages);
01165 PrintStr(" 0 R");
01166 PrintStr("@");
01167
01168 Double_t xlow=0, ylow=0, xup=1, yup=1;
01169 if (gPad) {
01170 xlow = gPad->GetAbsXlowNDC();
01171 xup = xlow + gPad->GetAbsWNDC();
01172 ylow = gPad->GetAbsYlowNDC();
01173 yup = ylow + gPad->GetAbsHNDC();
01174 }
01175
01176 PrintStr("/MediaBox [");
01177 Double_t width, height;
01178 switch (fPageFormat) {
01179 case 100 :
01180 width = 8.5*2.54;
01181 height = 11.*2.54;
01182 break;
01183 case 200 :
01184 width = 8.5*2.54;
01185 height = 14.*2.54;
01186 break;
01187 case 300 :
01188 width = 11.*2.54;
01189 height = 17.*2.54;
01190 break;
01191 default :
01192 width = 21.0*TMath::Power(TMath::Sqrt(2.), 4-fPageFormat);
01193 height = 29.7*TMath::Power(TMath::Sqrt(2.), 4-fPageFormat);
01194 };
01195 WriteReal(CMtoPDF(fXsize*xlow));
01196 WriteReal(CMtoPDF(fYsize*ylow));
01197 WriteReal(CMtoPDF(width));
01198 WriteReal(CMtoPDF(height));
01199 PrintStr("]");
01200 PrintStr("@");
01201
01202 Double_t xmargin = CMtoPDF(0.7);
01203 Double_t ymargin = 0;
01204 if (fPageOrientation == 1) ymargin = CMtoPDF(TMath::Sqrt(2.)*0.7);
01205 if (fPageOrientation == 2) ymargin = CMtoPDF(height)-CMtoPDF(0.7);
01206
01207 PrintStr("/CropBox [");
01208 if (fPageOrientation == 1) {
01209 WriteReal(xmargin);
01210 WriteReal(ymargin);
01211 WriteReal(xmargin+CMtoPDF(fXsize*xup));
01212 WriteReal(ymargin+CMtoPDF(fYsize*yup));
01213 }
01214 if (fPageOrientation == 2) {
01215 WriteReal(xmargin);
01216 WriteReal(CMtoPDF(height)-CMtoPDF(fXsize*xup)-xmargin);
01217 WriteReal(xmargin+CMtoPDF(fYsize*yup));
01218 WriteReal(CMtoPDF(height)-xmargin);
01219 }
01220 PrintStr("]");
01221 PrintStr("@");
01222
01223 if (fPageOrientation == 1) PrintStr("/Rotate 0@");
01224 if (fPageOrientation == 2) PrintStr("/Rotate 90@");
01225
01226 PrintStr("/Resources");
01227 WriteInteger(kObjPageResources);
01228 PrintStr(" 0 R");
01229 PrintStr("@");
01230
01231 PrintStr("/Contents");
01232 WriteInteger(4*(fNbPage-1)+kObjFirstPage+1);
01233 PrintStr(" 0 R@");
01234 PrintStr(">>@");
01235 PrintStr("endobj@");
01236
01237 NewObject(4*(fNbPage-1)+kObjFirstPage+1);
01238 PrintStr("<<@");
01239 PrintStr("/Length");
01240 WriteInteger(4*(fNbPage-1)+kObjFirstPage+2);
01241 PrintStr(" 0 R@");
01242 PrintStr("/Filter [/FlateDecode]@");
01243 PrintStr(">>@");
01244 PrintStr("stream@");
01245 fStartStream = fNByte;
01246 fCompress = kTRUE;
01247
01248
01249 fLineWidth = -1;
01250
01251 PrintStr("1 0 0 1");
01252 if (fPageOrientation == 2) {
01253 ymargin = CMtoPDF(height)-CMtoPDF(fXsize*xup)-xmargin;
01254 xmargin = xmargin+CMtoPDF(fYsize*yup);
01255 }
01256 WriteReal(xmargin);
01257 WriteReal(ymargin);
01258 PrintStr(" cm");
01259 if (fPageOrientation == 2) PrintStr(" 0 1 -1 0 0 0 cm");
01260 }
01261
01262
01263
01264 void TPDF::Off()
01265 {
01266
01267
01268 gVirtualPS = 0;
01269 }
01270
01271
01272
01273 void TPDF::On()
01274 {
01275
01276
01277
01278
01279
01280 if (!fType) {
01281 Error("On", "no PDF file open");
01282 Off();
01283 return;
01284 }
01285 gVirtualPS = this;
01286 }
01287
01288
01289
01290 void TPDF::Open(const char *fname, Int_t wtype)
01291 {
01292
01293
01294 Int_t i;
01295
01296 if (fStream) {
01297 Warning("Open", "PDF file already open");
01298 return;
01299 }
01300
01301 fLenBuffer = 0;
01302 fRed = -1;
01303 fGreen = -1;
01304 fBlue = -1;
01305 fType = abs(wtype);
01306 SetLineScale(gStyle->GetLineScalePS()/4.);
01307 gStyle->GetPaperSize(fXsize, fYsize);
01308 Float_t xrange, yrange;
01309 if (gPad) {
01310 Double_t ww = gPad->GetWw();
01311 Double_t wh = gPad->GetWh();
01312 if (fType == 113) {
01313 ww *= gPad->GetWNDC();
01314 wh *= gPad->GetHNDC();
01315 }
01316 Double_t ratio = wh/ww;
01317 xrange = fXsize;
01318 yrange = fXsize*ratio;
01319 if (yrange > fYsize) { yrange = fYsize; xrange = yrange/ratio;}
01320 fXsize = xrange; fYsize = yrange;
01321 }
01322
01323
01324 fStream = new ofstream();
01325 #ifdef R__WIN32
01326 fStream->open(fname, ofstream::out | ofstream::binary);
01327 #else
01328 fStream->open(fname, ofstream::out);
01329 #endif
01330 if (fStream == 0) {
01331 printf("ERROR in TPDF::Open: Cannot open file:%s\n",fname);
01332 return;
01333 }
01334
01335 gVirtualPS = this;
01336
01337 for (i=0; i<fSizBuffer; i++) fBuffer[i] = ' ';
01338
01339
01340
01341
01342 fPageOrientation = fType%10;
01343 if( fPageOrientation < 1 || fPageOrientation > 2) {
01344 Error("Open", "Invalid page orientation %d", fPageOrientation);
01345 return;
01346 }
01347
01348
01349
01350
01351
01352 fPageFormat = fType/1000;
01353 if( fPageFormat == 0 ) fPageFormat = 4;
01354 if( fPageFormat == 99 ) fPageFormat = 0;
01355
01356 fRange = kFALSE;
01357
01358
01359 Range(fXsize, fYsize);
01360
01361 fObjPos = 0;
01362 fObjPosSize = 0;
01363 fNbObj = 0;
01364 fNbPage = 0;
01365
01366 PrintStr("%PDF-1.4@");
01367 PrintStr("%\342\343\317\323");
01368 PrintStr("@");
01369
01370 NewObject(kObjRoot);
01371 PrintStr("<<@");
01372 PrintStr("/Type /Catalog@");
01373 PrintStr("/Pages");
01374 WriteInteger(kObjPages);
01375 PrintStr(" 0 R@");
01376 PrintStr("/Outlines");
01377 WriteInteger(kObjOutlines);
01378 PrintStr(" 0 R@");
01379 PrintStr("/PageMode /UseOutlines@");
01380 PrintStr(">>@");
01381 PrintStr("endobj@");
01382
01383 NewObject(kObjInfo);
01384 PrintStr("<<@");
01385 PrintStr("/Creator (ROOT Version ");
01386 PrintStr(gROOT->GetVersion());
01387 PrintStr(")");
01388 PrintStr("@");
01389 PrintStr("/CreationDate (");
01390 TDatime t;
01391 char str[17];
01392 snprintf(str,17,"D:%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d",
01393 t.GetYear() , t.GetMonth(),
01394 t.GetDay() , t.GetHour(),
01395 t.GetMinute(), t.GetSecond());
01396 PrintStr(str);
01397 PrintStr(")");
01398 PrintStr("@");
01399 PrintStr("/Title (");
01400 if (strlen(GetName())<=80) PrintStr(GetName());
01401 PrintStr(")");
01402 PrintStr("@");
01403 PrintStr("/Keywords (ROOT)@");
01404 PrintStr(">>@");
01405 PrintStr("endobj@");
01406
01407 NewObject(kObjPageResources);
01408 PrintStr("<<@");
01409 PrintStr("/ProcSet [/PDF /Text]@");
01410
01411 PrintStr("/Font@");
01412 PrintStr("<<@");
01413 for (i=0; i<kNumberOfFonts; i++) {
01414 PrintStr(" /F");
01415 WriteInteger(i+1,0);
01416 WriteInteger(kObjFont+i);
01417 PrintStr(" 0 R");
01418 }
01419 PrintStr("@");
01420 PrintStr(">>@");
01421
01422 PrintStr("/ColorSpace << /Cs8");
01423 WriteInteger(kObjColorSpace);
01424 PrintStr(" 0 R >>");
01425 PrintStr("@");
01426 PrintStr("/Pattern");
01427 WriteInteger(kObjPatternList);
01428 PrintStr(" 0 R");
01429 PrintStr("@");
01430 PrintStr(">>@");
01431 PrintStr("endobj@");
01432
01433 FontEncode();
01434 PatternEncode();
01435
01436 NewPage();
01437 fPageNotEmpty = kFALSE;
01438 }
01439
01440
01441 void TPDF::PatternEncode()
01442 {
01443
01444
01445 Int_t patternNb = kObjPattern;
01446
01447 NewObject(kObjColorSpace);
01448 if (gStyle->GetColorModelPS()) {
01449 PrintStr("[/Pattern /DeviceCMYK]@");
01450 } else {
01451 PrintStr("[/Pattern /DeviceRGB]@");
01452 }
01453 PrintStr("endobj@");
01454 NewObject(kObjPatternResourses);
01455 PrintStr("<</ProcSet[/PDF]>>@");
01456 PrintStr("endobj@");
01457
01458 NewObject(kObjPatternList);
01459 PrintStr("<<@");
01460 PrintStr(" /P01");
01461 WriteInteger(patternNb++);
01462 PrintStr(" 0 R");
01463 PrintStr(" /P02");
01464 WriteInteger(patternNb++);
01465 PrintStr(" 0 R");
01466 PrintStr(" /P03");
01467 WriteInteger(patternNb++);
01468 PrintStr(" 0 R");
01469 PrintStr(" /P04");
01470 WriteInteger(patternNb++);
01471 PrintStr(" 0 R");
01472 PrintStr(" /P05");
01473 WriteInteger(patternNb++);
01474 PrintStr(" 0 R");
01475 PrintStr(" /P06");
01476 WriteInteger(patternNb++);
01477 PrintStr(" 0 R");
01478 PrintStr(" /P07");
01479 WriteInteger(patternNb++);
01480 PrintStr(" 0 R");
01481 PrintStr(" /P08");
01482 WriteInteger(patternNb++);
01483 PrintStr(" 0 R");
01484 PrintStr(" /P09");
01485 WriteInteger(patternNb++);
01486 PrintStr(" 0 R");
01487 PrintStr(" /P10");
01488 WriteInteger(patternNb++);
01489 PrintStr(" 0 R");
01490 PrintStr(" /P11");
01491 WriteInteger(patternNb++);
01492 PrintStr(" 0 R");
01493 PrintStr(" /P12");
01494 WriteInteger(patternNb++);
01495 PrintStr(" 0 R");
01496 PrintStr(" /P13");
01497 WriteInteger(patternNb++);
01498 PrintStr(" 0 R");
01499 PrintStr(" /P14");
01500 WriteInteger(patternNb++);
01501 PrintStr(" 0 R");
01502 PrintStr(" /P15");
01503 WriteInteger(patternNb++);
01504 PrintStr(" 0 R");
01505 PrintStr(" /P16");
01506 WriteInteger(patternNb++);
01507 PrintStr(" 0 R");
01508 PrintStr(" /P17");
01509 WriteInteger(patternNb++);
01510 PrintStr(" 0 R");
01511 PrintStr(" /P18");
01512 WriteInteger(patternNb++);
01513 PrintStr(" 0 R");
01514 PrintStr(" /P19");
01515 WriteInteger(patternNb++);
01516 PrintStr(" 0 R");
01517 PrintStr(" /P20");
01518 WriteInteger(patternNb++);
01519 PrintStr(" 0 R");
01520 PrintStr(" /P21");
01521 WriteInteger(patternNb++);
01522 PrintStr(" 0 R");
01523 PrintStr(" /P22");
01524 WriteInteger(patternNb++);
01525 PrintStr(" 0 R");
01526 PrintStr(" /P23");
01527 WriteInteger(patternNb++);
01528 PrintStr(" 0 R");
01529 PrintStr(" /P24");
01530 WriteInteger(patternNb++);
01531 PrintStr(" 0 R");
01532 PrintStr(" /P25");
01533 WriteInteger(patternNb++);
01534 PrintStr(" 0 R@");
01535 PrintStr(">>@");
01536 PrintStr("endobj@");
01537
01538 patternNb = kObjPattern;
01539
01540
01541 NewObject(patternNb++);
01542 PrintStr("<</Type/Pattern/Matrix[1 0 0 1 20 28]/PatternType 1/Resources");
01543 WriteInteger(kObjPatternResourses);
01544 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 98/YStep 4/Length 91/Filter/FlateDecode>>");
01545 PrintStr("@");
01546 fStream->write("stream",6); fNByte += 6;
01547 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301P\241\034(\254\340\253\020m\250\020k\240\220\302e\244`\242\220\313ei\t\244r\200\272\215A\034\v \225\003\2241\202\310\030\201e\f!2\206@N0W \027@\200\001\0|c\024\357\n", 93);
01548 fNByte += 93;
01549 PrintStr("endstream@");
01550 PrintStr("endobj@");
01551
01552
01553 NewObject(patternNb++);
01554 PrintStr("<</Type/Pattern/Matrix[0.75 0 0 0.75 20 28]/PatternType 1/Resources");
01555 WriteInteger(kObjPatternResourses);
01556 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 96/YStep 4/Length 92/Filter/FlateDecode>>@");
01557 PrintStr("@");
01558 fStream->write("stream",6); fNByte += 6;
01559 fStream->write("\r\nH\211$\2121\n\2000\024C\367\234\"G\370\277\025\321+\b\016\342\340P\334tP\252\240\213\3277\332!\204\274\227\v\316\2150\032\335J\356\025\023O\241Np\247\363\021f\317\344\214\234\215\v\002+\036h\033U\326/~\243Ve\231PL\370\215\027\343\032#\006\274\002\f\0\242`\025:\n", 94);
01560 fNByte += 94;
01561 PrintStr("endstream@");
01562 PrintStr("endobj@");
01563
01564
01565 NewObject(patternNb++);
01566 PrintStr("<</Type/Pattern/Matrix[0.5 0 0 0.5 20 28]/PatternType 1/Resources");
01567 WriteInteger(kObjPatternResourses);
01568 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 96/YStep 16/Length 93/Filter/FlateDecode>>@");
01569 PrintStr("@");
01570 fStream->write("stream",6); fNByte += 6;
01571 fStream->write("\r\nH\211$\2121\n\2000\024C\367\234\"G\370\261(\366\n\202\20388\210\233\016J\025t\361\372\376\332!\204\274\227\033\342N\030\215\262\222g\303\304\313Q\347\360\240\370:f\317Y\f\\\214+**\360Dls'\177\306\274\032\257\344\256.\252\376\215\212\221\217\021\003>\001\006\0\317\243\025\254\n", 95);
01572 fNByte += 95;
01573 PrintStr("endstream@");
01574 PrintStr("endobj@");
01575
01576
01577 NewObject(patternNb++);
01578 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01579 WriteInteger(kObjPatternResourses);
01580 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 63/Filter/FlateDecode>>");
01581 PrintStr("@");
01582 fStream->write("stream",6); fNByte += 6;
01583 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\002V\231\313\005S\233\303\025\314\025\310\005\020`\0\344\270\r\274\n", 65);
01584 fNByte += 65;
01585 PrintStr("endstream@");
01586 PrintStr("endobj@");
01587
01588
01589 NewObject(patternNb++);
01590 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01591 WriteInteger(kObjPatternResourses);
01592 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 66/Filter/FlateDecode>>");
01593 PrintStr("@");
01594 fStream->write("stream",6); fNByte += 6;
01595 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\302\005Q\223\313\005\"\r\024r\270\202\271\002\271\0\002\f\0\344\320\r\274\n", 68);
01596 fNByte += 68;
01597 PrintStr("endstream@");
01598 PrintStr("endobj@");
01599
01600
01601 NewObject(patternNb++);
01602 PrintStr("<</Type/Pattern/Matrix[0.03 0 0 0.03 20 28]/PatternType 1/Resources");
01603 WriteInteger(kObjPatternResourses);
01604 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 66/Filter/FlateDecode>>");
01605 PrintStr("@");
01606 fStream->write("stream",6); fNByte += 6;
01607 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\302e\nR\232\v\242@js\270\202\271\002\271\0\002\f\0\345X\r\305\n", 68);
01608 fNByte += 68;
01609 PrintStr("endstream@");
01610 PrintStr("endobj@");
01611
01612
01613 NewObject(patternNb++);
01614 PrintStr("<</Type/Pattern/Matrix[0.03 0 0 0.03 20 28]/PatternType 1/Resources");
01615 WriteInteger(kObjPatternResourses);
01616 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 68/Filter/FlateDecode>>");
01617 PrintStr("@");
01618 fStream->write("stream",6); fNByte += 6;
01619 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\002\02465P\310\345\002)\0042r\270\202\271\002\271\0\002\f\0\345=\r\305\n", 70);
01620 fNByte += 70;
01621 PrintStr("endstream@");
01622 PrintStr("endobj@");
01623
01624
01625 NewObject(patternNb++);
01626 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01627 WriteInteger(kObjPatternResourses);
01628 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 101 101]/XStep 100/YStep 100/Length 139/Filter/FlateDecode>>");
01629 PrintStr("@");
01630 fStream->write("stream",6); fNByte += 6;
01631 fStream->write("\r\nH\211D\217\261\016\3020\fDw\177\305\315L6Q\225|\003\022C\305\300Puk+\201\032$\272\360\373\330\265\323\016\271\330\367\234\344\"x\201\030\214\252\232\030+%\353VZ.jd\367\205\003x\241({]\311\324]\323|\342\006\033J\201:\306\325\230Jg\226J\261\275D\257#\337=\220\260\354k\233\351\211\217Z75\337\020\374\324\306\035\303\310\230\342x=\303\371\275\307o\332s\331\223\224\240G\330\a\365\364\027`\0\nX1}\n",141);
01632 fNByte += 141;
01633 PrintStr("endstream@");
01634 PrintStr("endobj@");
01635
01636
01637 NewObject(patternNb++);
01638 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01639 WriteInteger(kObjPatternResourses);
01640 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 108/Filter/FlateDecode>>");
01641 PrintStr("@");
01642 fStream->write("stream",6); fNByte += 6;
01643 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\002\02465P\310\005RFFz&\020\002,d\240\220\314en\256g\0065\b,\001b\230\202$\240\232\214@\362\246`\2169H\336\024\2426\231\v&\200,\n\326\030\314\025\310\005\020`\0\f@\036\227\n", 110);
01644 fNByte += 110;
01645 PrintStr("endstream@");
01646 PrintStr("endobj@");
01647
01648
01649 NewObject(patternNb++);
01650 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01651 WriteInteger(kObjPatternResourses);
01652 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 93/Filter/FlateDecode>>");
01653 PrintStr("@");
01654 fStream->write("stream",6); fNByte += 6;
01655 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\002\02465P\310\345\002)\0042r\200\332\r\241\\C \017dN.\027L\312\0\302\205\2535\205j6\205X\224\303\025\314\025\310\005\020`\0\2127\031\t\n", 95);
01656 fNByte += 95;
01657 PrintStr("endstream@");
01658 PrintStr("endobj@");
01659
01660
01661 NewObject(patternNb++);
01662 PrintStr("<</Type/Pattern/Matrix[0.125 0 0 0.125 20 28]/PatternType 1/Resources");
01663 WriteInteger(kObjPatternResourses);
01664 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 164/Filter/FlateDecode>>");
01665 PrintStr("@");
01666 fStream->write("stream",6); fNByte += 6;
01667 fStream->write("\r\nH\211\\\2171\016\3020\fEw\237\342\037\301ip\223^\001\211\001u`@l0\200(\022,\\\037;v\204\332\241\211\336\373\337V\363\246\204;\210\301H\354\337\347F'\274T\355U>\220\360U\215\003\316\027\306\2655\027=\a\306\223\304I\002m\332\330\356&\030\325\333fZ\275F\337\205\235\265O\270\032\004\331\214\336\305\270\004\227`\357i\256\223\342;]\344\255(!\372\356\205j\030\377K\335\220\344\377\210\274\306\022\330\337T{\214,\212;\301\3508\006\346\206\021O=\216|\212|\246#\375\004\030\0\216FF\207\n", 166);
01668 fNByte += 166;
01669 PrintStr("endstream@");
01670 PrintStr("endobj@");
01671
01672
01673 NewObject(patternNb++);
01674 PrintStr("<</Type/Pattern/Matrix[0.125 0 0 0.125 20 28]/PatternType 1/Resources");
01675 WriteInteger(kObjPatternResourses);
01676 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 226/Filter/FlateDecode>>");
01677 PrintStr("@");
01678 fStream->write("stream",6); fNByte += 6;
01679 fStream->write("\r\nH\211<P;n\3030\f\335y\n\236 \220DK\242\256P\240C\321\241C\221\311\311\220\242\016\220.\275~D\221/\203I\342}\370(?(\363\215)q\342\234\374\373\273\322\027\337'\3646\301\037\316\374?a~\347\357s\342\313\2045\361A9\237\322fc\231\200\236F\263\301\334;\211\017\207\rN\311\252S\\\227{\247\006w\207\244\303\255p+(\205\333\360e/v\356a\315\317\360\272\320b|w\276\203o\340k\b\004\027\v$b\226\235,\242\254t(\024\nu\305Vm\313\021\375\327\272\257\227fuf\226ju\356\222x\030\024\313\261S\215\377\341\274,\203\254\253Z\\\262A\262\205eD\350\210\320\201\225\212\320\036\241\355\025\372JE,\2266\344\366\310U\344\016HFx>\351\203\236\002\f\0d}e\216\n", 228);
01680 fNByte += 228;
01681 PrintStr("endstream@");
01682 PrintStr("endobj@");
01683
01684
01685 NewObject(patternNb++);
01686 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01687 WriteInteger(kObjPatternResourses);
01688 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 69/Filter/FlateDecode>>");
01689 PrintStr("@");
01690 fStream->write("stream",6); fNByte += 6;
01691 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\002V\231\313\005S\233\303\005\241!\" ~0W \027@\200\001\0\331\227\020\253\n", 71);
01692 fNByte += 71;
01693 PrintStr("endstream@");
01694 PrintStr("endobj@");
01695
01696
01697 NewObject(patternNb++);
01698 PrintStr("<</Type/Pattern/Matrix[0.15 0 0 0.15 20 28]/PatternType 1/Resources");
01699 WriteInteger(kObjPatternResourses);
01700 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 80/YStep 80/Length 114/Filter/FlateDecode>>");
01701 PrintStr("@");
01702 fStream->write("stream",6); fNByte += 6;
01703 fStream->write("\r\nH\2114\214=\n\2000\f\205\367\234\342\035!-\241\364\f\202\20388\210\233\016J+\350\342\365M\3723\224\327\367}I\036r8A\f\206\343\372\336\203\026\334\212\006\205\027\004\237b\214X7\306\256\33032\331\240~\022y[\315\026\206\222\372\330}\264\036\253\217\335\353\240\030\b%\223\245o=X\227\346\245\355K\341\345@\3613M\364\v0\0\207o\"\261\n", 116);
01704 fNByte += 116;
01705 PrintStr("endstream@");
01706 PrintStr("endobj@");
01707
01708
01709 NewObject(patternNb++);
01710 PrintStr("<</Type/Pattern/Matrix[0.102 0 0 0.102 20 28]/PatternType 1/Resources");
01711 WriteInteger(kObjPatternResourses);
01712 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 60 60]/XStep 60/YStep 60/Length 218/Filter/FlateDecode>>");
01713 PrintStr("@");
01714 fStream->write("stream",6); fNByte += 6;
01715 fStream->write("\r\nH\211<\2211\016\3020\fEw\237\302'@\211c\267w@b@\f\f\210\2510\200(\022,\\\037\347\307\256Z\325\221\375\337\377\225\363\241\312\017\246\302\205'\274\337;\235\371\355\215\275\267\236\\\371\307\265\360\201/\327\3027o\233\361J\262\233\247~\362g\336\211zur!A]{\035}\031S\343\006p\241\226dKI\v\326\202\265\3153\331)X)\335fE\205M\235\373\327\r*\374\026\252\022\216u\223\200\361I\211\177\031\022\001#``\342GI\211\004c\221gi\246\231\247\221\247\231\247\233$XM3\315<\215<\315<K\211e\036#\215a4\366\344\035lm\214Z\314b\211Xj\337K\\\201$\332\325\v\365\2659\204\362\242\274'\v\221\r\321\211\216\364\027`\0\212'_\215\n", 220);
01716 fNByte += 220;
01717 PrintStr("endstream@");
01718 PrintStr("endobj@");
01719
01720
01721 NewObject(patternNb++);
01722 PrintStr("<</Type/Pattern/Matrix[0.1 0 0 0.05 20 28]/PatternType 1/Resources");
01723 WriteInteger(kObjPatternResourses);
01724 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 123/Filter/FlateDecode>>");
01725 PrintStr("@");
01726 fStream->write("stream",6); fNByte += 6;
01727 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020\035k\240\220\302ej\240\0D\271 \332\314X\317B\301\330\002H\230\233*\030\231\202\310d.CC=#\020\v*\rV\235\214\254\v\210r@\264\261\031P\241\031H5D\253\021H\267\005\3104 \v\344\016\260\002\020\003lB0W \027@\200\001\0hU \305\n", 125);
01728 fNByte += 125;
01729 PrintStr("endstream@");
01730 PrintStr("endobj@");
01731
01732
01733 NewObject(patternNb++);
01734 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01735 WriteInteger(kObjPatternResourses);
01736 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 66/Filter/FlateDecode>>");
01737 PrintStr("@");
01738 fStream->write("stream",6); fNByte += 6;
01739 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020md\242\020k\240\220\002V\234\313\005S\236\303\025\314\025\310\005\020`\0\r\351\016B\n", 68);
01740 fNByte += 68;
01741 PrintStr("endstream@");
01742 PrintStr("endobj@");
01743
01744
01745 NewObject(patternNb++);
01746 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01747 WriteInteger(kObjPatternResourses);
01748 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 69/Filter/FlateDecode>>");
01749 PrintStr("@");
01750 fStream->write("stream",6); fNByte += 6;
01751 fStream->write("\r\nH\211*\3442T\310T\3402P0P04\200\340\242T\256p\205<\240\220\027P0K\301D\241\034(\254\340\253\020md\242\020k\240\220\302\005Q\226\313\005\"\r\024r\270\202\271\002\271\0\002\f\0\016\001\016B\n", 71);
01752 fNByte += 71;
01753 PrintStr("endstream@");
01754 PrintStr("endobj@");
01755
01756
01757 NewObject(patternNb++);
01758 PrintStr("<</Type/Pattern/Matrix[0.117 0 0 0.117 20 28]/PatternType 1/Resources");
01759 WriteInteger(kObjPatternResourses);
01760 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 149/Filter/FlateDecode>>");
01761 PrintStr("@");
01762 fStream->write("stream",6); fNByte += 6;
01763 fStream->write("\r\nH\211L\216;\016\302@\fD{\237bN\020\331+6a\257\200D\201((P\252@\001R\220\240\341\372\370\263\216(\326\266f\336\330\373&\301\003\304`\b\307\373\334\351\202\227J\a\025\237\020|U\306\021\327\231q\243\306\250\214\325\372T\006\336\367\032\262\326\205\3124\264b\243$\"n.\244=\314\250!\2139\033\327\022i=\323\317\2518\332T}\347.\202\346W\373\372j\315\221\344\266\213=\237\241\344\034\361\264!\236w\344\177\271o8\323\211~\002\f\0\366\3026\233\n", 151);
01764 fNByte += 151;
01765 PrintStr("endstream@");
01766 PrintStr("endobj@");
01767
01768
01769 NewObject(patternNb++);
01770 PrintStr("<</Type/Pattern/Matrix[0.05 0 0 0.1 20 28]/PatternType 1/Resources");
01771 WriteInteger(kObjPatternResourses);
01772 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 122/Filter/FlateDecode>>");
01773 PrintStr("@");
01774 fStream->write("stream",6); fNByte += 6;
01775 fStream->write("\r\nH\211<L;\016\2030\f\335}\212w\002\344$M\2323 1 \006\006\304\224vhU\220`\341\372<\aT\311\366\263\336o\023\207\017D\241pz\355\376\226\021+\251\226\344\027\017\034\244\321a\232\025/\211\n\316r\343ORh\262}\317\210\344\032o\310)\302\2233\245\252[m\274\332\313\277!$\332\371\371\210`N\242\267$\217\263\246\252W\257\245\006\351\345\024`\0o\347 \305\n", 124);
01776 fNByte += 124;
01777 PrintStr("endstream@");
01778 PrintStr("endobj@");
01779
01780
01781 NewObject(patternNb++);
01782 PrintStr("<</Type/Pattern/Matrix[0.125 0 0 0.125 20 28]/PatternType 1/Resources");
01783 WriteInteger(kObjPatternResourses);
01784 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 101 101]/XStep 100/YStep 100/Length 117/Filter/FlateDecode>>");
01785 PrintStr("@");
01786 fStream->write("stream",6); fNByte += 6;
01787 fStream->write("\r\nH\211D\2151\n\2000\fE\367\234\342\037!)\224\336Ap\020\a\aq\323A\251\202.^\337$-\025\022^\372\033^n\022\354 \006CX\274\237\215&\\\032u\032\036\020\274\032\243\307\2740V]\027\234\024\242\"\033\2642En\324\312\224bc\262\\\230\377\301\332WM\224\212(U\221\375\265\301\025\016?\350\317P\215\221\033\213o\244\201>\001\006\0\031I'f\n", 119);
01788 fNByte += 119;
01789 PrintStr("endstream@");
01790 PrintStr("endobj@");
01791
01792
01793 NewObject(patternNb++);
01794 PrintStr("<</Type/Pattern/Matrix[0.125 0 0 0.125 20 28]/PatternType 1/Resources");
01795 WriteInteger(kObjPatternResourses);
01796 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 101 101]/XStep 100/YStep 100/Length 118/Filter/FlateDecode>>");
01797 PrintStr("@");
01798 fStream->write("stream",6); fNByte += 6;
01799 fStream->write("\r\nH\211<\215=\n\204P\f\204\373\234b\216\220<\b\357\016\302\026ba!vZ(\273\v\332x}\223\274\237\"|\223a\230\271Hp\200\030\fa\211\273w\232\3617k0\363\204\3401\033\037,+c#\3170~\2244\304\327EV\243r\247\272oOcr\337\323]H\t\226\252\334\252r\255\362\257\213(\t\304\250\326\315T\267\032\275q\242\221^\001\006\0\272\367(&\n", 120);
01800 fNByte += 120;
01801 PrintStr("endstream@");
01802 PrintStr("endobj@");
01803
01804
01805 NewObject(patternNb++);
01806 PrintStr("<</Type/Pattern/Matrix[0.06 0 0 0.06 20 28]/PatternType 1/Resources");
01807 WriteInteger(kObjPatternResourses);
01808 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 169/Filter/FlateDecode>>");
01809 PrintStr("@");
01810 fStream->write("stream",6); fNByte += 6;
01811 fStream->write("\r\nH\211<\220\273\n\0021\020E\373\371\212[[M\326\331\354\344\027\004\v\261\260\020;\025\224D\320\306\337w\036\254p\363\230\223\341$\344M\005\017\020\203Q8\307\347F'\274\f\355\f>Q\3605\214=\316\005\v.\214kt\217\230;)\324\366\245Fa\213e\320v\212r\022X\006\211Fi\3242\250J\224\302\020\367h\212\254I\\\325R\225o\03143\346U\235@a\t[\202Za\tA\202E`\351~O\002\235`\351~S\202\306h.m\253\264)\232K\217t\310\017q\354\a\353\247\364\377C\356\033\372\t0\0\bm:\375\n", 171);
01812 fNByte += 171;
01813 PrintStr("endstream@");
01814 PrintStr("endobj@");
01815
01816
01817 NewObject(patternNb++);
01818 PrintStr("<</Type/Pattern/Matrix[0.125 0 0 0.125 20 28]/PatternType 1/Resources");
01819 WriteInteger(kObjPatternResourses);
01820 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 100 100]/XStep 100/YStep 100/Length 280/Filter/FlateDecode>>");
01821 PrintStr("@");
01822 fStream->write("stream",6); fNByte += 6;
01823 fStream->write("\r\nH\211DQ9N\004A\f\314\373\025\216\211\326\343v\037_@\"@\004\004\210\f\220@\003\022$|\177\335\345j\220v\345\251\303\343*\215\312\273\024\275\\d\375?\361dM\3162\306\337\214\337Y\336n\240m\217\036\301y\343\\<,i\250\0038F\035)\347l\322\026o\377\023\353|[\254\177\343\005;\315\317ky\224\257\240n\203\374\020\225\337\240\345N\236T\272<_\344\245\304^\3238\030\tc\236E\233xO\034\363\204>\251\317\324\233\023{\352\235\376\336S\357Fl\251\017\372\207\247>xoh&_\366Ud\331\253\314D\023\332\241\211\016\205\246\235\326\236*\275\307\204z8!s\031\335\306\\\306C\306\\\225\376\312\\\225\307\252\246\356\364\273Q\347\271:\371\341l\177\311e\210\3571\211\251#\374\302H\037:\342c\241\323\2617\320 \034\250\0\302\323a{\005%\302a\373(Zx\313\026\213@\215p\324}\026=\274e\217E8s\326}\026M\036\312}\271\n0\0\215\263\207\016\n", 282);
01824 fNByte += 282;
01825 PrintStr("endstream@");
01826 PrintStr("endobj@");
01827
01828
01829 NewObject(patternNb++);
01830 PrintStr("<</Type/Pattern/Matrix[0.125 0 0 0.125 20 28]/PatternType 1/Resources");
01831 WriteInteger(kObjPatternResourses);
01832 PrintStr(" 0 R/PaintType 2/TilingType 1/BBox[0 0 101 101]/XStep 100/YStep 100/Length 54/Filter/FlateDecode>>");
01833 PrintStr("@");
01834 fStream->write("stream",6); fNByte += 6;
01835 fStream->write("\r\nH\2112T\310T\3402P0P\310\34526P\0\242\034.s\004m\016\242\r\r\f\024@\030\302\002\321iZP\305`M\346\310\212\201R\0\001\006\0\206\322\017\200\n", 56);
01836 fNByte += 56;
01837 PrintStr("endstream@");
01838 PrintStr("endobj@");
01839 }
01840
01841
01842 void TPDF::PrintStr(const char *str)
01843 {
01844
01845
01846 Int_t len = strlen(str);
01847 if (len == 0) return;
01848 fPageNotEmpty = kTRUE;
01849
01850 if (fCompress) {
01851 if (fLenBuffer+len >= fSizBuffer) {
01852 fBuffer = TStorage::ReAllocChar(fBuffer, 2*fSizBuffer, fSizBuffer);
01853 fSizBuffer = 2*fSizBuffer;
01854 }
01855 strcpy(fBuffer + fLenBuffer, str);
01856 fLenBuffer += len;
01857 return;
01858 }
01859
01860 TVirtualPS::PrintStr(str);
01861 }
01862
01863
01864
01865 void TPDF::PrintFast(Int_t len, const char *str)
01866 {
01867
01868
01869 fPageNotEmpty = kTRUE;
01870 if (fCompress) {
01871 if (fLenBuffer+len >= fSizBuffer) {
01872 fBuffer = TStorage::ReAllocChar(fBuffer, 2*fSizBuffer, fSizBuffer);
01873 fSizBuffer = 2*fSizBuffer;
01874 }
01875 strcpy(fBuffer + fLenBuffer, str);
01876 fLenBuffer += len;
01877 return;
01878 }
01879
01880 TVirtualPS::PrintFast(len, str);
01881 }
01882
01883
01884
01885 void TPDF::Range(Float_t xsize, Float_t ysize)
01886 {
01887
01888
01889 Float_t xps, yps, xncm, yncm, dxwn, dywn, xwkwn, ywkwn, xymax;
01890
01891 fXsize = xsize;
01892 fYsize = ysize;
01893
01894 xps = xsize;
01895 yps = ysize;
01896
01897 if( xsize <= xps && ysize < yps) {
01898 if ( xps > yps ) xymax = xps;
01899 else xymax = yps;
01900 xncm = xsize/xymax;
01901 yncm = ysize/xymax;
01902 dxwn = ((xps/xymax)-xncm)/2;
01903 dywn = ((yps/xymax)-yncm)/2;
01904 } else {
01905 if (xps/yps < 1) xwkwn = xps/yps;
01906 else xwkwn = 1;
01907 if (yps/xps < 1) ywkwn = yps/xps;
01908 else ywkwn = 1;
01909
01910 if (xsize < ysize) {
01911 xncm = ywkwn*xsize/ysize;
01912 yncm = ywkwn;
01913 dxwn = (xwkwn-xncm)/2;
01914 dywn = 0;
01915 if( dxwn < 0) {
01916 xncm = xwkwn;
01917 dxwn = 0;
01918 yncm = xwkwn*ysize/xsize;
01919 dywn = (ywkwn-yncm)/2;
01920 }
01921 } else {
01922 xncm = xwkwn;
01923 yncm = xwkwn*ysize/xsize;
01924 dxwn = 0;
01925 dywn = (ywkwn-yncm)/2;
01926 if( dywn < 0) {
01927 yncm = ywkwn;
01928 dywn = 0;
01929 xncm = ywkwn*xsize/ysize;
01930 dxwn = (xwkwn-xncm)/2;
01931 }
01932 }
01933 }
01934 fRange = kTRUE;
01935 }
01936
01937
01938
01939 void TPDF::SetColor(Int_t color)
01940 {
01941
01942
01943 if (color < 0) color = 0;
01944 TColor *col = gROOT->GetColor(color);
01945 if (col) {
01946 SetColor(col->GetRed(), col->GetGreen(), col->GetBlue());
01947 } else {
01948 SetColor(1., 1., 1.);
01949 }
01950 }
01951
01952
01953
01954 void TPDF::SetColor(Float_t r, Float_t g, Float_t b)
01955 {
01956
01957
01958
01959
01960
01961
01962 if (r == fRed && g == fGreen && b == fBlue) return;
01963
01964 fRed = r;
01965 fGreen = g;
01966 fBlue = b;
01967 if (fRed <= 0.000001) fRed = 0;
01968 if (fGreen <= 0.000001) fGreen = 0;
01969 if (fBlue <= 0.000001) fBlue = 0;
01970
01971 if (gStyle->GetColorModelPS()) {
01972 Double_t colCyan, colMagenta, colYellow;
01973 Double_t colBlack = TMath::Min(TMath::Min(1-fRed,1-fGreen),1-fBlue);
01974 if (colBlack==1) {
01975 colCyan = 0;
01976 colMagenta = 0;
01977 colYellow = 0;
01978 } else {
01979 colCyan = (1-fRed-colBlack)/(1-colBlack);
01980 colMagenta = (1-fGreen-colBlack)/(1-colBlack);
01981 colYellow = (1-fBlue-colBlack)/(1-colBlack);
01982 }
01983 if (colCyan <= 0.000001) colCyan = 0;
01984 if (colMagenta <= 0.000001) colMagenta = 0;
01985 if (colYellow <= 0.000001) colYellow = 0;
01986 if (colBlack <= 0.000001) colBlack = 0;
01987 WriteReal(colCyan);
01988 WriteReal(colMagenta);
01989 WriteReal(colYellow);
01990 WriteReal(colBlack);
01991 PrintFast(2," K");
01992 WriteReal(colCyan);
01993 WriteReal(colMagenta);
01994 WriteReal(colYellow);
01995 WriteReal(colBlack);
01996 PrintFast(2," k");
01997 } else {
01998 WriteReal(fRed);
01999 WriteReal(fGreen);
02000 WriteReal(fBlue);
02001 PrintFast(3," RG");
02002 WriteReal(fRed);
02003 WriteReal(fGreen);
02004 WriteReal(fBlue);
02005 PrintFast(3," rg");
02006 }
02007 }
02008
02009
02010
02011 void TPDF::SetFillColor( Color_t cindex )
02012 {
02013
02014
02015 fFillColor = cindex;
02016 if (gStyle->GetFillColor() <= 0) cindex = 0;
02017 }
02018
02019
02020
02021 void TPDF::SetFillPatterns(Int_t ipat, Int_t color)
02022 {
02023
02024
02025 char cpat[10];
02026 PrintStr(" /Cs8 cs");
02027 TColor *col = gROOT->GetColor(color);
02028 Double_t colRed = col->GetRed();
02029 Double_t colGreen = col->GetGreen();
02030 Double_t colBlue = col->GetBlue();
02031 if (gStyle->GetColorModelPS()) {
02032 Double_t colBlack = TMath::Min(TMath::Min(1-colRed,1-colGreen),1-colBlue);
02033 if (colBlack==1) {
02034 WriteReal(0);
02035 WriteReal(0);
02036 WriteReal(0);
02037 WriteReal(colBlack);
02038 } else {
02039 Double_t colCyan = (1-colRed-colBlack)/(1-colBlack);
02040 Double_t colMagenta = (1-colGreen-colBlack)/(1-colBlack);
02041 Double_t colYellow = (1-colBlue-colBlack)/(1-colBlack);
02042 WriteReal(colCyan);
02043 WriteReal(colMagenta);
02044 WriteReal(colYellow);
02045 WriteReal(colBlack);
02046 }
02047 } else {
02048 WriteReal(colRed);
02049 WriteReal(colGreen);
02050 WriteReal(colBlue);
02051 }
02052 snprintf(cpat,10," /P%2.2d scn", ipat);
02053 PrintStr(cpat);
02054 }
02055
02056
02057
02058 void TPDF::SetLineColor( Color_t cindex )
02059 {
02060
02061
02062 fLineColor = cindex;
02063 }
02064
02065
02066
02067 void TPDF::SetLineStyle(Style_t linestyle)
02068 {
02069
02070
02071
02072
02073
02074
02075
02076 if ( linestyle == fLineStyle) return;
02077 fLineStyle = linestyle;
02078 TString st = (TString)gStyle->GetLineStyleString(linestyle);
02079 PrintFast(2," [");
02080 TObjArray *tokens = st.Tokenize(" ");
02081 for (Int_t j = 0; j<tokens->GetEntries(); j++) {
02082 Int_t it;
02083 sscanf(((TObjString*)tokens->At(j))->GetName(), "%d", &it);
02084 WriteInteger((Int_t)(it/4));
02085 }
02086 delete tokens;
02087 PrintFast(5,"] 0 d");
02088 }
02089
02090
02091
02092 void TPDF::SetLineWidth(Width_t linewidth)
02093 {
02094
02095
02096 if (linewidth == fLineWidth) return;
02097 fLineWidth = linewidth;
02098 WriteReal(fLineScale*fLineWidth);
02099 PrintFast(2," w");
02100 }
02101
02102
02103
02104 void TPDF::SetMarkerColor( Color_t cindex )
02105 {
02106
02107
02108 fMarkerColor = cindex;
02109 }
02110
02111
02112
02113 void TPDF::SetTextColor( Color_t cindex )
02114 {
02115
02116
02117 fTextColor = cindex;
02118 }
02119
02120
02121
02122 void TPDF::Text(Double_t xx, Double_t yy, const char *chars)
02123 {
02124
02125
02126
02127
02128
02129
02130 if (fTextSize <= 0) return;
02131
02132 const Double_t kDEGRAD = TMath::Pi()/180.;
02133 char str[8];
02134 Double_t x = xx;
02135 Double_t y = yy;
02136
02137
02138 SetColor(Int_t(fTextColor));
02139
02140
02141 PrintStr(" q");
02142 Double_t x1 = XtoPDF(gPad->GetX1());
02143 Double_t x2 = XtoPDF(gPad->GetX2());
02144 Double_t y1 = YtoPDF(gPad->GetY1());
02145 Double_t y2 = YtoPDF(gPad->GetY2());
02146 WriteReal(x1);
02147 WriteReal(y1);
02148 WriteReal(x2 - x1);
02149 WriteReal(y2 - y1);
02150 PrintStr(" re W n");
02151
02152
02153 if (!fCompress) PrintStr("@");
02154
02155
02156 Int_t font = abs(fTextFont)/10;
02157 if( font > kNumberOfFonts || font < 1) font = 1;
02158
02159 Double_t wh = (Double_t)gPad->XtoPixel(gPad->GetX2());
02160 Double_t hh = (Double_t)gPad->YtoPixel(gPad->GetY1());
02161 Float_t tsize, ftsize;
02162 if (wh < hh) {
02163 tsize = fTextSize*wh;
02164 Int_t sizeTTF = (Int_t)(tsize*kScale+0.5);
02165 ftsize = (sizeTTF*fXsize*gPad->GetAbsWNDC())/wh;
02166 } else {
02167 tsize = fTextSize*hh;
02168 Int_t sizeTTF = (Int_t)(tsize*kScale+0.5);
02169 ftsize = (sizeTTF*fYsize*gPad->GetAbsHNDC())/hh;
02170 }
02171 Double_t fontsize = 72*(ftsize)/2.54;
02172 if( fontsize <= 0) return;
02173
02174
02175 Float_t tsizex = gPad->AbsPixeltoX(Int_t(tsize))-gPad->AbsPixeltoX(0);
02176 Float_t tsizey = gPad->AbsPixeltoY(0)-gPad->AbsPixeltoY(Int_t(tsize));
02177 Int_t txalh = fTextAlign/10;
02178 if (txalh < 1) txalh = 1; if (txalh > 3) txalh = 3;
02179 Int_t txalv = fTextAlign%10;
02180 if (txalv < 1) txalv = 1; if (txalv > 3) txalv = 3;
02181 if( txalv == 3) {
02182 y -= 0.8*tsizey*TMath::Cos(kDEGRAD*fTextAngle);
02183 x += 0.8*tsizex*TMath::Sin(kDEGRAD*fTextAngle);
02184 } else if( txalv == 2) {
02185 y -= 0.4*tsizey*TMath::Cos(kDEGRAD*fTextAngle);
02186 x += 0.4*tsizex*TMath::Sin(kDEGRAD*fTextAngle);
02187 }
02188
02189 if (txalh > 1) {
02190 TText t;
02191 UInt_t w, h;
02192 t.SetTextSize(fTextSize);
02193 t.SetTextFont(fTextFont);
02194 t.GetTextExtent(w, h, chars);
02195 Double_t twx = gPad->AbsPixeltoX(w)-gPad->AbsPixeltoX(0);
02196 Double_t twy = gPad->AbsPixeltoY(0)-gPad->AbsPixeltoY(w);
02197 if(txalh == 2){
02198 x = x-(twx/2)*TMath::Cos(kDEGRAD*fTextAngle);
02199 y = y-(twy/2)*TMath::Sin(kDEGRAD*fTextAngle);
02200 }
02201 if(txalh == 3){
02202 x = x-twx*TMath::Cos(kDEGRAD*fTextAngle);
02203 y = y-twy*TMath::Sin(kDEGRAD*fTextAngle);
02204 }
02205 }
02206
02207
02208 if (font == 15) {
02209 Float_t tanAlpha = 0.26794;
02210 Float_t dx = - tanAlpha * YtoPDF(y);
02211 PrintStr(" q 1 0");
02212 WriteReal(tanAlpha);
02213 PrintStr(" 1");
02214 WriteReal(dx);
02215 PrintStr(" 0 cm");
02216 }
02217
02218 PrintStr(" BT");
02219
02220 snprintf(str,8," /F%d",font);
02221 PrintStr(str);
02222 WriteReal(fontsize);
02223 PrintStr(" Tf");
02224
02225
02226 if(fTextAngle == 0) {
02227 WriteReal(XtoPDF(x));
02228 WriteReal(YtoPDF(y));
02229 PrintStr(" Td");
02230 } else if (fTextAngle == 90) {
02231 PrintStr(" 0 1 -1 0");
02232 WriteReal(XtoPDF(x));
02233 WriteReal(YtoPDF(y));
02234 PrintStr(" Tm");
02235 } else if (fTextAngle == 270) {
02236 PrintStr(" 0 -1 1 0");
02237 WriteReal(XtoPDF(x));
02238 WriteReal(YtoPDF(y));
02239 PrintStr(" Tm");
02240 } else {
02241 WriteReal(TMath::Cos(kDEGRAD*fTextAngle));
02242 WriteReal(TMath::Sin(kDEGRAD*fTextAngle));
02243 WriteReal(-TMath::Sin(kDEGRAD*fTextAngle));
02244 WriteReal(TMath::Cos(kDEGRAD*fTextAngle));
02245 WriteReal(XtoPDF(x));
02246 WriteReal(YtoPDF(y));
02247 PrintStr(" Tm");
02248 }
02249
02250 const Int_t len=strlen(chars);
02251
02252
02253
02254
02255
02256
02257
02258 const Float_t scale = 16.0;
02259
02260 TText saveAttText;
02261 saveAttText.TAttText::operator=(*this);
02262 TText t;
02263 t.SetTextSize(fTextSize * scale);
02264 t.SetTextFont(fTextFont);
02265 UInt_t wa1, wa0;
02266 t.GetTextAdvance(wa0, chars, kFALSE);
02267 t.GetTextAdvance(wa1, chars);
02268 t.TAttText::Modify();
02269 Bool_t kerning;
02270 if (wa0-wa1 != 0) kerning = kTRUE;
02271 else kerning = kFALSE;
02272 Int_t *charDeltas = 0;
02273 if (kerning) {
02274 charDeltas = new Int_t[len];
02275 for (Int_t i = 0;i < len;i++) {
02276 UInt_t ww;
02277 t.GetTextAdvance(ww, chars + i);
02278 charDeltas[i] = wa1 - ww;
02279 }
02280 for (Int_t i = len - 1;i > 0;i--) {
02281 charDeltas[i] -= charDeltas[i-1];
02282 }
02283 char tmp[2];
02284 tmp[1] = 0;
02285 for (Int_t i = 1;i < len;i++) {
02286 tmp[0] = chars[i-1];
02287 UInt_t width;
02288 t.GetTextAdvance(width, &tmp[0], kFALSE);
02289 Double_t wwl = gPad->AbsPixeltoX(width - charDeltas[i]) - gPad->AbsPixeltoX(0);
02290 wwl -= 0.5*(gPad->AbsPixeltoX(1) - gPad->AbsPixeltoX(0));
02291 charDeltas[i] = (Int_t)((1000.0/Float_t(fontsize))*(XtoPDF(wwl) - XtoPDF(0))/scale);
02292 }
02293 }
02294
02295 saveAttText.TAttText::Modify();
02296
02297
02298 if (kerning) PrintStr(" [");
02299 else PrintStr(" (");
02300
02301 for (Int_t i=0; i<len;i++) {
02302 if (chars[i]!='\n') {
02303 if (kerning) PrintStr("(");
02304 if (chars[i]=='(' || chars[i]==')') {
02305 snprintf(str,8,"\\%c",chars[i]);
02306 } else {
02307 snprintf(str,8,"%c",chars[i]);
02308 }
02309 PrintStr(str);
02310 if (kerning) {
02311 PrintStr(") ");
02312 if (i < len-1) {
02313 WriteInteger(charDeltas[i+1]);
02314 }
02315 }
02316 }
02317 }
02318
02319 if (kerning) PrintStr("] TJ ET Q");
02320 else PrintStr(") Tj ET Q");
02321 if (font == 15) PrintStr(" Q");
02322 if (!fCompress) PrintStr("@");
02323 if (kerning) delete [] charDeltas;
02324 }
02325
02326
02327
02328 void TPDF::TextNDC(Double_t u, Double_t v, const char *chars)
02329 {
02330
02331
02332 Double_t x = gPad->GetX1() + u*(gPad->GetX2() - gPad->GetX1());
02333 Double_t y = gPad->GetY1() + v*(gPad->GetY2() - gPad->GetY1());
02334 Text(x, y, chars);
02335 }
02336
02337
02338
02339 Double_t TPDF::UtoPDF(Double_t u)
02340 {
02341
02342
02343 Double_t cm = fXsize*(gPad->GetAbsXlowNDC() + u*gPad->GetAbsWNDC());
02344 return 72*cm/2.54;
02345 }
02346
02347
02348
02349 Double_t TPDF::VtoPDF(Double_t v)
02350 {
02351
02352
02353 Double_t cm = fYsize*(gPad->GetAbsYlowNDC() + v*gPad->GetAbsHNDC());
02354 return 72*cm/2.54;
02355 }
02356
02357
02358
02359 Double_t TPDF::XtoPDF(Double_t x)
02360 {
02361
02362
02363 Double_t u = (x - gPad->GetX1())/(gPad->GetX2() - gPad->GetX1());
02364 return UtoPDF(u);
02365 }
02366
02367
02368
02369 Double_t TPDF::YtoPDF(Double_t y)
02370 {
02371
02372
02373 Double_t v = (y - gPad->GetY1())/(gPad->GetY2() - gPad->GetY1());
02374 return VtoPDF(v);
02375 }
02376
02377
02378
02379 void TPDF::WriteCompressedBuffer()
02380 {
02381
02382
02383 z_stream stream;
02384 int err;
02385 char *out = new char[2*fLenBuffer];
02386
02387 stream.next_in = (Bytef*)fBuffer;
02388 stream.avail_in = (uInt)fLenBuffer;
02389 stream.next_out = (Bytef*)out;
02390 stream.avail_out = (uInt)2*fLenBuffer;
02391 stream.zalloc = (alloc_func)0;
02392 stream.zfree = (free_func)0;
02393 stream.opaque = (voidpf)0;
02394
02395 err = deflateInit(&stream, Z_DEFAULT_COMPRESSION);
02396 if (err != Z_OK) {
02397 Error("WriteCompressedBuffer", "error in deflateInit (zlib)");
02398 return;
02399 }
02400
02401 err = deflate(&stream, Z_FINISH);
02402 if (err != Z_STREAM_END) {
02403 deflateEnd(&stream);
02404 Error("WriteCompressedBuffer", "error in deflate (zlib)");
02405 return;
02406 }
02407
02408 err = deflateEnd(&stream);
02409
02410 fStream->write(out, stream.total_out);
02411
02412 fNByte += stream.total_out;
02413 fStream->write("\n",1); fNByte++;
02414 fLenBuffer = 0;
02415 delete [] out;
02416 fCompress = kFALSE;
02417 }
02418
02419
02420 void TPDF::WriteReal(Float_t z)
02421 {
02422
02423
02424
02425
02426
02427
02428 char str[15];
02429 snprintf(str,15," %g", z);
02430 if (strstr(str,"e") || strstr(str,"E")) snprintf(str,15," %10.8f", z);
02431 PrintStr(str);
02432 }