Logo ROOT   6.14/05
Reference Guide
TGSpeedo.cxx
Go to the documentation of this file.
1 // @(#)root/gui:$Id: TGSpeedo.cxx
2 // Author: Bertrand Bellenot 26/10/06
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 //////////////////////////////////////////////////////////////////////////
13 // //
14 // TGSpeedo //
15 // //
16 // TGSpeedo is a widget looking like a speedometer, with a needle, //
17 // a counter and a small odometer window. //
18 // //
19 //Begin_Html
20 /*
21 <img src="gif/speedometer.gif">
22 */
23 //End_Html //
24 // //
25 // Three thresholds are configurable, with their glowing color //
26 // A peak mark can be enabled, allowing to keep track of the highest //
27 // value displayed. The mark can be reset by right-clicking on the //
28 // widget. //
29 // Two signals are available: //
30 // OdoClicked(): when user click on the small odometer window //
31 // LedClicked(): when user click on the small led near the counter //
32 // //
33 //////////////////////////////////////////////////////////////////////////
34 
35 #include "TSystem.h"
36 #include "TGClient.h"
37 #include "TGResourcePool.h"
38 #include "TImage.h"
39 #include "TEnv.h"
40 #include "TMath.h"
41 
42 #include "TGSpeedo.h"
43 
44 
46 
47 ////////////////////////////////////////////////////////////////////////////////
48 /// TGSpeedo widget constructor.
49 
50 TGSpeedo::TGSpeedo(const TGWindow *p, int id)
51  : TGFrame(p, 1, 1), TGWidget (id), fImage(0), fImage2(0), fBase(0)
52 {
53  fAngleMin = -133.5;
54  fAngleMax = 133.5;
55  fAngle = -133.5;
56  fScaleMin = 0.0;
57  fScaleMax = 100.0;
58  fValue = 0.0;
59  fCounter = 0;
60  fPeakMark = kFALSE;
61  fMeanMark = kFALSE;
62  fPeakVal = 0.0;
63  fMeanVal = 0.0;
65  fThreshold[0] = fThreshold[1] = fThreshold[2] = 0.0;
68  fThresholdColor[2] = kRed;
70  fPicName = "speedo.gif";
72  if (!fImage || !fImage->IsValid())
73  Error("TGSpeedo::Build", "%s not found", fPicName.Data());
74  Build();
76 }
77 
78 ////////////////////////////////////////////////////////////////////////////////
79 /// TGSpeedo widget constructor.
80 
82  const char *lbl1, const char *lbl2, const char *dsp1,
83  const char *dsp2, int id)
84  : TGFrame(p, 1, 1), TGWidget (id), fImage(0), fImage2(0), fBase(0)
85 {
86  fAngleMin = -133.5;
87  fAngleMax = 133.5;
88  fAngle = -133.5;
89  fScaleMin = smin;
90  fScaleMax = smax;
91  fValue = smin;
92  fCounter = 0;
93  fLabel1 = lbl1;
94  fLabel2 = lbl2;
95  fDisplay1 = dsp1;
96  fDisplay2 = dsp2;
97  fPeakMark = kFALSE;
98  fMeanMark = kFALSE;
99  fPeakVal = 0.0;
100  fMeanVal = 0.0;
102  fThreshold[0] = fThreshold[1] = fThreshold[2] = 0.0;
103  fThresholdColor[0] = kGreen;
105  fThresholdColor[2] = kRed;
107  fPicName = "speedo.gif";
109  if (!fImage || !fImage->IsValid())
110  Error("TGSpeedo::Build", "%s not found", fPicName.Data());
111  Build();
113 }
114 
115 ////////////////////////////////////////////////////////////////////////////////
116 /// Build TGSpeedo widget.
117 
119 {
120  TString sc;
121  Float_t step, mark[5];
122  TString ar = "arialbd.ttf";
123  Int_t i, nexe, offset;
124 
125  const TGFont *counterFont = fClient->GetFont("-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*");
126  if (!counterFont) return;
127  fCounterFS = counterFont->GetFontStruct();
128 
129  const TGFont *textFont = fClient->GetFont("-*-helvetica-bold-r-*-*-8-*-*-*-*-*-*-*");
130  if (!textFont) return;
131  fTextFS = textFont->GetFontStruct();
132 
133  const TGFont *labelFont = fClient->GetFont("-*-helvetica-bold-r-*-*-14-*-*-*-*-*-*-*");
134  if (!labelFont) return;
135  FontStruct_t labelFS = labelFont->GetFontStruct();
136 
137  if (fImage && fImage->IsValid()) {
139  fImage->GetPixmap(), fImage->GetMask());
140  // center of the image
141  Float_t xc = (Float_t)(fBase ? (fBase->GetWidth() + 1) / 2 : 96.0);
142  Float_t yc = (Float_t)(fBase ? (fBase->GetHeight() + 1) / 2 : 96.0);
143 
144  // compute scale ticks steps
145  step = (fScaleMax - fScaleMin) / 4.0;
146  mark[0] = fScaleMin;
147  mark[4] = fScaleMax;
148  for (i=1; i<4; i++) {
149  mark[i] = mark[i-1] + step;
150  }
151  // format tick labels
152  if (fScaleMax >= 1000.0) {
153  nexe = 0;
154  while (1) {
155  nexe++;
156  for (i=0; i<5; i++) {
157  mark[i] /= 10.0;
158  }
159  // coverity[loop_condition]: ignore - false positive
160  if (mark[4] < 1000.0) break;
161  }
162  // draw multiplier
163  fImage->DrawText((Int_t)xc - 11, (Int_t)yc + 15, "x10", 12, "#ffffff", ar);
164  sc.Form("%d", nexe);
165  fImage->DrawText((Int_t)xc + 11, (Int_t)yc + 13, sc.Data(), 10, "#ffffff", ar);
166  }
167  else if (fScaleMax < 100.0) {
168  nexe = 0;
169  while (1) {
170  nexe--;
171  for (i=0; i<5; i++) {
172  mark[i] *= 10.0;
173  }
174  // coverity[loop_condition]: ignore - false positive
175  if (mark[4] > 99.9 ) break;
176  }
177  // draw multiplier
178  fImage->DrawText((Int_t)xc - 11, (Int_t)yc + 15, "x10", 12, "#ffffff", ar);
179  sc.Form("%d", nexe);
180  fImage->DrawText((Int_t)xc + 11, (Int_t)yc + 13, sc.Data(), 10, "#ffffff", ar);
181  }
182  // Format and draw scale tickmarks
183  sc.Form("%d",(Int_t)mark[0]);
184  fImage->DrawText((Int_t)xc - 51, (Int_t)yc + 30, sc.Data(), 14, "#ffffff", ar);
185  sc.Form("%d",(Int_t)mark[1]);
186  fImage->DrawText((Int_t)xc - 59, (Int_t)yc - 29, sc.Data(), 14, "#ffffff", ar);
187  sc.Form("%d",(Int_t)mark[2]);
188  offset = gVirtualX->TextWidth(labelFS, sc.Data(), sc.Length()) / 2;
189  fImage->DrawText((Int_t)xc - offset, (Int_t)yc - 65, sc.Data(), 14, "#ffffff", ar);
190  sc.Form("%d",(Int_t)mark[3]);
191  offset = 60 - gVirtualX->TextWidth(labelFS, sc.Data(), sc.Length());
192  fImage->DrawText((Int_t)xc + offset, (Int_t)yc - 29, sc.Data(), 14, "#ffffff", ar);
193  sc.Form("%d",(Int_t)mark[4]);
194  offset = 52 - gVirtualX->TextWidth(labelFS, sc.Data(), sc.Length());
195  fImage->DrawText((Int_t)xc + offset, (Int_t)yc + 30, sc.Data(), 14, "#ffffff", ar);
196  // draw main label (two lines)
197  fImage->DrawText((Int_t)xc + 13, (Int_t)yc - 17, fLabel1.Data(), 14, "#ffffff", ar);
198  fImage->DrawText((Int_t)xc + 13, (Int_t)yc - 4, fLabel2.Data(), 12, "#ffffff", ar);
199  if (fBase)
200  gVirtualX->ShapeCombineMask(fId, 0, 0, fBase->GetMask());
201  }
202 }
203 
204 ////////////////////////////////////////////////////////////////////////////////
205 /// TGSpeedo widget Destructor.
206 
208 {
209  if (fImage && fImage->IsValid())
210  delete fImage;
211  if (fImage2 && fImage2->IsValid())
212  delete fImage2;
213  if (fBase)
215 }
216 
217 ////////////////////////////////////////////////////////////////////////////////
218 /// Return default dimension of the widget.
219 
221 {
222  if (fBase)
223  return TGDimension(fBase->GetWidth(), fBase->GetHeight());
224  return TGDimension(100, 100);
225 }
226 
227 ////////////////////////////////////////////////////////////////////////////////
228 /// Make speedo glowing.
229 
231 {
232  static EGlowColor act_col = kNoglow;
233  TImage *glowImage = 0;
234 
235  if (col == act_col)
236  return;
237 
238  if (fImage && fImage->IsValid())
239  delete fImage;
240 
241  switch (col) {
242  case kNoglow:
243  break;
244  case kGreen:
245  glowImage = TImage::Open("glow_green.png");
246  if (!glowImage || !glowImage->IsValid()) {
247  Error("TGSpeedo::Glow", "glow_green.png not found");
248  glowImage = 0;
249  }
250  break;
251  case kOrange:
252  glowImage = TImage::Open("glow_orange.png");
253  if (!glowImage || !glowImage->IsValid()) {
254  Error("TGSpeedo::Glow", "glow_orange.png not found");
255  glowImage = 0;
256  }
257  break;
258  case kRed:
259  glowImage = TImage::Open("glow_red.png");
260  if (!glowImage || !glowImage->IsValid()) {
261  Error("TGSpeedo::Glow", "glow_red.png not found");
262  glowImage = 0;
263  }
264  break;
265  }
267  if (fImage && fImage->IsValid() && glowImage && glowImage->IsValid()) {
268  fImage->Merge(glowImage);
269  delete glowImage;
270  }
271  act_col = col;
272  Build();
273  DrawText();
274 }
275 
276 ////////////////////////////////////////////////////////////////////////////////
277 /// Handle mouse button event.
278 
280 {
281  if (fBase) {
282  int xc = (fBase->GetWidth() + 1) / 2;
283  int yc = (fBase->GetHeight() + 1) / 2;
284  if (event->fType == kButtonRelease && event->fCode == kButton1) {
285  // check if in the selector area
286  if ((event->fX > (xc - 26)) && (event->fX < (xc + 26)) &&
287  (event->fY < (yc + 50)) && (event->fY > (yc + 28))) {
288  OdoClicked();
289  }
290  // check if in the led area
291  else if ((event->fX > (xc + 30)) && (event->fX < (xc + 40)) &&
292  (event->fY > (yc + 57)) && (event->fY < (yc + 67))) {
293  LedClicked();
294  }
295  }
296  if (event->fType == kButtonRelease && event->fCode == kButton3) {
297  ResetPeakVal();
298  }
299  }
300  return kTRUE;
301 }
302 
303 ////////////////////////////////////////////////////////////////////////////////
304 /// Set actual value of odo meter.
305 
307 {
308  // avoid useless redraw
309  if (val == fCounter)
310  return;
311  fCounter = val;
312  DrawText();
313  DrawNeedle();
314 }
315 
316 ////////////////////////////////////////////////////////////////////////////////
317 /// Set small display text (two lines).
318 
319 void TGSpeedo::SetDisplayText(const char *text1, const char *text2)
320 {
321  if (!(fDisplay1.CompareTo(text1)) &&
322  !(fDisplay2.CompareTo(text2)))
323  return;
324  fDisplay1 = text1;
325  fDisplay2 = text2;
326  DrawText();
327  DrawNeedle();
328 }
329 
330 ////////////////////////////////////////////////////////////////////////////////
331 /// Set main label text (two lines).
332 
333 void TGSpeedo::SetLabelText(const char *text1, const char *text2)
334 {
335  if (fImage && fImage->IsValid())
336  delete fImage;
337  fLabel1 = text1;
338  fLabel2 = text2;
340  if (!fImage || !fImage->IsValid())
341  Error("TGSpeedo::Build", "%s not found", fPicName.Data());
342  Build();
343  DrawText();
344 }
345 
346 ////////////////////////////////////////////////////////////////////////////////
347 /// Set min and max scale values.
348 
350 {
351  if (fImage && fImage->IsValid())
352  delete fImage;
353  fScaleMin = min;
354  fScaleMax = max;
356  if (!fImage || !fImage->IsValid())
357  Error("TGSpeedo::Build", "%s not found", fPicName.Data());
358  Build();
359  DrawText();
360 }
361 
362 ////////////////////////////////////////////////////////////////////////////////
363 /// Set actual scale (needle position) value.
364 
366 {
367  // avoid useless redraw
368  if (val == fValue)
369  return;
370 
371  fValue = val;
372  if (fValue > fScaleMax)
373  fValue = fScaleMax;
374  else if (fValue < fScaleMin)
375  fValue = fScaleMin;
376 
377  if (fThresholdActive) {
378  if (fValue < fThreshold[0])
379  Glow(kNoglow);
380  if (fValue >= fThreshold[0] && fValue < fThreshold[1])
381  Glow(fThresholdColor[0]);
382  if (fValue >= fThreshold[1] && fValue < fThreshold[2])
383  Glow(fThresholdColor[1]);
384  if (fValue >= fThreshold[2])
385  Glow(fThresholdColor[2]);
386  }
387  if (fValue > fPeakVal)
388  fPeakVal = fValue;
389 
391  (fAngleMax - fAngleMin)));
392 
393  if (fAngle > fAngleMax)
394  fAngle = fAngleMax;
395  else if (fAngle < fAngleMin)
396  fAngle = fAngleMin;
397  DrawNeedle();
398 }
399 
400 ////////////////////////////////////////////////////////////////////////////////
401 /// Set actual scale (needle position) value.
402 
404 {
405  Float_t i;
406  Float_t old_val = fValue;
407  Float_t step, new_val = val;
408  // avoid useless redraw
409  if (val == fValue)
410  return;
411 
412  if ((damping > 0) || (gVirtualX->InheritsFrom("TGX11")))
413  step = 2.0;
414  else
415  step = 0.15;
416 
417  Float_t diff_angle = fAngleMax - fAngleMin;
418  Float_t diff_scale = fScaleMax - fScaleMin;
419  Float_t diff_ratio = diff_scale / diff_angle;
420  Float_t old_angle = fAngleMin + (old_val / diff_ratio);
421  Float_t new_angle = fAngleMin + (new_val / diff_ratio);
422 
423  if (new_angle > old_angle) {
424  for (i=old_angle; i<new_angle; i+=step) {
425  new_val = (i - fAngleMin) * diff_ratio;
426  SetScaleValue(new_val);
427  if (damping > 0)
428  gSystem->Sleep(damping);
429  }
430  }
431  if (new_angle < old_angle) {
432  for (i=old_angle; i>new_angle; i-=step) {
433  new_val = (i - fAngleMin) * diff_ratio;
434  SetScaleValue(new_val);
435  if (damping > 0)
436  gSystem->Sleep(damping);
437  }
438  }
439  // Last step
440  SetScaleValue(val);
441 }
442 
443 ////////////////////////////////////////////////////////////////////////////////
444 /// Increment/decrement scale (needle position) of "step" value.
445 
447 {
448  SetScaleValue(fValue + step);
449 }
450 
451 ////////////////////////////////////////////////////////////////////////////////
452 /// Translate distance from center and angle to xy coordinates.
453 
455 {
456  Float_t xc = (Float_t)(fBase ? (fBase->GetWidth() + 1) / 2 : 96.0);
457  Float_t yc = (Float_t)(fBase ? (fBase->GetHeight() + 1) / 2 : 96.0);
458  *x = (Int_t)(xc + val * sin(angle * TMath::Pi() / 180) + 0.5);
459  *y = (Int_t)(yc - val * cos(angle * TMath::Pi() / 180) + 0.5);
460 }
461 
462 ////////////////////////////////////////////////////////////////////////////////
463 /// Draw needle in speedo widget.
464 
466 {
467  Int_t xch0, xch1, ych0, ych1;
468  Int_t xpk0, ypk0, xpk1, ypk1;
469  Int_t xmn0, ymn0, xmn1, ymn1;
470  fValue = (fAngle - fAngleMin) * ((fScaleMax - fScaleMin) /
471  (fAngleMax - fAngleMin));
472 
473  // compute x/y position of the needle
474  Translate(9.0, fAngle, &xch0, &ych0);
475  Translate(73.0, fAngle, &xch1, &ych1);
476 
477  // compute x/y position of the peak mark
478  Float_t angle = fAngleMin + (fPeakVal / ((fScaleMax - fScaleMin) /
479  (fAngleMax - fAngleMin)));
480  Translate(80.0, angle, &xpk0, &ypk0);
481  Translate(67.0, angle, &xpk1, &ypk1);
482 
483  // compute x/y position of the peak mark
484  angle = fAngleMin + (fMeanVal / ((fScaleMax - fScaleMin) /
485  (fAngleMax - fAngleMin)));
486  Translate(80.0, angle, &xmn0, &ymn0);
487  Translate(70.0, angle, &xmn1, &ymn1);
488 
489  if (fImage2 && fImage2->IsValid()) {
490  // First clone original image.
491  TImage *img = (TImage*)fImage2->Clone("img");
492  if (!img || !img->IsValid()) return;
493  if (fPeakMark) {
494  img->DrawLine(xpk0, ypk0, xpk1, ypk1, "#00ff00", 3);
495  img->DrawLine(xpk0, ypk0, xpk1, ypk1, "#ffffff", 1);
496  }
497  if (fMeanMark) {
498  img->DrawLine(xmn0, ymn0, xmn1, ymn1, "#ffff00", 3);
499  img->DrawLine(xmn0, ymn0, xmn1, ymn1, "#ff0000", 1);
500  }
501  // draw line (used to render the needle) directly on the image
502  img->DrawLine(xch0, ych0, xch1, ych1, "#ff0000", 2);
503  // finally paint image to the widget
504  img->PaintImage(fId, 0, 0, 0, 0, 0, 0, "opaque");
505  // and finally, to avoid memory leaks
506  delete img;
507  }
508  gVirtualX->Update();
509 }
510 
511 ////////////////////////////////////////////////////////////////////////////////
512 /// Draw text in speedo widget.
513 
515 {
516  char sval[80];
517  char dsval[80];
518  Int_t strSize;
519 
520  // center of the image
521  Float_t xc = fBase ? (fBase->GetWidth() + 1) / 2 : 96.0;
522  Float_t yc = fBase ? (fBase->GetHeight() + 1) / 2 : 96.0;
523 
524  if (fImage && fImage->IsValid()) {
525  // First clone original image.
526  if (fImage2 && fImage2->IsValid())
527  delete fImage2;
528  fImage2 = (TImage*)fImage->Clone("fImage2");
529  if (!fImage2 || !fImage2->IsValid()) return;
530  TString ar = "arialbd.ttf";
531  // format counter value
532  Int_t nexe = 0;
533  Int_t ww = fCounter;
534  if (fCounter >= 10000) {
535  while (1) {
536  nexe++;
537  ww /= 10;
538  if (nexe%3 == 0 && ww < 10000) break;
539  }
540  fImage2->DrawText((Int_t)xc - 9, (Int_t)yc + 72, "x10", 10, "#ffffff", ar);
541  snprintf(sval, 80, "%d", nexe);
542  fImage2->DrawText((Int_t)xc + 9, (Int_t)yc + 69, sval, 8, "#ffffff", ar);
543  }
544  snprintf(sval, 80, "%04d", (int)ww);
545  snprintf(dsval, 80, "%c %c %c %c", sval[0], sval[1], sval[2], sval[3]);
546  // draw text in the counter
547  if (gVirtualX->InheritsFrom("TGX11")) {
548  // as there is a small difference between Windows and Linux...
549  fImage2->DrawText((Int_t)xc - 18, (Int_t)yc + 55, dsval, 12, "#ffffff", ar);
550  }
551  else {
552  fImage2->DrawText((Int_t)xc - 16, (Int_t)yc + 56, dsval, 12, "#ffffff", ar);
553  }
554  // compute the size of the string to draw in the small display box
555  // first line
556  strSize = gVirtualX->TextWidth(fTextFS, fDisplay1.Data(), fDisplay1.Length()) - 6;
557  // draw text directly on the imaget_t)yc + 29, fDispla
558  fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 29, fDisplay1.Data(), 8, "#ffffff", ar);
559  // second line
560  strSize = gVirtualX->TextWidth(fTextFS, fDisplay2.Data(), fDisplay2.Length()) - 6;
561  fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 38, fDisplay2.Data(), 8, "#ffffff", ar);
562  }
563 }
564 
565 ////////////////////////////////////////////////////////////////////////////////
566 /// Redraw speedo widget.
567 
569 {
570  char sval[80];
571  char dsval[80];
572  Int_t strSize;
573  Int_t xch0, xch1, ych0, ych1;
574  Int_t xpk0, ypk0, xpk1, ypk1;
575  Int_t xmn0, ymn0, xmn1, ymn1;
576  static Bool_t first = kTRUE;
577  if (first) {
579  first = kFALSE;
580  }
581  fValue = (fAngle - fAngleMin) * ((fScaleMax - fScaleMin) /
582  (fAngleMax - fAngleMin));
583 
584  // center of the image
585  Float_t xc = fBase ? (fBase->GetWidth() + 1) / 2 : 96.0;
586  Float_t yc = fBase ? (fBase->GetHeight() + 1) / 2 : 96.0;
587 
588  // compute x/y position of the needle
589  Translate(9.0, fAngle, &xch0, &ych0);
590  Translate(73.0, fAngle, &xch1, &ych1);
591 
592  // compute x/y position of the peak mark
593  Float_t angle = fAngleMin + (fPeakVal / ((fScaleMax - fScaleMin) /
594  (fAngleMax - fAngleMin)));
595  Translate(80.0, angle, &xpk0, &ypk0);
596  Translate(67.0, angle, &xpk1, &ypk1);
597 
598  // compute x/y position of the peak mark
599  angle = fAngleMin + (fMeanVal / ((fScaleMax - fScaleMin) /
600  (fAngleMax - fAngleMin)));
601  Translate(80.0, angle, &xmn0, &ymn0);
602  Translate(70.0, angle, &xmn1, &ymn1);
603 
604  if (fImage && fImage->IsValid()) {
605  // First clone original image.
606  if (fImage2 && fImage2->IsValid())
607  delete fImage2;
608  fImage2 = (TImage*)fImage->Clone("fImage2");
609  if (!fImage2 || !fImage2->IsValid()) return;
610  TString ar = "arialbd.ttf";
611  // format counter value
612  Int_t nexe = 0;
613  Int_t ww = fCounter;
614  if (fCounter >= 10000) {
615  while (1) {
616  nexe++;
617  ww /= 10;
618  if (nexe%3 == 0 && ww < 10000) break;
619  }
620  fImage2->DrawText((Int_t)xc - 9, (Int_t)yc + 72, "x10", 10, "#ffffff", ar);
621  snprintf(sval, 80, "%d", nexe);
622  fImage2->DrawText((Int_t)xc + 9, (Int_t)yc + 69, sval, 8, "#ffffff", ar);
623  }
624  snprintf(sval, 80, "%04d", (int)ww);
625  snprintf(dsval, 80, "%c %c %c %c", sval[0], sval[1], sval[2], sval[3]);
626  // draw text in the counter
627  if (gVirtualX->InheritsFrom("TGX11")) {
628  // as there is a small difference between Windows and Linux...
629  fImage2->DrawText((Int_t)xc - 18, (Int_t)yc + 55, dsval, 12, "#ffffff", ar);
630  }
631  else {
632  fImage2->DrawText((Int_t)xc - 16, (Int_t)yc + 56, dsval, 12, "#ffffff", ar);
633  }
634  // compute the size of the string to draw in the small display box
635  // first line
636  strSize = gVirtualX->TextWidth(fTextFS, fDisplay1.Data(), fDisplay1.Length()) - 6;
637  // draw text directly on the imaget_t)yc + 29, fDispla
638  fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 29, fDisplay1.Data(), 8, "#ffffff", ar);
639  // second line
640  strSize = gVirtualX->TextWidth(fTextFS, fDisplay2.Data(), fDisplay2.Length()) - 6;
641  fImage2->DrawText((Int_t)xc - (strSize / 2), (Int_t)yc + 38, fDisplay2.Data(), 8, "#ffffff", ar);
642  TImage *img = (TImage*)fImage2->Clone("img");
643  if (!img || !img->IsValid()) return;
644  if (fPeakMark) {
645  img->DrawLine(xpk0, ypk0, xpk1, ypk1, "#00ff00", 3);
646  img->DrawLine(xpk0, ypk0, xpk1, ypk1, "#ffffff", 1);
647  }
648  if (fMeanMark) {
649  img->DrawLine(xmn0, ymn0, xmn1, ymn1, "#ffff00", 3);
650  img->DrawLine(xmn0, ymn0, xmn1, ymn1, "#ff0000", 1);
651  }
652  // draw line (used to render the needle) directly on the image
653  img->DrawLine(xch0, ych0, xch1, ych1, "#ff0000", 2);
654  // finally paint image to the widget
655  img->PaintImage(fId, 0, 0, 0, 0, 0, 0, "opaque");
656  // and finally, to avoid memory leaks
657  delete img;
658  }
659 }
Bool_t fThresholdActive
Definition: TGSpeedo.h:61
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
Definition: TSystem.cxx:932
Handle_t FontStruct_t
Definition: GuiTypes.h:38
Int_t fCounter
Definition: TGSpeedo.h:48
float Float_t
Definition: RtypesCore.h:53
void AddInput(UInt_t emask)
Add events specified in the emask to the events the frame should handle.
Definition: TGFrame.cxx:321
TString fDisplay2
Definition: TGSpeedo.h:53
virtual Bool_t IsValid() const
Definition: TImage.h:230
void SetDisplayText(const char *text1, const char *text2="")
Set small display text (two lines).
Definition: TGSpeedo.cxx:319
#define mark(osub)
Definition: triangle.c:1206
void DrawNeedle()
Draw needle in speedo widget.
Definition: TGSpeedo.cxx:465
void StepScale(Float_t step)
Increment/decrement scale (needle position) of "step" value.
Definition: TGSpeedo.cxx:446
Int_t fY
Definition: GuiTypes.h:177
void DrawText()
Draw text in speedo widget.
Definition: TGSpeedo.cxx:514
Basic string class.
Definition: TString.h:131
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
void Translate(Float_t val, Float_t angle, Int_t *x, Int_t *y)
Translate distance from center and angle to xy coordinates.
Definition: TGSpeedo.cxx:454
An abstract interface to image processing library.
Definition: TImage.h:29
virtual void Merge(const TImage *, const char *="alphablend", Int_t=0, Int_t=0)
Definition: TImage.h:172
UInt_t GetHeight() const
Definition: TGPicture.h:64
double cos(double)
virtual Pixmap_t GetPixmap()
Definition: TImage.h:235
Float_t fAngle
Definition: TGSpeedo.h:54
virtual void DoRedraw()
Redraw the frame.
Definition: TGFrame.cxx:412
void SetMinMaxScale(Float_t min, Float_t max)
Set min and max scale values.
Definition: TGSpeedo.cxx:349
Double_t x[n]
Definition: legend1.C:17
Float_t fValue
Definition: TGSpeedo.h:54
TGPicturePool * GetPicturePool() const
Definition: TGClient.h:135
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
Definition: TSystem.cxx:445
TString fPicName
Definition: TGSpeedo.h:49
void FreePicture(const TGPicture *pic)
Free picture resource.
Definition: TGClient.cxx:306
TGSpeedo(const TGWindow *p=0, int id=-1)
TGSpeedo widget constructor.
Definition: TGSpeedo.cxx:50
TImage * fImage2
Definition: TGSpeedo.h:45
EGlowColor
Definition: TGSpeedo.h:41
virtual TGDimension GetDefaultSize() const
Return default dimension of the widget.
Definition: TGSpeedo.cxx:220
constexpr Double_t Pi()
Definition: TMath.h:38
double sin(double)
void SetOdoValue(Int_t val)
Set actual value of odo meter.
Definition: TGSpeedo.cxx:306
Float_t fMeanVal
Definition: TGSpeedo.h:56
void LedClicked()
Definition: TGSpeedo.h:110
TImage * fImage
Definition: TGSpeedo.h:44
Float_t fAngleMax
Definition: TGSpeedo.h:57
const Mask_t kButtonPressMask
Definition: GuiTypes.h:160
void ResetPeakVal()
Definition: TGSpeedo.h:106
FontStruct_t fTextFS
Definition: TGSpeedo.h:47
virtual void PaintImage(Drawable_t, Int_t, Int_t, Int_t=0, Int_t=0, UInt_t=0, UInt_t=0, Option_t *="")
Definition: TImage.h:243
void SetScaleValue(Float_t val)
Set actual scale (needle position) value.
Definition: TGSpeedo.cxx:365
Bool_t fPeakMark
Definition: TGSpeedo.h:62
R__EXTERN TSystem * gSystem
Definition: TSystem.h:540
EGEventType fType
Definition: GuiTypes.h:174
void Glow(EGlowColor col=kGreen)
Make speedo glowing.
Definition: TGSpeedo.cxx:230
TString fLabel2
Definition: TGSpeedo.h:51
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Definition: TString.cxx:2264
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:880
void SetLabelText(const char *text1, const char *text2="")
Set main label text (two lines).
Definition: TGSpeedo.cxx:333
const Handle_t kNone
Definition: GuiTypes.h:87
Ssiz_t Length() const
Definition: TString.h:405
virtual TObject * Clone(const char *) const
Make a clone of an object using the Streamer facility.
Definition: TImage.h:111
const TGPicture * GetPicture(const char *name)
Get a picture from the picture pool.
Definition: TGPicture.cxx:80
virtual ~TGSpeedo()
TGSpeedo widget Destructor.
Definition: TGSpeedo.cxx:207
FontStruct_t fCounterFS
Definition: TGSpeedo.h:47
TString fDisplay1
Definition: TGSpeedo.h:52
#define gVirtualX
Definition: TVirtualX.h:350
const Bool_t kFALSE
Definition: RtypesCore.h:88
void Build()
Build TGSpeedo widget.
Definition: TGSpeedo.cxx:118
Float_t fScaleMin
Definition: TGSpeedo.h:58
virtual void DrawText(Int_t=0, Int_t=0, const char *="", Int_t=12, const char *=0, const char *="fixed", EText3DType=TImage::kPlain, const char *=0, Float_t=0)
Definition: TImage.h:200
Float_t fScaleMax
Definition: TGSpeedo.h:58
#define ClassImp(name)
Definition: Rtypes.h:359
virtual Pixmap_t GetMask()
Definition: TImage.h:236
const Mask_t kButtonReleaseMask
Definition: GuiTypes.h:161
UInt_t fCode
Definition: GuiTypes.h:179
Definition: TGFont.h:149
FontStruct_t GetFontStruct() const
Definition: TGFont.h:193
Double_t y[n]
Definition: legend1.C:17
UInt_t GetWidth() const
Definition: TGPicture.h:63
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
Definition: TString.cxx:406
Handle_t fId
Definition: TGObject.h:36
virtual void DrawLine(UInt_t, UInt_t, UInt_t, UInt_t, const char *="#000000", UInt_t=1)
Definition: TImage.h:184
Bool_t fMeanMark
Definition: TGSpeedo.h:63
Float_t fAngleMin
Definition: TGSpeedo.h:57
EGlowColor fThresholdColor[3]
Definition: TGSpeedo.h:60
TGClient * fClient
Definition: TGObject.h:37
Float_t fPeakVal
Definition: TGSpeedo.h:55
Pixmap_t GetMask() const
Definition: TGPicture.h:66
#define snprintf
Definition: civetweb.c:1351
TString fLabel1
Definition: TGSpeedo.h:50
static TImage * Open(const char *file, EImageFileTypes type=kUnknown)
Open a specified image file.
Definition: TImage.cxx:110
const TGPicture * fBase
Definition: TGSpeedo.h:46
Definition: first.py:1
void OdoClicked()
Definition: TGSpeedo.h:109
const Bool_t kTRUE
Definition: RtypesCore.h:87
Int_t fX
Definition: GuiTypes.h:177
virtual Bool_t HandleButton(Event_t *event)
Handle mouse button event.
Definition: TGSpeedo.cxx:279
TGFont * GetFont(const char *font, Bool_t fixedDefault=kTRUE)
Get a font from the font pool.
Definition: TGClient.cxx:346
virtual void DoRedraw()
Redraw speedo widget.
Definition: TGSpeedo.cxx:568
Float_t fThreshold[3]
Definition: TGSpeedo.h:59
const char * Data() const
Definition: TString.h:364