src/3rdparty/phonon/ds9/videorenderer_default.cpp
changeset 30 5dc02b23752f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/3rdparty/phonon/ds9/videorenderer_default.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -0,0 +1,153 @@
+/*  This file is part of the KDE project.
+
+Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+
+This library is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 2.1 or 3 of the License.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include "videorenderer_default.h"
+
+#ifndef QT_NO_PHONON_VIDEO
+
+#include <QtGui/QWidget>
+#include <QtGui/QPainter>
+
+#include <uuids.h>
+
+QT_BEGIN_NAMESPACE
+
+
+namespace Phonon
+{
+    namespace DS9
+    {
+        VideoRendererDefault::~VideoRendererDefault()
+        {
+        }
+
+        bool VideoRendererDefault::isNative() const
+        {
+            return true;
+        }
+
+
+        VideoRendererDefault::VideoRendererDefault(QWidget *target) : m_target(target)
+        {
+            m_target->setAttribute(Qt::WA_PaintOnScreen, true);
+            m_filter = Filter(CLSID_VideoRenderer, IID_IBaseFilter);
+        }
+
+        QSize VideoRendererDefault::videoSize() const
+        {
+            LONG w = 0,
+                h = 0;
+            ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
+            if (basic) {
+                basic->GetVideoSize( &w, &h);
+            }
+            return QSize(w, h);
+        }
+
+        void VideoRendererDefault::repaintCurrentFrame(QWidget * /*target*/, const QRect & /*rect*/)
+        {
+            //nothing to do here: the renderer paints everything
+        }
+
+        void VideoRendererDefault::notifyResize(const QSize &size, Phonon::VideoWidget::AspectRatio aspectRatio,
+            Phonon::VideoWidget::ScaleMode scaleMode)
+        {
+            if (!isActive()) {
+                ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
+                if (basic) {
+                    basic->SetDestinationPosition(0, 0, 0, 0);
+                }
+                return;
+            }
+
+            ComPointer<IVideoWindow> video(m_filter, IID_IVideoWindow);
+
+            OAHWND owner;
+            HRESULT hr = video->get_Owner(&owner);
+            if (FAILED(hr)) {
+                return;
+            }
+
+            const OAHWND newOwner = reinterpret_cast<OAHWND>(m_target->winId());
+            if (owner != newOwner) {
+                video->put_Owner(newOwner);
+                video->put_MessageDrain(newOwner);
+                video->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
+            }
+
+            //make sure the widget takes the whole size of the parent
+            video->SetWindowPosition(0, 0, size.width(), size.height());
+
+            const QSize vsize = videoSize();
+            internalNotifyResize(size, vsize, aspectRatio, scaleMode);
+
+            ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
+            if (basic) {
+                basic->SetDestinationPosition(m_dstX, m_dstY, m_dstWidth, m_dstHeight);
+            }
+        }
+
+        void VideoRendererDefault::applyMixerSettings(qreal /*brightness*/, qreal /*contrast*/, qreal /*m_hue*/, qreal /*saturation*/)
+        {
+            //this can't be supported for the default renderer
+        }
+
+        QImage VideoRendererDefault::snapshot() const
+        {
+            ComPointer<IBasicVideo> basic(m_filter, IID_IBasicVideo);
+            if (basic) {
+                LONG bufferSize = 0;
+                //1st we get the buffer size
+                basic->GetCurrentImage(&bufferSize, 0);
+
+                QByteArray buffer;
+                buffer.resize(bufferSize);
+                HRESULT hr = basic->GetCurrentImage(&bufferSize, reinterpret_cast<long*>(buffer.data()));
+
+                if (SUCCEEDED(hr)) {
+
+                    const BITMAPINFOHEADER  *bmi = reinterpret_cast<const BITMAPINFOHEADER*>(buffer.constData());
+
+                    const int w = qAbs(bmi->biWidth),
+                        h = qAbs(bmi->biHeight);
+
+                    // Create image and copy data into image.
+                    QImage ret(w, h, QImage::Format_RGB32);
+
+                    if (!ret.isNull()) {
+                        const char *data = buffer.constData() + bmi->biSize;
+                        const int bytes_per_line = w * sizeof(QRgb);
+                        for (int y = h - 1; y >= 0; --y) {
+                            qMemCopy(ret.scanLine(y), //destination
+                                data,     //source
+                                bytes_per_line);
+                            data += bytes_per_line;
+                        }
+                    }
+                    return ret;
+                }
+            }
+            return QImage();
+        }
+
+    }
+}
+
+QT_END_NAMESPACE
+
+#endif //QT_NO_PHONON_VIDEO