AJA NTV2 SDK  17.0.1.1246
NTV2 SDK 17.0.1.1246
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  QFont f ("Lucida");
52  f.setPointSize (18);
53  setFont (f);
54  painter.setPen (qRgba (255, 255, 255, 255));
55  painter.drawText (30, 40, _statusString);
56 
57  #if defined (INCLUDE_AJACC)
58  QFont captionFont ("Courier");
59  captionFont.setPointSize (24);
60  QFontMetrics metrics (captionFont);
61  const int offX (width() / 2 - 32 * metrics.averageCharWidth() / 2);
62  const int offY (height() / 2 - 15 * (metrics.height() + metrics.leading()) / 2);
63  setFont (captionFont);
64  painter.setPen (qRgba (255, 255, 255, 0));
65  for (unsigned ndx (0); ndx < 15; ndx++)
66  painter.drawText (offX, offY + ndx * (metrics.height() + metrics.leading()), _captionStrings [ndx]);
67  #endif // defined (INCLUDE_AJACC)
68 
69  _render = false;
70 } // paintEvent
71 
72 
73 void AJAPreviewWidget::updateFrame (const QImage &image, bool clear)
74 {
75 // qDebug() << "Update Frame";
76  _unscaledImageSize.setHeight(image.height());
77  _unscaledImageSize.setWidth(image.width());
78  _image = image;
79  _clear = clear;
80 
81  if (!_render)
82  {
83  _render = true;
84  QMetaObject::invokeMethod(this, "renderFrame", Qt::QueuedConnection);
85  }
86 }
87 
88 void AJAPreviewWidget::updateFrameWithStatus (const QImage &image, const QString& statusString, bool clear)
89 {
90 // qDebug() << "Update Frame With Status";
91 
92  _statusString = statusString;
93  _unscaledImageSize.setHeight(image.height());
94  _unscaledImageSize.setWidth(image.width());
95  _image = image;
96  _clear = clear;
97 
98  if (!_render)
99  {
100  _render = true;
101  QMetaObject::invokeMethod(this, "renderFrame", Qt::QueuedConnection);
102  }
103 }
104 
105 void AJAPreviewWidget::updateFrameWithROI (const QImage & image, ROIRectList roiList, bool clear)
106 {
107  _roiList = roiList;
108  _unscaledImageSize.setHeight (image.height());
109  _unscaledImageSize.setWidth (image.width());
110  _image = image;
111  _clear = clear;
112 
113  if (!_render)
114  {
115  _render = true;
116  QMetaObject::invokeMethod(this, "renderFrame", Qt::QueuedConnection);
117  }
118 }
119 
121 {
122  _roiList = roiList;
123 }
124 
125 void AJAPreviewWidget::updateStatusString(const QString statusString)
126 {
127  _statusString = statusString;
128 }
129 
130 #if defined (INCLUDE_AJACC)
131  void AJAPreviewWidget::updateCaptionScreen (const ushort * pInScreen)
132  {
133  const ushort * pCell (pInScreen);
134  for (UWord row (NTV2_CC608_MinRow); row <= NTV2_CC608_MaxRow; row++)
135  for (UWord col (NTV2_CC608_MinCol); col <= NTV2_CC608_MaxCol; col++)
136  _captionStrings [row-1].replace (col-1, 1, QChar (*pCell++));
137  }
138 #endif // defined (INCLUDE_AJACC)
139 
140 void AJAPreviewWidget::renderFrame ()
141 {
142 // qDebug() << "Render Frame";
143  if (_image.width() > this->width())
144  _pixmap = QPixmap::fromImage(_image.scaledToWidth(this->width(), Qt::SmoothTransformation), Qt::ImageConversionFlags());
145  else if (_image.height() > this->height())
146  _pixmap = QPixmap::fromImage(_image.scaledToHeight(this->height(), Qt::SmoothTransformation), Qt::ImageConversionFlags());
147  else
148  _pixmap = QPixmap::fromImage(_image, Qt::ImageConversionFlags());
149 
150  setAttribute(Qt::WA_OpaquePaintEvent, _clear ? false : true);
151  repaint();
152 }
153 
154 
155 void AJAPreviewWidget::dragEnterEvent( QDragEnterEvent *ev )
156 {
157  if (ev->mimeData()->hasFormat("text/uri-list"))
158  ev->acceptProposedAction();
159  else
160  ev->setAccepted( false );
161 }
162 
163 
164 void AJAPreviewWidget::dropEvent (QDropEvent * ev)
165 {
166  QList<QUrl> urls = ev->mimeData()->urls();
167  if (urls.isEmpty())
168  return;
169 
170  QString fileName = urls.first().toLocalFile();
171  if (fileName.isEmpty())
172  return;
173 
174  QImage imageFile(fileName);
175  if ( !imageFile.isNull())
176  {
177  updateFrame(imageFile,true);
178  return;
179  }
180  emit droppedFile(fileName);
181 }
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:125
AJAPreviewWidget::updateFrame
void updateFrame(const QImage &image, bool clear)
Definition: ajapreviewwidget.cpp:73
ROIStruct::display
bool display
Definition: ajapreviewwidget.h:27
ROIStruct
Definition: ajapreviewwidget.h:25
AJAPreviewWidget::dropEvent
void dropEvent(QDropEvent *event)
Definition: ajapreviewwidget.cpp:164
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:120
UWord
uint16_t UWord
Definition: ajatypes.h:244
AJAPreviewWidget::updateFrameWithROI
void updateFrameWithROI(const QImage &image, ROIRectList roiList, bool clear)
Definition: ajapreviewwidget.cpp:105
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:88
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:155
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).