LIBGUI:Clipping stuff

This commit is contained in:
burniouf 2022-11-03 07:59:03 +01:00
parent 116664cbee
commit c481b84d0b
6 changed files with 96 additions and 93 deletions

Binary file not shown.

View File

@ -88,7 +88,9 @@ CB.Cache2CBBuf
rts rts
*-------------------------------------- *--------------------------------------
CB.FlushBufToYA jsr CLIP.GetInCache * Y,A = Target Object
*--------------------------------------
CB.FlushBufToYA jsr CLIP.GetRect
lda hCBBuf lda hCBBuf
beq .8 beq .8

View File

@ -3,14 +3,12 @@ NEW
*-------------------------------------- *--------------------------------------
* CLIPPING Functions: * CLIPPING Functions:
* In: * In:
* Graphic Context in CLIP.Cache * Target Clipping Region in CLIP.Rect
* YA = Control Block * YA = Control Block
* Out: * Out:
* CC : CB.Cache clipped & visible * CC : CB.Cache clipped & visible
* CS : CB.Cache invisible * CS : CB.Cache invisible
*-------------------------------------- *--------------------------------------
CLIP.YA jsr CB.GetInCache
CLIP.CB.Cache lda CB.Cache+S.CB.CMD CLIP.CB.Cache lda CB.Cache+S.CB.CMD
and #$7F remove S.CB.CMD.OSD and #$7F remove S.CB.CMD.OSD
tax tax
@ -21,17 +19,17 @@ CLIP.Point
rts rts
*-------------------------------------- *--------------------------------------
CLIP.HLine >LDYA CB.Cache+S.CB.Y1 CLIP.HLine >LDYA CB.Cache+S.CB.Y1
>SCMPYA CLIP.Cache+S.OBJ.Y2 >SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9 bpl .9
>LDYA CB.Cache+S.CB.Y1 >LDYA CB.Cache+S.CB.Y1
>SCMPYA CLIP.Cache+S.OBJ.Y1 >SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9 bmi .9
>LDYA CLIP.Cache+S.OBJ.X1 >LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CB.Cache+S.CB.X1 >STYAIFGTR CB.Cache+S.CB.X1
>LDYA CLIP.Cache+S.OBJ.X2 >LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CB.Cache+S.CB.X2 >STYAIFLWR CB.Cache+S.CB.X2
clc clc
@ -41,17 +39,17 @@ CLIP.HLine >LDYA CB.Cache+S.CB.Y1
rts rts
*-------------------------------------- *--------------------------------------
CLIP.VLine >LDYA CB.Cache+S.CB.X1 CLIP.VLine >LDYA CB.Cache+S.CB.X1
>SCMPYA CLIP.Cache+S.OBJ.X2 >SCMPYA CLIP.Rect+S.RECT.X2
bpl .9 bpl .9
>LDYA CB.Cache+S.CB.X1 >LDYA CB.Cache+S.CB.X1
>SCMPYA CLIP.Cache+S.OBJ.X1 >SCMPYA CLIP.Rect+S.RECT.X1
bmi .9 bmi .9
>LDYA CLIP.Cache+S.OBJ.Y1 >LDYA CLIP.Rect+S.RECT.Y1
>STYAIFGTR CB.Cache+S.CB.Y1 >STYAIFGTR CB.Cache+S.CB.Y1
>LDYA CLIP.Cache+S.OBJ.Y2 >LDYA CLIP.Rect+S.RECT.Y2
>STYAIFLWR CB.Cache+S.CB.Y2 >STYAIFLWR CB.Cache+S.CB.Y2
clc clc
@ -60,19 +58,19 @@ CLIP.VLine >LDYA CB.Cache+S.CB.X1
.9 sec .9 sec
rts rts
*-------------------------------------- *--------------------------------------
CLIP.Rect jsr CLIP.Cache.Overlap CLIP.Rectangle jsr CLIP.Rect.Overlap
bcs .9 bcs .9
>LDYA CLIP.Cache+S.OBJ.X1 >LDYA CLIP.Rect+S.RECT.X1
>STYAIFGTR CB.Cache+S.CB.X1 >STYAIFGTR CB.Cache+S.CB.X1
>LDYA CLIP.Cache+S.OBJ.X2 >LDYA CLIP.Rect+S.RECT.X2
>STYAIFLWR CB.Cache+S.CB.X2 >STYAIFLWR CB.Cache+S.CB.X2
>LDYA CLIP.Cache+S.OBJ.Y1 >LDYA CLIP.Rect+S.RECT.Y1
>STYAIFGTR CB.Cache+S.CB.Y1 >STYAIFGTR CB.Cache+S.CB.Y1
>LDYA CLIP.Cache+S.OBJ.Y2 >LDYA CLIP.Rect+S.RECT.Y2
>STYAIFLWR CB.Cache+S.CB.Y2 >STYAIFLWR CB.Cache+S.CB.Y2
clc clc
@ -89,15 +87,15 @@ CLIP.Text.RTS rts
*-------------------------------------- *--------------------------------------
CLIP.BitBlt jsr CB.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1 CLIP.BitBlt jsr CB.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
jsr CLIP.Cache.Overlap jsr CLIP.Rect.Overlap
bcs CLIP.Text.RTS bcs CLIP.Text.RTS
lda CLIP.Cache+S.OBJ.X1 lda CLIP.Rect+S.RECT.X1
sec sec
sbc CB.Cache+S.CB.X1 sbc CB.Cache+S.CB.X1
sta DX sta DX
lda CLIP.Cache+S.OBJ.X1+1 lda CLIP.Rect+S.RECT.X1+1
sbc CB.Cache+S.CB.X1+1 sbc CB.Cache+S.CB.X1+1
sta DX+1 sta DX+1
bvc .1 bvc .1
@ -134,11 +132,11 @@ CLIP.BitBlt jsr CB.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
.2 lda CB.Cache+S.CB.X2 .2 lda CB.Cache+S.CB.X2
sec sec
sbc CLIP.Cache+S.OBJ.X2 sbc CLIP.Rect+S.RECT.X2
sta DX sta DX
lda CB.Cache+S.CB.X2+1 lda CB.Cache+S.CB.X2+1
sbc CLIP.Cache+S.OBJ.X2+1 sbc CLIP.Rect+S.RECT.X2+1
sta DX+1 sta DX+1
bvc .3 bvc .3
eor #$80 eor #$80
@ -154,12 +152,12 @@ CLIP.BitBlt jsr CB.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
sta CB.Cache+S.CB.SrcW+1 sta CB.Cache+S.CB.SrcW+1
bcc .9 bcc .9
.4 lda CLIP.Cache+S.OBJ.Y1 .4 lda CLIP.Rect+S.RECT.Y1
sec sec
sbc CB.Cache+S.CB.Y1 sbc CB.Cache+S.CB.Y1
sta DX sta DX
lda CLIP.Cache+S.OBJ.Y1+1 lda CLIP.Rect+S.RECT.Y1+1
sbc CB.Cache+S.CB.Y1+1 sbc CB.Cache+S.CB.Y1+1
sta DX+1 sta DX+1
bvc .5 bvc .5
@ -196,11 +194,11 @@ CLIP.BitBlt jsr CB.SetX2Y2 set X2=X1+W-1 Y2=X1+H-1
.6 lda CB.Cache+S.CB.Y2 .6 lda CB.Cache+S.CB.Y2
sec sec
sbc CLIP.Cache+S.OBJ.Y2 sbc CLIP.Rect+S.RECT.Y2
sta DX sta DX
lda CB.Cache+S.CB.Y2+1 lda CB.Cache+S.CB.Y2+1
sbc CLIP.Cache+S.OBJ.Y2+1 sbc CLIP.Rect+S.RECT.Y2+1
sta DX+1 sta DX+1
bvc .7 bvc .7
eor #$80 eor #$80
@ -228,7 +226,6 @@ CLIP.Line.BOTTOM .EQ 4
CLIP.Line.TOP .EQ 8 CLIP.Line.TOP .EQ 8
*-------------------------------------- *--------------------------------------
CLIP.Line jsr CLIP.Line.EncodeP1 CLIP.Line jsr CLIP.Line.EncodeP1
>DEBUG
jsr CLIP.Line.EncodeP2 jsr CLIP.Line.EncodeP2
.1 lda CLIP.Line.P1 .1 lda CLIP.Line.P1
@ -339,7 +336,7 @@ CLIP.Line.EncodeP2
*-------------------------------------- *--------------------------------------
CLIP.Line.EncodeX.AX CLIP.Line.EncodeX.AX
pha pha
>SCMPAX CLIP.Cache+S.OBJ.X1 >SCMPAX CLIP.Rect+S.RECT.X1
bpl .1 bpl .1
pla pla
@ -351,7 +348,7 @@ CLIP.Line.EncodeX.AX
rts rts
.1 pla .1 pla
>SCMPAX CLIP.Cache+S.OBJ.X2 >SCMPAX CLIP.Rect+S.RECT.X2
bmi .8 bmi .8
tya tya
@ -362,7 +359,7 @@ CLIP.Line.EncodeX.AX
*-------------------------------------- *--------------------------------------
CLIP.Line.EncodeY.AX CLIP.Line.EncodeY.AX
pha pha
>SCMPAX CLIP.Cache+S.OBJ.Y1 >SCMPAX CLIP.Rect+S.RECT.Y1
bpl .1 bpl .1
pla pla
@ -373,7 +370,7 @@ CLIP.Line.EncodeY.AX
rts rts
.1 pla .1 pla
>SCMPAX CLIP.Cache+S.OBJ.Y2 >SCMPAX CLIP.Rect+S.RECT.Y2
bmi .8 bmi .8
tya tya
@ -382,21 +379,21 @@ CLIP.Line.EncodeY.AX
.8 rts .8 rts
*-------------------------------------- *--------------------------------------
CLIP.Cache.Overlap CLIP.Rect.Overlap
>LDYA CB.Cache+S.CB.X1 >LDYA CB.Cache+S.CB.X1
>SCMPYA CLIP.Cache+S.OBJ.X2 >SCMPYA CLIP.Rect+S.RECT.X2
bpl .9 bpl .9
>LDYA CB.Cache+S.CB.X2 >LDYA CB.Cache+S.CB.X2
>SCMPYA CLIP.Cache+S.OBJ.X1 >SCMPYA CLIP.Rect+S.RECT.X1
bmi .9 bmi .9
>LDYA CB.Cache+S.CB.Y1 >LDYA CB.Cache+S.CB.Y1
>SCMPYA CLIP.Cache+S.OBJ.Y2 >SCMPYA CLIP.Rect+S.RECT.Y2
bpl .9 bpl .9
>LDYA CB.Cache+S.CB.Y2 >LDYA CB.Cache+S.CB.Y2
>SCMPYA CLIP.Cache+S.OBJ.Y1 >SCMPYA CLIP.Rect+S.RECT.Y1
bmi .9 bmi .9
clc clc
@ -405,12 +402,14 @@ CLIP.Cache.Overlap
.9 sec .9 sec
rts rts
*-------------------------------------- *--------------------------------------
CLIP.GetInCache >STYA .1+1 CLIP.GetRect >STYA .1+1
ldx #S.OBJ-1 ldy #S.OBJ.Y2+1
ldx #7
.1 lda $ffff,x SELF MODIFIED .1 lda $ffff,y
sta CLIP.Cache,x sta CLIP.Rect,x
dey
dex dex
bpl .1 bpl .1

