From b9057a61e73d33a62289735dc56b449830ea16ac Mon Sep 17 00:00:00 2001 From: Damien Fouilleul Date: Wed, 6 Apr 2005 11:23:52 +0000 Subject: [PATCH] - all: intitial offscreen drawing support (mostly for printing). Unfortunately, video output cannot be printed at this stage, and to support it, interfacing with a video filter such as the 'snapshot' filter is required to do a still capture. --- activex/Makefile.am | 2 + activex/plugin.cpp | 43 +++++++++++++-------- activex/plugin.h | 3 +- activex/viewobject.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++ activex/viewobject.h | 67 ++++++++++++++++++++++++++++++++ 5 files changed, 186 insertions(+), 17 deletions(-) create mode 100644 activex/viewobject.cpp create mode 100644 activex/viewobject.h diff --git a/activex/Makefile.am b/activex/Makefile.am index 54b69e017a..80ac888bb5 100644 --- a/activex/Makefile.am +++ b/activex/Makefile.am @@ -32,6 +32,8 @@ SOURCES_activex = \ connectioncontainer.h \ objectsafety.cpp \ objectsafety.h \ + viewobject.cpp \ + viewobject.h \ vlccontrol.cpp \ vlccontrol.h \ plugin.cpp \ diff --git a/activex/plugin.cpp b/activex/plugin.cpp index 416fb2b725..3812062427 100644 --- a/activex/plugin.cpp +++ b/activex/plugin.cpp @@ -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(vlcControl); return NOERROR; } + else if( IID_IViewObject == riid ) + { + AddRef(); + *ppv = reinterpret_cast(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) diff --git a/activex/plugin.h b/activex/plugin.h index 9ad9234886..ab23774b1c 100644 --- a/activex/plugin.h +++ b/activex/plugin.h @@ -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 index 0000000000..313139b8aa --- /dev/null +++ b/activex/viewobject.cpp @@ -0,0 +1,88 @@ +/***************************************************************************** + * viewobject.cpp: ActiveX control for VLC + ***************************************************************************** + * Copyright (C) 2005 VideoLAN + * + * Authors: Damien Fouilleul + * + * 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 + +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 index 0000000000..8b3c49a79b --- /dev/null +++ b/activex/viewobject.h @@ -0,0 +1,67 @@ +/***************************************************************************** + * persiststorage.h: ActiveX control for VLC + ***************************************************************************** + * Copyright (C) 2005 VideoLAN + * + * Authors: Damien Fouilleul + * + * 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 + +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(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 + -- 2.39.5