// initialization STDMETHODIMP CDirect2DRMDevice::InitFromSurface(LPDIRECTDRAWSURFACE pdds) { HRESULT hr; if (pdds == NULL) return E_NULLPOINTER; // if (m_pddsBackBuffer) // return E_ALREADYINITIALIZED; // release the old surface MMRELEASE(m_pddsBackBuffer); pdds->AddRef(); m_pddsBackBuffer = pdds; if (FAILED(hr = pdds->GetSurfaceDesc(&m_ddsd)) || FAILED(hr = m_pixi.Init(m_ddsd.ddpfPixelFormat))) return hr; // notify the viewports that the device has been resized for(DWORD i = 0, cLimit = m_dsViewports.Items(); i < cLimit; i++) { if (FAILED(hr = m_dsViewports[i]->DeviceResized())) return hr; } return S_OK; }