View File

@ -50,11 +50,11 @@ DRAW.Line jsr DRAW.PullY2X2Y1X1
lda #S.CB.CMD.HLINE DY=0 : HLINE X1,X2 At Y1 lda #S.CB.CMD.HLINE DY=0 : HLINE X1,X2 At Y1
.20 sta CB.Cache+S.CB.CMD .20 sta CB.Cache+S.CB.CMD
* >DEBUG
jsr CLIP.CB.Cache jsr CLIP.CB.Cache
bcs .8 bcs .8
jmp CB.GFXWrite jsr CB.GFXWrite
.8 clc .8 clc
rts rts
@ -63,7 +63,7 @@ DRAW.Line jsr DRAW.PullY2X2Y1X1
lda #$ff lda #$ff
sta IY set IY=-1 sta IY set IY=-1
.4 .4
* jsr CLIP.Line * jsr CLIP.Line
* bcs .8 * bcs .8
@ -309,6 +309,38 @@ DRAW.BitMap lda #S.CB.CMD.BITBLT
.8 clc .8 clc
rts rts
*-------------------------------------- *--------------------------------------
* drawtext (short int hWND, short int OP, short int hFONT, int X1, int Y1, char *str)
*--------------------------------------
DRAW.Text lda #S.CB.CMD.DRAWTEXT2
jsr CB.InitCacheA
>PULLW CB.Cache+S.CB.TxtPtr
jsr DRAW.PullY1X1
>PULLB CB.Cache+S.CB.hFont
>PULLB CB.Cache+S.CB.OP
jsr DRAW.PullInnerWND
jsr CLIP.CB.Cache
bcs .8
jmp CB.GFXWrite
.8 clc
rts
*--------------------------------------
DRAW.PullInnerWND
jsr OBJ.PullHWND get dest window at ZPWNDPtr
jsr DRAW.GetInnerWND get inners in CLIP.Rect
>LDYA ZPWNDPtr
jmp CB.ToGlobal set CB.Cache to global coord.
*--------------------------------------
* private
*--------------------------------------
DRAW.xBM >LDYA L.BMs,x DRAW.xBM >LDYA L.BMs,x
DRAW.yaBM >STYA ZPBMPtr DRAW.yaBM >STYA ZPBMPtr
@ -339,28 +371,6 @@ DRAW.BM lda #S.CB.CMD.BITBLT
jmp CB.Cache2CBBuf jmp CB.Cache2CBBuf
*-------------------------------------- *--------------------------------------
* drawtext (short int hWND, short int OP, short int hFONT, int X1, int Y1, char *str)
*--------------------------------------
DRAW.Text lda #S.CB.CMD.DRAWTEXT2
jsr CB.InitCacheA
>PULLW CB.Cache+S.CB.TxtPtr
jsr DRAW.PullY1X1
>PULLB CB.Cache+S.CB.hFont
>PULLB CB.Cache+S.CB.OP
jsr DRAW.PullInnerWND
jsr CLIP.CB.Cache
bcs .8
jmp CB.GFXWrite
.8 clc
rts
*--------------------------------------
DRAW.YAText >STYA CB.Cache+S.CB.TxtPtr DRAW.YAText >STYA CB.Cache+S.CB.TxtPtr
stx CB.Cache+S.CB.hFont stx CB.Cache+S.CB.hFont
@ -396,48 +406,38 @@ DRAW.PullX >PULLA
rts rts
*-------------------------------------- *--------------------------------------
DRAW.PullInnerWND
jsr OBJ.PullHWND get dest window at ZPWNDPtr
jsr DRAW.GetInnerWND get inners in CLIP.Cache
>LDYA ZPWNDPtr
jmp CB.ToGlobal set CB.Cache to global coord.
*--------------------------------------
DRAW.GetInnerWND DRAW.GetInnerWND
ldy #S.OBJ.X1 ldy #S.OBJ.X1
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.X1 sta CLIP.Rect+S.RECT.X1
iny iny
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.X1+1 sta CLIP.Rect+S.RECT.X1+1
ldy #S.WND.InnerY1 ldy #S.WND.InnerY1
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.Y1 sta CLIP.Rect+S.RECT.Y1
iny iny
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.Y1+1 sta CLIP.Rect+S.RECT.Y1+1
ldy #S.WND.InnerW ldy #S.WND.InnerX2
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.W sta CLIP.Rect+S.RECT.X2
iny iny
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.W+1 sta CLIP.Rect+S.RECT.X2+1
ldy #S.WND.InnerH ldy #S.WND.InnerY2
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.H sta CLIP.Rect+S.RECT.Y2
iny iny
lda (ZPWNDPtr),y lda (ZPWNDPtr),y
sta CLIP.Cache+S.OBJ.H+1 sta CLIP.Rect+S.RECT.Y2+1
rts
>LDYA L.CLIP.Cache
jmp OBJ.SetX2Y2 set X2 = X1 + W - 1...
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE usr/src/lib/libgui.s.draw SAVE usr/src/lib/libgui.s.draw

