A2osX/LIB/LIBGUI.S.CLIP.txt

266 lines
5.2 KiB
Plaintext
Raw Normal View History

PR#3
PREFIX /A2OSX.BUILD
NEW
INC 1
AUTO 6
.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
jmp (J.CLIP,x)
*--------------------------------------
CLIP.Point
CLIP.HLine
CLIP.VLine
CLIP.Rect
clc
rts
*--------------------------------------
2017-12-04 07:18:24 +00:00
CLIP.BitBlt.9 pla
CLIP.BitBlt.99 sec
rts
CLIP.BitBlt clc
rts
2017-12-04 16:42:08 +00:00
lda CB.Cache+S.CB.DestX
ldx CB.Cache+S.CB.DestX+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-04 07:18:24 +00:00
* S.CB.DestX before S.GC.X1: D=S.GC.X1-S.CB.DestX, S.CB.SrcW-=D, S.CB.DestX=0, S.CB.X1+=D
lda GC.Cache+S.GC.X1 Compute D....
sec
2017-12-04 16:42:08 +00:00
sbc CB.Cache+S.CB.DestX
2017-12-04 07:18:24 +00:00
sta D
lda GC.Cache+S.GC.X1+1
2017-12-04 16:42:08 +00:00
sbc CB.Cache+S.CB.DestX+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
2017-12-04 07:18:24 +00:00
iny
2017-12-04 16:42:08 +00:00
lda CB.Cache+S.CB.SrcW+1
2017-12-04 07:18:24 +00:00
sbc D
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...
2017-12-04 16:42:08 +00:00
stz CB.Cache+S.CB.DestX Dext.X=0
stz CB.Cache+S.CB.DestX+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
2017-12-04 16:42:08 +00:00
sta CB.Cache+S.CB.X1+1 S.CB.DestX=0, new between S.GC.X1 & S.GC.X2....
2017-12-04 07:18:24 +00:00
* S.CB.DestX between S.GC.X1 & S.GC.X2: D=S.GC.X2-S.CB.DestX
2017-12-04 16:42:08 +00:00
2017-12-04 07:18:24 +00:00
.1 lda GC.Cache+S.GC.X2
sec
2017-12-04 16:42:08 +00:00
sbc CB.Cache+S.CB.DestX
2017-12-04 07:18:24 +00:00
sta D
2017-12-04 16:42:08 +00:00
lda GC.Cache+S.GC.X2+1
sbc CB.Cache+S.CB.DestX+1
2017-12-04 07:18:24 +00:00
sta D+1 Always positive...
lda D
2017-12-04 16:42:08 +00:00
cmp CB.Cache+S.CB.SrcW
2017-12-04 07:18:24 +00:00
lda D+1
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
2017-12-04 16:42:08 +00:00
lda D SrcW < D, make SrcW=D
sta CB.Cache+S.CB.SrcW
lda D+1
sta CB.Cache+S.CB.SrcW+1
2017-12-04 07:18:24 +00:00
2017-12-04 16:42:08 +00:00
CLIP.BitBlt.Y lda CB.Cache+S.CB.DestY
ldx CB.Cache+S.CB.DestY+1
2017-12-04 07:18:24 +00:00
pha
2017-12-04 07:18:24 +00:00
>SCMPAX GC.Cache+S.GC.Y2 DestY after Y2....exit
2017-12-04 16:42:08 +00:00
bpl .9
2017-12-04 16:42:08 +00:00
pla
>SCMPAX GC.Cache+S.GC.Y1
bpl .1 DestY Inside Y1-Y2, go check if Y1+H fit in
* S.CB.DestY above S.GC.Y1: D=S.GC.Y1-S.CB.DestY, S.CB.SrcH-=D, S.CB.DestY=0, S.CB.Y1+=D
* S.CB.DestY between S.GC.Y1 & S.GC.Y2: D=S.GC.Y2-S.CB.DestY
.1
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