diff --git a/applications/foxpaint/main.asm b/applications/foxpaint/main.asm new file mode 100644 index 0000000..b70b094 --- /dev/null +++ b/applications/foxpaint/main.asm @@ -0,0 +1,230 @@ +; mouse painting demo + + mov r0, window_struct + mov r1, window_title + mov r2, 640 + mov r3, 448 + mov r4, 0 + mov r5, 16 + mov r6, menu_items_root + mov r7, 0 + call new_window + +event_loop: + mov r0, window_struct + call get_next_window_event + + ; was the mouse clicked? + cmp r0, EVENT_TYPE_MOUSE_CLICK + ifz call mouse_click_event + + ; was the mouse released? + cmp r0, EVENT_TYPE_MOUSE_RELEASE + ifz mov.8 [is_drawing], 0 + + ; did the user click the menu bar? + cmp r0, EVENT_TYPE_MENU_BAR_CLICK + ifz mov r0, menu_items_root + ifz call menu_bar_click_event + + ; is the user in a menu? + cmp r0, EVENT_TYPE_MENU_UPDATE + ifz call menu_update_event + + ; did the user click a menu item? + cmp r0, EVENT_TYPE_MENU_CLICK + ifz call menu_click_event + + ; should the menu be closed? + cmp r0, EVENT_TYPE_MENU_ACK + ifz call menu_ack_event + + cmp.8 [is_drawing], 0 + ifnz call draw_pixel + + call yield_task + jmp event_loop + +mouse_click_event: + push r0 + + ; first, check if we are attempting to drag or close the window + cmp r2, 16 + iflteq jmp drag_or_close_window + + ; if not, enable the drawing flag + mov.8 [is_drawing], 1 + + pop r0 + ret + +menu_click_event: + ; r2 contains the clicked root menu + ; r3 contains the clicked menu item + + ; canvas + cmp r2, 0 + ifz call canvas_menu_click_event + + ; brush + cmp r2, 1 + ifz call brush_menu_click_event + + ; color + cmp r2, 2 + ifz call color_menu_click_event + + ret + +menu_ack_event: + push r0 + + mov r0, menu_items_root + call close_menu + + pop r0 + ret + +canvas_menu_click_event: + ; r2 contains the clicked root menu + ; r3 contains the clicked menu item + + ; clear to black + cmp r3, 0 + ifz call clear_canvas_black + + ; clear to white + cmp r3, 1 + ifz call clear_canvas_white + + ret + +brush_menu_click_event: + ; r2 contains the clicked root menu + ; r3 contains the clicked menu item + + ; 2x2 + cmp r3, 0 + ifz mov.8 [brush_size], 2 + + ; 4x4 + cmp r3, 1 + ifz mov.8 [brush_size], 4 + + ; 8x8 + cmp r3, 2 + ifz mov.8 [brush_size], 8 + + ; 16x16 + cmp r3, 3 + ifz mov.8 [brush_size], 16 + + ret + +color_menu_click_event: + ; r2 contains the clicked root menu + ; r3 contains the clicked menu item + + ; black + cmp r3, 0 + ifz mov [color], 0xFF000000 + + ; white + cmp r3, 1 + ifz mov [color], 0xFFFFFFFF + + ; red + cmp r3, 2 + ifz mov [color], 0xFF0000FF + + ; green + cmp r3, 3 + ifz mov [color], 0xFF00FF00 + + ; blue + cmp r3, 4 + ifz mov [color], 0xFFFF0000 + + ret + +draw_pixel: + mov r0, window_struct + call get_window_overlay_number + mov r2, r0 + mov r5, r0 + call get_mouse_position + call make_coordinates_relative_to_overlay + movz.8 r2, [brush_size] + movz.8 r3, [brush_size] + mov r4, [color] + call draw_filled_rectangle_to_overlay + + ret + +clear_canvas_black: + mov r0, 0xFF000000 + mov r1, window_struct + call fill_window + + ret + +clear_canvas_white: + mov r0, 0xFFFFFFFF + mov r1, window_struct + call fill_window + + ret + +drag_or_close_window: + cmp r1, 8 + iflteq jmp close_window + mov r0, window_struct + call start_dragging_window + pop r0 + ret +close_window: + mov r0, window_struct + call destroy_window + call end_current_task + +window_title: data.str "FoxPaint" data.8 0 +window_struct: data.fill 0, 36 + +menu_items_root: + data.8 3 ; number of menus + data.32 menu_items_canvas_list data.32 menu_items_canvas_name ; pointer to menu list, pointer to menu name + data.32 menu_items_brush_list data.32 menu_items_brush_name ; pointer to menu list, pointer to menu name + data.32 menu_items_color_list data.32 menu_items_color_name ; pointer to menu list, pointer to menu name +menu_items_canvas_name: + data.8 6 data.str "Canvas" data.8 0x00 ; text length, text, null-terminator +menu_items_brush_name: + data.8 5 data.str "Brush" data.8 0x00 ; text length, text, null-terminator +menu_items_color_name: + data.8 5 data.str "Color" data.8 0x00 ; text length, text, null-terminator +menu_items_canvas_list: + data.8 2 ; number of items + data.8 16 ; menu width (usually longest item + 2) + data.8 14 data.str "Clear to Black" data.8 0x00 ; text length, text, null-terminator + data.8 14 data.str "Clear to White" data.8 0x00 ; text length, text, null-terminator +menu_items_brush_list: + data.8 4 ; number of items + data.8 7 ; menu width (usually longest item + 2) + data.8 3 data.str "2x2" data.8 0x00 ; text length, text, null-terminator + data.8 3 data.str "4x4" data.8 0x00 ; text length, text, null-terminator + data.8 3 data.str "8x8" data.8 0x00 ; text length, text, null-terminator + data.8 5 data.str "16x16" data.8 0x00 ; text length, text, null-terminator +menu_items_color_list: + data.8 5 ; number of items + data.8 7 ; menu width (usually longest item + 2) + data.8 5 data.str "Black" data.8 0x00 ; text length, text, null-terminator + data.8 5 data.str "White" data.8 0x00 ; text length, text, null-terminator + data.8 3 data.str "Red" data.8 0x00 ; text length, text, null-terminator + data.8 5 data.str "Green" data.8 0x00 ; text length, text, null-terminator + data.8 4 data.str "Blue" data.8 0x00 ; text length, text, null-terminator + +is_drawing: data.8 0 +brush_size: data.8 4 +color: data.32 0xFFFFFFFF + + #include "../../../fox32rom/fox32rom.def" + #include "../../fox32os.def" diff --git a/build.sh b/build.sh index 93b3950..460d4af 100755 --- a/build.sh +++ b/build.sh @@ -25,6 +25,9 @@ echo "assembling barclock" echo "assembling terminal" ../fox32asm/target/release/fox32asm applications/terminal/main.asm base_image/terminal.fxf +echo "assembling foxpaint" +../fox32asm/target/release/fox32asm applications/foxpaint/main.asm base_image/foxpaint.fxf + echo "assembling bg" ../fox32asm/target/release/fox32asm applications/bg/main.asm base_image/bg.fxf