社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

DirectX Trandform を使った画像の変換 - DirectX Transform

DirectX Trandform を使った画像の変換するコードが発掘されたので、
抜粋を公開します。

そもそも「DirectX Trandformって何?」っていう人も多いと
思いますが、一言で説明すると"IEのCSSでのfilter"のことです。

この DirectX Trandform の進化したものが、"WPF Bitmap Effects"に
なります。
WPFの基盤となる milcore の中で、唯一公開されているものだと思います。

---
_COM_SMARTPTR_TYPEDEF(IDXTransformFactory, __uuidof(IDXTransformFactory));
_COM_SMARTPTR_TYPEDEF(IDXTransform, __uuidof(IDXTransform));

_COM_SMARTPTR_TYPEDEF(IDXSurfaceFactory, __uuidof(IDXSurfaceFactory));
_COM_SMARTPTR_TYPEDEF(IDXSurface, __uuidof(IDXSurface));

_COM_SMARTPTR_TYPEDEF(IDXDCLock, __uuidof(IDXDCLock));


class CMainDlg :
 public CDialogImpl
{
 // 省略。。

public:
 BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam)
 {
  // 省略。。

  HRESULT hr = S_OK;
 
  // トランスフォームファクトリ
  hr = m_spDXTransformFactory.CreateInstance(CLSID_DXTransformFactory);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  // サーフェスファクトリ
  hr = m_spDXTransformFactory->QueryService(
   SID_SDXSurfaceFactory, __uuidof(IDXSurfaceFactory), (void**)&m_spDXSurfaceFactory);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  // 入力用サーフェス
  CString strURL = _T("http://www.kanabo.net/images/header_logo.gif");
//  CString strURL = _T("c:\\windows\\winnt256.bmp");
  hr = m_spDXSurfaceFactory->LoadImage(
   T2W((LPTSTR)(LPCTSTR)strURL), NULL, NULL, &DDPF_PMARGB32, __uuidof(IDXSurface), (void**)&m_spInputDXSurface);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  // 省略。。

  return TRUE;
 }

protected:
 static HRESULT OnDraw(HDC hDC, IDXSurfacePtr spInputDXSurface, IDXSurfaceFactoryPtr spDXSurfaceFactory, IDXTransformPtr spDXTransform = NULL)
 {
  if (spInputDXSurface == NULL)
  {
   ATLASSERT(0);
   return E_FAIL;
  }
  if (spDXSurfaceFactory == NULL)
  {
   ATLASSERT(0);
   return E_FAIL;
  }

  HRESULT hr = S_OK;

  // 入力用サーフェスの領域の取得
  CDXDBnds bnds;
      hr = spInputDXSurface->GetBounds(&bnds);
  if (FAILED(hr))
  {
   return hr;
  }

  // 出力用サーフェス
  IDXSurfacePtr spOutputDXSurface;
  hr = spDXSurfaceFactory->CreateSurface(
   NULL, NULL, &DDPF_PMARGB32, &bnds, 0, NULL, __uuidof(IDXSurface), (void**)&spOutputDXSurface);
 //  NULL, NULL, NULL, &bnds, NULL, NULL, __uuidof(IDXSurface), (void**)&spOutputDXSurface);
  if (FAILED(hr))
  {
   return hr;
  }

  // 出力用サーフェスに転送
  if (spDXTransform == NULL)
  {
   hr = spDXSurfaceFactory->BitBlt(spOutputDXSurface, NULL, spInputDXSurface, NULL, NULL);
   if (FAILED(hr))
   {
    return hr;
   }
  }
  else
  {
   // トランスフォーム準備
   IUnknown* pUnkInputs[1] = { IUnknownPtr(spInputDXSurface) };
   IUnknown* pUnkOutputs[1] = { IUnknownPtr(spOutputDXSurface) };
   hr = spDXTransform->Setup(pUnkInputs, 1, pUnkOutputs, 1, 0);
   if (FAILED(hr))
   {
    return hr;
   }

   // トランスフォーム実行
#if 0
   hr = spDXTransform->Execute(NULL, &bnds, NULL);
#else
   CDXDVec vec(true);
   hr = spDXTransform->Execute(NULL, &bnds, &vec);
#endif
   if (FAILED(hr))
   {
    return hr;
   }
  }

  // 出力用サーフェスのDCをロック
  IDXDCLockPtr spDXDCLock;
  hr = spOutputDXSurface->LockSurfaceDC(NULL, INFINITE, DXLOCKF_READ, &spDXDCLock);
  if (FAILED(hr))
  {
   return hr;
  }

  // 出力用サーフェスのDCを取得
  HDC hDstDC = spDXDCLock->GetDC();
  if (hDstDC == NULL)
  {
   return E_FAIL;
  }

  // 描画
  ::BitBlt(hDC, 0, 0, bnds.Width(), bnds.Height(), hDstDC, 0, 0, SRCCOPY);

  return S_OK
 }

protected:
 IDXSurfaceFactoryPtr m_spDXSurfaceFactory;
 IDXTransformFactoryPtr m_spDXTransformFactory;

 IDXSurfacePtr m_spInputDXSurface;
 IDXTransformPtr m_spDXTransform;
};
---


■Filters Overviews and Tutorials - MSDN
http://msdn2.microsoft.com/en-US/library/aa753539.aspx

■WPF Bitmap Effects - MSDN
http://msdn2.microsoft.com/en-us/library/ms735322.aspx

投稿日時 : 2007年6月5日 20:31


コメントを追加

タイトル
名前
URL
コメント