Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

204 lines
5.7 KiB

//
// msaa.cpp
//
// AA stuff.
//
#include "private.h"
#include "ic.h"
#include "tim.h"
#include "dim.h"
#include "msaa.h"
#include "tlapi.h"
extern "C" HRESULT WINAPI TF_PostAllThreadMsg(WPARAM wParam, DWORD dwFlags);
//+---------------------------------------------------------------------------
//
// SystemEnableMSAA
//
// Called by msaa to kick cicero msaa support on the desktop.
//----------------------------------------------------------------------------
STDAPI CMSAAControl::SystemEnableMSAA()
{
if (InterlockedIncrement(&GetSharedMemory()->cMSAARef) == 0)
{
TF_PostAllThreadMsg(TFPRIV_ENABLE_MSAA, TLF_TIMACTIVE);
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// SystemDisableMSAA
//
// Called by msaa to halt cicero msaa support on the desktop.
//----------------------------------------------------------------------------
STDAPI CMSAAControl::SystemDisableMSAA()
{
if (InterlockedDecrement(&GetSharedMemory()->cMSAARef) == -1)
{
TF_PostAllThreadMsg(TFPRIV_DISABLE_MSAA, TLF_TIMACTIVE);
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// _InitMSAAHook
//
//----------------------------------------------------------------------------
void CInputContext::_InitMSAAHook(IAccServerDocMgr *pAAAdaptor)
{
IDocWrap *pAADocWrapper;
if (_pMSAAState != NULL)
return; // already inited
Assert(_ptsi != NULL);
// try to allocate some space for the state we'll need to save
// since we rarely use msaa, it's stored separately from the ic
if ((_pMSAAState = (MSAA_STATE *)cicMemAlloc(sizeof(MSAA_STATE))) == NULL)
return;
// back up the original ptsi
_pMSAAState->ptsiOrg = _ptsi;
_ptsi = NULL;
if (CoCreateInstance(CLSID_DocWrap, NULL, CLSCTX_INPROC_SERVER,
IID_IDocWrap, (void **)&pAADocWrapper) != S_OK)
{
goto ExitError;
}
if (pAADocWrapper->SetDoc(IID_ITextStoreAnchor, _pMSAAState->ptsiOrg) != S_OK)
goto ExitError;
if (pAADocWrapper->GetWrappedDoc(IID_ITextStoreAnchor, (IUnknown **)&_pMSAAState->pAADoc) != S_OK)
goto ExitError;
if (pAADocWrapper->GetWrappedDoc(IID_ITextStoreAnchor, (IUnknown **)&_ptsi) != S_OK)
goto ExitError;
if (pAAAdaptor->NewDocument(IID_ITextStoreAnchor, _pMSAAState->pAADoc) != S_OK)
goto ExitError;
pAADocWrapper->Release();
return;
ExitError:
pAADocWrapper->Release();
_UninitMSAAHook(pAAAdaptor);
}
//+---------------------------------------------------------------------------
//
// _UninitMSAAHook
//
//----------------------------------------------------------------------------
void CInputContext::_UninitMSAAHook(IAccServerDocMgr *pAAAdaptor)
{
if (_pMSAAState == NULL)
return; // not inited
pAAAdaptor->RevokeDocument(_pMSAAState->pAADoc);
SafeRelease(_pMSAAState->pAADoc);
SafeRelease(_ptsi);
// restore orig unwrapped doc
_ptsi = _pMSAAState->ptsiOrg;
// free msaa struct
cicMemFree(_pMSAAState);
_pMSAAState = NULL;
}
//+---------------------------------------------------------------------------
//
// _InitMSAA
//
//----------------------------------------------------------------------------
void CThreadInputMgr::_InitMSAA()
{
CDocumentInputManager *dim;
CInputContext *pic;
int iDim;
int iContext;
HRESULT hr;
if (_pAAAdaptor != NULL)
return; // already inited
hr = CoCreateInstance(CLSID_AccServerDocMgr, NULL, CLSCTX_INPROC_SERVER,
IID_IAccServerDocMgr, (void **)&_pAAAdaptor);
if (hr != S_OK || _pAAAdaptor == NULL)
{
_pAAAdaptor = NULL;
return;
}
// now wrap all existing ic's
for (iDim = 0; iDim < _rgdim.Count(); iDim++)
{
dim = _rgdim.Get(iDim);
for (iContext = 0; iContext <= dim->_GetCurrentStack(); iContext++)
{
pic = dim->_GetIC(iContext);
// we need to reset our sinks, so msaa can wrap them
// first, disconnect the sink
pic->_GetTSI()->UnadviseSink(SAFECAST(pic, ITextStoreAnchorSink *));
// now announce the ic
pic->_InitMSAAHook(_pAAAdaptor);
// now reset the sink on the wrapped _ptsi
pic->_GetTSI()->AdviseSink(IID_ITextStoreAnchorSink, SAFECAST(pic, ITextStoreAnchorSink *), TS_AS_ALL_SINKS);
}
}
}
//+---------------------------------------------------------------------------
//
// _UninitMSAA
//
//----------------------------------------------------------------------------
void CThreadInputMgr::_UninitMSAA()
{
CDocumentInputManager *dim;
CInputContext *pic;
int iDim;
int iContext;
if (_pAAAdaptor == NULL)
return; // already uninited
// unwrap all existing ic's
for (iDim = 0; iDim < _rgdim.Count(); iDim++)
{
dim = _rgdim.Get(iDim);
for (iContext = 0; iContext <= dim->_GetCurrentStack(); iContext++)
{
pic = dim->_GetIC(iContext);
// we need to reset our sinks
// first, unadvise the wrapped sinks
pic->_GetTSI()->UnadviseSink(SAFECAST(pic, ITextStoreAnchorSink *));
// unwrap the ptsi
pic->_UninitMSAAHook(_pAAAdaptor);
// now reset the sink on the original _ptsi
pic->_GetTSI()->AdviseSink(IID_ITextStoreAnchorSink, SAFECAST(pic, ITextStoreAnchorSink *), TS_AS_ALL_SINKS);
}
}
_pAAAdaptor->Release();
_pAAAdaptor = NULL;
}