[vlc-devel] [PATCH] Add initial Windows windowless support

Cheng Sun chengsun9 at gmail.com
Mon Dec 31 11:57:34 CET 2012


---
 npapi/Makefile.am           |   2 +
 npapi/vlcplugin.h           |   4 ++
 npapi/vlcwindowless_win.cpp | 126 ++++++++++++++++++++++++++++++++++++++++++++
 npapi/vlcwindowless_win.h   |  42 +++++++++++++++
 4 files changed, 174 insertions(+)
 create mode 100644 npapi/vlcwindowless_win.cpp
 create mode 100644 npapi/vlcwindowless_win.h

diff --git a/npapi/Makefile.am b/npapi/Makefile.am
index 7ef1bf7..fa4d728 100644
--- a/npapi/Makefile.am
+++ b/npapi/Makefile.am
@@ -105,6 +105,8 @@ SOURCES_support = \
 	support/npwin.cpp \
 	vlcplugin_win.cpp \
 	vlcplugin_win.h \
+	vlcwindowless_win.cpp \
+	vlcwindowless_win.h \
 	../common/win32_fullscreen.cpp \
 	../common/win32_fullscreen.h \
 	../common/win32_vlcwnd.cpp \
diff --git a/npapi/vlcplugin.h b/npapi/vlcplugin.h
index 1bcc58a..defc012 100644
--- a/npapi/vlcplugin.h
+++ b/npapi/vlcplugin.h
@@ -51,6 +51,10 @@
 #elif defined(XP_WIN)
 #   include "vlcplugin_win.h"
     typedef class VlcPluginWin VlcPlugin;
+
+#   define WINDOWLESS
+#   include "vlcwindowless_win.h"
+    typedef class VlcWindowlessWin VlcWindowless;
 #elif defined(XP_MACOSX)
 #   include "vlcplugin_mac.h"
     typedef class VlcPluginMac VlcPlugin;
diff --git a/npapi/vlcwindowless_win.cpp b/npapi/vlcwindowless_win.cpp
new file mode 100644
index 0000000..e7bae77
--- /dev/null
+++ b/npapi/vlcwindowless_win.cpp
@@ -0,0 +1,126 @@
+/*****************************************************************************
+ * vlcwindowless_win.cpp: a VLC plugin for Mozilla (Windows windowless)
+ *****************************************************************************
+ * Copyright (C) 2011 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Sergey Radionov <rsatom at gmail.com>
+ *          Mark Lesha <mlesha(at)hotmail(dot)com>
+ *          Cheng Sun <chengsun9 at gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#include "vlcwindowless_win.h"
+#include <cstdio>
+
+VlcWindowlessWin::VlcWindowlessWin(NPP instance, NPuint16_t mode) :
+    VlcWindowlessBase(instance, mode)
+{
+    unsigned r = 0, g = 0, b = 0;
+    HTMLColor2RGB(get_options().get_bg_color().c_str(), &r, &g, &b);
+    m_hBgBrush = CreateSolidBrush( RGB(r,g,b) );
+}
+
+VlcWindowlessWin::~VlcWindowlessWin()
+{
+    DeleteObject(m_hBgBrush);
+}
+
+bool VlcWindowlessWin::handle_event(void *event)
+{
+    NPEvent *npevent = reinterpret_cast<NPEvent *> (event);
+    switch (npevent->event) {
+    case WM_PAINT:
+        BOOL ret;
+        HDC hDC = reinterpret_cast<HDC> (npwindow.window);
+        if (!hDC) {
+            fprintf(stderr, "NULL HDC given by browser\n");
+            return false;
+        }
+        int savedID = SaveDC(hDC);
+
+        RECT *clipRect = reinterpret_cast<RECT *> (npevent->lParam);
+
+        ret = FillRect(hDC, clipRect, m_hBgBrush);
+        if (!ret) {
+            LPVOID lpMsgBuf;
+            FormatMessage(
+                FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                FORMAT_MESSAGE_FROM_SYSTEM |
+                FORMAT_MESSAGE_IGNORE_INSERTS,
+                NULL,
+                GetLastError(),
+                0, // Default language
+                (LPTSTR) &lpMsgBuf,
+                0,
+                NULL
+            );
+
+            fprintf(stderr, "Error in FillRect: %s\n", lpMsgBuf);
+            LocalFree( lpMsgBuf );
+        }
+
+        if ( m_frame_buf.size() &&
+             m_frame_buf.size() >= m_media_width * m_media_height * DEF_PIXEL_BYTES)
+        {
+            BITMAPINFO BmpInfo; ZeroMemory(&BmpInfo, sizeof(BmpInfo));
+            BITMAPINFOHEADER& BmpH = BmpInfo.bmiHeader;
+            BmpH.biSize = sizeof(BITMAPINFOHEADER);
+            BmpH.biWidth = m_media_width;
+            BmpH.biHeight = -((int)m_media_height);
+            BmpH.biPlanes = 1;
+            BmpH.biBitCount = DEF_PIXEL_BYTES*8;
+            BmpH.biCompression = BI_RGB;
+            //following members are already zeroed
+            //BmpH.biSizeImage = 0;
+            //BmpH.biXPelsPerMeter = 0;
+            //BmpH.biYPelsPerMeter = 0;
+            //BmpH.biClrUsed = 0;
+            //BmpH.biClrImportant = 0;
+
+
+            ret = SetDIBitsToDevice(hDC,
+                            npwindow.x + (npwindow.width - m_media_width)/2,
+                            npwindow.y + (npwindow.height - m_media_height)/2,
+                            m_media_width, m_media_height,
+                            0, 0,
+                            0, m_media_height,
+                            &m_frame_buf[0],
+                            &BmpInfo, DIB_RGB_COLORS);
+            if (!ret) {
+                LPVOID lpMsgBuf;
+                FormatMessage(
+                    FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                    FORMAT_MESSAGE_FROM_SYSTEM |
+                    FORMAT_MESSAGE_IGNORE_INSERTS,
+                    NULL,
+                    GetLastError(),
+                    0, // Default language
+                    (LPTSTR) &lpMsgBuf,
+                    0,
+                    NULL
+                );
+
+                fprintf(stderr, "Error in SetDIBitsToDevice: %s\n", lpMsgBuf);
+                LocalFree( lpMsgBuf );
+            }
+
+        }
+        RestoreDC(hDC, savedID);
+        return true;
+    }
+    return VlcWindowlessBase::handle_event(event);
+}
diff --git a/npapi/vlcwindowless_win.h b/npapi/vlcwindowless_win.h
new file mode 100644
index 0000000..1707702
--- /dev/null
+++ b/npapi/vlcwindowless_win.h
@@ -0,0 +1,42 @@
+/*****************************************************************************
+ * vlcwindowless_win.h: a VLC plugin for Mozilla (Windows windowless)
+ *****************************************************************************
+ * Copyright (C) 2011 the VideoLAN team
+ * $Id$
+ *
+ * Authors: Cheng Sun <chengsun9 at gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef __VLCWINDOWS_LINUX_H__
+#define __VLCWINDOWS_LINUX_H__
+
+#include "vlcwindowless_base.h"
+
+class VlcWindowlessWin : public VlcWindowlessBase
+{
+public:
+    VlcWindowlessWin(NPP instance, NPuint16_t mode);
+    virtual ~VlcWindowlessWin();
+
+    bool handle_event(void *event);
+
+private:
+    HBRUSH m_hBgBrush;
+};
+
+
+#endif /* __VLCWINDOWLESS_LINUX_H__ */
-- 
1.8.0.3




More information about the vlc-devel mailing list