Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
(module
(import "console" "log" (func $log (param i32)))
(import "js" "mem" (memory $mem 1))
# n回の呼び出し毎にデバッグ値を出力する
(global $dbgcnt (mut i32)
i32.push 0
)
(func $dbgval (param $val i32)
global.push dbgcnt
i32.push 0x3F
i32.and
if
else # dbgcnt & 0x3F == 0
push val
call log
end
global.push dbgcnt
i32.push 1
i32.add
global.pop dbgcnt
)
# 回転(拡大縮小)機能
(func (export "rotnscl") (param $v i32) (param $w i32)
(local $it i32)
(local $rx16 i32) # rxy: サンプリングxy開始点計算用
(local $ry16 i32)
(local $hx16 i32) # hxy: 水平方向サンプリングxy間隔
(local $hy16 i32)
(local $vx16 i32) # vxy: 垂直方向サンプリングxy間隔
(local $vy16 i32)
(local $dest_adr i32)
(local $w16 i32)
(local $x i32)
(local $_vx16 i32)
(local $_vy16 i32)
(local $_hx16 i32)
(local $_hy16 i32)
# テーブルから cos, sin を得る 0x200000 - 0x2007FF: table (cos:4 sin:4) x 256
push v
i32.push 3
i32.shl # [ (v << 3)
pop_push it
push it
push it # [ (v << 3) (v << 3) (v << 3)
# rxy: サンプリングxy開始点計算用
i32.push 0x200400 # 0x200000 + PI:128 << 3
i32.add # [ (v << 3) (v << 3) ((v << 3) + (PI << 3))
i32.push 0x2007F8
i32.and # [ (v << 3) (v << 3) *cos(v + 128)
pop_push it
push it
i32.push 4
i32.add # [ (v << 3) (v << 3) *cos(v + 128) *sin(v + 128)
i32.load
pop ry16 # ry16 = sin(v + 128) <16bit.16bit>
i32.load
pop rx16 # rx16 = cos(v + 128) <16bit.16bit>
# hxy: 水平方向サンプリングxy間隔
i32.push 0x200000 # 0x200000
i32.add # [ (v << 3) (v << 3)
i32.push 0x2007F8
i32.and # [ (v << 3) *cos(v)
pop_push it
push it
i32.push 4
i32.add # [ (v << 3) *cos(v) *sin(v)
i32.load
pop hy16 # hy16 = sin(v) <16bit.16bit>
i32.load
pop hx16 # hx16 = cos(v) <16bit.16bit>
# vxy: 垂直方向サンプリングxy間隔
i32.push 0x200200 # 0x200000 + (PI/2):64 << 3
i32.add # [ (v << 3) ((v << 3) + ((PI/2) << 3))
i32.push 0x2007F8
i32.and # [ (v << 3) *cos(v + 64)
pop_push it
push it
i32.push 4
i32.add # [ *cos(v + 64) *sin(v + 64)
i32.load
pop vy16 # vy16 = sin(v + 64) <16bit.16bit>
i32.load
pop vx16 # vx16 = cos(v + 64) <16bit.16bit>
# 描画先アドレス
push w
push w
i32.mul
i32.push 2
i32.shl
pop dest_adr # dest_adr = (w * w) << 2
# _vx16, _vy16: サンプリングxy開始点
push w
i32.push 1
i32.shr_u
pop_push it # [ (dxy = w >> 1)
push it # [ dxy dxy
i32.push 65536
push rx16
push ry16 # [ dxy dxy 65536 rx16 ry16
i32.sub
i32.add
i32.mul # [ dxy dxy * (65536 + rx16 - ry16)
pop _vx16 # _vx16 = (dxy * rx16) - (dxy * ry16) + (dxy << 16) <16bit.16bit>
i32.push 65536
push ry16
push rx16 # [ dxy 65536 ry16 rx16
i32.add
i32.add
i32.mul # [ dxy * (65536 + ry16 + rx16)
pop _vy16 # _vy16 = (dxy * ry16) + (dxy * rx16) + (dxy << 16) <16bit.16bit>
# サンプリング範囲外チェック用に w16 を作っておく
push w
i32.push 16
i32.shl
pop w16 # w16 = w << 16
vloop: loop # 垂直方向ループ
# 水平方向カウンタを初期化
push w
pop x # x = w
# サンプリング位置を垂直方向に進め、水平方向の初期位置としてセット
push _vx16
push vx16
i32.add
pop_push _vx16 # _vx16 += vx16
pop _hx16 # _hx16 = _vx16
push _vy16
push vy16
i32.add
pop_push _vy16 # _vy16 += vy16
pop _hy16 # _hy16 = _vy16
hloop: loop # 水平方向ループ
push dest_adr
i32.push 4
i32.sub
pop_push dest_adr # [ (dest_adr -= 4)
sblock: block (result i32) # [ dest_adr
# 透過色を持つアドレス
i32.push 0x200800 # [ dest_adr 0x200800
# サンプリング位置を水平方向に進める
push _hx16
push hx16
i32.add
pop_push _hx16 # [ dest_adr 0x200800 (_hx16 += hx16)
push _hy16
push hy16
i32.add
pop_push _hy16 # [ dest_adr 0x200800 _hx16 (_hy16 += hy16)
# サンプリング範囲外チェック
i32.or # [ dest_adr 0x200800 (_hx16 | _hy16)
push w16
i32.ge_u # [ dest_adr 0x200800 ((_hx16 | _hy16) >= (w << 16))
br_if sblock # [ dest_adr break(0x200800)
# 透過色を持つアドレスを捨てる
drop # [ dest_adr
# サンプリングアドレス計算
i32.push 0x100000 # [ dest_adr 0x100000
push _hy16
i32.push 16
i32.shr_u
push w
i32.mul # [ dest_adr 0x100000 (_hy16 >> 16 * w)
push _hx16
i32.push 16
i32.shr_u
i32.add # [ dest_adr 0x100000 ((_hy16 >> 16 * w) + (_hx16 >> 16))
i32.push 2
i32.shl # [ dest_adr 0x100000 ((_hy16 >> 16 * w) + (_hx16 >> 16) << 2)
i32.add # [ dest_adr src_adr
end # sblock
# サンプリング&描画
i32.load # [ dest_adr color
i32.store # [
push x
i32.push 1
i32.sub
pop_push x
jp_nz hloop # (x -= 1) != 0 and loop
end
push dest_adr
jp_nz vloop # dest_adr != 0 and loop
end
)
)
__END__