]> git.sesse.net Git - vlc/commitdiff
- all: intitial offscreen drawing support (mostly for printing). Unfortunately, video...
authorDamien Fouilleul <damienf@videolan.org>
Wed, 6 Apr 2005 11:23:52 +0000 (11:23 +0000)
committerDamien Fouilleul <damienf@videolan.org>
Wed, 6 Apr 2005 11:23:52 +0000 (11:23 +0000)
activex/Makefile.am
activex/plugin.cpp
activex/plugin.h
activex/viewobject.cpp [new file with mode: 0644]
activex/viewobject.h [new file with mode: 0644]

index 54b69e017a7a30f14cf9bb046c485999593a5903..80ac888bb54ff8b2b9faa830a6c7e21ee2be1248 100644 (file)
@@ -32,6 +32,8 @@ SOURCES_activex = \
     connectioncontainer.h \
     objectsafety.cpp \
     objectsafety.h \
+    viewobject.cpp \
+    viewobject.h \
     vlccontrol.cpp \
     vlccontrol.h \
     plugin.cpp \
index 416fb2b7256a62baec0f2891f1c86ba326e5e042..38120624272cf7288534973f381d0a5fd8cc8c90 100644 (file)
@@ -33,6 +33,7 @@
 #include "connectioncontainer.h"
 #include "objectsafety.h"
 #include "vlccontrol.h"
+#include "viewobject.h"
 
 #include "utils.h"
 
@@ -81,8 +82,10 @@ static LRESULT CALLBACK VLCVideoClassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam
             RECT pr;
             if( GetUpdateRect(hWnd, &pr, FALSE) )
             {
+                RECT bounds;
+                GetClientRect(hWnd, &bounds);
                 BeginPaint(hWnd, &ps);
-                p_instance->onPaint(ps, pr);
+                p_instance->onPaint(ps.hdc, bounds, pr);
                 EndPaint(hWnd, &ps);
             }
             return 0L;
@@ -246,6 +249,7 @@ VLCPlugin::VLCPlugin(VLCPluginClass *p_class) :
     vlcConnectionPointContainer = new VLCConnectionPointContainer(this);
     vlcObjectSafety = new VLCObjectSafety(this);
     vlcControl = new VLCControl(this);
+    vlcViewObject = new VLCViewObject(this);
 };
 
 VLCPlugin::~VLCPlugin()
@@ -253,6 +257,7 @@ VLCPlugin::~VLCPlugin()
     vlcOleInPlaceObject->UIDeactivate();
     vlcOleInPlaceObject->InPlaceDeactivate();
 
+    delete vlcViewObject;
     delete vlcControl;
     delete vlcObjectSafety;
     delete vlcConnectionPointContainer;
@@ -372,6 +377,12 @@ STDMETHODIMP VLCPlugin::QueryInterface(REFIID riid, void **ppv)
         *ppv = reinterpret_cast<LPVOID>(vlcControl);
         return NOERROR;
     }
+    else if( IID_IViewObject == riid )
+    {
+        AddRef();
+        *ppv = reinterpret_cast<LPVOID>(vlcViewObject);
+        return NOERROR;
+    }
 
     *ppv = NULL;
 
@@ -702,19 +713,19 @@ BOOL VLCPlugin::hasFocus(void)
     return GetActiveWindow() == _inplacewnd;
 };
 
