📄 gui_dispstringinrect.txt
字号:
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\gui_dispstringinrect.o --depend=.\Obj\gui_dispstringinrect.d --device=DARMSTM --apcs=interwork -O3 -I..\..\include -I..\..\..\FWLib\library\inc -I..\..\..\USBLib\library\inc -I..\..\Config -I..\..\GUI\Core -I..\..\GUI\Font -I..\..\GUI\ConvertColor -I..\..\GUI\AntiAlias -I..\..\GUI\ConvertMono -I..\..\GUI\JPEG -I..\..\GUI\MemDev -I..\..\GUI\MultiLayer -I..\..\GUI\Widget -I..\..\GUI\WM -IC:\Keil\ARM\INC\ST\STM32F10x ..\..\GUI\Core\GUI_DispStringInRect.c]
THUMB
AREA ||i.GUI_DispStringInRect||, CODE, READONLY, ALIGN=1
GUI_DispStringInRect PROC
;;;144 */
;;;145 void GUI_DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign) {
000000 f64773ff MOV r3,#0x7fff
;;;146 GUI_DispStringInRectMax(s, pRect, TextAlign, 0x7fff);
000004 f7ffbffe B.W GUI_DispStringInRectMax
;;;147 }
;;;148
ENDP
AREA ||i.GUI_DispStringInRectMax||, CODE, READONLY, ALIGN=1
GUI_DispStringInRectMax PROC
;;;106 #if (GUI_WINSUPPORT)
;;;107 void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign, int MaxLen) {
000000 e92d41fc PUSH {r2-r8,lr}
000004 0005 MOVS r5,r0
000006 460e MOV r6,r1
000008 4617 MOV r7,r2
00000a 4698 MOV r8,r3
;;;108 if (s) {
00000c d017 BEQ |L2.62|
;;;109 const GUI_RECT *pOldClipRect = NULL;
00000e 2400 MOVS r4,#0
;;;110 GUI_RECT r;
;;;111 GUI_LOCK();
;;;112 if (pRect) {
000010 b166 CBZ r6,|L2.44|
;;;113 pOldClipRect = WM_SetUserClipRect(pRect);
000012 4630 MOV r0,r6
000014 f7fffffe BL WM_SetUserClipRect
000018 0004 MOVS r4,r0
;;;114 if (pOldClipRect) {
00001a d007 BEQ |L2.44|
;;;115 GUI__IntersectRects(&r, pRect, pOldClipRect);
00001c 4622 MOV r2,r4
00001e 4631 MOV r1,r6
000020 4668 MOV r0,sp
000022 f7fffffe BL GUI__IntersectRects
;;;116 WM_SetUserClipRect(&r);
000026 4668 MOV r0,sp
000028 f7fffffe BL WM_SetUserClipRect
|L2.44|
;;;117 }
;;;118 }
;;;119 GUI__DispStringInRect(s, pRect, TextAlign, MaxLen);
00002c 4643 MOV r3,r8
00002e 463a MOV r2,r7
000030 4631 MOV r1,r6
000032 4628 MOV r0,r5
000034 f7fffffe BL GUI__DispStringInRect
;;;120 WM_SetUserClipRect(pOldClipRect);
000038 4620 MOV r0,r4
00003a f7fffffe BL WM_SetUserClipRect
|L2.62|
;;;121 GUI_UNLOCK();
;;;122 }
;;;123 }
00003e e8bd81fc POP {r2-r8,pc}
;;;124
ENDP
AREA ||i.GUI__DispStringInRect||, CODE, READONLY, ALIGN=2
GUI__DispStringInRect PROC
;;;36 */
;;;37 void GUI__DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign, int MaxNumChars) {
000000 e92d4fff PUSH {r0-r11,lr}
000004 b085 SUB sp,sp,#0x14
;;;38 GUI_RECT r;
;;;39 GUI_RECT rLine;
;;;40 int y = 0;
000006 2400 MOVS r4,#0
000008 460e MOV r6,r1 ;37
00000a 4691 MOV r9,r2 ;37
00000c 469a MOV r10,r3 ;37
;;;41 const char GUI_UNI_PTR *sOrg =s;
;;;42 int FontYSize;
;;;43 int xLine = 0;
00000e 4625 MOV r5,r4
;;;44 int LineLen;
;;;45 int NumCharsRem; /* Number of remaining characters */
;;;46 FontYSize = GUI_GetFontSizeY();
000010 f8ddb014 LDR r11,[sp,#0x14]
000014 f7fffffe BL GUI_GetFontSizeY
000018 4680 MOV r8,r0
;;;47 if (pRect) {
00001a b12e CBZ r6,|L3.40|
;;;48 r = *pRect;
00001c 2208 MOVS r2,#8
00001e 4631 MOV r1,r6
000020 a803 ADD r0,sp,#0xc
000022 f7fffffe BL __aeabi_memcpy
000026 e002 B |L3.46|
|L3.40|
;;;49 } else {
;;;50 GUI_GetClientRect(&r);
000028 a803 ADD r0,sp,#0xc
00002a f7fffffe BL GUI_GetClientRect
|L3.46|
;;;51 }
;;;52 /* handle vertical alignment */
;;;53 if ((TextAlign & GUI_TA_VERTICAL) == GUI_TA_TOP) {
00002e f0190f0c TST r9,#0xc
000032 d102 BNE |L3.58|
;;;54 y = r.y0;
000034 f9bd400e LDRSH r4,[sp,#0xe]
000038 e029 B |L3.142|
|L3.58|
;;;55 } else {
;;;56 int NumLines;
;;;57 /* Count the number of lines */
;;;58 for (NumCharsRem = MaxNumChars, NumLines = 1; NumCharsRem ;NumLines++) {
00003a 4657 MOV r7,r10
00003c 2601 MOVS r6,#1
00003e e010 B |L3.98|
|L3.64|
;;;59 LineLen = GUI__GetLineNumChars(s, NumCharsRem);
000040 4639 MOV r1,r7
000042 9805 LDR r0,[sp,#0x14]
000044 f7fffffe BL GUI__GetLineNumChars
;;;60 NumCharsRem -= LineLen;
000048 1a3f SUBS r7,r7,r0
;;;61 s += GUI_UC__NumChars2NumBytes(s, LineLen);
00004a 4601 MOV r1,r0
00004c 9805 LDR r0,[sp,#0x14]
00004e f7fffffe BL GUI_UC__NumChars2NumBytes
000052 9905 LDR r1,[sp,#0x14]
000054 4408 ADD r0,r0,r1
;;;62 if (GUI__HandleEOLine(&s))
000056 9005 STR r0,[sp,#0x14]
000058 a805 ADD r0,sp,#0x14
00005a f7fffffe BL GUI__HandleEOLine
00005e b910 CBNZ r0,|L3.102|
000060 1c76 ADDS r6,r6,#1 ;58
|L3.98|
000062 2f00 CMP r7,#0 ;58
000064 d1ec BNE |L3.64|
|L3.102|
;;;63 break;
;;;64 }
;;;65 /* Do the vertical alignment */
;;;66 switch (TextAlign & GUI_TA_VERTICAL) {
000066 f009000c AND r0,r9,#0xc
00006a 2804 CMP r0,#4
00006c d013 BEQ |L3.150|
00006e 2808 CMP r0,#8
000070 d011 BEQ |L3.150|
000072 280c CMP r0,#0xc
000074 d10b BNE |L3.142|
;;;67 case GUI_TA_BASELINE:
;;;68 case GUI_TA_BOTTOM:
;;;69 y = r.y1 -NumLines * FontYSize+1;
;;;70 break;
;;;71 case GUI_TA_VCENTER:
;;;72 y = r.y0+(r.y1-r.y0+1 -NumLines * FontYSize) /2;
000076 f9bd1012 LDRSH r1,[sp,#0x12]
00007a f9bd000e LDRSH r0,[sp,#0xe]
00007e 1a0a SUBS r2,r1,r0
000080 fb062118 MLS r1,r6,r8,r2
000084 1c49 ADDS r1,r1,#1
000086 eb0171d1 ADD r1,r1,r1,LSR #31
00008a eb000461 ADD r4,r0,r1,ASR #1
|L3.142|
;;;73 break;
;;;74 }
;;;75 }
;;;76 /* Output string */
;;;77 for (NumCharsRem = MaxNumChars, s = sOrg; NumCharsRem;) {
00008e 4656 MOV r6,r10
000090 f8cdb014 STR r11,[sp,#0x14]
000094 e04c B |L3.304|
|L3.150|
000096 f9bd1012 LDRSH r1,[sp,#0x12] ;69
00009a fb061418 MLS r4,r6,r8,r1 ;69
00009e 1c64 ADDS r4,r4,#1 ;69
0000a0 e7f5 B |L3.142|
|L3.162|
;;;78 int xLineSize;
;;;79 LineLen = GUI__GetLineNumChars(s, NumCharsRem);
0000a2 4631 MOV r1,r6
0000a4 9805 LDR r0,[sp,#0x14]
0000a6 f7fffffe BL GUI__GetLineNumChars
0000aa 4607 MOV r7,r0
;;;80 NumCharsRem -= LineLen;
0000ac 1a36 SUBS r6,r6,r0
;;;81 xLineSize = GUI__GetLineDistX(s, LineLen);
0000ae 4601 MOV r1,r0
0000b0 9805 LDR r0,[sp,#0x14]
0000b2 f7fffffe BL GUI__GetLineDistX
;;;82 switch (TextAlign & GUI_TA_HORIZONTAL) {
0000b6 f0190103 ANDS r1,r9,#3
0000ba d00e BEQ |L3.218|
0000bc 2901 CMP r1,#1
0000be d00f BEQ |L3.224|
0000c0 2902 CMP r1,#2
0000c2 d111 BNE |L3.232|
;;;83 case GUI_TA_HCENTER:
;;;84 xLine = r.x0+(r.x1-r.x0-xLineSize)/2; break;
0000c4 f9bd1010 LDRSH r1,[sp,#0x10]
0000c8 f9bd200c LDRSH r2,[sp,#0xc]
0000cc 1a89 SUBS r1,r1,r2
0000ce 1a09 SUBS r1,r1,r0
0000d0 eb0171d1 ADD r1,r1,r1,LSR #31
0000d4 eb020561 ADD r5,r2,r1,ASR #1
0000d8 e006 B |L3.232|
|L3.218|
;;;85 case GUI_TA_LEFT:
;;;86 xLine = r.x0; break;
0000da f9bd500c LDRSH r5,[sp,#0xc]
0000de e003 B |L3.232|
|L3.224|
;;;87 case GUI_TA_RIGHT:
;;;88 xLine = r.x1 -xLineSize + 1;
0000e0 f9bd1010 LDRSH r1,[sp,#0x10]
0000e4 1a0d SUBS r5,r1,r0
0000e6 1c6d ADDS r5,r5,#1
|L3.232|
;;;89 }
;;;90 rLine.x0 = GUI_Context.DispPosX = xLine;
0000e8 4914 LDR r1,|L3.316|
;;;91 rLine.x1 = rLine.x0 + xLineSize-1;
0000ea 1e40 SUBS r0,r0,#1
0000ec 844d STRH r5,[r1,#0x22] ;90
0000ee 4428 ADD r0,r0,r5
0000f0 f8ad0008 STRH r0,[sp,#8]
0000f4 f8ad5004 STRH r5,[sp,#4] ;90
;;;92 rLine.y0 = GUI_Context.DispPosY = y;
0000f8 848c STRH r4,[r1,#0x24]
;;;93 rLine.y1 = y + FontYSize-1;
0000fa eb040008 ADD r0,r4,r8
0000fe 1e40 SUBS r0,r0,#1
000100 f8ad000a STRH r0,[sp,#0xa]
000104 f8ad4006 STRH r4,[sp,#6] ;92
;;;94 GUI__DispLine(s, LineLen, &rLine);
000108 aa01 ADD r2,sp,#4
00010a 4639 MOV r1,r7
00010c 9805 LDR r0,[sp,#0x14]
00010e f7fffffe BL GUI__DispLine
;;;95 s += GUI_UC__NumChars2NumBytes(s, LineLen);
000112 4639 MOV r1,r7
000114 9805 LDR r0,[sp,#0x14]
000116 f7fffffe BL GUI_UC__NumChars2NumBytes
00011a 9905 LDR r1,[sp,#0x14]
00011c 4408 ADD r0,r0,r1
;;;96 y += GUI_GetFontDistY();
00011e 9005 STR r0,[sp,#0x14]
000120 f7fffffe BL GUI_GetFontDistY
000124 4404 ADD r4,r4,r0
;;;97 if (GUI__HandleEOLine(&s))
000126 a805 ADD r0,sp,#0x14
000128 f7fffffe BL GUI__HandleEOLine
00012c 2800 CMP r0,#0
00012e d101 BNE |L3.308|
|L3.304|
000130 2e00 CMP r6,#0 ;77
000132 d1b6 BNE |L3.162|
|L3.308|
;;;98 break;
;;;99 }
;;;100 }
000134 b009 ADD sp,sp,#0x24
000136 e8bd8ff0 POP {r4-r11,pc}
;;;101
ENDP
00013a 0000 DCW 0x0000
|L3.316|
DCD GUI_Context
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -