+ pSurface->UnlockRect();
+no_lock:
+ return image;
+}
+
+
+static image::Image *
+getRenderTargetImage(IDirect3DDevice9 *pDevice,
+ IDirect3DSurface9 *pRenderTarget) {
+ image::Image *image = NULL;
+ D3DSURFACE_DESC Desc;
+ IDirect3DSurface9 *pStagingSurface = NULL;
+ HRESULT hr;
+
+ if (!pRenderTarget) {
+ return NULL;
+ }
+
+ hr = pRenderTarget->GetDesc(&Desc);
+ assert(SUCCEEDED(hr));
+
+ hr = pDevice->CreateOffscreenPlainSurface(Desc.Width, Desc.Height, Desc.Format, D3DPOOL_SYSTEMMEM, &pStagingSurface, NULL);
+ if (FAILED(hr)) {
+ goto no_staging;
+ }
+
+ hr = pDevice->GetRenderTargetData(pRenderTarget, pStagingSurface);
+ if (FAILED(hr)) {
+ goto no_rendertargetdata;
+ }
+
+ image = getSurfaceImage(pDevice, pStagingSurface);
+