; *************************************************************************** ; copyright : (C) 2026 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** ; * This file is part of the project "AqHome". * ; * Please see toplevel file COPYING of that project for license details. * ; *************************************************************************** #ifndef AQH_AVR_GUI2_LAYOUT_ASM #define AQH_AVR_GUI2_LAYOUT_ASM ; *************************************************************************** ; defines ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine Layout_SetDefaultWidths ; ; Set defaultWidth in WIDGET_OFFS_TMP_LO/HI ; ; @param Y pointer to widget ; @clobbers any, !Y Layout_SetDefaultWidths: push yl push yh bigcall OBJ_GetFirstChild Layout_SetDefaultWidths_loop: brcc Layout_SetDefaultWidths_ret mov yl, r18 mov yh, r19 bigcall Widget_GetDefaultWidth std Y+WIDGET_OFFS_TMP_LO, r18 std Y+WIDGET_OFFS_TMP_HI, r19 rcall OBJ_GetNext rjmp Layout_SetDefaultWidths_loop Layout_SetDefaultWidths_ret: pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine Layout_SetDefaultHeights ; ; @param Y pointer to widget ; @clobbers any, !Y Layout_SetDefaultHeights: push yl push yh bigcall OBJ_GetFirstChild Layout_SetDefaultHeights_loop: brcc Layout_SetDefaultHeights_ret mov yl, r18 mov yh, r19 bigcall Widget_GetDefaultHeight std Y+WIDGET_OFFS_TMP_LO, r18 std Y+WIDGET_OFFS_TMP_HI, r19 rcall OBJ_GetNext rjmp Layout_SetDefaultHeights_loop Layout_SetDefaultHeights_ret: pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine Layout_SumTmpValues ; ; @param Y pointer to widget ; @return r19:r18 total width of all child widgets plus space between ; @clobbers r16, r17, r18, r19, r20, r21, r22, r23, Z Layout_SumTmpValues: ldd zl, Y+WIDGET_OFFS_STYLE_LO ldd zh, Y+WIDGET_OFFS_STYLE_HI ; get spacing adiw zh:zl, WIDGET_STYLE_OFFS_SPACING lpm r22, Z sbiw zh:zl, WIDGET_STYLE_OFFS_SPACING ; get outer border adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE lpm r23, Z sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE ; start adding clr r20 clr r21 push yl push yh bigcall OBJ_GetFirstChild Layout_SumTmpValues_loop: brcc Layout_SumTmpValues_loopEnd mov yl, r18 mov yh, r19 ldd r18, Y+WIDGET_OFFS_TMP_LO ldd r19, Y+WIDGET_OFFS_TMP_HI add r20, r18 ; add widget size adc r21, r19 add r20, r22 ; add spacing adc r20, r22 sub r20, r22 rcall OBJ_GetNext rjmp Layout_SumTmpValues_loop Layout_SumTmpValues_loopEnd: mov r16, r20 or r16, r21 breq Layout_SumTmpValues_done sub r20, r22 ; sub last spacing sbc r21, r22 add r21, r22 add r20, r23 ; add outer border (begin) adc r21, r23 sub r21, r23 add r20, r23 ; add outer border (end) adc r21, r23 sub r21, r23 Layout_SumTmpValues_done: mov r18, r20 mov r19, r21 pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine Layout_GetMaxTmp ; ; @param Y pointer to widget ; @return r19:r18 maximum value in WIDGET_OFFS_TMP_LO/HI of children ; @clobbers any, !Y Layout_GetMaxTmp: clr r20 clr r21 push yl push yh bigcall OBJ_GetFirstChild Layout_GetMaxTmp_loop: brcc Layout_GetMaxTmp_ret mov yl, r18 mov yh, r19 ldd r18, Y+WIDGET_OFFS_TMP_LO ldd r19, Y+WIDGET_OFFS_TMP_HI ; max cp r20, r18 cpc r21, r19 brcc Layout_GetMaxTmp_next mov r20, r18 mov r21, r19 Layout_GetMaxTmp_next: rcall OBJ_GetNext rjmp Layout_GetMaxTmp_loop Layout_GetMaxTmp_ret: mov r18, r20 mov r19, r21 pop yh pop yl ret ; @end ; --------------------------------------------------------------------------- ; @routine Layout_AddToTmpOfFillXChildren ; ; @param Y pointer to widget ; @param R21:R20 value to add to tmp value of expandable widgets ; @param r22 mask for OBJECT_OFFS_OPTS_LO (e.g. 1<