A2osX/LIB/LIBGUI.S.CLIP.txt
2023-07-10 06:57:04 +02:00

449 lines
7.5 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
*--------------------------------------
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
*--------------------------------------
* CLIPPING Functions:
* In:
* Target Clipping Region in CLIP.Rect
* YA = Control Block
* Out:
* CC : CLIP.Cache clipped & visible
* CS : CLIP.Cache invisible
*--------------------------------------
CLIP.CB.Cache ldx #S.CB
.1 lda CB.Cache-1,x
sta CLIP.Cache-1,x
dex
bne .1
* 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 CLIP.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9
>LDYA CLIP.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9
>LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CLIP.Cache+S.CB.X1
>LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CLIP.Cache+S.CB.X2
clc
rts
.9 sec
rts
*--------------------------------------
CLIP.VLine >LDYA CLIP.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X2
bpl .9
>LDYA CLIP.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X1
bpl CLIP.Y1Y2
* bmi .9
* >LDYA CLIP.Rect+S.RECT.Y1
* >STYAIFGTR CLIP.Cache+S.CB.Y1
* >LDYA CLIP.Rect+S.RECT.Y2
* >STYAIFLWR CLIP.Cache+S.CB.Y2
* clc
* rts
.9 sec
rts
*--------------------------------------
CLIP.Rectangle jsr CLIP.Rect.Overlap
bcs CLIP.Text.RTS
>LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CLIP.Cache+S.CB.X1
>LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CLIP.Cache+S.CB.X2
CLIP.Y1Y2 >LDYA CLIP.Rect+S.RECT.Y1
>STYAIFGTR CLIP.Cache+S.CB.Y1
>LDYA CLIP.Rect+S.RECT.Y2
>STYAIFLWR CLIP.Cache+S.CB.Y2
* clc
* rts
*--------------------------------------
CLIP.Text clc
rts
CLIP.Text.9 sec
CLIP.Text.RTS rts
*--------------------------------------
* BitBlt :
*--------------------------------------
CLIP.BitBlt jsr CLIP.SetX2Y2
jsr CLIP.Rect.Overlap
bcs CLIP.Text.RTS
ldx #S.RECT select CLIP.Rect
CLIP.BitBltX lda CLIP.Screen+S.RECT.X1,x
sec
sbc CLIP.Cache+S.CB.X1
sta TmpW
lda CLIP.Screen+S.RECT.X1+1,x
sbc CLIP.Cache+S.CB.X1+1
sta TmpW+1
bvc .1
eor #$80
.1 bmi .2
ldy #S.CB.X1
jsr CLIP.AddTmpW2ClipCacheY
ldy #S.CB.SrcX
jsr CLIP.AddTmpW2ClipCacheY
ldy #S.CB.SrcW
jsr CLIP.SubTmpW2ClipCacheY
bcc CLIP.Text.9
*--------------------------------------
.2 lda CLIP.Cache+S.CB.X2
sec
sbc CLIP.Screen+S.RECT.X2,x
sta TmpW
lda CLIP.Cache+S.CB.X2+1
sbc CLIP.Screen+S.RECT.X2+1,x
sta TmpW+1
bvc .3
eor #$80
.3 bmi .4
ldy #S.CB.SrcW
jsr CLIP.SubTmpW2ClipCacheY
bcc .9
*--------------------------------------
.4 lda CLIP.Screen+S.RECT.Y1,x
sec
sbc CLIP.Cache+S.CB.Y1
sta TmpW
lda CLIP.Screen+S.RECT.Y1+1,x
sbc CLIP.Cache+S.CB.Y1+1
sta TmpW+1
bvc .5
eor #$80
.5 bmi .6
ldy #S.CB.Y1
jsr CLIP.AddTmpW2ClipCacheY
ldy #S.CB.SrcY
jsr CLIP.AddTmpW2ClipCacheY
ldy #S.CB.SrcH
jsr CLIP.SubTmpW2ClipCacheY
bcc .9
*--------------------------------------
.6 lda CLIP.Cache+S.CB.Y2
sec
sbc CLIP.Screen+S.RECT.Y2,x
sta TmpW
lda CLIP.Cache+S.CB.Y2+1
sbc CLIP.Screen+S.RECT.Y2+1,x
sta TmpW+1
bvc .7
eor #$80
.7 bmi .8
ldy #S.CB.SrcH
jsr CLIP.SubTmpW2ClipCacheY
bcc .9
.8 clc
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 CLIP.Cache+S.CB.X1
ldx CLIP.Cache+S.CB.X1+1
jsr CLIP.Line.EncodeX.AX
lda CLIP.Cache+S.CB.Y1
ldx CLIP.Cache+S.CB.Y1+1
jsr CLIP.Line.EncodeY.AX
sty CLIP.Line.P1
rts
*--------------------------------------
CLIP.Line.EncodeP2
ldy #0
lda CLIP.Cache+S.CB.X2
ldx CLIP.Cache+S.CB.X2+1
jsr CLIP.Line.EncodeX.AX
lda CLIP.Cache+S.CB.Y2
ldx CLIP.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.SetX2Y2 ldx CLIP.Cache+S.CB.SrcW+1
lda CLIP.Cache+S.CB.SrcW
bne .3
dex
.3 dec
clc
adc CLIP.Cache+S.CB.X1
sta CLIP.Cache+S.CB.X2
txa
adc CLIP.Cache+S.CB.X1+1
sta CLIP.Cache+S.CB.X2+1
ldx CLIP.Cache+S.CB.SrcH+1
lda CLIP.Cache+S.CB.SrcH
bne .4
dex
.4 dec
clc
adc CLIP.Cache+S.CB.Y1
sta CLIP.Cache+S.CB.Y2
txa
adc CLIP.Cache+S.CB.Y1+1
sta CLIP.Cache+S.CB.Y2+1
rts
*--------------------------------------
CLIP.Rect.Overlap
>LDYA CLIP.Cache+S.CB.X1
>SCMPYA CLIP.Rect+S.RECT.X2
bpl .9
>LDYA CLIP.Cache+S.CB.X2
>SCMPYA CLIP.Rect+S.RECT.X1
bmi .9
>LDYA CLIP.Cache+S.CB.Y1
>SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9
>LDYA CLIP.Cache+S.CB.Y2
>SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9
clc
rts
.9 sec
rts
*--------------------------------------
CLIP.AddTmpW2ClipCacheY
clc
lda CLIP.Cache,y
adc TmpW
sta CLIP.Cache,y
lda CLIP.Cache+1,y
adc TmpW+1
sta CLIP.Cache+1,y
rts
*--------------------------------------
CLIP.SubTmpW2ClipCacheY
sec
lda CLIP.Cache,y
sbc TmpW
sta CLIP.Cache,y
lda CLIP.Cache+1,y
sbc TmpW+1
sta CLIP.Cache+1,y
rts
*--------------------------------------
MAN
SAVE usr/src/lib/libgui.s.clip
LOAD usr/src/lib/libgui.s
ASM