QXRD  0.11.16
qxrdimagedisplaywidget.cpp
Go to the documentation of this file.
2 #include <QPainter>
3 #include <QTime>
4 #include <QScrollArea>
5 #include <QPaintEvent>
6 #include "qxrdapplication.h"
7 #include "qcepimagedata.h"
8 
10  QWidget(parent),
11  m_Data(NULL),
12  m_Mask(NULL),
13  m_Overflow(NULL),
14  m_Minimum(0),
15  m_Maximum(25.5),
16  m_StepSize(0.1),
17  m_TableMax(255),
18  m_ColorTable(256),
19  m_DisplayScale(0.5)
20 {
21  setGrayscale();
22 }
23 
25 {
26  m_ColorTable.resize(257);
27 
28  for (int i=0; i<256; i++) {
29  m_ColorTable[i] = qRgb(i,i,i);
30  }
31 }
32 
33 void QxrdImageDisplayWidget::paintEvent(QPaintEvent *event)
34 {
35  QPainter painter(this);
36 
37  QRegion rgn = event->region();
38  QVector<QRect> rects = rgn.rects();
39 
40  foreach(QRect rect, rects) {
41 // printf("paint rect %d,%d,%d,%d\n",
42 // rect.left(), rect.top(),
43 // rect.right(), rect.bottom());
44 
45  QRect srcRect(rect.left()/m_DisplayScale, rect.top()/m_DisplayScale,
46  rect.width()/m_DisplayScale+1, rect.height()/m_DisplayScale+1);
47  QRect dstRect(srcRect.left()*m_DisplayScale, srcRect.top()*m_DisplayScale,
48  srcRect.width()*m_DisplayScale, srcRect.height()*m_DisplayScale);
49 
50  painter.drawImage(dstRect, m_DataImage, srcRect);
51  }
52 
53 // painter.fillRect(rect(), Qt::lightGray);
54 //
55 // painter.drawImage(rect(), m_DataImage, m_DataImage.rect());
56 
57 // painter.fillRect(QRect(10,10,40,40), Qt::red);
58 }
59 
62  QcepMaskDataPtr ovflow,
63  QcepMaskDataPtr mask)
64 {
65  QTime tic;
66  tic.start();
67 
68  if (img) {
69  m_Data = img;
70  }
71 
72  if (ovflow) {
73  m_Overflow = ovflow;
74  }
75 
76  if (mask) {
77  m_Mask = mask;
78  }
79 
80  rebuildImage();
81 
82  adjustSize();
83  repaint();
84 
85  if (g_Application) {
86  g_Application->printMessage(tr("Image rebuilt after %1 msec").arg(tic.elapsed()));
87  }
88 }
89 
91 {
92  if (m_Data) {
93  return QSize(m_Data->get_Width()*m_DisplayScale,
94  m_Data->get_Height()*m_DisplayScale);
95  } else {
96  return QSize(128,128);
97  }
98 }
99 
101 {
102  if (m_Data) {
103  int width = m_Data->get_Width();
104  int height = m_Data->get_Height();
105  double *data = m_Data->data();
106  QRgb *table = m_ColorTable.data();
107 
108  m_DataImage = QImage(width, height, QImage::Format_ARGB32_Premultiplied);
109 
110  for (int row=0; row<height; row++) {
111  QRgb* line = (QRgb*)(m_DataImage.scanLine(row));
112 
113  for (int col=0; col<width; col++) {
114  double val = *data++;
115 
116  if (val<m_Minimum) {
117  *line++ = table[0];
118  } else if (val>m_Maximum) {
119  *line++ = table[m_TableMax];
120  } else {
121  int n = (int)((val - m_Minimum)/m_StepSize);
122  *line++ = table[n];
123  }
124  }
125  }
126  }
127 }
128 
130 {
131  QxrdImageDisplayWidget *res = NULL;
132 
133  if (tw) {
134  QScrollArea *sa = new QScrollArea();
135 
136  res = new QxrdImageDisplayWidget();
137 
138  sa -> setWidget(res);
139 
140  tw->insertTab(1, sa, "Image");
141  }
142 
143  return res;
144 }
static QxrdImageDisplayWidget * insertNew(QxrdApplication *app, QTabWidget *tw)
QxrdImageDisplayWidget(QWidget *parent=0)
void updateImage(QcepDoubleImageDataPtr img, QcepMaskDataPtr ovflow=QcepMaskDataPtr(), QcepMaskDataPtr mask=QcepMaskDataPtr())
void paintEvent(QPaintEvent *event)
virtual void printMessage(QString msg, QDateTime ts=QDateTime::currentDateTime())=0
QcepApplication * g_Application
QSharedPointer< QcepMaskData > QcepMaskDataPtr
QcepDoubleImageDataPtr m_Data
QSharedPointer< QcepDoubleImageData > QcepDoubleImageDataPtr