AJA NTV2 SDK  17.5.0.1242
NTV2 SDK 17.5.0.1242
ajapreviewwidget.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
2 #include "ajapreviewwidget.h"
3 
4 /***************************************************************************************/
5 
6 
8  : QFrame (parent)
9 {
10  qRegisterMetaType<QImage>("QImage");
11  qRegisterMetaType<ROIRectList>("ROIRectList");
12  setAcceptDrops(true);
13  #if defined (INCLUDE_AJACC)
14  for (unsigned ndx (0); ndx < 15; ndx++)
15  _captionStrings [ndx] = QString (32, QChar (32));
16  #endif // defined (INCLUDE_AJACC)
17  _clear = false;
18  _render = false;
19 }
20 
21 void AJAPreviewWidget::paintEvent (QPaintEvent * /* event */)
22 {
23  QPainter painter (this);
24 
25  const int offsetX (_pixmap.width() < width() ? (width() - _pixmap.width()) / 2 : 0);
26  const int offsetY (_pixmap.height() < height() ? (height() - _pixmap.height()) / 2 : 0);
27 
28  painter.drawPixmap (offsetX, offsetY, _pixmap);
29  for (int i (0); i < _roiList.size(); i++)
30  {
31  const ROIStruct & roiRectInfo (_roiList [i]);
32  //qDebug() << "ROI:" << roiRectInfo.roiRect.left() << roiRectInfo.roiRect.right() << roiRectInfo.roiRect.top() << roiRectInfo.roiRect.bottom();
33  const double hScale (double (_pixmap.width()) / double (_unscaledImageSize.width()));
34  const double vScale (double (_pixmap.height()) / double (_unscaledImageSize.height()));
35  //qDebug() << "hScale=" << hScale << "vScale=" << vScale;
36  if (roiRectInfo.display)
37  {
38  QPen currentPen (roiRectInfo.roiRectColor);
39  currentPen.setWidth (4);
40  painter.setPen (currentPen);
41  QRectF currentRect; //(roiRectInfo.roiRect);
42  currentRect.setLeft (double(offsetX) + roiRectInfo.roiRect.left() * hScale);
43  currentRect.setRight (double(offsetX) + roiRectInfo.roiRect.right() * hScale);
44  currentRect.setTop (double(offsetY) + roiRectInfo.roiRect.top() * vScale);
45  currentRect.setBottom (double(offsetY) + roiRectInfo.roiRect.bottom() * vScale);
46  //qDebug() << "ROI2:" << currentRect.left() << currentRect.right() << currentRect.top() << currentRect.bottom();
47  painter.drawRect (currentRect);
48  }
49  }
50 
51  // Draw the status message using a dark gray outline and white interior, for better visibility...
52  QFont f ("Lucida");
53  f.setPointSize(32);
54  f.setStyleStrategy(QFont::PreferOutline);
55  f.setLetterSpacing(QFont::PercentageSpacing, 110.0);
56  f.setWeight(QFont::Bold);
57  const QBrush whiteBrush(Qt::white);
58  const QPen blackPen(QBrush(Qt::darkGray), 2.0);
59  QPainterPath pp;
60  pp.addText(QPointF(30.0, 40.0), f, _statusString);
61  painter.fillPath(pp, whiteBrush);
62  painter.strokePath(pp, blackPen);
63 // setFont(f);
64 // painter.setPen (qRgba (255, 255, 255, 255));
65 // painter.drawText (30, 40, _statusString);
66 
67  #if defined (INCLUDE_AJACC)
68  QFont captionFont ("Courier");
69  captionFont.setPointSize (24);
70  QFontMetrics metrics (captionFont);
71  const int offX (width() / 2 - 32 * metrics.averageCharWidth() / 2);
72  const int offY (height() / 2 - 15 * (metrics.height() + metrics.leading()) / 2);
73  setFont (captionFont);
74  painter.setPen (qRgba (255, 255, 255, 0));
75  for (unsigned ndx (0); ndx < 15; ndx++)
76  painter.drawText (offX, offY + ndx * (metrics.height() + metrics.leading()), _captionStrings [ndx]);
77  #endif // defined (INCLUDE_AJACC)
78 
79  _render = false;
80 } // paintEvent
81 
82 
83 void AJAPreviewWidget::updateFrame (const QImage &image, bool clear)
84 {
85 // qDebug() << "Update Frame";
86  _unscaledImageSize.setHeight(image.height());
87  _unscaledImageSize.setWidth(image.width());
88  _image = image;
89  _clear = clear;
90 
91  if (!_render)
92  {
93  _render = true;
94  QMetaObject::invokeMethod(this, "renderFrame", Qt::QueuedConnection);
95  }
96 }
97 
98 void AJAPreviewWidget::updateFrameWithStatus (const QImage &image, const QString& statusString, bool clear)
99 {
100 // qDebug() << "Update Frame With Status";
101 
102  _statusString = statusString;
103  _unscaledImageSize.setHeight(image.height());
104  _unscaledImageSize.setWidth(image.width());
105  _image = image;
106  _clear = clear;
107 
108  if (!_render)
109  {
110  _render = true;
111  QMetaObject::invokeMethod(this, "renderFrame", Qt::QueuedConnection);
112  }
113 }
114 
115 void AJAPreviewWidget::updateFrameWithROI (const QImage & image, ROIRectList roiList, bool clear)
116 {
117  _roiList = roiList;
118  _unscaledImageSize.setHeight (image.height());
119  _unscaledImageSize.setWidth (image.width());
120  _image = image;
121  _clear = clear;
122 
123  if (!_render)
124  {
125  _render = true;
126  QMetaObject::invokeMethod(this, "renderFrame", Qt::QueuedConnection);
127  }
128 }
129 
131 {
132  _roiList = roiList;
133 }
134 
135 void AJAPreviewWidget::updateStatusString(const QString statusString)
136 {
137  _statusString = statusString;
138 }
139 
140 #if defined (INCLUDE_AJACC)
141  void AJAPreviewWidget::updateCaptionScreen (const ushort * pInScreen)
142  {
143  const ushort * pCell (pInScreen);
144  for (UWord row (NTV2_CC608_MinRow); row <= NTV2_CC608_MaxRow; row++)
145  for (UWord col (NTV2_CC608_MinCol); col <= NTV2_CC608_MaxCol; col++)
146  _captionStrings [row-1].replace (col-1, 1, QChar (*pCell++));
147  }
148 #endif // defined (INCLUDE_AJACC)
149 
150 void AJAPreviewWidget::renderFrame ()
151 {
152 // qDebug() << "Render Frame";
153  if (_image.width() > this->width())
154  _pixmap = QPixmap::fromImage(_image.scaledToWidth(this->width(), Qt::SmoothTransformation), Qt::ImageConversionFlags());
155  else if (_image.height() > this->height())
156  _pixmap = QPixmap::fromImage(_image.scaledToHeight(this->height(), Qt::SmoothTransformation), Qt::ImageConversionFlags());
157  else
158  _pixmap = QPixmap::fromImage(_image, Qt::ImageConversionFlags());
159 
160  setAttribute(Qt::WA_OpaquePaintEvent, _clear ? false : true);
161  repaint();
162 }
163 
164 
165 void AJAPreviewWidget::dragEnterEvent( QDragEnterEvent *ev )
166 {
167  if (ev->mimeData()->hasFormat("text/uri-list"))
168  ev->acceptProposedAction();
169  else
170  ev->setAccepted( false );
171 }
172 
173 
174 void AJAPreviewWidget::dropEvent (QDropEvent * ev)
175 {
176  QList<QUrl> urls = ev->mimeData()->urls();
177  if (urls.isEmpty())
178  return;
179 
180  QString fileName = urls.first().toLocalFile();
181  if (fileName.isEmpty())
182  return;
183 
184  QImage imageFile(fileName);
185  if ( !imageFile.isNull())
186  {
187  updateFrame(imageFile,true);
188  return;
189  }
190  emit droppedFile(fileName);
191 }
ROIStruct::roiRectColor
QColor roiRectColor
normalize to width and height 0.0-1.0
Definition: ajapreviewwidget.h:29
ROIRectList
QList< ROIStruct > ROIRectList
Definition: ajapreviewwidget.h:33
NTV2_CC608_MinCol
const UWord NTV2_CC608_MinCol(1)
The minimum column index number (located at the left edge of the screen).
AJAPreviewWidget::updateStatusString
void updateStatusString(const QString statusString)
Definition: ajapreviewwidget.cpp:135
AJAPreviewWidget::updateFrame
void updateFrame(const QImage &image, bool clear)
Definition: ajapreviewwidget.cpp:83
ROIStruct::display
bool display
Definition: ajapreviewwidget.h:27
ROIStruct
Definition: ajapreviewwidget.h:25
AJAPreviewWidget::dropEvent
void dropEvent(QDropEvent *event)
Definition: ajapreviewwidget.cpp:174
AJAPreviewWidget::AJAPreviewWidget
AJAPreviewWidget(QWidget *parent=NULL)
Definition: ajapreviewwidget.cpp:7
aja::replace
std::string & replace(std::string &str, const std::string &from, const std::string &to)
Definition: common.cpp:110
AJAPreviewWidget::updateROI
void updateROI(ROIRectList roiList)
Definition: ajapreviewwidget.cpp:130
UWord
uint16_t UWord
Definition: ajatypes.h:253
AJAPreviewWidget::updateFrameWithROI
void updateFrameWithROI(const QImage &image, ROIRectList roiList, bool clear)
Definition: ajapreviewwidget.cpp:115
ROIStruct::roiRect
QRectF roiRect
Definition: ajapreviewwidget.h:28
NTV2_CC608_MaxCol
const UWord NTV2_CC608_MaxCol(32)
The maximum column index number (located at the right edge of the screen).
ajapreviewwidget.h
AJAPreviewWidget::updateFrameWithStatus
void updateFrameWithStatus(const QImage &image, const QString &statusString, bool clear)
Definition: ajapreviewwidget.cpp:98
AJAPreviewWidget::droppedFile
void droppedFile(QString fileName)
NTV2_CC608_MinRow
const UWord NTV2_CC608_MinRow(1)
The minimum row index number (located at the top of the screen).
AJAPreviewWidget::dragEnterEvent
void dragEnterEvent(QDragEnterEvent *event)
Definition: ajapreviewwidget.cpp:165
AJAPreviewWidget::paintEvent
void paintEvent(QPaintEvent *event)
Definition: ajapreviewwidget.cpp:21
NTV2_CC608_MaxRow
const UWord NTV2_CC608_MaxRow(15)
The maximum permissible row index number (located at the bottom of the screen).