avr: more work on relative coords->absolute coords

This commit is contained in:
Martin Preuss
2026-01-19 00:47:32 +01:00
parent c578ddd1a6
commit 065d301292

View File

@@ -155,8 +155,8 @@ Widget_OnTouch:
breq Widget_OnTouch_secRet ; no press change, jmp breq Widget_OnTouch_secRet ; no press change, jmp
; check for position inside this widget ; check for position inside this widget
rcall Widget_LoadDisplayRegs ; (R0-R11) rcall widgetLoadCoordsForFullWidget
rcall Widget_MakeAbsPos ; (R16, R17) TODO!!! rcall Widget_MakeAbsPos ; (R16, R17)
rcall Widget_IsPointInRect ; (R16, R17) rcall Widget_IsPointInRect ; (R16, R17)
sbci r16, 0 ; r16=ff if touched inside, 0 otherwise sbci r16, 0 ; r16=ff if touched inside, 0 otherwise
@@ -271,19 +271,19 @@ Widget_IsPointInRect:
mov r17, r19 mov r17, r19
sub r16, r4 sub r16, r4
sbc r17, r5 sbc r17, r5
brcs Widget_IsPointInRect_no brcs Widget_IsPointInRect_no ; jmp if left of widget
sub r16, r8 ; sub width sub r16, r8 ; sub width
sbc r17, r9 sbc r17, r9
brcc Widget_IsPointInRect_no brcc Widget_IsPointInRect_no ; jmp if right of widget
mov r16, r20 ; checkY-widgetY mov r16, r20 ; checkY-widgetY
mov r17, r21 mov r17, r21
sub r16, r8 sub r16, r8
sbc r17, r9 sbc r17, r9
brcs Widget_IsPointInRect_no brcs Widget_IsPointInRect_no ; jmp if above widget
sub r16, r10 ; sub height sub r16, r10 ; sub height
sbc r17, r11 sbc r17, r11
brcc Widget_IsPointInRect_no brcc Widget_IsPointInRect_no ; jmp if below widget
sec ; is inside rect sec ; is inside rect
rjmp Widget_IsPointInRect_ret rjmp Widget_IsPointInRect_ret
@@ -473,25 +473,12 @@ Widget_SubFlags_ret:
Widget_Clear: Widget_Clear:
rcall OBJ_IsObject rcall OBJ_IsObject
brcc Widget_Clear_ret brcc Widget_Clear_ret
clr r4
clr r5
clr r6
clr r7
adiw zh:zl, WIDGET_OFFS_WIDTH_LO
lpm r8, Z+ ; WIDTH_LO
lpm r9, Z+
lpm r10, Z+ ; HEIGHT_LO
lpm r11, Z
sbiw zh:zl, WIDGET_OFFS_WIDTH_LO+3
rcall Widget_MakeAbsPos ; (R16, R17) rcall widgetLoadCoordsForFullWidget
rcall Widget_GetSdramPtr ; (none) rcall Widget_MakeAbsPos ; (R16, R17)
; adiw zh:zl, WIDGET_OFFS_OPTS_LO ; get OPTS low rcall Widget_GetSdramPtr ; (none)
; lpm r14, Z rcall Widget_SelectColors ; (R16)
; sbiw zh:zl, WIDGET_OFFS_OPTS_LO mov r2, r0 ; use background
rcall Widget_SelectColors ; (R16)
mov r2, r0 ; use background
mov r3, r1 mov r3, r1
bigcall Display_FillRect bigcall Display_FillRect
Widget_Clear_ret: Widget_Clear_ret:
@@ -500,10 +487,29 @@ Widget_Clear_ret:
; ---------------------------------------------------------------------------
; @routine Widget_DrawBorder @global
;
; @param Z byte address of widget object (for LPM!)
; @param r3:r2 color
; @clobbers any, !Z
Widget_DrawBorder:
rcall OBJ_IsObject
brcc Widget_DrawBorder_ret
rcall widgetLoadCoordsForFullWidget
rcall Widget_MakeAbsPos ; (R16, R17)
bigcall Display_DrawRect
Widget_DrawBorder_ret:
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Widget_SelectColors @global ; @routine Widget_SelectColors @global
; ;
; @param Z byte address of widget object (for LPM!) ; @param Z byte address of widget object (for LPM!)
; @param Y pointer to Widget data in SDRAM ; @param Y pointer to Widget data in SDRAM
; @return r1:r0 background color ; @return r1:r0 background color
; @return r3:r2 foreground color ; @return r3:r2 foreground color
@@ -601,25 +607,6 @@ Widget_FillRect:
; ---------------------------------------------------------------------------
; @routine Widget_DrawBorder @global
;
; @param Z byte address of widget object (for LPM!)
; @param r3:r2 color
; @clobbers any, !Z
Widget_DrawBorder:
clr r6
clr r7
clr r8
clr r9
rcall Widget_MakeAbsPos ; (R16, R17)
bigcall Display_DrawRect
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine Widget_DrawImage @global ; @routine Widget_DrawImage @global
; ;
@@ -1276,4 +1263,29 @@ Widget_CalcStringWidthFLASH_done:
; ---------------------------------------------------------------------------
; @routine Widget_AlignPosXY
;
; @param Z byte address of widget object (for LPM!)
; @return r5:r4 X (0)
; @return r7:r6 Y (0)
; @return r9:r8 widget width
; @return r11:R10 widget height
widgetLoadCoordsForFullWidget:
clr r4
clr r5
clr r6
clr r7
adiw zh:zl, WIDGET_OFFS_WIDTH_LO
lpm r8, Z+ ; WIDTH_LO
lpm r9, Z+
lpm r10, Z+ ; HEIGHT_LO
lpm r11, Z
sbiw zh:zl, WIDGET_OFFS_WIDTH_LO+3
ret
; @end
#endif #endif