ReC98/libs/master.lib/grcg_round_boxfill.asm

196 lines
3.0 KiB
NASM

PAGE 98,120
; graphics - grcg - round - boxfill - PC98V
;
; DESCRIPTION:
; 角の丸い四角形塗りつぶし (level 2)
;
; FUNCTION:
; void far _pascal grcg_round_boxfill( int x1, int y1, int x2, int y2, unsigned r ) ;
; PARAMETERS:
; int x1,y1 左上角の座標
; int x2,y2 右下角の座標
; unsigned r 四隅の円の半径
;
; BINDING TARGET:
; Microsoft-C / Turbo-C
;
; RUNNING TARGET:
; NEC PC-9801 Normal mode
;
; REQUIRING RESOURCES:
; CPU: V30
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
;
; COMPILER/ASSEMBLER:
; TASM 3.0
; OPTASM 1.6
;
; NOTES:
; ・描画規則はgrcg_hline, grcg_boxfillに依存しています。
; ・色をつけるには、グラフィックチャージャーを利用してください。
; ・grc_setclip()によるクリッピングに対応しています。
;
; AUTHOR:
; 恋塚昭彦
;
; 関連関数:
; grc_setclip()
; grcg_hline(), grcg_boxfill()
;
; HISTORY:
; 93/ 3/ 1 Initial
MRETURN macro
pop DI
pop SI
leave
ret 10
endm
; 引数
x1 = (RETSIZE+5)*2
y1 = (RETSIZE+4)*2
x2 = (RETSIZE+3)*2
y2 = (RETSIZE+2)*2
r = (RETSIZE+1)*2
retfunc GC_RBOXF_BOXFILL
push word ptr [BP+x1]
push word ptr [BP+y1]
push word ptr [BP+x2]
push word ptr [BP+y2]
call GRCG_BOXFILL
MRETURN
endfunc
func GRCG_ROUND_BOXFILL ; {
enter 2,0
push SI
push DI
; 変数
s = -2
mov AX,[BP+r]
mov BX,[BP+x1]
mov SI,[BP+x2]
cmp BX,SI
jle short @@SKIP1
xchg BX,SI
mov [BP+x1],BX
mov [BP+x2],SI
@@SKIP1:
sub SI,BX
shr SI,1 ; SI = abs(x2 - x1) / 2
sub AX,SI ; AX = min(AX,SI)
sbb DX,DX
and AX,DX
add AX,SI
mov CX,[BP+y1]
mov DI,[BP+y2]
cmp CX,DI
jle short @@SKIP2
xchg CX,DI
@@SKIP2:
mov BX,DI ; BX = max(y1,y2)
sub DI,CX
shr DI,1 ; DI = abs(y2 - y1) / 2
sub AX,DI ; AX = min(AX,DI)
sbb DX,DX
and AX,DX
add AX,DI
jz short GC_RBOXF_BOXFILL ; 半径が 0 になったら長方形になる
mov [BP+s],AX
add CX,AX ; y1,y2を内側へずらす
sub BX,AX
mov [BP+y1],CX
mov [BP+y2],BX
mov SI,AX ; SI = wx
inc CX
dec BX
cmp BX,CX
jl short @@SKIP_BOXFILL
push word ptr [BP+x1]
push CX
push word ptr [BP+x2]
push BX
call GRCG_BOXFILL
@@SKIP_BOXFILL:
add [BP+x1],SI
sub [BP+x2],SI
mov DI,0 ; DI = wy
@@LOOP_8:
mov AX,[BP+x1]
sub AX,SI
push AX ; x1 - wx
mov AX,[BP+x2]
add AX,SI
push AX ; x2 + wx
mov AX,[BP+y1]
sub AX,DI ; y1 - wy
push AX
call GRCG_HLINE
mov AX,[BP+x1]
sub AX,SI
push AX ; x1 - wx
mov AX,[BP+x2]
add AX,SI
push AX ; x2 + wx
mov AX,[BP+y2]
add AX,DI ; y1 + wy
push AX
call GRCG_HLINE
mov AX,DI
stc
rcl AX,1 ; (wy << 1) + 1
sub [BP+s],AX
jns short @@LOOP_8E
mov AX,[BP+x1]
sub AX,DI
push AX ; x1 - wy
mov AX,[BP+x2]
add AX,DI
push AX ; x2 + wy
mov AX,[BP+y1]
sub AX,SI ; y1 - wx
push AX
call GRCG_HLINE
mov AX,[BP+x1]
sub AX,DI
push AX ; x1 - wy
mov AX,[BP+x2]
add AX,DI
push AX ; x2 + wy
mov AX,[BP+y2]
add AX,SI ; y1 + wx
push AX
call GRCG_HLINE
dec SI ; s += --wx << 1 ;
mov AX,SI
shl AX,1
add [BP+s],AX
@@LOOP_8E:
inc DI
cmp SI,DI
jae short @@LOOP_8
MRETURN
endfunc ; }