Checkpoint, implemented slider graphics on palette edit screen

This commit is contained in:
Ben Bridle 2022-09-23 14:17:13 +12:00
parent d3f13ef67f
commit 2e4760cd18
3 changed files with 239 additions and 54 deletions

View File

@ -78,3 +78,75 @@
RETURN
&colour $1 &width $2
@draw_slider ( value active? -- )
( use 3012 for flashing active state, if needed )
STH* SWPr r/SCREEN.X? #01 /SCREEN.AUTO! ( | active? value x* )
( Draw slider background )
;&slider_bg /SCREEN.ADDR! #0800 ( total i | active? value x* )
&loop
COL_2012 /SCREEN.SPRITE!
INC GTHk ,&loop JCN
POP* ( | active? value x* )
( Draw slider end caps )
;&slider_cap /SCREEN.ADDR!
STHkr* #0001 SUB* /SCREEN.X! ( | active? value x* )
COL_2012 /SCREEN.SPRITE!
STHkr* #003d ADD* /SCREEN.X! ( | active? value x* )
COL_2012_X /SCREEN.SPRITE! ( | active? value x* )
( Draw slider indicator )
STHkr* SWPr* #00 STHr ( x* value* | x* active? )
MUL4 ADD* INC* INCk* INC* /SCREEN.X! ( sx* | x* active? )
COL_0 #0007 ;draw_vertical_line CALL
/SCREEN.X! /SCREEN.Y? INCk* /SCREEN.Y! ( y* | x* active? )
STHr COL_0 COL_2 CHOOSE
#0005 DUP* ;draw_capsule CALL
COL_0 #0005 DUP* ;draw_capsule_outline CALL
( Clean up and return )
/SCREEN.Y! r/SCREEN.X! #00 /SCREEN.AUTO! ( -- )
RETURN
&slider_cap e0c0 8880 88c0 e0ff 1f3f 7760 773f 1f00
&slider_bg 0000 1100 1100 00ff ffff ee00 eeff ff00
@draw_slider_old ( value active? -- )
( use 3012 for flashing active state, if needed )
( If active, draw the expanded style, else draw the collapsed style )
DUP ;&collapsed_bg ;&expanded_bg CHOOSE* /SCREEN.ADDR!
;&collapsed_cap ;&expanded_cap CHOOSE* ,&cap STR*
STH r/SCREEN.X? #01 /SCREEN.AUTO! ( | value x* )
( Draw slider background )
#0800 ( total i | value x* )
&loop
COL_2012 /SCREEN.SPRITE!
INC GTHk ,&loop JCN
POP* ( | value x* )
( Draw slider end caps )
[ LIT* &cap $2 ] /SCREEN.ADDR!
STHkr* DEC* DUP* /SCREEN.X! ( x* | value x* )
COL_2012 /SCREEN.SPRITE!
#003d ADD* /SCREEN.X! ( | value x* )
COL_2012_X /SCREEN.SPRITE! ( | value x* )
( Draw slider indicator )
STHkr* ROTr #00 STHr ( x* 00 value | x* )
MUL4 ADD* INC* DUPk* /SCREEN.X! ( sx* sx* | x* )
COL_1 #0005 #0007 ;draw_capsule_outline CALL
#0002 ADD* /SCREEN.X! ( sx* | x* )
COL_0 #0007 ;draw_vertical_line CALL
/SCREEN.X! /SCREEN.Y? INCk* /SCREEN.Y! ( y* | x* )
COL_2 #0005 DUP* ;draw_capsule CALL
COL_0 #0005 DUP* ;draw_capsule_outline CALL
( Clean up and return )
/SCREEN.Y! r/SCREEN.X! #00 /SCREEN.AUTO! ( -- )
RETURN
&expanded_cap e0c0 8880 88c0 e0ff 1f3f 7760 773f 1f00
&expanded_bg 0000 1100 1100 00ff ffff ee00 eeff ff00
&collapsed_cap ffff c080 c0ff ffff 0000 3f60 3f00 0000
&collapsed_bg ffff 0000 00ff ffff 0000 ff00 ff00 0000

View File

@ -1,3 +1,8 @@
@fill_screen_with_halftone ( sprite_colour -- )
;sprite/halftone ( sprite_colour sprite_addr )
,fill_screen_with_sprite JMP
@clear_foreground ( -- )
COL_00_FG ( sprite_colour )
@fill_screen_with_colour ( sprite_colour -- )

View File

