SSE用いたアルファブレンドの高速化4 アライメントがずれている画像同士のアルファブレンド

Posted on Sat 03 December 2011 in ペイントツール

↓の続き

今回はアライメントをずらした場合での計測をします。

_mm_loadu_si128などアライメントをあわせる必要がないロード・ストア命令を使用する場合は、
前回と同じ様に何も考えずに読み込んでアルファブレンドを行い、書きこむという順で処理を行うことができます。

しかし、アライメントを合わせる必要があるロード・ストア命令を使用する場合は、
処理方法をアライメントのズレによって変える必要があります。

今回のアルファブレンド処理では、

  1. 入出力メモリともアライメントが揃っている場合
  2. 入出力メモリともアライメントから同じだけずれている場合
  3. 入力、出力メモリのアライメントのずれ量が違う場合

の3通りに分けてコードを実装しました。

1の場合は、前回と同様のコードで処理します。
2の場合は、ずれてる分を処理して入出力ともアライメントを合わせた状態にして、1と同じように処理します。
3の場合は、ずれてる分をシフト演算を使用してずれを合わせる処理をいれて、
ロード・ストア命令がアライメントが合った状態で実行されるようにします。

計測方法

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

  1. SSEを使わない処理
  2. _mm_loadu_si128でメモリ読み込み、_mm_storeu_si128でメモリ書き込み
  3. _mm_load_si128でメモリ読み込み、_mm_store_si128でメモリ書き込み
  4. _mm_load_si128でメモリ読み込み、_mm_stream_si128でメモリ書き込み

の4通りの処理の処理速度を計測する。
前回までは間違えて浮動小数点用の_mm_loadu_ps等を使っていたので、今回は_mm_loadu_si128等を使います。

  • チャンネルサイズ8bit 5700x5700BGR画像を2枚読み込み、アルファ値を指定してアルファブレンドを行う。
  • 画像の保存、読み込みは …

Continue reading

SSE用いたアルファブレンドの高速化3 アルファチャンネルをもつ画像同士のアルファブレンド

Posted on Mon 28 November 2011 in ペイントツール

↓の続き
http://d.hatena.ne.jp/hiroki0/20090914/1252931917
http://d.hatena.ne.jp/hiroki0/20100320/1269074009

使用するアルファブレンド計算式

チャンネルサイズ8bitとして
a_{dst} = 255 - (255 - a_{over})(255 - a_{under}) /
255
d_{dst} = (d_{over} a_{over} + (d_{under} a_{under} (255 -
a_{over}) / 255) /
a_{dst}

ここで、aはアルファ値、dは画素値である。

この計算式をコードにすると以下のようになる。
255による除算は、高速化のために256の除算に変更しシフト演算で処理している。
また、計算量を減らすためにアルファ値により分岐を行なっている。
今回は、この処理をSSEにより実装して計測を行う。

if ((over_pix->a == 255) || (under_pix->a == 0)) {
    dst_pix->value = over_pix->value;
} else if (over_pix->a == 0) {
    dst_pix->value = under_pix->value;
} else …

Continue reading

wintabから傾きを取得するコード

Posted on Fri 24 December 2010 in ペイントツール

f:id:hiroki0:20101225035447j:image Azimuthがペンとタブレットの前後方向の軸がなす角、
Altitudeがペンとタブレット平面がなす角です。
ペンが逆さまのときAltitudeは負の値になります。
矢印が向いてるほうがタブレットの上側を表しています。

まず、取得するデータ型に傾きを定義するために、PK_ORIENTATIONをPACKETDATAに含めます。

#include <wintab.h>
#define PACKETDATA (PK_CURSOR | PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION)
#define PACKETMODE PK_BUTTONS
#include <pktdef.h>

タブレットからのデータを正規化するために、
WTInfo関数を呼び出して、AzimuthとAltitudeの最大値を調べています。

typedef UINT (API *WTInfo_)( UINT wCategory, UINT nIndex, LPVOID lpOutput );

HMODULE dll = LoadLibrary("wintab32.dll");
WTInfo_ wtInfo = (WTInfo_)GetProcAddress(dll, "WTInfoA");

double …

Continue reading

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

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を読み込めばいいということらしい。


開発版更新

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

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

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

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


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

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

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

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


トーンカーブ

Posted on Sun 27 September 2009 in ペイントツール • Tagged with ペイントツール

3次スプラインを利用してトーンカーブを実装してみた。
f:id:hiroki0:20090927071914j:image


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

Posted on Mon 14 September 2009 in ペイントツール

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

  • SSEを使わない処理
  • 16バイトアライメントなし、SSEを使って1pixelごとに処理
  • 16バイトアライメントなし、SSEを使って2pixelごとに処理

計測方法

  • 1920x1200BGR画像を2枚読み込み、アルファ値を指定してアルファブレンドを行う。
  • 画像の保存、読み込みはopenCVを用いた。
  • アルファブレンド部分の処理のみ処理時間を計測した。
  • 処理時間の計測は以下のページにあるコードを使用した。

http://74.125.155.132/search?q=cache:lBJiOP0zi6MJ:clippingcutting.blogspot.com/2007_10_01_archive.html+QPCTimer+QueryPerformanceFrequency&cd=1&hl=ja&ct=clnk&gl=jp

計測に使用した環境


Continue reading

PSDデータのフォーマット

Posted on Sun 02 August 2009 in ペイントツール

PSDファイルの構成

PSDファイルは、先頭から以下の順で構成されている。
値はビッグエンディアンで格納されているのでリトルエンディアンへの変換が必要

[Header]
[Color Mode Data Block]
[Image Resources Block]
[Layer and Mask Information Block]
[Image Data]

Header

[4byte] Signature "8BPS"が入ってるらしい [2byte] Version バージョン [6byte] Reserved 0で無いといけない [2byte] channels カラーチャンネル数 (例えば、RGBAだと4) [4byte] rows 画像の高さ [4byte] columns 画像の幅 [2byte] Depth 1pixelのデータ深度 [2byte] color_mode カラーモード

  • カラーモード
    • 0 Bitmap …

Continue reading