A2osX/LIB/LIBGUI.S.CLIP.txt
2017-12-05 08:09:16 +01:00

313 lines
6.3 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.

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
*--------------------------------------
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
*--------------------------------------
CLIP.BitBlt.9 pla
CLIP.BitBlt.99 sec
rts
CLIP.BitBlt lda CB.Cache+S.CB.DestX
ldx CB.Cache+S.CB.DestX+1
pha
>SCMPAX GC.Cache+S.GC.X2
bpl CLIP.BitBlt.9 DestX after X2....exit
pla
>SCMPAX GC.Cache+S.GC.X1
bpl .1 DestX Inside X1-X2, go check if X1+W fit in
* 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
sbc CB.Cache+S.CB.DestX
sta D
lda GC.Cache+S.GC.X1+1
sbc CB.Cache+S.CB.DestX+1
sta D+1 ....always positive
lda CB.Cache+S.CB.SrcW S.CB.SrcW-=D
sec
sbc D
sta CB.Cache+S.CB.SrcW
iny
lda CB.Cache+S.CB.SrcW+1
sbc D
sta CB.Cache+S.CB.SrcW+1
bcc CLIP.BitBlt.99 Negative!!!! nothing to do,exit...
stz CB.Cache+S.CB.DestX Dext.X=0
stz CB.Cache+S.CB.DestX+1
lda CB.Cache+S.CB.X1 S.CB.X1+=D
clc
adc D
sta CB.Cache+S.CB.X1
lda CB.Cache+S.CB.X1+1
adc D+1
sta CB.Cache+S.CB.X1+1 S.CB.DestX=0, new between S.GC.X1 & S.GC.X2....
* S.CB.DestX between S.GC.X1 & S.GC.X2: D=S.GC.X2-S.CB.DestX
.1 lda GC.Cache+S.GC.X2
sec
sbc CB.Cache+S.CB.DestX
sta D
lda GC.Cache+S.GC.X2+1
sbc CB.Cache+S.CB.DestX+1
sta D+1 Always positive...
lda D
cmp CB.Cache+S.CB.SrcW
lda D+1
sbc CB.Cache+S.CB.SrcW+1
bcs CLIP.BitBlt.Y D >= SrcW....nothing to clip
lda D SrcW < D, make SrcW=D
sta CB.Cache+S.CB.SrcW
lda D+1
sta CB.Cache+S.CB.SrcW+1
CLIP.BitBlt.Y lda CB.Cache+S.CB.DestY
ldx CB.Cache+S.CB.DestY+1
pha
>SCMPAX GC.Cache+S.GC.Y2 DestY after Y2....exit
bmi .10
sec
rts
.10 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
lda GC.Cache+S.GC.Y1 Compute D....
sec
sbc CB.Cache+S.CB.DestY
sta D
lda GC.Cache+S.GC.Y1+1
sbc CB.Cache+S.CB.DestY+1
sta D+1 ....always positive
lda CB.Cache+S.CB.SrcH S.CB.SrcH-=D
sec
sbc D
sta CB.Cache+S.CB.SrcH
iny
lda CB.Cache+S.CB.SrcH+1
sbc D
sta CB.Cache+S.CB.SrcH+1
bcc .99 Negative!!!! nothing to do,exit...
stz CB.Cache+S.CB.DestY Dext.X=0
stz CB.Cache+S.CB.DestY+1
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.DestY=0, new between S.GC.Y1 & S.GC.Y2....
* S.CB.DestY between S.GC.Y1 & S.GC.Y2: D=S.GC.Y2-S.CB.DestY
.1 lda GC.Cache+S.GC.Y2
sec
sbc CB.Cache+S.CB.DestY
sta D
lda GC.Cache+S.GC.Y2+1
sbc CB.Cache+S.CB.DestY+1
sta D+1 Always positive...
lda D
cmp CB.Cache+S.CB.SrcH
lda D+1
sbc CB.Cache+S.CB.SrcH+1
bcs .8 D >= SrcH....nothing to clip
lda D SrcH < D, make SrcH=D
sta CB.Cache+S.CB.SrcH
lda D+1
sta CB.Cache+S.CB.SrcH+1
.8 clc
rts
.9 pla
.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