A2osX/LIB/LIBGUI.S.CLIP.txt

319 lines
6.4 KiB
Plaintext
Raw Normal View History

NEW
PREFIX /A2OSX.BUILD
AUTO 4,1
.LIST OFF
*--------------------------------------
* CLIPPING Functions:
* In:
* Graphic Context in GC.Cache
* YA = Control Block
* Out:
* CC : CB.Cache clipped & visible
* CS : CB.Cache invisible
*--------------------------------------
2017-12-04 16:42:08 +00:00
CLIP.YA jsr CB.Get
ldx CB.Cache+S.CB.CMD
CLIP.X jmp (J.CLIP,x)
*--------------------------------------
CLIP.Point
CLIP.HLine
CLIP.VLine
CLIP.Rect
CLIP.Text
clc
rts
*--------------------------------------
2017-12-04 07:18:24 +00:00
CLIP.BitBlt.9 pla
CLIP.BitBlt.99 sec
rts
CLIP.BitBlt lda CB.Cache+S.CB.DstX
ldx CB.Cache+S.CB.DstX+1
pha
2017-12-04 16:42:08 +00:00
>SCMPAX GC.Cache+S.GC.X2
bpl CLIP.BitBlt.9 DestX after X2....exit
pla
2017-12-04 16:42:08 +00:00
>SCMPAX GC.Cache+S.GC.X1
bpl .1 DestX Inside X1-X2, go check if X1+W fit in
2017-12-06 07:28:30 +00:00
* S.CB.DstX before S.GC.X1: D=S.GC.X1-S.CB.DstX, S.CB.SrcW-=D, S.CB.DstX=+=D, S.CB.X1+=D
2017-12-04 07:18:24 +00:00
lda GC.Cache+S.GC.X1 Compute D....
sec
sbc CB.Cache+S.CB.DstX
2017-12-04 07:18:24 +00:00
sta D
lda GC.Cache+S.GC.X1+1
sbc CB.Cache+S.CB.DstX+1
2017-12-04 07:18:24 +00:00
sta D+1 ....always positive
2017-12-04 16:42:08 +00:00
lda CB.Cache+S.CB.SrcW S.CB.SrcW-=D
2017-12-04 07:18:24 +00:00
sec
sbc D
2017-12-04 16:42:08 +00:00
sta CB.Cache+S.CB.SrcW
lda CB.Cache+S.CB.SrcW+1
sbc D+1
2017-12-04 16:42:08 +00:00
sta CB.Cache+S.CB.SrcW+1
2017-12-04 07:18:24 +00:00
bcc CLIP.BitBlt.99 Negative!!!! nothing to do,exit...
lda CB.Cache+S.CB.DstX S.CB.DstX+=D
clc
adc D
sta CB.Cache+S.CB.DstX
lda CB.Cache+S.CB.DstX+1
adc D+1
sta CB.Cache+S.CB.DstX+1
2017-12-04 16:42:08 +00:00
lda CB.Cache+S.CB.X1 S.CB.X1+=D
2017-12-04 07:18:24 +00:00
clc
adc D
2017-12-04 16:42:08 +00:00
sta CB.Cache+S.CB.X1
lda CB.Cache+S.CB.X1+1
2017-12-04 07:18:24 +00:00
adc D+1
sta CB.Cache+S.CB.X1+1 S.CB.DstX=0, new between S.GC.X1 & S.GC.X2....
2017-12-04 07:18:24 +00:00
* S.CB.DstX between S.GC.X1 & S.GC.X2: D=(S.GC.X2+1)-S.CB.DstX
2017-12-04 16:42:08 +00:00
.1 lda GC.Cache+S.GC.X2 Compute D in X,Y
2017-12-04 07:18:24 +00:00
sec
sbc CB.Cache+S.CB.DstX
tax
2017-12-04 16:42:08 +00:00
lda GC.Cache+S.GC.X2+1
sbc CB.Cache+S.CB.DstX+1
2017-12-04 07:18:24 +00:00
inx
bne .2
inc
.2 tay
cpx CB.Cache+S.CB.SrcW
2017-12-04 16:42:08 +00:00
sbc CB.Cache+S.CB.SrcW+1
2017-12-04 07:18:24 +00:00
bcs CLIP.BitBlt.Y D >= SrcW....nothing to clip
stx CB.Cache+S.CB.SrcW SrcW < D, make SrcW=D
sty CB.Cache+S.CB.SrcW+1
2017-12-04 07:18:24 +00:00
CLIP.BitBlt.Y lda CB.Cache+S.CB.DstY
ldx CB.Cache+S.CB.DstY+1
2017-12-04 07:18:24 +00:00
pha
>SCMPAX GC.Cache+S.GC.Y2 DestY after Y2....exit
2017-12-05 07:09:16 +00:00
bmi .10
2017-12-06 07:28:30 +00:00
pla
2017-12-05 07:09:16 +00:00
sec
rts
2017-12-05 07:09:16 +00:00
.10 pla
2017-12-04 16:42:08 +00:00
>SCMPAX GC.Cache+S.GC.Y1
bpl .1 DestY Inside Y1-Y2, go check if Y1+H fit in
* S.CB.DstY above S.GC.Y1: D=S.GC.Y1-S.CB.DstY, S.CB.SrcH-=D, S.CB.DstY=0, S.CB.Y1+=D
2017-12-05 07:09:16 +00:00
lda GC.Cache+S.GC.Y1 Compute D....
sec
sbc CB.Cache+S.CB.DstY
2017-12-05 07:09:16 +00:00
sta D
lda GC.Cache+S.GC.Y1+1
sbc CB.Cache+S.CB.DstY+1
2017-12-05 07:09:16 +00:00
sta D+1 ....always positive
lda CB.Cache+S.CB.SrcH S.CB.SrcH-=D
sec
sbc D
sta CB.Cache+S.CB.SrcH
lda CB.Cache+S.CB.SrcH+1
sbc D+1
2017-12-05 07:09:16 +00:00
sta CB.Cache+S.CB.SrcH+1
bcc .99 Negative!!!! nothing to do,exit...
lda CB.Cache+S.CB.DstY Dst.Y+=D
clc
adc D
sta CB.Cache+S.CB.DstY
lda CB.Cache+S.CB.DstY+1
adc D+1
sta CB.Cache+S.CB.DstY+1
2017-12-05 07:09:16 +00:00
lda CB.Cache+S.CB.Y1 S.CB.Y1+=D
clc
adc D
sta CB.Cache+S.CB.Y1
lda CB.Cache+S.CB.Y1+1
adc D+1
sta CB.Cache+S.CB.Y1+1 S.CB.DstY=0, new between S.GC.Y1 & S.GC.Y2....
2017-12-05 07:09:16 +00:00
* S.CB.DstY between S.GC.Y1 & S.GC.Y2: D=(S.GC.Y2+1)-S.CB.DstY
2017-12-04 16:42:08 +00:00
.1 lda GC.Cache+S.GC.Y2 Compute D in X,Y
2017-12-05 07:09:16 +00:00
sec
sbc CB.Cache+S.CB.DstY
tax
2017-12-05 07:09:16 +00:00
lda GC.Cache+S.GC.Y2+1
sbc CB.Cache+S.CB.DstY+1
inx
bne .2
inc
.2 tay
2017-12-05 07:09:16 +00:00
cpx CB.Cache+S.CB.SrcH
2017-12-05 07:09:16 +00:00
sbc CB.Cache+S.CB.SrcH+1
bcs .8 D >= SrcH....nothing to clip
stx CB.Cache+S.CB.SrcH SrcH < D, make SrcH=D
sty CB.Cache+S.CB.SrcH+1
2017-12-05 07:09:16 +00:00
.8 clc
rts
.9 pla
2017-12-04 07:18:24 +00:00
.99 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
tay
lda CB.Cache+S.CB.Y1
ldx CB.Cache+S.CB.Y1+1
jsr CLIP.Line.EncodeY.AX
sta 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
tay
lda CB.Cache+S.CB.Y2
ldx CB.Cache+S.CB.Y2+1
jsr CLIP.Line.EncodeY.AX
sta CLIP.Line.P2
rts
*--------------------------------------
CLIP.Line.EncodeX.AX
pha
>SCMPAX GC.Cache+S.GC.X1
bmi .1
tya
ora #CLIP.Line.LEFT
plx
rts
.1 pla
>SCMPAX GC.Cache+S.GC.X1
bpl .8
tya
ora #CLIP.Line.RIGHT
.8 rts
*--------------------------------------
CLIP.Line.EncodeY.AX
pha
>SCMPAX GC.Cache+S.GC.Y1
bmi .1
tya
ora #CLIP.Line.TOP
plx
rts
.1 pla
>SCMPAX GC.Cache+S.GC.Y1
bpl .8
tya
ora #CLIP.Line.BOTTOM
.8 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/LIB/LIBGUI.S.CLIP
LOAD /A2OSX.SRC/LIB/LIBGUI.S
ASM