SSE用いたアルファブレンドの高速化2

Posted on Sat 20 March 2010 in ペイントツール

ロード・ストアに使用するSSE命令

ロード

イントリンシック命令 対応するSSE命令
_mm_loadu_ps MOVUPS アライメントを合わせる必要がない
_mm_load_ps MOVAPS アライメントを合わせなければならない

ストア

イントリンシック命令 対応するSSE命令
_mm_storeu_ps MOVUPS アライメントを合わせる必要がない
_mm_store_ps MOVAPS アライメントを合わせなければならない
_mm_stream_si128 MOVNTPD アライメントを合わせなければならない、キャッシュを介さずにストアする

計測するアルファブレンド処理

32bit,64bit向けに2通りに実行ファイルを作成、それぞれについて

  • SSEを使わない処理
  • _mm_loadu_psでメモリ読み込み、_mm_storeu_psでメモリ書き込み
  • _mm_load_psでメモリ読み込み、_mm_store_psでメモリ書き込み
  • _mm_load_psでメモリ読み込み、_mm_stream_si128でメモリ書き込み

の4通りでテストする。

64bit向けの設定だと__asmのとこでエラーがでるのでインラインアセンブラではなく組み込み関数を使って書きました。
アライメントをあわせて処理するために、128bit(4pixel)ずつ読み込んで処理を行っています。

計測方法

  • 5760x3600BGR画像を2枚読み込み、アルファ値を指定してアルファブレンドを行う。
  • 画像の保存、読み込みはopenCV 2 …

Continue reading

ブレークポイントがヒットしない時の対処

Posted on Wed 17 March 2010 in Windows • Tagged with Windows

デバック時、リビルドしたソースにブレークポイントを設定しても、
ブレークポイントは、現在の設定ではヒットしません。ソースコード が元のバージョンと異なります。」
と表示されるときの対処

[「ツール」→「オプション」→「デバッグ」→「全般」を開き、「元のバージョンと完全に一致するソースファイルを必要とする」のチェックをはずす。]

http://www.langedge.jp/blog/?&blogid=1&archive=2006-6-14


64bit対応のOpenCV 2.0のスタティックリンクライブラリのビルド

Posted on Mon 15 March 2010 in OpenCV

CMakeを用いてVisual Studioのプロジェクトを作る

ここを参考にOpenCVのソースからVisual Studioのプロジェクトを作成する。
http://d.hatena.ne.jp/Guernsey/20091002/1254459730

「アプリケーションを正しく初期化できませんでした (0xc0150002)」というエラーダイアログがでないようにするためにCMakeのConfigure時にでENABLE_OPENMPを外す。
http://d.hatena.ne.jp/Guernsey/20091120/1258734848

スタティックリンクライブラリをビルドするために

  • 「構成プロパティ」→「全般」で「構成の種類」をダイナミックライブラリからスタティックライブラリに変更する
  • DllMain()をコメントアウト
  • opencv-1.1preからvideoInput.libをリンクさせる
  • atlthunk.libが見つからないとリンクエラーが出たらatlthunk.libを無視

64bit対応にするために

  • すべてのプロジェクトのプロパティの「構成プロパティ」→「C/C …

Continue reading

64bit版のWintab DLLのロード

Posted on Sun 14 March 2010 in ペイントツール

タブレットの情報を取得するのに、以下のようにWintabのDLLを使用している。

LoadLibrary("wintab32.dll");

wintab32.dllという名前なのでこのDLLは32bit用で、64bitのexeから呼び出すには64bit用のDLLを読み込まないとダメだと思い、それらしいものを探してみるがどこにも見当たらない。

この記事によると、OSが同じ名前のDLLを32bit用と64bit用で切り替えてくれるようだ。
[http://kait-field.spaces.live.com/Blog/cns!B90E9B4A3C4DFD66!889.entry?wa=wsignin1.0&sa=838339906]

なので、64bit版の方でもwintab32.dllを読み込めばいいということらしい。


C言語、32bit環境と64bit環境の変数のサイズ

Posted on Sat 13 March 2010 in Windows

32bit環境と64bit環境向けにコンパイルしたものを実行して、sizeofでサイズを調べた。

32bit 64bit
char 1 1
short 2 2
int 4 4
long 4 4
long long 8 8
float 8 8
double 8 8
long double 8 8

どうやら、32bit環境と64bit環境で変数サイズに違いは無いみたいだ。


WH_KEYBOARDのフックプロシージャサンプル

Posted on Sun 07 March 2010 in Windows

キーボードが押されてない状態から押された状態へ遷移した時と、押している状態から、押されていない状態へ遷移した時に、押されたキーの仮想コード、shift、ctrl、altのそれぞれの状態を表示するフックプロシージャのコード

WH_KEYBORDのフックプロシージャは、0を返すと他のフックプシージャやウィンドウメッセージを処理するウィンドウへメッセージを渡し、0以外を返すとメッセージを渡さない。

LRESULT KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode < 0 || nCode == HC_NOREMOVE)
    return ::CallNextHookEx(m_hHook, nCode, wParam, lParam);

  ::OutputDebugString("keyboard hook! ");
  if((lParam & 0xc0000000) == 0xc0000000){
    UINT optChar = 0;
    //check keyup shift
    if(::GetKeyState(VK_SHIFT) >= 0){
      ::OutputDebugString("shift ");
    }
    //check keyup …

Continue reading

開発版更新

Posted on Mon 01 March 2010 in ペイントツール

  • ナビゲーターの画像が何もしてない時でもチカチカしてたのを修正
  • 半透明なピクセルに半透明なピクセルを書き込めないバグを修正
  • ソフト円ブラシを追加
  • レイヤー合成高速化

http://key0note.ath.cx/hp/frayer_wiki/

f:id:hiroki0:20100301063557j:image ブラシのテスト。
黒い線がハード円ブラシ、赤い線がハードエアーブラシ、青い線がソフト円ブラシ、緑の線がソフトエアーブラシ。


OpenCL開発環境のインストール

Posted on Tue 23 February 2010 in OpenCL

windows7 64bit、Visual Studio 2008環境下にOpenCLの開発環境をインストールする手順を記します。
自分はNVIDIAGPUを使っているのでNVIDIAOpenCL環境をインストールします。

ドライバ、SDKのインストール

http://developer.nvidia.com/object/opencl.html
上のNVIDIのサイトから

をダウンロードしてインストールします。
再起動が求められた場合は、再起動を行います。

windows7の場合では、インクルードファイルとライブラリファイルはそれぞれ次の箇所にインストールされてました。

C:\Users\(ユーザ)\AppData …

Continue reading

円描画のアンチエイリアス

Posted on Sun 14 February 2010 in ペイントツール

円描画時のアンチエイリアスのかけ方のテスト
f:id:hiroki0:20100215002421p:image

ついでにブラシ描画のテスト
f:id:hiroki0:20100215002422p:image


ローカルフック使用時にはスレッドIDが必要

Posted on Thu 11 February 2010 in Windows

ローカルフックを作成するには、
第3引数にNULL、第4引数にスレッドIDを指定する。

対して、グローバルフックの場合は、
第3引数にDLLモジュールのハンドル、第4引数に0を指定する。

//ローカルフックの作成
::SetWindowsHookEx(
  WH_GETMESSAGE,
  (HOOKPROC)hookfunc,
  NULL,
  ::GetCurrentThreadId());