〜 グラフィック 〜
色反転コピー (要GDI32.DLL)

HSPのコピー命令gcopyの実態はAPI関数BitBltであり、
コピー元画像をそのままコピー先に貼り付けるモードのほか、gmode命令で指定できる色加算コピーモード、
今回使用する色反転コピーモード等があります。一覧は下記を参照してください。
0x00000042BLACKNESSパレット0の色(デフォルトは黒)でコピー先の矩形塗り潰し
0x001100A6NOTSRCERASEコピー元の色とコピー先の色をOR結合して反転
0x00330008NOTSRCCOPY反転したコピー元の色をコピー先にコピー
0x00440328SRCERASEコピー元の色と反転したコピー先の色をAND結合
0x00550009DSTINVERTコピー先長方形の色を反転
0x005A0049PATINVERT指定パターンの色とコピー先の色をXOR結合
0x00660046SRCINVERTコピー元の色とコピー先の色をXOR結合
0x008800C6SRCANDコピー元とコピー先の色をAND結合
0x00BB0226MERGEPAINT反転したコピー元の色とコピー先の色をOR結合
0x00C000CAMERGECOPYコピー元の色とコピー先の色をAND結合
0x00CC0020SRCCOPYコピー元をコピー先にそのままコピー
0x00EE0086SRCPAINTコピー元とコピー先の色をOR結合
0x00F00021PATCOPY指定パターンをコピー先にコピー
0x00FB0A09PATPAINT指定パターンの色と反転したコピー元の色をOR結合し、コピー先の色とOR結合
0x00FF0062WHITENESSパレット1の色(デフォルトは白)でコピー先の矩形塗り潰し
HSP3以降は、デバイスコンテキストハンドルをシステム変数hdcから取得できますが、 HSP2以前は、この変数が用意されていないので取得することが出来ません。 また、HSP3以降であってもhdcは現在の描画対象ウィンドウのデバイスコンテキストであり、 コピー元ウィンドウがカレントウィンドウでない場合はgsel命令で切り替えて取得する必要があります。 API関数GetDCを使用することでもデバイスコンテキストのハンドルを取得することが出来ますが、 標準命令mrefで「mref v, 96 + id」のようにしてBMSCR構造体を読み込んで、 後は5番目の要素「v.4」を取得すれば対象ウィンドウのデバイスコンテキストを参照できます。 但し、HSP2のBMSCRはウィンドウID0〜7の8つしか取得できません。 それ以上のウィンドウを扱う機会はあまりないと思いますが、制約があることだけは覚えておいてください。

revcopy ウィンドウID, X, Y, 横幅, 高さ, モード
ウィンドウIDコピー元のウィンドウIDを指定する。
コピー元の左上基点X座標を指定する。
コピー元の左上基点Y座標を指定する。
横幅コピーする横幅を指定する。
高さコピーする縦幅を指定する。
モード以下の反転モードを指定する。
0:コピー元の色を反転してコピー先へコピー(デフォルト)
1:コピー元とコピー先を色加算して反転コピー
2:反転したコピー元の色とコピー先を色加算してコピー

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
	ll_libload gdi, "gdi32.dll"
	ll_getproc BitBlt, "BitBlt", gdi

#module
#deffunc revcopy int, int, int, int, int, int
	mref id, 0 : mref x, 1 : mref y, 2 : mref w, 3 : mref h, 4 : mref mode, 5
	mref bmscr1, 67
	mref bmscr2, 96 + id
	raster = 0x00330008, 0x001100A6, 0x00BB0226 // NOTSRCCOPY, NOTSRCERASE, MERGEPAINT
	prm = bmscr1.4, csrx, csry, w, h, bmscr2.4, x, y, raster.mode
	ll_callfunc prm, 9, BitBlt@
	redraw
	return
#global

	buffer 2
	dialog "", 16
	if stat = 0 : end
	picload refstr
	size = winx, winy
	gsel 0
	repeat 3
		color 200, 100 : boxf
		revcopy 2, , , size, size.1, cnt // 反転コピー
		dialog "モード" + cnt
	loop

revcopy ウィンドウID, X, Y, 横幅, 高さ, モード
ウィンドウIDコピー元のウィンドウIDを指定する。
コピー元の左上基点X座標を指定する。
コピー元の左上基点Y座標を指定する。
横幅コピーする横幅を指定する。
高さコピーする縦幅を指定する。
モード以下の反転モードを指定する。
0:コピー元の色を反転してコピー先へコピー(デフォルト)
1:コピー元とコピー先を色加算して反転コピー
2:反転したコピー元の色とコピー先を色加算してコピー

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#uselib "gdi32.dll"
#func  global BitBlt "BitBlt" int, int, int, int, int, int, int, int, int

#module
#deffunc revcopy int id, int x, int y, int w, int h, int mode
	mref bmscr, 96 + id
	raster = 0x00330008, 0x001100A6, 0x00BB0226 // NOTSRCCOPY, NOTSRCERASE, MERGEPAINT
	BitBlt hdc, ginfo_cx, ginfo_cy, w, h, bmscr.4, x, y, raster.mode
	redraw
	return
#global

	buffer 1
	dialog "", 16
	if stat = 0 : end
	picload refstr
	size = ginfo_winx, ginfo_winy
	gsel 0
	repeat 3
		color 200, 100 : boxf
		revcopy 1, , , size, size.1, cnt // 反転コピー
		dialog "モード" + cnt
	loop
	end