35 TPave::TPave(): TBox()
46 SetFillColor(gStyle->GetFillColor());
47 SetFillStyle(gStyle->GetFillStyle());
48 SetLineColor(gStyle->GetLineColor());
49 SetLineStyle(gStyle->GetLineStyle());
50 fShadowColor = GetLineColor();
75 TPave::TPave(Double_t x1, Double_t y1,Double_t x2, Double_t y2,
76 Int_t bordersize ,Option_t *option)
79 fBorderSize = bordersize;
89 if (fOption ==
"NDC" || fOption ==
"ndc") fOption =
"brNDC";
91 SetFillColor(gStyle->GetFillColor());
92 SetFillStyle(gStyle->GetFillStyle());
93 SetLineColor(gStyle->GetLineColor());
94 SetLineStyle(gStyle->GetLineStyle());
95 SetName((
char*)ClassName());
96 fShadowColor = GetLineColor();
105 ROOT::CallRecursiveRemoveIfNeeded(*
this);
111 TPave::TPave(
const TPave &pave) : TBox(pave)
122 pave.TPave::Copy(*
this);
128 TPave &TPave::operator=(
const TPave &src)
130 src.TPave::Copy(*
this);
138 void TPave::ConvertNDCtoPad()
140 Double_t dpx = gPad->GetX2() - gPad->GetX1();
141 Double_t dpy = gPad->GetY2() - gPad->GetY1();
142 Double_t xp1 = gPad->GetX1();
143 Double_t yp1 = gPad->GetY1();
150 if (fOption.Contains(
"NDC")) {
155 fX1 = xp1 + fX1NDC*dpx;
156 fY1 = yp1 + fY1NDC*dpy;
157 fX2 = xp1 + fX2NDC*dpx;
158 fY2 = yp1 + fY2NDC*dpy;
160 if (gPad->GetLogx()) {
161 if (fX1 > 0) fX1 = TMath::Log10(fX1);
162 if (fX2 > 0) fX2 = TMath::Log10(fX2);
164 if (gPad->GetLogy()) {
165 if (fY1 > 0) fY1 = TMath::Log10(fY1);
166 if (fY2 > 0) fY2 = TMath::Log10(fY2);
168 fX1NDC = (fX1-xp1)/dpx;
169 fY1NDC = (fY1-yp1)/dpy;
170 fX2NDC = (fX2-xp1)/dpx;
171 fY2NDC = (fY2-yp1)/dpy;
174 fX1 = xp1 + fX1NDC*dpx;
175 fY1 = yp1 + fY1NDC*dpy;
176 fX2 = xp1 + fX2NDC*dpx;
177 fY2 = yp1 + fY2NDC*dpy;
184 void TPave::Copy(TObject &obj)
const
187 ((TPave&)obj).fX1NDC = fX1NDC;
188 ((TPave&)obj).fY1NDC = fY1NDC;
189 ((TPave&)obj).fX2NDC = fX2NDC;
190 ((TPave&)obj).fY2NDC = fY2NDC;
191 ((TPave&)obj).fBorderSize = fBorderSize;
192 ((TPave&)obj).fInit = fInit;
193 ((TPave&)obj).fOption = fOption;
194 ((TPave&)obj).fName = fName;
195 ((TPave&)obj).fCornerRadius= fCornerRadius;
196 ((TPave&)obj).fShadowColor = fShadowColor;
206 Int_t TPave::DistancetoPrimitive(Int_t px, Int_t py)
208 Int_t pxl, pyl, pxt, pyt;
209 Int_t px1 = gPad->XtoAbsPixel(fX1);
210 Int_t py1 = gPad->YtoAbsPixel(fY1);
211 Int_t px2 = gPad->XtoAbsPixel(fX2);
212 Int_t py2 = gPad->YtoAbsPixel(fY2);
213 if (px1 < px2) {pxl = px1; pxt = px2;}
214 else {pxl = px2; pxt = px1;}
215 if (py1 < py2) {pyl = py1; pyt = py2;}
216 else {pyl = py2; pyt = py1;}
219 if ( (px >= pxl && px <= pxt) && (py >= pyl && py <= pyt) )
return 0;
226 void TPave::Draw(Option_t *option)
229 if (option && strlen(option)) opt = option;
230 else opt = GetOption();
238 void TPave::DrawPave(Double_t x1, Double_t y1,Double_t x2, Double_t y2,
239 Int_t bordersize ,Option_t *option)
241 TPave *newpave =
new TPave(x1,y1,x2,y2,bordersize,option);
242 newpave->SetBit(kCanDelete);
243 newpave->AppendPad(option);
251 void TPave::ExecuteEvent(Int_t event, Int_t px, Int_t py)
255 if (!gPad->IsEditable())
return;
257 TBox::ExecuteEvent(event, px, py);
267 if (event == kButton1Double) {
268 if (TestBit(kNameIsAction)) gROOT->ProcessLine(GetName());
275 void TPave::ls(Option_t *)
const
277 TROOT::IndentLevel();
278 printf(
"OBJ: %s\t%s \tX1= %f Y1=%f X2=%f Y2=%f\n",IsA()->GetName(),GetName(),fX1,fY1,fX2,fY2);
300 void TPave::Paint(Option_t *option)
305 PaintPave(fX1, fY1, fX2, fY2, fBorderSize, option);
311 void TPave::PaintPave(Double_t x1, Double_t y1,Double_t x2, Double_t y2,
312 Int_t bordersize ,Option_t *option)
315 TString opt = option;
318 if (opt.Contains(
"arc")) {
319 PaintPaveArc(x1,y1,x2,y2,bordersize,option);
324 if (opt.Length() == 0) opt =
"br";
325 Int_t fillstyle = GetFillStyle();
326 Int_t fillcolor = GetFillColor();
327 Int_t shadowcolor = GetShadowColor();
330 if (fBorderSize <= 0 && fillstyle <= 0)
return;
331 TBox::PaintBox(x1,y1,x2,y2);
332 if (fBorderSize <= 0)
return;
333 if (fBorderSize == 1) {
334 gPad->PaintLine(x1,y1,x2,y1);
335 gPad->PaintLine(x2,y1,x2,y2);
336 gPad->PaintLine(x2,y2,x1,y2);
337 gPad->PaintLine(x1,y2,x1,y1);
341 Double_t wy = gPad->PixeltoY(0) - gPad->PixeltoY(fBorderSize);
342 Double_t wx = gPad->PixeltoX(fBorderSize) - gPad->PixeltoX(0);
345 if (opt.Contains(
"t") && opt.Contains(
"r")) {
347 x[0] = x1 + 1.5*wx; y[0] = y2;
348 x[1] = x[0]; y[1] = y2 + wy;
349 x[2] = x2 + wx; y[2] = y[1];
350 x[3] = x[2]; y[3] = y1 + 1.5*wy;
351 x[4] = x2; y[4] = y[3];
352 x[5] = x[4]; y[5] = y2;
355 if (opt.Contains(
"t") && opt.Contains(
"l")) {
357 x[0] = x1 - wx; y[0] = y1 + 1.5*wy;
358 x[1] = x[0]; y[1] = y2 + wy;
359 x[2] = x2 - 1.5*wx; y[2] = y[1];
360 x[3] = x[2]; y[3] = y2;
361 x[4] = x1; y[4] = y[3];
362 x[5] = x1; y[5] = y[0];
365 if (opt.Contains(
"b") && opt.Contains(
"r")) {
367 x[0] = x1 + 1.5*wx; y[0] = y1;
368 x[1] = x[0]; y[1] = y1 - wy;
369 x[2] = x2 + wx; y[2] = y[1];
370 x[3] = x[2]; y[3] = y2 - 1.5*wy;
371 x[4] = x2; y[4] = y[3];
372 x[5] = x[4]; y[5] = y1;
375 if (opt.Contains(
"b") && opt.Contains(
"l")) {
377 x[0] = x1 - wx; y[0] = y2 - 1.5*wy;
378 x[1] = x[0]; y[1] = y1 - wy;
379 x[2] = x2 - 1.5*wx; y[2] = y[1];
380 x[3] = x[2]; y[3] = y1;
381 x[4] = x1; y[4] = y[3];
382 x[5] = x[4]; y[5] = y[0];
385 for (Int_t i=0;i<6;i++) {
386 if (x[i] < gPad->GetX1()) x[i] = gPad->GetX1();
387 if (x[i] > gPad->GetX2()) x[i] = gPad->GetX2();
388 if (y[i] < gPad->GetY1()) y[i] = gPad->GetY1();
389 if (y[i] > gPad->GetY2()) y[i] = gPad->GetY2();
391 x[6] = x[0]; y[6] = y[0];
393 SetFillColor(shadowcolor);
395 gPad->PaintFillArea(6,x,y);
396 x[0] = x1; y[0] = y1;
397 x[1] = x1; y[1] = y2;
398 x[2] = x2; y[2] = y2;
399 x[3] = x2; y[3] = y1;
400 x[4] = x1; y[4] = y1;
401 gPad->PaintPolyLine(5,x,y);
402 SetFillStyle(fillstyle);
403 SetFillColor(fillcolor);
409 void TPave::PaintPaveArc(Double_t x1, Double_t y1, Double_t x2, Double_t y2,
410 Int_t, Option_t *option)
412 const Int_t kNPARC = 10;
413 Double_t x[4*kNPARC+10], y[4*kNPARC+10];
414 Double_t px[4*kNPARC+10], py[4*kNPARC+10];
416 TString opt = option;
418 if (opt.Length() == 0) opt =
"br";
419 Int_t fillstyle = GetFillStyle();
420 Int_t fillcolor = GetFillColor();
421 Int_t shadowcolor = GetShadowColor();
423 static Double_t cosa[kNPARC], sina[kNPARC];
424 static Bool_t done = kFALSE;
427 Double_t dtheta = 0.5*3.141592/(kNPARC+1);
429 for (i=0;i<kNPARC;i++) {
431 cosa[i] = TMath::Cos(theta);
432 sina[i] = TMath::Sin(theta);
435 Int_t px1 = gPad->XtoAbsPixel(x1);
436 Int_t py1 = gPad->YtoAbsPixel(y1);
437 Int_t px2 = gPad->XtoAbsPixel(x2);
438 Int_t py2 = gPad->YtoAbsPixel(y2);
440 Double_t rad = fCornerRadius;
441 if (rad > 0 && rad < 0.5) rad = fCornerRadius;
443 Double_t r = rad*TMath::Abs(py1-py2);
444 if (r > 0.5*TMath::Abs(px2-px1)) r = 0.5*TMath::Abs(px2-px1);
448 px[0] = px2; py[0] = py1 - r;
449 px[1] = px2; py[1] = py2 + r;
451 for (i=0;i<kNPARC;i++) {
452 px[np] = px2 - r + r*cosa[i];
453 py[np] = py2 + r - r*sina[i];
456 px[np] = px2 - r; py[np] = py2;
457 px[np+1] = px1 + r; py[np+1] = py2;
459 for (i=kNPARC-1;i>=0;i--) {
460 px[np] = px1 + r - r*cosa[i];
461 py[np] = py2 + r - r*sina[i];
464 px[np] = px1; py[np] = py2 + r;
465 px[np+1] = px1; py[np+1] = py1 - r;
467 for (i=0;i<kNPARC;i++) {
468 px[np] = px1 + r - r*cosa[i];
469 py[np] = py1 - r + r*sina[i];
472 px[np] = px1 + r; py[np] = py1;
473 px[np+1] = px2 - r; py[np+1] = py1;
475 for (i=kNPARC-1;i>=0;i--) {
476 px[np] = px2 - r + r*cosa[i];
477 py[np] = py1 - r + r*sina[i];
480 px[np] = px[0]; py[np] =py[0];
483 for (i=0;i<=np;i++) {
484 x[i] = gPad->AbsPixeltoX(Int_t(px[i]));
485 y[i] = gPad->AbsPixeltoY(Int_t(py[i]));
487 gPad->PaintFillArea(np , x, y);
488 gPad->PaintPolyLine(np+1, x, y);
491 if (fBorderSize <= 0)
return;
493 Double_t wy = fBorderSize;
494 Double_t wx = fBorderSize;
496 if (opt.Contains(
"tr")) {
497 px[0] = px2; py[0] = py1 - r;
498 px[1] = px2; py[1] = py2 + r;
500 for (i=0;i<kNPARC;i++) {
501 px[np] = px2 - r + r*cosa[i];
502 py[np] = py2 + r - r*sina[i];
505 px[np] = px2 - r; py[np] = py2;
506 px[np+1] = px1 + r; py[np+1] = py2;
507 px[np+2] = px1 + r; py[np+2] = py2 - wy;
508 px[np+3] = px2 - r; py[np+3] = py2 - wy;
510 for (i=kNPARC-1;i>=0;i--) {
511 px[np] = px2 - r + r*cosa[i]*(1+wx/r);
512 py[np] = py2 + r - r*sina[i]*(1+wy/r);
515 px[np] = px2 + wx; py[np] = py2 + r;
516 px[np+1] = px2 + wx; py[np+1] = py1 - r;
517 px[np+2] = px[0]; py[np+2] = py[0];
521 if (opt.Contains(
"tl")) {
522 px[0] = px2 - r; py[0] = py2;
523 px[1] = px1 + r; py[1] = py2;
525 for (i=kNPARC-1;i>=0;i--) {
526 px[np] = px1 + r - r*cosa[i];
527 py[np] = py2 + r - r*sina[i];
530 px[np] = px1; py[np] = py2 + r;
531 px[np+1] = px1; py[np+1] = py1 - r;
532 px[np+2] = px1 - wx; py[np+2] = py1 - r;
533 px[np+3] = px1 - wx; py[np+3] = py2 + r;
535 for (i=0;i<kNPARC;i++) {
536 px[np] = px1 + r - r*cosa[i]*(1+wx/r);
537 py[np] = py2 + r - r*sina[i]*(1+wy/r);
540 px[np] = px1 + r; py[np] = py2 - wy;
541 px[np+1] = px2 - r; py[np+1] = py2 - wy;
542 px[np+2] = px[0]; py[np+2] = y[0];
546 if (opt.Contains(
"br")) {
547 px[0] = px1 + r; py[0] = py1;
548 px[1] = px2 - r; py[1] = py1;
550 for (i=kNPARC-1;i>=0;i--) {
551 px[np] = px2 - r + r*cosa[i];
552 py[np] = py1 - r + r*sina[i];
555 px[np] = px2; py[np] = py1 - r;
556 px[np+1] = px2; py[np+1] = py2 + r;
557 px[np+2] = px2 + wx; py[np+2] = py2 + r;
558 px[np+3] = px2 + wx; py[np+3] = py1 - r;
560 for (i=0;i<kNPARC;i++) {
561 px[np] = px2 - r + r*cosa[i]*(1+wx/r);
562 py[np] = py1 - r + r*sina[i]*(1+wy/r);
565 px[np] = px2 - r; py[np] = py1 + wy;
566 px[np+1] = px[0]; py[np+1] = py[0] + wy;
567 px[np+2] = px[0]; py[np+2] = py[0];
571 if (opt.Contains(
"bl")) {
572 px[0] = px1; py[0] = py2 + r;
573 px[1] = px1; py[1] = py1 - r;
575 for (i=0;i<kNPARC;i++) {
576 px[np] = px1 + r - r*cosa[i];
577 py[np] = py1 + r - r*sina[i];
580 px[np] = px1 + r; py[np] = py1;
581 px[np+1] = px2 - r; py[np+1] = py1;
582 px[np+2] = px2 - r; py[np+2] = py1 + wy;
583 px[np+3] = px1 + r; py[np+3] = py1 + wy;
585 for (i=kNPARC-1;i>=0;i--) {
586 px[np] = px1 + r - r*cosa[i]*(1+wx/r);
587 py[np] = py1 - r + r*sina[i]*(1+wy/r);
590 px[np] = px1 - wx; py[np] = py1 - r;
591 px[np+1] = px1 - wx; py[np+1] = py[0];
592 px[np+2] = px[0]; py[np+2] = py[0];
596 SetFillColor(shadowcolor);
598 for (i=0;i<=np;i++) {
599 x[i] = gPad->AbsPixeltoX(Int_t(px[i]));
600 y[i] = gPad->AbsPixeltoY(Int_t(py[i]));
602 gPad->PaintFillArea(np,x,y);
603 SetFillStyle(fillstyle);
604 SetFillColor(fillcolor);
610 void TPave::Print(Option_t *option)
const
618 void TPave::SavePrimitive(std::ostream &out, Option_t * )
621 if (gROOT->ClassSaved(TPave::Class())) {
626 if (fOption.Contains(
"NDC")) {
627 out<<
"pave = new TPave("<<fX1NDC<<
","<<fY1NDC<<
","<<fX2NDC<<
","<<fY2NDC
628 <<
","<<fBorderSize<<
","<<quote<<fOption<<quote<<
");"<<std::endl;
630 out<<
"pave = new TPave("<<fX1<<
","<<fY1<<
","<<fX2<<
","<<fY2
631 <<
","<<fBorderSize<<
","<<quote<<fOption<<quote<<
");"<<std::endl;
633 if (strcmp(GetName(),
"TPave")) {
634 out<<
" pave->SetName("<<quote<<GetName()<<quote<<
");"<<std::endl;
637 out<<
" pave->SetCornerRadius("<<fCornerRadius<<
");"<<std::endl;
639 SaveFillAttributes(out,
"pave",19,1001);
640 SaveLineAttributes(out,
"pave",1,1,1);
641 out<<
" pave->Draw();"<<std::endl;
647 void TPave::SetX1(Double_t x1)
651 Double_t dpx = gPad->GetX2() - gPad->GetX1();
652 Double_t xp1 = gPad->GetX1();
653 fX1NDC = (fX1-xp1)/dpx;
660 void TPave::SetX2(Double_t x2)
664 Double_t dpx = gPad->GetX2() - gPad->GetX1();
665 Double_t xp1 = gPad->GetX1();
666 fX2NDC = (fX2-xp1)/dpx;
673 void TPave::SetY1(Double_t y1)
677 Double_t dpy = gPad->GetY2() - gPad->GetY1();
678 Double_t yp1 = gPad->GetY1();
679 fY1NDC = (fY1-yp1)/dpy;
686 void TPave::SetY2(Double_t y2)
690 Double_t dpy = gPad->GetY2() - gPad->GetY1();
691 Double_t yp1 = gPad->GetY1();
692 fY2NDC = (fY2-yp1)/dpy;
699 void TPave::Streamer(TBuffer &R__b)
701 if (R__b.IsReading()) {
703 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
705 R__b.ReadClassBuffer(TPave::Class(),
this, R__v, R__s, R__c);
709 TBox::Streamer(R__b);
710 Float_t x1ndc,y1ndc,x2ndc,y2ndc,rad;
711 R__b >> x1ndc; fX1NDC = x1ndc;
712 R__b >> y1ndc; fY1NDC = y1ndc;
713 R__b >> x2ndc; fX2NDC = x2ndc;
714 R__b >> y2ndc; fY2NDC = y2ndc;
717 R__b >> rad; fCornerRadius = rad;
718 fOption.Streamer(R__b);
719 fName.Streamer(R__b);
720 R__b.CheckByteCount(R__s, R__c, TPave::IsA());
724 R__b.WriteClassBuffer(TPave::Class(),
this);