A2osX/LIB/LIBGUI.S.CLIP.txt
2022-11-03 07:59:03 +01:00

422 lines
7.0 KiB
Plaintext
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.

NEW
AUTO 3,1
*--------------------------------------
* CLIPPING Functions:
* In:
* Target Clipping Region in CLIP.Rect
* YA = Control Block
* Out:
* CC : CB.Cache clipped & visible
* CS : CB.Cache invisible
*--------------------------------------
CLIP.CB.Cache lda CB.Cache+S.CB.CMD
and #$7F remove S.CB.CMD.OSD
tax
jmp (J.CLIP-2,x)
*--------------------------------------
CLIP.Point
clc
rts
*--------------------------------------
CLIP.HLine >LDYA CB.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9
>LDYA CB.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9
>LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CB.Cache+S.CB.X1
>LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CB.Cache+S.CB.X2
clc
rts
.9 sec
rts
*--------------------------------------
CLIP.VLine >LDYA CB.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X2
bpl .9
>LDYA CB.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X1
bmi .9
>LDYA CLIP.Rect+S.RECT.Y1
>STYAIFGTR CB.Cache+S.CB.Y1
>LDYA CLIP.Rect+S.RECT.Y2
>STYAIFLWR CB.Cache+S.CB.Y2
clc
rts
.9 sec
rts
*--------------------------------------
CLIP.Rectangle jsr CLIP.Rect.Overlap
bcs .9
>LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CB.Cache+S.CB.X1
>LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CB.Cache+S.CB.X2
>LDYA CLIP.Rect+S.RECT.Y1
>STYAIFGTR CB.Cache+S.CB.Y1
>LDYA CLIP.Rect+S.RECT.Y2
>STYAIFLWR CB.Cache+S.CB.Y2
clc
.9 rts
*--------------------------------------
CLIP.Text
clc
rts
CLIP.Text.9 sec
CLIP.Text.RTS rts
*--------------------------------------
* BitBlt :
*--------------------------------------
CLIP.BitBlt jsr CB.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
jsr CLIP.Rect.Overlap
bcs CLIP.Text.RTS
lda CLIP.Rect+S.RECT.X1
sec
sbc CB.Cache+S.CB.X1
sta DX
lda CLIP.Rect+S.RECT.X1+1
sbc CB.Cache+S.CB.X1+1
sta DX+1
bvc .1
eor #$80
.1 bmi .2
lda CB.Cache+S.CB.X1
clc
adc DX
sta CB.Cache+S.CB.X1
lda CB.Cache+S.CB.X1+1
adc DX+1
sta CB.Cache+S.CB.X1+1
lda CB.Cache+S.CB.SrcX
clc
adc DX
sta CB.Cache+S.CB.SrcX
lda CB.Cache+S.CB.SrcX+1
adc DX+1
sta CB.Cache+S.CB.SrcX+1
lda CB.Cache+S.CB.SrcW
sec
sbc DX
sta CB.Cache+S.CB.SrcW
lda CB.Cache+S.CB.SrcW+1
sbc DX+1
sta CB.Cache+S.CB.SrcW+1
bcc CLIP.Text.9
.2 lda CB.Cache+S.CB.X2
sec
sbc CLIP.Rect+S.RECT.X2
sta DX
lda CB.Cache+S.CB.X2+1
sbc CLIP.Rect+S.RECT.X2+1
sta DX+1
bvc .3
eor #$80
.3 bmi .4
lda CB.Cache+S.CB.SrcW
sec
sbc DX
sta CB.Cache+S.CB.SrcW
lda CB.Cache+S.CB.SrcW+1
sbc DX+1
sta CB.Cache+S.CB.SrcW+1
bcc .9
.4 lda CLIP.Rect+S.RECT.Y1
sec
sbc CB.Cache+S.CB.Y1
sta DX
lda CLIP.Rect+S.RECT.Y1+1
sbc CB.Cache+S.CB.Y1+1
sta DX+1
bvc .5
eor #$80
.5 bmi .6
lda CB.Cache+S.CB.Y1
clc
adc DX
sta CB.Cache+S.CB.Y1
lda CB.Cache+S.CB.Y1+1
adc DX+1
sta CB.Cache+S.CB.Y1+1
lda CB.Cache+S.CB.SrcY
clc
adc DX
sta CB.Cache+S.CB.SrcY
lda CB.Cache+S.CB.SrcY+1
adc DX+1
sta CB.Cache+S.CB.SrcY+1
lda CB.Cache+S.CB.SrcH
sec
sbc DX
sta CB.Cache+S.CB.SrcH
lda CB.Cache+S.CB.SrcH+1
sbc DX+1
sta CB.Cache+S.CB.SrcH+1
bcc .9
.6 lda CB.Cache+S.CB.Y2
sec
sbc CLIP.Rect+S.RECT.Y2
sta DX
lda CB.Cache+S.CB.Y2+1
sbc CLIP.Rect+S.RECT.Y2+1
sta DX+1
bvc .7
eor #$80
.7 bmi .8
lda CB.Cache+S.CB.SrcH
sec
sbc DX
sta CB.Cache+S.CB.SrcH
lda CB.Cache+S.CB.SrcH+1
sbc DX+1
sta CB.Cache+S.CB.SrcH+1
bcc .9
.8 clc
.99 rts
.9 sec
rts
*--------------------------------------
CLIP.Line.LEFT .EQ 1
CLIP.Line.RIGHT .EQ 2
CLIP.Line.BOTTOM .EQ 4
CLIP.Line.TOP .EQ 8
*--------------------------------------
CLIP.Line jsr CLIP.Line.EncodeP1
jsr CLIP.Line.EncodeP2
.1 lda CLIP.Line.P1
ora CLIP.Line.P2
beq .88
lda CLIP.Line.P1
and CLIP.Line.P2
bne .99
lda CLIP.Line.P1
beq .5
bit #CLIP.Line.TOP
beq .2
* Y1 is above S.CB.Y1....
* DY=Y2-Y1;
jsr CLIP.Line.EncodeP1
bra .1
.2 bit #CLIP.Line.BOTTOM
beq .3
* Y1 is below S.CB.Y2....
jsr CLIP.Line.EncodeP1
bra .1
.3 bit #CLIP.Line.RIGHT
beq .4
* X1 is after S.CB.X2....
jsr CLIP.Line.EncodeP1
bra .1
* X1 is before S.CB.X1....
.4 jsr CLIP.Line.EncodeP1
bra .1
* P2
.5 lda CLIP.Line.P2
bit #CLIP.Line.TOP
beq .6
* Y2 is above S.CB.Y1....
jsr CLIP.Line.EncodeP2
bra .1
.6 bit #CLIP.Line.BOTTOM
beq .7
* Y2 is below S.CB.Y2....
jsr CLIP.Line.EncodeP2
bra .1
.7 bit #CLIP.Line.RIGHT
beq .8
* X2 is after S.CB.X2....
jsr CLIP.Line.EncodeP2
bra .1
* X2 is before S.CB.X1....
.8 jsr CLIP.Line.EncodeP2
bra .1
.88 clc
rts
.99 sec
rts
*--------------------------------------
CLIP.Line.EncodeP1
ldy #0
lda CB.Cache+S.CB.X1
ldx CB.Cache+S.CB.X1+1
jsr CLIP.Line.EncodeX.AX
lda CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y1+1
jsr CLIP.Line.EncodeY.AX
sty CLIP.Line.P1
rts
*--------------------------------------
CLIP.Line.EncodeP2
ldy #0
lda CB.Cache+S.CB.X2
ldx CB.Cache+S.CB.X2+1
jsr CLIP.Line.EncodeX.AX
lda CB.Cache+S.CB.Y2
ldx CB.Cache+S.CB.Y2+1
jsr CLIP.Line.EncodeY.AX
sty CLIP.Line.P2
rts
*--------------------------------------
CLIP.Line.EncodeX.AX
pha
>SCMPAX CLIP.Rect+S.RECT.X1
bpl .1
pla
tya
ora #CLIP.Line.LEFT
tay
rts
.1 pla
>SCMPAX CLIP.Rect+S.RECT.X2
bmi .8
tya
ora #CLIP.Line.RIGHT
tay
.8 rts
*--------------------------------------
CLIP.Line.EncodeY.AX
pha
>SCMPAX CLIP.Rect+S.RECT.Y1
bpl .1
pla
tya
ora #CLIP.Line.TOP
tya
rts
.1 pla
>SCMPAX CLIP.Rect+S.RECT.Y2
bmi .8
tya
ora #CLIP.Line.BOTTOM
tay
.8 rts
*--------------------------------------
CLIP.Rect.Overlap
>LDYA CB.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X2
bpl .9
>LDYA CB.Cache+S.CB.X2
>SCMPYA CLIP.Rect+S.RECT.X1
bmi .9
>LDYA CB.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9
>LDYA CB.Cache+S.CB.Y2
>SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9
clc
rts
.9 sec
rts
*--------------------------------------
CLIP.GetRect >STYA .1+1
ldy #S.OBJ.Y2+1
ldx #7
.1 lda $ffff,y
sta CLIP.Rect,x
dey
dex
bpl .1
rts
*--------------------------------------
MAN
SAVE usr/src/lib/libgui.s.clip
LOAD usr/src/lib/libgui.s
ASM