mirror of
https://github.com/irmen/prog8.git
synced 2025-01-12 04:30:03 +00:00
Merge branch 'monogfx_fill_optimization'
This commit is contained in:
commit
01a38a0b11
@ -819,31 +819,14 @@ invert:
|
|||||||
while cx16.r12L!=0 {
|
while cx16.r12L!=0 {
|
||||||
pop_stack()
|
pop_stack()
|
||||||
xx = x1
|
xx = x1
|
||||||
while xx >= 0 {
|
if fill_scanline_left() goto skip
|
||||||
if pget(xx as uword, yy as uword) as ubyte != cx16.r11L
|
|
||||||
break
|
|
||||||
xx--
|
|
||||||
}
|
|
||||||
if x1!=xx
|
|
||||||
horizontal_line(xx as uword+1, yy as uword, x1-xx as uword, cx16.r10L as bool)
|
|
||||||
else
|
|
||||||
goto skip
|
|
||||||
|
|
||||||
left = xx + 1
|
left = xx + 1
|
||||||
if left < x1
|
if left < x1
|
||||||
push_stack(left, x1 - 1, yy, -dy)
|
push_stack(left, x1 - 1, yy, -dy)
|
||||||
xx = x1 + 1
|
xx = x1 + 1
|
||||||
|
|
||||||
do {
|
do {
|
||||||
cx16.r9s = xx
|
fill_scanline_right()
|
||||||
while xx <= width-1 {
|
|
||||||
if pget(xx as uword, yy as uword) as ubyte != cx16.r11L
|
|
||||||
break
|
|
||||||
xx++
|
|
||||||
}
|
|
||||||
if cx16.r9s!=xx
|
|
||||||
horizontal_line(cx16.r9, yy as uword, xx-cx16.r9s as uword, cx16.r10L as bool)
|
|
||||||
|
|
||||||
push_stack(left, xx - 1, yy, dy)
|
push_stack(left, xx - 1, yy, dy)
|
||||||
if xx > x2 + 1
|
if xx > x2 + 1
|
||||||
push_stack(x2 + 1, xx - 1, yy, -dy)
|
push_stack(x2 + 1, xx - 1, yy, -dy)
|
||||||
@ -857,6 +840,70 @@ skip:
|
|||||||
left = xx
|
left = xx
|
||||||
} until xx>x2
|
} until xx>x2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub fill_scanline_left() -> bool {
|
||||||
|
; TODO maybe this could use vera auto decrement, but that would require some clever masking calculations
|
||||||
|
cx16.r9s = xx
|
||||||
|
while xx >= 0 {
|
||||||
|
if pgetset()
|
||||||
|
break
|
||||||
|
xx--
|
||||||
|
}
|
||||||
|
return xx==cx16.r9s
|
||||||
|
}
|
||||||
|
|
||||||
|
sub fill_scanline_right() {
|
||||||
|
; TODO maybe this could use vera auto increment, but that would require some clever masking calculations
|
||||||
|
cx16.r9s = xx
|
||||||
|
while xx <= width-1 {
|
||||||
|
if pgetset()
|
||||||
|
break
|
||||||
|
xx++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub pgetset() -> bool {
|
||||||
|
; test and optionally set a pixel
|
||||||
|
word @zp xpos = xx
|
||||||
|
%asm {{
|
||||||
|
lda p8v_xpos
|
||||||
|
and #7
|
||||||
|
pha ; xbits
|
||||||
|
}}
|
||||||
|
xpos /= 8
|
||||||
|
if width==320
|
||||||
|
xpos += yy*(320/8) as uword
|
||||||
|
else
|
||||||
|
xpos += yy*(640/8) as uword
|
||||||
|
|
||||||
|
%asm {{
|
||||||
|
stz cx16.VERA_CTRL
|
||||||
|
stz cx16.VERA_ADDR_H
|
||||||
|
lda p8v_xpos+1
|
||||||
|
sta cx16.VERA_ADDR_M
|
||||||
|
lda p8v_xpos
|
||||||
|
sta cx16.VERA_ADDR_L
|
||||||
|
ply ; xbits
|
||||||
|
lda p8s_plot.p8v_maskbits,y
|
||||||
|
and cx16.VERA_DATA0
|
||||||
|
beq +
|
||||||
|
lda #1
|
||||||
|
+
|
||||||
|
; cx16.r11L = seed color to check against
|
||||||
|
eor cx16.r11L
|
||||||
|
beq +
|
||||||
|
rts
|
||||||
|
+ ; cx16.r10L = new color to set
|
||||||
|
lda p8s_plot.p8v_maskbits,y
|
||||||
|
ldx cx16.r10L
|
||||||
|
beq +
|
||||||
|
tsb cx16.VERA_DATA0
|
||||||
|
bra ++
|
||||||
|
+ trb cx16.VERA_DATA0
|
||||||
|
+ lda #0
|
||||||
|
rts
|
||||||
|
}}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub position(uword @zp xx, uword yy) {
|
sub position(uword @zp xx, uword yy) {
|
||||||
|
@ -1,25 +1,42 @@
|
|||||||
%option no_sysinit, enable_floats
|
%import monogfx
|
||||||
|
%import textio
|
||||||
|
%import math
|
||||||
|
|
||||||
|
%option no_sysinit
|
||||||
%zeropage basicsafe
|
%zeropage basicsafe
|
||||||
|
|
||||||
main {
|
|
||||||
sub start() {
|
|
||||||
ubyte[] array = [1,2,3]
|
|
||||||
ubyte[3] array2
|
|
||||||
float[] flarray = [1.1, 2.2, 3.3]
|
|
||||||
float[3] flarray2
|
|
||||||
word[] warray = [-2222,42,3333]
|
|
||||||
word[3] warray2
|
|
||||||
str[] names = ["apple", "banana", "tomato"]
|
|
||||||
str[3] names2
|
|
||||||
|
|
||||||
; 8 array assignments -> 8 arraycopies:
|
main {
|
||||||
array = [8,7,6]
|
|
||||||
array = array2
|
sub start() {
|
||||||
flarray = [99.9, 88.8, 77.7]
|
monogfx.lores()
|
||||||
flarray = flarray2
|
demofill()
|
||||||
warray = [4444,5555,6666]
|
}
|
||||||
warray = warray2
|
|
||||||
names = ["x1", "x2", "x3"]
|
sub demofill() {
|
||||||
names = names2
|
const uword offsetx = 0
|
||||||
|
const uword offsety = 0
|
||||||
|
|
||||||
|
monogfx.circle(offsetx+160, offsety+120, 110, true)
|
||||||
|
monogfx.rect(offsetx+180, offsety+5, 25, 190, true)
|
||||||
|
monogfx.line(offsetx+100, offsety+150, offsetx+240, offsety+10, true)
|
||||||
|
monogfx.line(offsetx+101, offsety+150, offsetx+241, offsety+10, true)
|
||||||
|
monogfx.rect(offsetx+150, offsety+130, 10, 100, true)
|
||||||
|
|
||||||
|
sys.wait(30)
|
||||||
|
|
||||||
|
cbm.SETTIM(0,0,0)
|
||||||
|
monogfx.fill(offsetx+100,offsety+100,true)
|
||||||
|
monogfx.fill(offsetx+100,offsety+100,false)
|
||||||
|
uword duration = cbm.RDTIM16()
|
||||||
|
sys.wait(30)
|
||||||
|
|
||||||
|
monogfx.textmode()
|
||||||
|
txt.nl()
|
||||||
|
txt.print_uw(duration)
|
||||||
|
txt.print(" jiffies\n")
|
||||||
|
|
||||||
|
; before optimizations: ~166 jiffies
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user