; Copyright 1996 Acorn Computers Ltd ; ; Licensed under the Apache License, Version 2.0 (the "License"); ; you may not use this file except in compliance with the License. ; You may obtain a copy of the License at ; ; http://www.apache.org/licenses/LICENSE-2.0 ; ; Unless required by applicable law or agreed to in writing, software ; distributed under the License is distributed on an "AS IS" BASIS, ; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ; See the License for the specific language governing permissions and ; limitations under the License. ; ; > source.NewSWIs SWIWimp_TextOp AND userblk,R0,#255 TEQ userblk,#0 TEQNE userblk,#1 TEQNE userblk,#2 SETV NE ADRVSL R0,ErrorBlock_WimpBadReasonCode BVS ExitWimp TEQ userblk,#0 BLEQ textop_setcolours [ AllowMatrix TST R0,#&20000000 MOVNE R14,R6 MOVEQ R14,#0 STR R14,validationstring ] TEQ userblk,#1 BLEQ textop_gettextwidth TEQ userblk,#2 BLEQ textop_painttext B ExitWimp textop_setcolours Push lr [ outlinefont LDR R3,systemfont TEQ R3,#0 STRNE R1,last_fg_gcol STRNE R2,last_bg_gcol Pull PC,NE ] MOV R0,R2 MOV R3,#128 ; bg MOV R4,#0 SWI ColourTrans_SetGCOL MOVVC R0,R1 MOVVC R3,#0 SWIVC ColourTrans_SetGCOL Pull PC textop_painttext Push "lr" TST R0,#&20000000 LDRNE R3,redrawhandle Abs R3,R3,NE LDRNE R14,[R3,#w_wax0] ADDNE R4,R4,R14 LDRNE R14,[R3,#w_way1] ADDNE R5,R5,R14 [ outlinefont LDR R3,systemfont TEQ R3,#0 BEQ systemfont_paint MOV R2,R1 MOV R1,#is_deleted MOV R9,#bignum BL pushfontstring LDR R9,last_fg_gcol CMP R9,#-1 MOVNE R9,R9, LSR #8 ORRNE R9,R9,#&0E000000 Push "R9",NE LDRNE R9,last_bg_gcol MOVNE R9,R9, LSR #8 MOVNE R9,R9, LSL #8 ORRNE R9,R9,#19 ; set font colours Push "R9",NE ADDNE R7,R7,#8 SUBNE R1,R1,#8 MOVNE R9,#-1 STRNE R9,last_fg_gcol TST R0,#&40000000 LDRNE R14,systemfonty1 SUBNE R14,R14,#28 ; system font was 28 OS units above baseline SUBNE R5,R5,R14 ,LSR #1 TST R0,#&10000000 ; vertically central LDRNE R14,systemfonty1 SUBNE R5,R5,R14 ,LSR #1 ; LDRNE R14,systemfonty0 ; SUBNE R5,R5,R14 ,LSR #1 ; SUBNE R5,R5,R14 ; p'=p-(y1-3y2)/2 test_rightjustified TST R0,#&80000000 BEQ textop_paintfancy ; right justified Push "R1-R5" MOV R2,#0 MOV R3,#bignum MOV R4,#bignum SWI XFont_ScanString MOV R1,R3 SWI XFont_ConverttoOS MOV R0,R1 Pull "R1-R5" SUB R4,R4,R0 ; R4 was RHS textop_paintfancy MOV R3,R4 ; LDR R14,systemfonty0 ; get baseline same as system font ; ADD R14,R14,#4 ; SUB R4,R5,R14 MOV R4,R5 MOV R2,#16 ; use OS units LDR R14,dx_1 BIC R3,R3,R14 LDR R14,dy_1 ADD R4,R4,R14 ; round up BIC R4,R4,R14 SWI XFont_Paint ADD sp,sp,R7 ; balance stack from pushfontstring Pull "PC" systemfont_paint ] TST R0,#&10000000 ; vertically central SUBNE R5,R5,#16 ; system font is 32 OS units high LDR R14,dx_1 BIC R4,R4,R14 LDR R14,dy_1 SUB R5,R5,R14 ; round down as plotting from top left BIC R5,R5,R14 TST R0,#&80000000 ; right justified ? BEQ paint_systemfont MOV R0,#0 MOV R7,R1 systemfontlength LDRB R6,[R7],#1 CMP R6,#31 ADDGT R0,R0,#1 BGT systemfontlength MOV R0,R0,LSL #4 ; 16 OS units per char SUB R4,R4,R0 paint_systemfont Push "R1" MOV R1,R4 ADD R2,R5,#28 ; top left vs btm left MOV R0,#4 ; move abbsolute SWI XOS_Plot Pull "R0" SWI XOS_Write0 Pull "PC" textop_gettextwidth Push "lr" MOV R9,#bignum CMP R2,#0 MOVGT R9,R2 [ outlinefont LDR R3,systemfont TEQ R3,#0 BEQ textop_sysfontwidth MOV R2,R1 MOV R1,#is_deleted BL pushfontstring [ true MOV R2,#0 MOV R3,#bignum MOV R4,#bignum SWI XFont_ScanString ADD sp,sp,R7 MOV R1,R3 | SWI XFont_StringBBox ; calls scanstring internally SUB R1,R3,R1 ADD sp,sp,R7 ] SWI XFont_ConverttoOS MOV R0,R1 Pull "PC" textop_sysfontwidth ] MOV R0,#0 textop_sysfontwidth_loop LDRB R3,[R1],#1 CMP R3,#31 ADDGT R0,R0,#1 CMPGT R9,R0 BGT textop_sysfontwidth_loop MOV R0,R0, LSL #4 Pull "PC" SWIWimp_ResizeIcon CMP R0,#0 LDRLT handle,iconbarhandle MOVGE handle,R0 BL checkhandle BVS ExitWimp LDR R0,[handle,#w_nicons] CMP R1,R0 BGT badiconhandle CMP R1,#0 BLT badiconhandle LDR R0,[handle,#w_icons] ADD R0,R0,R1, LSL #i_shift STMIA R0,{R2-R5} B ExitWimp [ UseDynamicArea wimpspritepoolarea DCB "WSpr" wimpspritepool DCB "WSP",0 ALIGN ] allocatespritememory [ UseDynamicArea Push "R1,R8,LR" TEQ R0,#ModHandReason_Claim BNE %FT10 ADR R0,wimpspritepool ; Look up name for Wimp sprite pool. ADR R2,errorbuffer ; Put it in a safe place for now (copied out by OS_DynamicArea). MOV R3,#256 BL LookupToken1 Pull "R1,R8,PC",VS MOV R8,R2 MOV R0,#ModHandReason_Claim ; Restore corrupted R0. 10 LDR R1,wimpspritepoolarea BL Dynamic_Module Pull "R1,R8,PC",VC,^ MyXError WimpNoSprites Pull "R1,R8,PC" | Push "LR" SWI XOS_Module Pull "PC" ] MakeErrorBlock WimpNoSprites badiconhandle ADRL R0,ErrorBlock_WimpBadIconHandle SETV B ExitWimp SWIWimp_Extend TEQ R0,#1 MOVEQ R0,R12 BEQ ExitWimp TEQ R0,#2 ADREQ R0,extendjumptable BEQ ExitWimp TEQ R0,#3 LDREQ R0,wimpswiintercept STREQ R1,wimpswiintercept BEQ ExitWimp TEQ R0,#4 ADREQ R0,spritename ADREQ R1,list_at STREQ R1,[sp] BEQ ExitWimp TEQ R0,#5 LDREQ R0,plotsprCB STREQ R1,plotsprCB BEQ ExitWimp [ ChildWindows CMP R0,#6 ; In: R0 = 6 => get parent, 7,8 => get top/bottom child, 9,10 => get next/previous sibling RSBGES R14,R0,#10 ; In: R1 = window handle, or -1 for top-level ; Out: R1 = result handle, or -1 for none BGE %FT01 ] B ExitWimp [ ChildWindows 01 CMP R1,#nullptr BEQ %FT05 MOV handle,R1 BL checkhandle_iconbar BVS ExitWimp CMP R0,#7 LDRLT handle,[handle,#w_parent] BLT %FT03 LDREQ handle,[handle,#w_children + lh_forwards] BEQ %FT02 CMP R0,#9 LDRLT handle,[handle,#w_children + lh_backwards] BLT %FT02 LDR R14,[handle,#w_flags] TST R14,#ws_open ; sibling pointers are garbage if window is not open MOVEQ handle,#nullptr BEQ %FT04 CMP R0,#9 LDREQ handle,[handle,#w_active_link + ll_forwards] LDRGT handle,[handle,#w_active_link + ll_backwards] 02 CMP handle,#nullptr LDRNE R14,[handle,#ll_forwards] ; if either forward or backward pointer is null, we're at the head entry (not a window) CMPNE R14,#nullptr LDRNE R14,[handle,#ll_backwards] CMPNE R14,#nullptr MOVEQ handle,#nullptr SUBNE handle,handle,#w_active_link 03 CMP handle,#nullptr Rel handle,handle,NE 04 STR handle,[sp] B ExitWimp 05 CMP R0,#7 LDREQ handle,activewinds + lh_forwards BEQ %BT02 CMP R0,#8 LDREQ handle,activewinds + lh_backwards BEQ %BT02 B ExitWimp ] extendjumptable B getspriteaddr B pushfontstring B callaswi B ExitWimp B ExitWimp2 B godrawicon B exitcicon B int_setcolour END