1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Contact: https://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the plugins of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at https://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 3 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 3 requirements |
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
24 | ** |
25 | ** GNU General Public License Usage |
26 | ** Alternatively, this file may be used under the terms of the GNU |
27 | ** General Public License version 2.0 or (at your option) the GNU General |
28 | ** Public license version 3 or any later version approved by the KDE Free |
29 | ** Qt Foundation. The licenses are as published by the Free Software |
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
31 | ** included in the packaging of this file. Please review the following |
32 | ** information to ensure the GNU General Public License requirements will |
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
35 | ** |
36 | ** $QT_END_LICENSE$ |
37 | ** |
38 | ****************************************************************************/ |
39 | |
40 | #include "qdeclarativecamera_p.h" |
41 | #include "qdeclarativecamerafocus_p.h" |
42 | |
43 | QT_BEGIN_NAMESPACE |
44 | |
45 | /*! |
46 | \qmltype CameraFocus |
47 | \instantiates QDeclarativeCameraFocus |
48 | \inqmlmodule QtMultimedia |
49 | \brief An interface for focus related camera settings. |
50 | \ingroup multimedia_qml |
51 | \ingroup camera_qml |
52 | |
53 | This type allows control over manual and automatic |
54 | focus settings, including information about any parts of the |
55 | camera frame that are selected for autofocusing. |
56 | |
57 | It should not be constructed separately, instead the |
58 | \c focus property of a \l Camera should be used. |
59 | |
60 | \qml |
61 | |
62 | Item { |
63 | width: 640 |
64 | height: 360 |
65 | |
66 | Camera { |
67 | id: camera |
68 | |
69 | focus { |
70 | focusMode: Camera.FocusMacro |
71 | focusPointMode: Camera.FocusPointCustom |
72 | customFocusPoint: Qt.point(0.2, 0.2) // Focus relative to top-left corner |
73 | } |
74 | } |
75 | |
76 | VideoOutput { |
77 | source: camera |
78 | anchors.fill: parent |
79 | } |
80 | } |
81 | |
82 | \endqml |
83 | */ |
84 | |
85 | /*! |
86 | \class QDeclarativeCameraFocus |
87 | \internal |
88 | \brief An interface for focus related camera settings. |
89 | */ |
90 | |
91 | /*! |
92 | Construct a declarative camera focus object using \a parent object. |
93 | */ |
94 | |
95 | QDeclarativeCameraFocus::QDeclarativeCameraFocus(QCamera *camera, QObject *parent) : |
96 | QObject(parent) |
97 | { |
98 | m_focus = camera->focus(); |
99 | m_focusZones = new FocusZonesModel(this); |
100 | |
101 | updateFocusZones(); |
102 | |
103 | connect(asender: m_focus, SIGNAL(focusZonesChanged()), SLOT(updateFocusZones())); |
104 | connect(sender: camera, signal: &QCamera::statusChanged, slot: [this](QCamera::Status status) { |
105 | if (status != QCamera::UnloadedStatus && status != QCamera::LoadedStatus |
106 | && status != QCamera::ActiveStatus) { |
107 | return; |
108 | } |
109 | |
110 | emit supportedFocusModesChanged(); |
111 | emit supportedFocusPointModesChanged(); |
112 | }); |
113 | } |
114 | |
115 | QDeclarativeCameraFocus::~QDeclarativeCameraFocus() |
116 | { |
117 | } |
118 | /*! |
119 | \property QDeclarativeCameraFocus::focusMode |
120 | |
121 | This property holds the current camera focus mode. |
122 | |
123 | It's possible to combine multiple QCameraFocus::FocusMode enum values, |
124 | for example QCameraFocus::MacroFocus + QCameraFocus::ContinuousFocus. |
125 | |
126 | In automatic focusing modes, the \l focusPointMode |
127 | and \l focusZones properties provide information and control |
128 | over how automatic focusing is performed. |
129 | */ |
130 | |
131 | /*! |
132 | \qmlproperty enumeration CameraFocus::focusMode |
133 | |
134 | This property holds the current camera focus mode, which can be one of the following values: |
135 | |
136 | \table |
137 | \header |
138 | \li Value |
139 | \li Description |
140 | \row |
141 | \li FocusManual |
142 | \li Manual or fixed focus mode. |
143 | \row |
144 | \li FocusHyperfocal |
145 | \li Focus to hyperfocal distance, with the maximum depth of field achieved. All objects at distances from half of this distance out to infinity will be acceptably sharp. |
146 | \row |
147 | \li FocusInfinity |
148 | \li Focus strictly to infinity. |
149 | \row |
150 | \li FocusAuto |
151 | \li One-shot auto focus mode. |
152 | \row |
153 | \li FocusContinuous |
154 | \li Continuous auto focus mode. |
155 | \row |
156 | \li FocusMacro |
157 | \li One shot auto focus to objects close to camera. |
158 | \endtable |
159 | |
160 | It's possible to combine multiple Camera::FocusMode values, |
161 | for example Camera.FocusMacro + Camera.FocusContinuous. |
162 | |
163 | In automatic focusing modes, the \l focusPointMode property |
164 | and \l focusZones property provide information and control |
165 | over how automatic focusing is performed. |
166 | */ |
167 | QDeclarativeCameraFocus::FocusMode QDeclarativeCameraFocus::focusMode() const |
168 | { |
169 | return QDeclarativeCameraFocus::FocusMode(int(m_focus->focusMode())); |
170 | } |
171 | |
172 | /*! |
173 | \qmlproperty list<FocusMode> CameraFocus::supportedFocusModes |
174 | |
175 | This property holds the supported focus modes of the camera. |
176 | |
177 | \since 5.11 |
178 | \sa focusMode |
179 | */ |
180 | QVariantList QDeclarativeCameraFocus::supportedFocusModes() const |
181 | { |
182 | QVariantList supportedModes; |
183 | |
184 | for (int i = int(FocusManual); i <= int(FocusMacro); ++i) { |
185 | if (m_focus->isFocusModeSupported(mode: (QCameraFocus::FocusMode) i)) |
186 | supportedModes.append(t: i); |
187 | } |
188 | |
189 | return supportedModes; |
190 | } |
191 | |
192 | #if QT_DEPRECATED_SINCE(5, 11) |
193 | /*! |
194 | \qmlmethod bool QtMultimedia::CameraFocus::isFocusModeSupported(mode) const |
195 | \obsolete |
196 | |
197 | Returns true if the supplied \a mode is a supported focus mode, and |
198 | false otherwise. |
199 | */ |
200 | bool QDeclarativeCameraFocus::isFocusModeSupported(QDeclarativeCameraFocus::FocusMode mode) const |
201 | { |
202 | return m_focus->isFocusModeSupported(mode: QCameraFocus::FocusModes(int(mode))); |
203 | } |
204 | #endif |
205 | |
206 | void QDeclarativeCameraFocus::setFocusMode(QDeclarativeCameraFocus::FocusMode mode) |
207 | { |
208 | if (mode != focusMode()) { |
209 | m_focus->setFocusMode(QCameraFocus::FocusModes(int(mode))); |
210 | emit focusModeChanged(focusMode()); |
211 | } |
212 | } |
213 | /*! |
214 | \property QDeclarativeCameraFocus::focusPointMode |
215 | |
216 | This property holds the current camera focus point mode. It is used in |
217 | automatic focusing modes to determine what to focus on. |
218 | |
219 | If the current focus point mode is \l QCameraFocus::FocusPointCustom, the |
220 | \l customFocusPoint property allows you to specify which part of |
221 | the frame to focus on. |
222 | */ |
223 | /*! |
224 | \qmlproperty enumeration CameraFocus::focusPointMode |
225 | |
226 | This property holds the current camera focus point mode. It is used in automatic |
227 | focusing modes to determine what to focus on. If the current |
228 | focus point mode is \c Camera.FocusPointCustom, the \l customFocusPoint |
229 | property allows you to specify which part of the frame to focus on. |
230 | |
231 | The property can take one of the following values: |
232 | \table |
233 | \header |
234 | \li Value |
235 | \li Description |
236 | \row |
237 | \li FocusPointAuto |
238 | \li Automatically select one or multiple focus points. |
239 | \row |
240 | \li FocusPointCenter |
241 | \li Focus to the frame center. |
242 | \row |
243 | \li FocusPointFaceDetection |
244 | \li Focus on faces in the frame. |
245 | \row |
246 | \li FocusPointCustom |
247 | \li Focus to the custom point, defined by the customFocusPoint property. |
248 | \endtable |
249 | */ |
250 | QDeclarativeCameraFocus::FocusPointMode QDeclarativeCameraFocus::focusPointMode() const |
251 | { |
252 | return QDeclarativeCameraFocus::FocusPointMode(m_focus->focusPointMode()); |
253 | } |
254 | |
255 | /*! |
256 | \qmlproperty list<enumeration> CameraFocus::supportedFocusPointModes |
257 | |
258 | This property holds the supported focus point modes of the camera. |
259 | |
260 | \since 5.10 |
261 | \sa focusPointMode |
262 | */ |
263 | QVariantList QDeclarativeCameraFocus::supportedFocusPointModes() const |
264 | { |
265 | QVariantList supportedModes; |
266 | |
267 | for (int i = int(FocusPointAuto); i <= int(FocusPointCustom); i++) { |
268 | if (m_focus->isFocusPointModeSupported(QCameraFocus::FocusPointMode(i))) |
269 | supportedModes.append(t: i); |
270 | } |
271 | |
272 | return supportedModes; |
273 | } |
274 | |
275 | void QDeclarativeCameraFocus::setFocusPointMode(QDeclarativeCameraFocus::FocusPointMode mode) |
276 | { |
277 | if (mode != focusPointMode()) { |
278 | m_focus->setFocusPointMode(QCameraFocus::FocusPointMode(mode)); |
279 | emit focusPointModeChanged(focusPointMode()); |
280 | } |
281 | } |
282 | |
283 | #if QT_DEPRECATED_SINCE(5, 10) |
284 | /*! |
285 | \qmlmethod bool QtMultimedia::CameraFocus::isFocusPointModeSupported(mode) const |
286 | \obsolete |
287 | |
288 | Returns true if the supplied \a mode is a supported focus point mode, and |
289 | false otherwise. |
290 | */ |
291 | bool QDeclarativeCameraFocus::isFocusPointModeSupported(QDeclarativeCameraFocus::FocusPointMode mode) const |
292 | { |
293 | return m_focus->isFocusPointModeSupported(QCameraFocus::FocusPointMode(mode)); |
294 | } |
295 | #endif |
296 | |
297 | /*! |
298 | \property QDeclarativeCameraFocus::customFocusPoint |
299 | |
300 | This property holds the position of the custom focus point in relative |
301 | frame coordinates. For example, QPointF(0,0) pointing to the left top corner of the frame, and QPointF(0.5,0.5) |
302 | pointing to the center of the frame. |
303 | |
304 | Custom focus point is used only in QCameraFocus::FocusPointCustom focus mode. |
305 | */ |
306 | |
307 | /*! |
308 | \qmlproperty point QtMultimedia::CameraFocus::customFocusPoint |
309 | |
310 | This property holds the position of custom focus point, in relative frame coordinates: |
311 | QPointF(0,0) points to the left top frame point, QPointF(0.5,0.5) |
312 | points to the frame center. |
313 | |
314 | Custom focus point is used only in FocusPointCustom focus mode. |
315 | */ |
316 | |
317 | QPointF QDeclarativeCameraFocus::customFocusPoint() const |
318 | { |
319 | return m_focus->customFocusPoint(); |
320 | } |
321 | |
322 | void QDeclarativeCameraFocus::setCustomFocusPoint(const QPointF &point) |
323 | { |
324 | if (point != customFocusPoint()) { |
325 | m_focus->setCustomFocusPoint(point); |
326 | emit customFocusPointChanged(customFocusPoint()); |
327 | } |
328 | } |
329 | /*! |
330 | \property QDeclarativeCameraFocus::focusZones |
331 | |
332 | This property holds the list of current camera focus zones, |
333 | each including \c area specified in the same coordinates as \l customFocusPoint, and zone \c status as one of the following values: |
334 | \table |
335 | \header \li Value \li Description |
336 | \row \li QCameraFocusZone::Unused \li This focus point area is currently unused in autofocusing. |
337 | \row \li QCameraFocusZone::Selected \li This focus point area is used in autofocusing, but is not in focus. |
338 | \row \li QCameraFocusZone::Focused \li This focus point is used in autofocusing, and is in focus. |
339 | \endtable |
340 | */ |
341 | /*! |
342 | \qmlproperty list<focusZone> QtMultimedia::CameraFocus::focusZones |
343 | |
344 | This property holds the list of current camera focus zones, |
345 | each including \c area specified in the same coordinates as \l customFocusPoint, |
346 | and zone \c status as one of the following values: |
347 | |
348 | \table |
349 | \header \li Value \li Description |
350 | \row \li Camera.FocusAreaUnused \li This focus point area is currently unused in autofocusing. |
351 | \row \li Camera.FocusAreaSelected \li This focus point area is used in autofocusing, but is not in focus. |
352 | \row \li Camera.FocusAreaFocused \li This focus point is used in autofocusing, and is in focus. |
353 | \endtable |
354 | |
355 | \qml |
356 | |
357 | VideoOutput { |
358 | id: viewfinder |
359 | source: camera |
360 | |
361 | //display focus areas on camera viewfinder: |
362 | Repeater { |
363 | model: camera.focus.focusZones |
364 | |
365 | Rectangle { |
366 | border { |
367 | width: 2 |
368 | color: status == Camera.FocusAreaFocused ? "green" : "white" |
369 | } |
370 | color: "transparent" |
371 | |
372 | // Map from the relative, normalized frame coordinates |
373 | property variant mappedRect: viewfinder.mapNormalizedRectToItem(area); |
374 | |
375 | x: mappedRect.x |
376 | y: mappedRect.y |
377 | width: mappedRect.width |
378 | height: mappedRect.height |
379 | } |
380 | } |
381 | } |
382 | \endqml |
383 | */ |
384 | |
385 | QAbstractListModel *QDeclarativeCameraFocus::focusZones() const |
386 | { |
387 | return m_focusZones; |
388 | } |
389 | |
390 | /*! \internal */ |
391 | void QDeclarativeCameraFocus::updateFocusZones() |
392 | { |
393 | m_focusZones->setFocusZones(m_focus->focusZones()); |
394 | } |
395 | |
396 | |
397 | FocusZonesModel::FocusZonesModel(QObject *parent) |
398 | :QAbstractListModel(parent) |
399 | { |
400 | } |
401 | |
402 | int FocusZonesModel::rowCount(const QModelIndex &parent) const |
403 | { |
404 | if (parent == QModelIndex()) |
405 | return m_focusZones.count(); |
406 | |
407 | return 0; |
408 | } |
409 | |
410 | QVariant FocusZonesModel::data(const QModelIndex &index, int role) const |
411 | { |
412 | if (index.row() < 0 || index.row() > m_focusZones.count()) |
413 | return QVariant(); |
414 | |
415 | QCameraFocusZone zone = m_focusZones.value(i: index.row()); |
416 | |
417 | if (role == StatusRole) |
418 | return zone.status(); |
419 | |
420 | if (role == AreaRole) |
421 | return zone.area(); |
422 | |
423 | return QVariant(); |
424 | } |
425 | |
426 | QHash<int,QByteArray> FocusZonesModel::roleNames() const |
427 | { |
428 | return {{StatusRole, QByteArrayLiteral("status" )}, |
429 | {AreaRole, QByteArrayLiteral("area" )}}; |
430 | } |
431 | |
432 | void FocusZonesModel::setFocusZones(const QCameraFocusZoneList &zones) |
433 | { |
434 | beginResetModel(); |
435 | m_focusZones = zones; |
436 | endResetModel(); |
437 | } |
438 | |
439 | QT_END_NAMESPACE |
440 | |
441 | #include "moc_qdeclarativecamerafocus_p.cpp" |
442 | |