@ -40,6 +40,9 @@
%/V.BRUSH2.PATTERN { #1d } %/V.BRUSH2.PATTERN? { #1d LDZ } %/V.BRUSH2.PATTERN! { #1d STZ }
%/V.BRUSH3.PATTERN { #1e } %/V.BRUSH3.PATTERN? { #1e LDZ } %/V.BRUSH3.PATTERN! { #1e STZ }
( The index of the colour that's currently selected in the colour palette editor )
%/V.ACTIVE_COLOUR { #1f } %/V.ACTIVE_COLOUR? { #1f LDZ } %/V.ACTIVE_COLOUR! { #1f STZ }
%TOOL_COUNT? { #07 }
@ -52,17 +55,88 @@
( Seed default palettes for canvas and UI )
#1c8d /V.CANVAS.RED! #1619 /V.CANVAS.GREEN! #1010 /V.CANVAS.BLUE!
( TODO: Remove this line )
#1d4a /V.UI.RED! #2d69 /V.UI.GREEN! #3978 /V.UI.BLUE!
#1d44 /V.UI.RED! #2d68 /V.UI.GREEN! #397a /V.UI.BLUE!
#1d24 /V.UI.RED! #2d8a /V.UI.GREEN! #3946 /V.UI.BLUE!
#1d22 /V.UI.RED! #2d8b /V.UI.GREEN! #3946 /V.UI.BLUE!
;recenter_canvas CALL
;tool_screen GOTO
;colour_screen GOTO
~_user_interface_framework.tal
( ---------------------------------------------------------------------------- )
( P R O G R A M S C R E E N S )
@colour_screen
;ui__clear CALL
( Draw static elements )
COL_30 ;fill_screen_with_colour CALL
#0000 DUP* /SCREEN.X! /SCREEN.Y!
COL_0 #0080 /SCREEN.HEIGHT? ;draw_rect_filled CALL
#0080 /SCREEN.X! COL_1 /SCREEN.HEIGHT? ;draw_vertical_line CALL
#0018 /SCREEN.X! #0008 /SCREEN.Y!
COL_T1 ;&title_text ;draw_text CALL
#0019 /SCREEN.X! #0048 /SCREEN.Y!
COL_T1 ;&red_text ;draw_text CALL
#0058 /SCREEN.Y!
COL_T1 ;&green_text ;draw_text CALL
#0068 /SCREEN.Y!
COL_T1 ;&blue_text ;draw_text CALL
( Register change callbacks )
#00 ;colour_screen__change__colour
#01 ;ui__register_change_callbacks CALL
( Register draw callbacks )
#00 ;colour_screen__draw__colours
#01 ;colour_screen__draw__red
#02 ;colour_screen__draw__green
#03 ;colour_screen__draw__blue
#04 ;ui__register_draw_callbacks CALL
#0004 ;ui__run GOTO
&title_text "CHANGE <SPACE> "COLOURS <NULL>
&red_text "R <NULL>
&green_text "G <NULL>
&blue_text "B <NULL>
@colour_screen__change__colour ( delta )
/V.ACTIVE_COLOUR #04 ;change_variable CALLRETURN
@colour_screen__draw__colours ( active? )
#0013 /SCREEN.X! #0020 /SCREEN.Y!
/V.ACTIVE_COLOUR? DUP ROT
;draw_colour_swatch CALL
;load_merged_palette CALLRETURN
@colour_screen__draw__red ( active? )
#0024 /SCREEN.X! #0060 /SCREEN.Y!
#04 SWP ;draw_slider CALLRETURN
@colour_screen__draw__green ( active? )
#0024 /SCREEN.X! #006a /SCREEN.Y!
#04 SWP ;draw_slider CALLRETURN
@colour_screen__draw__blue ( active? )
#0024 /SCREEN.X! #0075 /SCREEN.Y!
#04 SWP ;draw_slider CALLRETURN
@canvas_screen
;ui__clear CALL
;canvas_colour_palette ;ui__load_colour_palette CALL
@ -151,21 +225,8 @@
;draw_canvas CALLRETURN
( Draws a capsule, either empty, half-filled, or solid filled )
( Doesn't preserve coordinates )
( States: unselected, inactive selected, and active selected )
@draw_colour
;sprite/capsule_half /SCREEN.ADDR!
;brush_pattern/2 /SCREEN.ADDR!
#0001 /SCREEN.AUTO!
COL_T2 /SCREEN.SPRITE!
COL_T2_X /SCREEN.SPRITE!
/SCREEN.AUTO! RETURN
@tool_screen
;ui__clear CALL
;ui_colour_palette ;ui__load_colour_palette CALL
( Draw non-interactive elements )
COL_0 ;fill_screen_with_colour CALL
@ -210,60 +271,79 @@
@tool_screen__change__tool ( delta -- )
/V.ACTIVE_TOOL TOOL_COUNT? ,change__variable JMP
/V.ACTIVE_TOOL TOOL_COUNT? ,change_variable JMP
@tool_screen__change__colour ( delta -- )
/V.BRUSH1.COLOUR #04 ,change__variable JMP
/V.BRUSH1.COLOUR #04 ,change_variable JMP
@tool_screen__change__shape ( delta -- )
/V.BRUSH1.SHAPE #08 ,change__variable JMP
/V.BRUSH1.SHAPE #08 ,change_variable JMP
@tool_screen__change__pattern ( delta -- )
/V.BRUSH1.PATTERN #08 ( ... jump elided ... )
@change__variable ( delta var_addr count -- )
@change_variable ( delta var_addr count -- )
STH LDZk ROT ADD STHr ;clamp CALL SWP STZ RETURN
@tool_screen__draw__colours ( active? )
#0013 CENTER_LEFT! #0005 CENTER_DOWN!
STH #0400 ( total i | active? )
&loop
DUP /V.BRUSH1.COLOUR? EQU ( total i selected? | active? )
STHkr COL_2 COL_3 CHOOSE ( total i selected? col | active? )
COL_1 SWP CHOOSE ( total i col | active? )
#0015 #0008 ;draw_capsule CALL ( total i | active? )
STHkr NOT ,&skip JCN
COL_1 #0015 #0008 ;draw_capsule_outline CALL
&skip
#0017 MOVE_RIGHT
INC NEQk ,&loop JCN
POP* POPr
RETURN
/V.BRUSH1.COLOUR? SWP DUP*
;draw_colour_swatch CALL
( Either load regular UI palette, or replace colour 0x03 )
;load_merged_palette JCN* POP
;ui_colour_palette ;ui__load_colour_palette GOTO
( TODO: Find a way to share code between these two, there's 300 bytes of code here )
@tool_screen__draw__shapes ( active? )
#0010 CENTER_LEFT! #0013 CENTER_DOWN!
;brush_shape /SCREEN.ADDR!
/V.BRUSH1.SHAPE #0013 ;draw_sprite_row JMP*
@tool_screen__draw__patterns ( active? )
;brush_pattern /SCREEN.ADDR!
/V.BRUSH1.PATTERN #0021 ( ... jump elided ... )
@draw_sprite_row ( active? variable down* )
CENTER_DOWN! #0010 CENTER_LEFT!
#05 /SCREEN.AUTO! ,&variable STR #0800 ( active? total i )
#05 /SCREEN.AUTO! #0800 ( active? total i )
&loop
DUP [ LIT &variable $1 ] LDZ EQU ( active? total i selected? )
DUP /V.BRUSH1.SHAPE? EQU ( active? total i selected? )
OVR* POP ( active? total i selected? active? )
COL_12 COL_13 CHOOSE COL_10 SWP CHOOSE ( active? total i colour )
/SCREEN.SPRITE! #0003 MOVE_RIGHT ( active? total i )
INC NEQk ,&loop JCN ( active? total i+1 )
POP* POP #00 /SCREEN.AUTO!
#005a MOVE_LEFT #0002 MOVE_UP
#00 /SCREEN.AUTO! POP* #0800
&loop_two
DUP /V.BRUSH1.SHAPE? EQU ( active? total i selected? )
OVR* POP
COL_2 COL_3 CHOOSE COL_1 SWP CHOOSE
#000b #000b ;draw_capsule_outline CALL
#000b MOVE_RIGHT
INC NEQk ,&loop_two JCN
POP* POP
RETURN
@tool_screen__draw__patterns ( active? )
#0010 CENTER_LEFT! #0021 CENTER_DOWN!
;brush_pattern /SCREEN.ADDR!
#05 /SCREEN.AUTO! #0800 ( active? total i )
&loop_one
DUP /V.BRUSH1.PATTERN? EQU ( active? total i selected? )
OVR* POP ( active? total i selected? active? )
COL_02 COL_03 CHOOSE COL_10 SWP CHOOSE ( active? total i colour )
/SCREEN.SPRITE! #0003 MOVE_RIGHT ( active? total i )
INC NEQk ,&loop_one JCN ( active? total i+1 )
( Draw outlines )
#0059 MOVE_LEFT #0001 MOVE_UP
#00 /SCREEN.AUTO! POP* #0800
&loop_two
DUP /V.BRUSH1.PATTERN? EQU ( active? total i selected? )
OVR* POP
COL_2 COL_3 CHOOSE COL_0 SWP CHOOSE
#000a #000a ;draw_capsule_outline CALL
#000b MOVE_RIGHT
INC NEQk ,&loop_two JCN
POP* POP
RETURN
@tool_screen__draw__tools ( active? )
( TODO: Have the icon that the mouse is currently hovering over be
rendered in the chosen-but-not-active colour. Figure out how to do this
for all UI elements. Colours, for example. )
( Choose between the real active tool and an impossible tool number )
( TODO: This is needlessly complicated )
#ff /V.ACTIVE_TOOL? CHOOSE ,&active_tool STR
( Draw a label on top, containing the name of the active tool )
#0040 CENTER_LEFT! #002f CENTER_UP!
@ -275,10 +355,11 @@
/SCREEN.X! #001b ;draw_capsule CALL ( -- )
( Draw each of the large tool icons )
TOOL_COUNT? #00 ( total i )
&loop DUPk [ LIT &active_tool $1 ] EQU
;draw_tool_palette_icon CALL
INC GTHk ,&loop JCN
&end POP* RETURN
&loop
DUPk [ LIT &active_tool $1 ] EQU
;draw_tool_palette_icon CALL
INC GTHk ,&loop JCN
POP* RETURN
@get_tool_name ( index -- text_addr* )
@ -403,7 +484,7 @@
( Render the canvas to the screen )
@draw_canvas ( -- )
COL_20 ;fill_screen_with_colour CALL ( -- )
COL_20 ;fill_screen_with_halftone CALL ( -- )
#05 /SCREEN.AUTO! ( -- )
/V.CANVAS.Y? /SCREEN.Y! ( -- )
;canvas_buffer /SCREEN.ADDR! ( -- )
@ -420,6 +501,34 @@
&end ( 0* )
/SCREEN.AUTO! POP RETURN ( -- )
( Draw four boxes, with the nth box filled with colour #3 )
@draw_colour_swatch ( n active? -- )
STH* #0400 ( total i | n active? )
&loop
DUP OVRr STHr EQU ( total i nth? | n active? )
STHkr COL_2 COL_3 CHOOSE ( total i nth? col | n active? )
COL_1 SWP CHOOSE ( total i col | n active? )
#0015 #0008 ;draw_capsule CALL ( total i | n active? )
STHkr NOT ,&skip JCN ( total i | n active? )
COL_1 #0015 #0008 ;draw_capsule_outline CALL
&skip
#0017 MOVE_RIGHT
INC NEQk ,&loop JCN
POP* POPr* RETURN
@load_merged_palette ( ui_colour )
#03 SWP SUB MUL4 STH #0300 ( total i | sft )
&loop_colour
DUPk ADD STHk ( total i i*2 | sft i*2 )
.canvas_colour_palette ADD LDZ* ( total i channel* | sft i*2 )
OVRr STHr SFT* #000f AND* ( total i col3* | sft i*2 )
.ui_colour_palette STHkr ADD LDZ* ( total i col3* chan* | sft i*2 )
#fff0 AND* ORA* ( total i channel* | sft i*2 )
/SYSTEM.RED STHr ADD DEO* ( total i | sft )
INC GTHk ,&loop_colour JCN
POP* POPr RETURN
~_fill_screen.tal
@ -471,15 +580,14 @@
&3 1122 4488 1122 4488 ( 1/4 left-diag )
&4 8844 2211 8844 2211 ( 1/4 right-diag )
&5 aaaa aaaa aaaa aaaa ( 1/2 vertical )
&6 5555 5555 5555 5555 ( 1/2 horizontal )
&6 ff00 ff00 ff00 ff00 ( 1/2 horizontal )
&7 0044 0011 0044 0011 ( 1/8 sparse )
&8 40a0 4000 0000 0000 ( 1/16 clumps )
@sprite
&left_chevron 1030 70f0 7030 1000
&cursor 80c0 e0f0 f8e0 1000
&capsule_half 7f80 8080 8080 807f
&capsule_right 7f80 8080 8080 807f
&halftone aa55 aa55 aa55 aa55
&blank 0000 0000 0000 0000