xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/allwinner/camera/CameraUI/src/cprojectionpicture.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "cprojectionpicture.h"
2 #include <QEvent>
3 #include <QPainter>
4 #include <QGesture>
5 #include <QPointF>
6 #include <QPinchGesture>
7 #include <QDebug>
8 #include <QKeyEvent>
9 #include <QMouseEvent>
10 #include <QWheelEvent>
11 #include <QPoint>
12 
CProjectionPicture(QWidget * parent)13 CProjectionPicture::CProjectionPicture(QWidget *parent)
14     : QWidget(parent),
15     horizontalOffset(0),
16     verticalOffset(0),
17     scaleFactor(1),
18     currentStepScaleFactor(1),
19     m_translateButton(Qt::LeftButton),
20     m_bMouseTranslate(false),
21     m_zoomDelta(0.2)
22 {
23     this->setFocusPolicy(Qt::ClickFocus);
24     grabGesture(Qt::PanGesture);
25     grabGesture(Qt::PinchGesture);
26     grabGesture(Qt::SwipeGesture);
27 }
setPicture(QImage & image)28 void CProjectionPicture::setPicture(QImage &image)
29 {
30     if(image.format() == QImage::Format_Mono)
31     {
32         qDebug() << "format_mono";
33         currentImage = image.convertToFormat(QImage::Format_Mono);
34     }
35     else if(image.format()  == QImage::Format_MonoLSB)
36     {
37         qDebug() << "format_monoLSB";
38         currentImage = image.convertToFormat(QImage::Format_MonoLSB);
39     }
40     else if(image.format()  == QImage::Format_Indexed8)
41     {
42         qDebug() << "QImage::Format_Indexed8";
43         currentImage = image.convertToFormat(QImage::Format_Indexed8);
44     }
45     else if(image.format()  == QImage::Format_RGB32)
46     {
47         qDebug() << "QImage::Format_RGB32";
48         currentImage = image.convertToFormat(QImage::Format_RGB32);
49     }
50     else if(image.format()  == QImage::Format_ARGB32)
51     {
52         qDebug()<<"QImage::Format_ARGB32";
53         currentImage = image.convertToFormat(QImage::Format_ARGB32);
54     }
55 
56     else if(image.format()  ==QImage::Format_ARGB32_Premultiplied)
57     {
58          qDebug()<<"QImage::Format_ARGB32_Premultiplied";
59          currentImage = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
60     }
61 
62     else if(image.format()  == QImage::Format_RGB16)
63     {
64         qDebug("QImage::Format_RGB16");
65         currentImage = image.convertToFormat(QImage::Format_RGB16);
66     }
67 
68     else if(image.format()  == QImage::Format_ARGB8565_Premultiplied)
69     {
70         qDebug()<<"QImage::Format_ARGB8565_Premultiplied";
71         currentImage = image.convertToFormat(QImage::Format_ARGB8565_Premultiplied);
72     }
73 
74     else if(image.format()  == QImage::Format_RGB666)
75     {
76         qDebug()<<"QImage::Format_RGB666";
77         currentImage = image.convertToFormat(QImage::Format_RGB666);
78     }
79 
80     else if(image.format()  == QImage::Format_ARGB6666_Premultiplied)
81     {
82         qDebug()<<"QImage::Format_ARGB6666_Premultiplied";
83         currentImage = image.convertToFormat(QImage::Format_ARGB6666_Premultiplied);
84     }
85 
86     else if(image.format()  == QImage::Format_RGB555)
87     {
88         qDebug()<<"QImage::Format_RGB555";
89         currentImage = image.convertToFormat(QImage::Format_RGB555);
90     }
91 
92     else if(image.format()  == QImage::Format_ARGB8555_Premultiplied)
93     {
94         qDebug()<<"QImage::Format_ARGB8555_Premultiplied";
95         currentImage = image.convertToFormat(QImage::Format_ARGB8555_Premultiplied);
96     }
97 
98     else if(image.format()  == QImage::Format_RGB888)
99     {
100         qDebug()<<"QImage::Format_RGB888";
101         currentImage = image.convertToFormat(QImage::Format_RGB888);
102     }
103 
104     else if(image.format() == QImage::Format_RGB444)
105     {
106         qDebug()<<"QImage::Format_RGB444";
107         currentImage = image.convertToFormat(QImage::Format_RGB444);
108     }
109     else if(image.format()  == QImage::Format_ARGB4444_Premultiplied)
110     {
111         qDebug()<<"QImage::Format_ARGB4444_Premultiplied";
112         currentImage = image.convertToFormat(QImage::Format_ARGB4444_Premultiplied);
113     }
114     else
115     {
116         qDebug()<<"unkown format";
117     }
118     update();
119 }
120 
event(QEvent * event)121 bool CProjectionPicture::event(QEvent *event)
122 {
123     if (event->type() == QEvent::Gesture)
124         return gestureEvent(static_cast<QGestureEvent*>(event));
125     return QWidget::event(event);
126 }
127 
paintEvent(QPaintEvent *)128 void CProjectionPicture::paintEvent(QPaintEvent*)
129 {
130     QPainter painter(this);
131     QImage image = currentImage;
132 
133 
134     if(!image.isNull()){
135         image = image.scaled(this->width()*currentStepScaleFactor * scaleFactor,
136                              this->height()*currentStepScaleFactor * scaleFactor,
137                              Qt::KeepAspectRatio,
138                              Qt::SmoothTransformation);
139     }
140     const qreal iw = image.width();
141     const qreal ih = image.height();
142     const qreal wh = height();
143     const qreal ww = width();
144 
145     painter.translate(ww/2, wh/2);
146     painter.translate(horizontalOffset, verticalOffset);
147     //painter.scale(currentStepScaleFactor * scaleFactor, currentStepScaleFactor * scaleFactor);
148     painter.translate(-iw/2, -ih/2);
149     painter.drawImage(0,0,image);
150 }
151 //还原
152 //void CProjectionPicture::mouseDoubleClickEvent(QMouseEvent *)
153 //{
154 //    scaleFactor = 1;
155 //    currentStepScaleFactor = 1;
156 //    verticalOffset = 0;
157 //    horizontalOffset = 0;
158 //    update();
159 //}
160 
gestureEvent(QGestureEvent * event)161 bool CProjectionPicture::gestureEvent(QGestureEvent *event)
162 {
163     if (QGesture *pan = event->gesture(Qt::PanGesture))
164         panTriggered(static_cast<QPanGesture *>(pan));
165     if (QGesture *pinch = event->gesture(Qt::PinchGesture))
166         pinchTriggered(static_cast<QPinchGesture *>(pinch));
167     return true;
168 }
169 
panTriggered(QPanGesture * gesture)170 void CProjectionPicture::panTriggered(QPanGesture *gesture)
171 {
172 #ifndef QT_NO_CURSOR
173     switch (gesture->state()) {
174         case Qt::GestureStarted:
175         case Qt::GestureUpdated:
176             setCursor(Qt::SizeAllCursor);
177             break;
178         default:
179             setCursor(Qt::ArrowCursor);
180     }
181 #endif
182     QPointF delta = gesture->delta();
183     horizontalOffset += delta.x();
184     verticalOffset += delta.y();
185     update();
186 }
187 
pinchTriggered(QPinchGesture * gesture)188 void CProjectionPicture::pinchTriggered(QPinchGesture *gesture)
189 {
190     QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
191     if (changeFlags & QPinchGesture::ScaleFactorChanged) {
192         currentStepScaleFactor = gesture->totalScaleFactor();
193     }
194     if (gesture->state() == Qt::GestureFinished) {
195         scaleFactor *= currentStepScaleFactor;
196         currentStepScaleFactor = 1;
197     }
198     update();
199 }
200 
resizeEvent(QResizeEvent * e)201 void CProjectionPicture::resizeEvent(QResizeEvent*e)
202 {
203     update();
204     QWidget::resizeEvent(e);
205 }
206 
207 
208 //void CProjectionPicture::keyPressEvent(QKeyEvent *event)
209 //{
210 //    switch (event->key()) {
211 //    qDebug() << event->key();
212 //    case Qt::Key_Up:
213 //        translate(QPointF(0, -5));
214 //        break;
215 //    case Qt::Key_Down:
216 //        translate(QPointF(0, 5));
217 //        break;
218 //    case Qt::Key_Left:
219 //        translate(QPointF(-5, 0));
220 //        break;
221 //    case Qt::Key_Right:
222 //        translate(QPointF(5, 0));
223 //        break;
224 //    case Qt::Key_Plus:
225 //        zoomIn();
226 //        break;
227 //    case Qt::Key_Minus:
228 //        zoomOut();
229 //        break;
230 //    default:
231 //        QWidget::keyPressEvent(event);
232 //    }
233 //    QWidget::keyPressEvent(event);
234 //}
235 
236 
237 //void CProjectionPicture::mouseMoveEvent(QMouseEvent *event)
238 //{
239 //    if (m_bMouseTranslate){
240 //        QPointF mouseDelta = event->pos() - m_lastMousePos;
241 //        translate(mouseDelta);
242 //    }
243 
244 //    m_lastMousePos = event->pos();
245 
246 //    QWidget::mouseMoveEvent(event);
247 //}
248 
249 //void CProjectionPicture::mousePressEvent(QMouseEvent *event)
250 //{
251 //    qDebug() << "CProjectionPicture::mousePressEvent";
252 //    if (event->button() == m_translateButton) {
253 //        m_bMouseTranslate = true;
254 //        m_lastMousePos = event->pos();
255 //        setCursor(Qt::OpenHandCursor);
256 //    }
257 
258 //    QWidget::mousePressEvent(event);
259 //}
260 
261 //void CProjectionPicture::mouseReleaseEvent(QMouseEvent *event)
262 //{
263 //    if (event->button() == m_translateButton)
264 //    {
265 //        m_bMouseTranslate = false;
266 //        setCursor(Qt::ArrowCursor);
267 //    }
268 
269 //    QWidget::mouseReleaseEvent(event);
270 //}
271 
272 
273 //void CProjectionPicture::wheelEvent(QWheelEvent *event)
274 //{
275 //    qDebug() << "CProjectionPicture::wheelEvent";
276 ////    QPoint numPixels = event->pixelDelta();
277 //    QPoint scrallAmount = event->angleDelta();
278 //    if(scrallAmount.y() > 0){
279 //        zoomIn();
280 //    }
281 //    else if(scrallAmount.y() < 0){
282 //        zoomOut();
283 //    }
284 //    QWidget::wheelEvent(event);
285 //}
286 
zoomIn()287 void CProjectionPicture::zoomIn()
288 {
289     zoom(1 + m_zoomDelta);
290 }
291 
292 
zoomOut()293 void CProjectionPicture::zoomOut()
294 {
295     zoom(1 - m_zoomDelta);
296 }
297 
298 
zoom(float scale)299 void CProjectionPicture::zoom(float scale)
300 {
301     scaleFactor *= scale;
302     update();
303 }
304 
305 
translate(QPointF delta)306 void CProjectionPicture::translate(QPointF delta)
307 {
308     horizontalOffset += delta.x();
309     verticalOffset += delta.y();
310     update();
311 }
312