[過去ログ] 物凄い勢いで誰かが質問に答えるスレ@ゲーム製作技術 (1001レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
431(7): 名前は開発中のものです。 [] 02/04/08 21:17 ID:l6XgGYO6(1) AAS
あ”ー!!頭がぐちゃぐちゃしてきたよ兄さん!!
ラスターオペレーションに関して質問というか、アドバイスをいただきたいのです。
手元に白黒の画像があります。
この白と黒を指定の背景色と前景色にして画面に転送したいと思っています。
一応できたのですが、対象サイズと同じサイズの領域を2つも必要とするので
実はもっと単純な方法があるのではないかな?などと思っています。
今やっている手順を、白−前景色、黒−背景色として状況を説明しますと、
まず、一時領域を前景色で塗りつぶし、そこに AND 演算で画像を転送し、
前景色と黒バックの画像を作り、
次にマスク用領域に反転しつつマスク画像を作成、
次に最終的に描画したい場所を背景色で塗りつぶし、
マスク画像を AND 演算で描画し、最後に一時領域の画像を XOR 演算で描画しています。
なんとなく無駄がありそうなのですが、
もっと高速 or リソースの少なくて済む方法等があったらご教授頂けないでしょうか?
432(1): 名前は開発中のものです。 [sage] 02/04/08 21:35 ID:??? AAS
>>431
文章がよーわからんけど
A(一番上)
B(真中)
C(一番下)
と画像を重ねあわせる時、ACが同一の画像って事であってるか?
434(1): 名前は開発中のものです。 [sage] 02/04/09 01:36 ID:??? AAS
>>431
俺も文章がよくわからないんだが。というより、何がしたいのかわからない。
既に書いてある領域に白と黒の背景色と前景色を描きこみたいってことなのか?
436(1): 名前は開発中のものです。 [sage] 02/04/09 08:39 ID:??? AAS
>431
MMX命令使いなされ。
外部リンク[html]:homepage1.nifty.com
437(1): 431 [] 02/04/09 09:51 ID:0lddlFaw(1) AAS
>>432-436
あはっ、頭がぐちゃぐちゃしている時に書いたので
文章もぐちゃぐちゃでした。スミマセン。
簡単に言うと、DOS の文字みたいな物を表示したいのです。
フォントの色と背景色を指定できるような物です。
それを白黒のパターンから表示したいのです。
今のところ、
(1) 白黒画像 -ソース-
(2) 対象画像 -デスティネーション-
としたとき
(3) 一時画像 -前景色生成用-
(4) マスク画像 -前景色透過用-
を用意して、
(ステップ1)
一時領域(3)を指定の前景色でFill、
そこに白黒画像(1)を AND 演算転送で 前景色+背景部分が黒の画像を生成。
(ステップ2)
マスク領域(4)に白黒画像(1)を NOT 演算転送して、マスク画像を生成。
(ステップ3)
対象領域(2)を背景色で塗りつぶし、マスク画像(4)を AND 演算で転送、
最後に一時領域(3)の画像を対象領域(2)に XOR 演算で転送
という手順を取っています。
これで伝わったでしょうか?よろしくお願いします。
442(1): 431 [] 02/04/09 16:51 ID:ZX8.ylbM(1) AAS
>>440440(2): 暇人 [] 02/04/09 14:37 ID:TLqMFG8I(1) AAS
431さんの質問を画像にしたためてみました。
(あきまさ君のうpローダー借ります)
画像リンク
白黒2階調のBFNTみたいな文字画像を、(バックと文字の色を
変えて)表示させたいけど、↑の画像の手順よりもっとスマートに
処理できないものだろうか…?ということみたいです。
わ〜!ありがとうございます!!
こんなに解りやすい図にして頂けるなんてすごく嬉しいです。
まさしく図の通りです。
というわけで皆様よろしくお願いします。
444: 名前は開発中のものです。 [sage] 02/04/09 21:11 ID:??? AAS
>431
使用言語、環境(DirectX&Surface / GDI&DIB / etc...)くらいの情報なけりゃアドバイスも糞も無いと思うが。
446: 名前は開発中のものです。 [sage] 02/04/09 22:48 ID:??? AAS
>>431
src, dest, mono 全部24bitBitmapデータじゃないと動かないけど、MMXアセンブラ化してみた。
動作的には dest = ( src & mono ) | ( dest & !mono ) かな。
void BitBlt2( void *src, void *dest, void *mono, long len )
{
_asm {
mov eax, 8
mov ecx, len
shr ecx, 3 // len /= 8
mov edi, dest
mov esi, src
mov ebx, mono
loopM:
movq mm0, [esi]
movq mm1, [edi]
movq mm2, [ebx]
pand mm0, mm2 // src 画像を mono の白い部分だけ抜く
pandn mm2, mm1 // dest 画像を mono の黒い部分だけ抜く
pxor mm0, mm2
movq [edi], mm0
add esi, eax
add edi, eax
add ebx, eax
dec ecx
jnz loopM
// loop loopM // K6-2ならこっち
EMMS
}
for( int i = len & 0x7ffffff8; i < len; i++ )
if( ((char*)mono)[i] )
((char*)dest)[i] = ((char*)src)[i];
}
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.034s