-void VLCPlugin::onPaint(PAINTSTRUCT &ps, RECT &pr)
+void VLCPlugin::onPaint(HDC hdc, const RECT &bounds, const RECT &pr)
 {
     /*
     ** if VLC is playing, it may not display any VIDEO content 
     ** hence, draw control logo
     */ 
-    int width = _bounds.right-_bounds.left;
-    int height = _bounds.bottom-_bounds.top;
+    int width = bounds.right-bounds.left;
+    int height = bounds.bottom-bounds.top;
 
     HBITMAP pict = _p_class->getInPlacePict();
     if( NULL != pict )
     {
-        HDC hdcPict = CreateCompatibleDC(ps.hdc);
+        HDC hdcPict = CreateCompatibleDC(hdc);
         if( NULL != hdcPict )
         {
             BITMAP bm;
@@ -728,26 +739,26 @@ void VLCPlugin::onPaint(PAINTSTRUCT &ps, RECT &pr)
                 if( dstHeight > height-4 )
                     dstHeight = height-4;
 
-                int dstX = (width-dstWidth)/2;
-                int dstY = (height-dstHeight)/2;
+                int dstX = bounds.left+(width-dstWidth)/2;
+                int dstY = bounds.top+(height-dstHeight)/2;
 
                 SelectObject(hdcPict, pict);
-                StretchBlt(ps.hdc, dstX, dstY, dstWidth, dstHeight,
+                StretchBlt(hdc, dstX, dstY, dstWidth, dstHeight,
                         hdcPict, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
                 DeleteDC(hdcPict);
-                ExcludeClipRect(ps.hdc, dstX, dstY, dstWidth+dstX, dstHeight+dstY);
+                ExcludeClipRect(hdc, dstX, dstY, dstWidth+dstX, dstHeight+dstY);
             }
         }
     }
 
-    FillRect(ps.hdc, &pr, (HBRUSH)GetStockObject(WHITE_BRUSH));
-    SelectObject(ps.hdc, GetStockObject(BLACK_BRUSH));
+    FillRect(hdc, &pr, (HBRUSH)GetStockObject(WHITE_BRUSH));
+    SelectObject(hdc, GetStockObject(BLACK_BRUSH));
 
-    MoveToEx(ps.hdc, 0, 0, NULL);
-    LineTo(ps.hdc, width-1, 0);
-    LineTo(ps.hdc, width-1, height-1);
-    LineTo(ps.hdc, 0, height-1);
-    LineTo(ps.hdc, 0, 0);
+    MoveToEx(hdc, bounds.left, bounds.top, NULL);
+    LineTo(hdc, bounds.left+width-1, bounds.top);
+    LineTo(hdc, bounds.left+width-1, bounds.top+height-1);
+    LineTo(hdc, bounds.left, bounds.top+height-1);
+    LineTo(hdc, bounds.left, bounds.top);
 };
 
 void VLCPlugin::onPositionChange(LPCRECT lprcPosRect, LPCRECT lprcClipRect)
index 9ad92348863cc717d21c47d5c163493c2e7a5bbb..ab23774b1c2ea35ccc5d18aa153adff20d5ccf5b 100644 (file)
@@ -118,7 +118,7 @@ public:
 
     // container events
     void onPositionChange(LPCRECT lprcPosRect, LPCRECT lprcClipRect);
-    void onPaint(PAINTSTRUCT &ps, RECT &pr);
+    void onPaint(HDC hdc, const RECT &bounds, const RECT &pr);
 
     // control events
     void firePropChangedEvent(DISPID dispid);
@@ -146,6 +146,7 @@ private:
     class VLCConnectionPointContainer *vlcConnectionPointContainer;
     class VLCObjectSafety *vlcObjectSafety;
     class VLCControl *vlcControl;
+    class VLCViewObject *vlcViewObject;
 
     // in place activated window (Clipping window)
     HWND _inplacewnd;
diff --git a/activex/viewobject.cpp b/activex/viewobject.cpp
new file mode 100644 (file)
index 0000000..313139b
--- /dev/null
@@ -0,0 +1,88 @@
+/*****************************************************************************
+ * viewobject.cpp: ActiveX control for VLC
+ *****************************************************************************
+ * Copyright (C) 2005 VideoLAN
+ *
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *****************************************************************************/
+
+#include "plugin.h"
+#include "viewobject.h"
+
+#include <iostream>
+
+using namespace std;
+
+STDMETHODIMP VLCViewObject::Draw(DWORD dwAspect, LONG lindex, PVOID pvAspect,
+        DVTARGETDEVICE *ptd, HDC hicTargetDev, HDC hdcDraw, LPCRECTL lprcBounds,
+        LPCRECTL lprcWBounds, BOOL(CALLBACK *pfnContinue)(DWORD), DWORD dwContinue)
+{
+    switch( dwAspect )
+    {
+        case DVASPECT_CONTENT:
+            if( _p_instance->getVisible() )
+            {
+                RECT bounds;
+                bounds.left   = lprcBounds->left;
+                bounds.top    = lprcBounds->top;
+                bounds.right  = lprcBounds->right;
+                bounds.bottom = lprcBounds->bottom;
+                _p_instance->onPaint(hdcDraw, bounds, bounds);
+            }
+            return S_OK;
+        case DVASPECT_THUMBNAIL:
+            break;
+        case DVASPECT_ICON:
+            break;
+        case DVASPECT_DOCPRINT:
+            break;
+    }
+    return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCViewObject::Freeze(DWORD dwAspect, LONG lindex,
+        PVOID pvAspect, LPDWORD pdwFreeze)
+{
+    if( NULL != pvAspect )
+        return E_INVALIDARG;
+
+    return OLE_E_BLANK;
+};
+
+STDMETHODIMP VLCViewObject::GetAdvise(LPDWORD pdwAspect, LPDWORD padvf,
+        LPADVISESINK *ppAdviseSink)
+{
+    return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCViewObject::GetColorSet(DWORD dwAspect, LONG lindex, 
+        PVOID pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LPLOGPALETTE *ppColorSet)
+{
+    return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCViewObject::SetAdvise(DWORD dwAspect, DWORD advf,
+        LPADVISESINK pAdvSink)
+{
+    return OLE_E_ADVISENOTSUPPORTED;
+};
+
+STDMETHODIMP VLCViewObject::Unfreeze(DWORD dwFreeze)
+{
+    return E_NOTIMPL;
+};
+
diff --git a/activex/viewobject.h b/activex/viewobject.h
new file mode 100644 (file)
index 0000000..8b3c49a
--- /dev/null
@@ -0,0 +1,67 @@
+/*****************************************************************************
+ * persiststorage.h: ActiveX control for VLC
+ *****************************************************************************
+ * Copyright (C) 2005 VideoLAN
+ *
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *****************************************************************************/
+
+#ifndef __VIEWOBJECT_H__
+#define __VIEWOBJECT_H__
+
+#include <oleidl.h>
+
+class VLCViewObject : public IViewObject
+{
+
+public:
+
+    VLCViewObject(VLCPlugin *p_instance) : _p_instance(p_instance) {};
+    virtual ~VLCViewObject() {};
+
+    // IUnknown methods
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
+    {
+        if( (NULL != ppv)
+         && (IID_IUnknown == riid) 
+         && (IID_IPersist == riid) 
+         && (IID_IViewObject == riid) ) {
+            AddRef();
+            *ppv = reinterpret_cast<LPVOID>(this);
+            return NOERROR;
+        }
+        return _p_instance->QueryInterface(riid, ppv);
+    };
+
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };
+
+    // IViewObject methods
+    STDMETHODIMP Draw(DWORD,LONG,PVOID,DVTARGETDEVICE*,HDC,HDC,LPCRECTL,LPCRECTL,BOOL(CALLBACK *)(DWORD),DWORD);
+    STDMETHODIMP Freeze(DWORD,LONG,PVOID,LPDWORD);
+    STDMETHODIMP GetAdvise(LPDWORD,LPDWORD,LPADVISESINK *);
+    STDMETHODIMP GetColorSet(DWORD,LONG,PVOID,DVTARGETDEVICE *,HDC,LPLOGPALETTE *);
+    STDMETHODIMP SetAdvise(DWORD,DWORD,LPADVISESINK);
+    STDMETHODIMP Unfreeze(DWORD);
+
+private:
+
+    VLCPlugin *_p_instance;
+};
+
+#endif
+