ReC98/libs/master.lib/grcg_trapezoid.asm

148 lines
3.4 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PAGE 98,120
; koichan library - graphics - grcg - trapezoid - PC98V
;
; Function:
; void far _pascal grcg_trapezoid( int y1, int x11, int x12, int y2, int x21, int x22 ) ;
;
; Description:
; 台形塗りつぶし(青プレーンのみ)
;
; Parameters:
; int y1 1つ目の水平線のy座標
; int x11, x12 1つ目の水平線の両端のx座標
; int y2 2つ目の水平線のy座標
; int x21, x22 2つ目の水平線の両端のx座標
;
; Binding Target:
; Microsoft-C / Turbo-C ( Small Model )
;
; Running Target:
; NEC PC-9801 Normal mode
;
; Requiring Resources:
; CPU: V30
; GRAPHICS ACCELARATOR: GRAPHIC CHARGER
;
; Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Notes:
; ・グラフィック画面の青プレーンにのみ描画します。
; ・色をつけるには、グラフィックチャージャーを利用してください。
; ・クリッピングを行っています。
;  左右方向は、grc_setclip()によるクリッピングに対応していますが、
;  上下方向は、画面枠でクリップします。呼び出し側で対応して(ヒー)
;  y座標が上境界にかかっていると遅くなります。
;  (上境界との交点を計算せずに、上から順に調べているため)
; ・位置関係は上下、左右とも自由ですが、ねじれている場合
;  ねじれた台形(2つの三角形が頂点で接している状態)を描画します。
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 92/3/21 Initial
; 92/3/29 bug fix, 台形に側辺の交差を認めるようにした
; 92/4/2 少々加速
; 92/4/18 三角形ルーチンから分離。クリッピング付加。
; 92/4/19 少々加速
; 92/5/7 自己書き換えにより加速
; 92/5/20 任意クリッピングの横にだけ対応。:-)
; 92/5/22 ↑これも自己書き換え〜
; 92/6/6 bug fix
; 92/6/13 bug fix
; 92/6/16 TASM対応
; 95/ 3/25 [M0.22k] BUGFIX ClipYT=0を仮定していた
;=========================================================================
; void _pascal grcg_trapezoid( int y1, int x11, int x12, int y2, int x21, int x22 )
FUNC GRCG_TRAPEZOID
push BP
mov BP,SP
push DI
push SI
mov ES,ClipYT_seg
mov AX,ClipYT
mov CX,ClipYH
; 引数
@@y1 = (RETSIZE+6)*2
@@x11 = (RETSIZE+5)*2
@@x12 = (RETSIZE+4)*2
@@y2 = (RETSIZE+3)*2
@@x21 = (RETSIZE+2)*2
@@x22 = (RETSIZE+1)*2
mov SI,[BP+@@y1]
sub SI,AX
js short @@Lno_draw
mov DI,[BP+@@y2]
sub DI,AX
js short @@Lno_draw
cmp SI,DI
jg short @@Lgyaku
or DI,DI
js short @@Lno_draw
cmp SI,CX
jg short @@Lno_draw
sub DI,CX ; if ( y2 >= Ymax )
sbb AX,AX ; y2 = Ymax ;
and DI,AX
add DI,CX
sub DI,SI ; DI = y2 - y1
jl short @@Lno_draw
mov AX,[BP+@@x21]
mov CX,DI ; y2-y1
mov BX,offset trapez_a ;a
mov DX,[BP+@@x11]
call make_linework
mov AX,[BP+@@x22]
mov CX,DI ; y2-y1
mov BX,offset trapez_b ;b
mov DX,[BP+@@x12]
push offset @@Ldraw
jmp make_linework
@@Lgyaku:
xchg SI,DI ; y2<->y1
or DI,DI
js short @@Lno_draw
cmp SI,CX
jg short @@Lno_draw
sub DI,CX ; if ( y2 >= Ymax )
sbb AX,AX ; y2 = Ymax ;
and DI,AX
add DI,CX
sub DI,SI ; DI = y2 - y1
jl short @@Lno_draw
mov AX,[BP+@@x11]
mov CX,DI ; y2-y1
mov BX,offset trapez_a ;a
mov DX,[BP+@@x21]
call make_linework
mov AX,[BP+@@x12]
mov CX,DI ; y2-y1
mov BX,offset trapez_b ;b
mov DX,[BP+@@x22]
call make_linework
@@Ldraw:
imul SI,SI,80
mov DX,DI
call draw_trapezoid
@@Lno_draw:
pop SI
pop DI
leave
ret 12
ENDFUNC