View File

@ -156,12 +156,14 @@ PTR.Show.I ldx PTR.T
lda #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.SAVE lda #S.CB.OP.ORA+S.CB.OP.MASK+S.CB.OP.SAVE
PTR.Draw.I sta CB.PTR+S.CB.OP PTR.Draw.I sta CB.PTR+S.CB.OP
>LDYA L.WND.Screen >LDYA L.WND.Screen
jsr CLIP.GetInCache jsr CLIP.GetRect
>LDYA L.CB.PTR >LDYA L.CB.PTR
jsr CLIP.YA jsr CB.GetInCache
jsr CLIP.CB.Cache
bcs .8 bcs .8
jsr CB.GFXWrite jsr CB.GFXWrite

View File

@ -152,8 +152,8 @@ L.MouseClamp .DA MouseClamp
L.MSG .DA MSG L.MSG .DA MSG
L.MSG.XY .DA MSG+S.MSG.X1 L.MSG.XY .DA MSG+S.MSG.X1
L.CB.PTR .DA CB.PTR L.CB.PTR .DA CB.PTR
L.CLIP.Rect .DA CLIP.Rect
L.CB.Cache .DA CB.Cache L.CB.Cache .DA CB.Cache
L.CLIP.Cache .DA CLIP.Cache
L.WND.Screen .DA WND.Screen L.WND.Screen .DA WND.Screen
L.WND.Desktop .DA WND.Desktop L.WND.Desktop .DA WND.Desktop
L.WND.SysBar .DA WND.SysBar L.WND.SysBar .DA WND.SysBar
@ -198,9 +198,9 @@ J.Clip .DA CLIP.Point SETPIXEL
.DA CLIP.Point GETPIXEL .DA CLIP.Point GETPIXEL
.DA CLIP.HLine HLINE .DA CLIP.HLine HLINE
.DA CLIP.VLine VLINE .DA CLIP.VLine VLINE
.DA CLIP.Rect FILLRECT .DA CLIP.Rectangle FILLRECT
.DA CLIP.BitBlt BITBLT .DA CLIP.BitBlt BITBLT
.DA CLIP.Rect GETRECTBUFSIZE .DA CLIP.Rectangle GETRECTBUFSIZE
.DA CLIP.Text DRAWTEXT .DA CLIP.Text DRAWTEXT
.DA CLIP.Text GETTEXTSIZE .DA CLIP.Text GETTEXTSIZE
.DA CLIP.Line DRAWLINE .DA CLIP.Line DRAWLINE
@ -345,8 +345,8 @@ CB.PTR .DA #S.CB.CMD.BITBLT
.DA #0 .DA #0
.BS S.CB-4 .BS S.CB-4
*-------------------------------------- *--------------------------------------
CLIP.Rect .BS S.RECT
CB.Cache .BS S.CB CB.Cache .BS S.CB
CLIP.Cache .BS S.OBJ
*-------------------------------------- *--------------------------------------
MENU.Stack.Owner .BS 1 MENU.Stack.Owner .BS 1
MENU.Stack.Idx .BS 1 MENU.Stack.Idx .BS 1