guiarc.txt
来自「STM32F103ZET6+UCOSII+UCGUI源码」· 文本 代码 · 共 643 行 · 第 1/2 页
TXT
643 行
AREA ||i._DrawArc||, CODE, READONLY, ALIGN=2
_DrawArc PROC
;;;79 */
;;;80 static void _DrawArc(int x0, int y0, int rx, int ry, int Angle0, int Angle1, int xMul, int yMul) {
000000 e92d4ff0 PUSH {r4-r11,lr}
000004 4606 MOV r6,r0
000006 b091 SUB sp,sp,#0x44
;;;81 float afx[4];
;;;82 float afy[4];
;;;83 float ri = rx-(GUI_Context.PenSize+1.5)/2;
000008 488c LDR r0,|L5.572|
00000a 460f MOV r7,r1 ;80
00000c 4614 MOV r4,r2 ;80
00000e 7d00 LDRB r0,[r0,#0x14] ; GUI_Context
000010 f8ddb068 LDR r11,[sp,#0x68]
000014 f8dd8074 LDR r8,[sp,#0x74]
000018 f7fffffe BL __aeabi_ui2d
00001c a288 ADR r2,|L5.576|
00001e ca0c LDM r2,{r2,r3}
000020 f7fffffe BL __aeabi_dadd
000024 f04f32ff MOV r2,#0xffffffff
000028 f7fffffe BL __ARM_scalbn
00002c 4682 MOV r10,r0
00002e 4689 MOV r9,r1
000030 4620 MOV r0,r4
000032 f7fffffe BL __aeabi_i2d
000036 460d MOV r5,r1
000038 4604 MOV r4,r0
00003a 464b MOV r3,r9
00003c 4652 MOV r2,r10
00003e f7fffffe BL __aeabi_dsub
000042 f7fffffe BL __aeabi_d2f
;;;84 float ro = rx+(GUI_Context.PenSize+1.5)/2;
000046 9008 STR r0,[sp,#0x20]
000048 4652 MOV r2,r10
00004a 464b MOV r3,r9
00004c 4620 MOV r0,r4
00004e 4629 MOV r1,r5
000050 f7fffffe BL __aeabi_dadd
000054 f7fffffe BL __aeabi_d2f
;;;85 float fAngle0 = Angle0*3.1415926/180;
000058 9007 STR r0,[sp,#0x1c]
00005a 4658 MOV r0,r11
00005c f7fffffe BL __aeabi_i2d
000060 a479 ADR r4,|L5.584|
000062 e9d42300 LDRD r2,r3,[r4,#0]
000066 f7fffffe BL __aeabi_dmul
00006a a579 ADR r5,|L5.592|
00006c e9d52300 LDRD r2,r3,[r5,#0]
000070 f7fffffe BL __aeabi_ddiv
000074 f7fffffe BL __aeabi_d2f
000078 4681 MOV r9,r0
;;;86 float fAngle1 = Angle1*3.1415926/180;
00007a 981b LDR r0,[sp,#0x6c]
00007c f7fffffe BL __aeabi_i2d
000080 cc0c LDM r4!,{r2,r3}
000082 f7fffffe BL __aeabi_dmul
000086 cd0c LDM r5!,{r2,r3}
000088 f7fffffe BL __aeabi_ddiv
00008c f7fffffe BL __aeabi_d2f
000090 4604 MOV r4,r0
;;;87 float sin0 = sin(fAngle0);
000092 4648 MOV r0,r9
000094 f7fffffe BL __aeabi_f2d
000098 468a MOV r10,r1
00009a 4605 MOV r5,r0
00009c f7fffffe BL ||sin||
0000a0 f7fffffe BL __aeabi_d2f
0000a4 4683 MOV r11,r0
;;;88 float sin1 = sin(fAngle1);
0000a6 4620 MOV r0,r4
0000a8 f7fffffe BL __aeabi_f2d
0000ac 4689 MOV r9,r1
0000ae 4604 MOV r4,r0
0000b0 f7fffffe BL ||sin||
0000b4 f7fffffe BL __aeabi_d2f
0000b8 9006 STR r0,[sp,#0x18]
0000ba 4628 MOV r0,r5
0000bc 4651 MOV r1,r10
;;;89 float cos0 = cos(fAngle0);
0000be f7fffffe BL ||cos||
0000c2 f7fffffe BL __aeabi_d2f
0000c6 9005 STR r0,[sp,#0x14]
0000c8 4620 MOV r0,r4
0000ca 4649 MOV r1,r9
;;;90 float cos1 = cos(fAngle1);
0000cc f7fffffe BL ||cos||
0000d0 f7fffffe BL __aeabi_d2f
;;;91 U32 ri2 = ri*ri;
0000d4 9908 LDR r1,[sp,#0x20]
0000d6 4604 MOV r4,r0 ;90
0000d8 4608 MOV r0,r1
0000da f7fffffe BL __aeabi_fmul
0000de f7fffffe BL __aeabi_f2uiz
;;;92 U32 ro2 = ro*ro;
0000e2 9907 LDR r1,[sp,#0x1c]
0000e4 9004 STR r0,[sp,#0x10]
0000e6 4608 MOV r0,r1
0000e8 f7fffffe BL __aeabi_fmul
0000ec f7fffffe BL __aeabi_f2uiz
;;;93 int y, yMax, yMin;
;;;94 afy[0] = ri*sin0;
0000f0 9003 STR r0,[sp,#0xc]
0000f2 4659 MOV r1,r11
0000f4 9808 LDR r0,[sp,#0x20]
0000f6 f7fffffe BL __aeabi_fmul
0000fa 4605 MOV r5,r0
;;;95 afy[1] = ro*sin0;
0000fc 9009 STR r0,[sp,#0x24]
0000fe 4659 MOV r1,r11
000100 9807 LDR r0,[sp,#0x1c]
000102 f7fffffe BL __aeabi_fmul
000106 4683 MOV r11,r0
;;;96 afy[2] = ri*sin1;
000108 9906 LDR r1,[sp,#0x18]
00010a 9808 LDR r0,[sp,#0x20]
00010c f7fffffe BL __aeabi_fmul
000110 4682 MOV r10,r0
;;;97 afy[3] = ro*sin1;
000112 e9dd1006 LDRD r1,r0,[sp,#0x18]
000116 f7fffffe BL __aeabi_fmul
;;;98 afx[0] = ri*cos0;
00011a 900a STR r0,[sp,#0x28]
00011c 9010 STR r0,[sp,#0x40] ;97
00011e 9905 LDR r1,[sp,#0x14]
000120 9808 LDR r0,[sp,#0x20]
000122 f7fffffe BL __aeabi_fmul
;;;99 afx[1] = ro*cos0;
000126 900b STR r0,[sp,#0x2c]
000128 9905 LDR r1,[sp,#0x14]
00012a 9807 LDR r0,[sp,#0x1c]
00012c f7fffffe BL __aeabi_fmul
;;;100 afx[2] = ri*cos1;
000130 900c STR r0,[sp,#0x30]
000132 4621 MOV r1,r4
000134 9808 LDR r0,[sp,#0x20]
000136 f7fffffe BL __aeabi_fmul
;;;101 afx[3] = ro*cos1;
00013a 900d STR r0,[sp,#0x34]
00013c 4621 MOV r1,r4
00013e 9807 LDR r0,[sp,#0x1c]
000140 f7fffffe BL __aeabi_fmul
000144 900e STR r0,[sp,#0x38]
000146 4628 MOV r0,r5
;;;102 yMin = ceil(afy[0]);
000148 f7fffffe BL __aeabi_f2d
00014c f7fffffe BL ceil
000150 f7fffffe BL __aeabi_d2iz
000154 4681 MOV r9,r0
;;;103 yMax = floor(afy[3]);
000156 9810 LDR r0,[sp,#0x40]
000158 f7fffffe BL __aeabi_f2d
00015c f7fffffe BL floor
000160 f7fffffe BL __aeabi_d2iz
;;;104 /* Use Clipping rect to reduce calculation (if possible) */
;;;105 if (GUI_Context.pClipRect_HL) {
000164 4935 LDR r1,|L5.572|
000166 6909 LDR r1,[r1,#0x10] ; GUI_Context
000168 b1e9 CBZ r1,|L5.422|
;;;106 if (yMul ==1) {
00016a f1b80f01 CMP r8,#1
00016e d10b BNE |L5.392|
;;;107 if (yMax > (GUI_Context.pClipRect_HL->y1 -y0))
000170 f9b12006 LDRSH r2,[r1,#6]
000174 1bd2 SUBS r2,r2,r7
000176 4282 CMP r2,r0
000178 da00 BGE |L5.380|
00017a 4610 MOV r0,r2
|L5.380|
;;;108 yMax = (GUI_Context.pClipRect_HL->y1 -y0);
;;;109 if (yMin < (GUI_Context.pClipRect_HL->y0 -y0))
00017c f9b12002 LDRSH r2,[r1,#2]
000180 1bd2 SUBS r2,r2,r7
000182 454a CMP r2,r9
000184 dd00 BLE |L5.392|
;;;110 yMin = (GUI_Context.pClipRect_HL->y0 -y0);
000186 4691 MOV r9,r2
|L5.392|
;;;111 }
;;;112 if (yMul == -1) {
000188 f1180201 ADDS r2,r8,#1
00018c d10b BNE |L5.422|
;;;113 if (yMin > (GUI_Context.pClipRect_HL->y1 -y0))
00018e f9b12006 LDRSH r2,[r1,#6]
000192 1bd2 SUBS r2,r2,r7
000194 454a CMP r2,r9
000196 da00 BGE |L5.410|
;;;114 yMin = (GUI_Context.pClipRect_HL->y1 -y0);
000198 4691 MOV r9,r2
|L5.410|
;;;115 if (yMax < (GUI_Context.pClipRect_HL->y0 -y0))
00019a f9b11002 LDRSH r1,[r1,#2]
00019e 1bc9 SUBS r1,r1,r7
0001a0 4281 CMP r1,r0
0001a2 dd00 BLE |L5.422|
0001a4 4608 MOV r0,r1
|L5.422|
;;;116 yMax = (GUI_Context.pClipRect_HL->y0 -y0);
;;;117 }
;;;118 }
;;;119 /* Start drawing lines ... */
;;;120 {
;;;121 int xMinDisp, xMaxDisp, xMin=0,xMax=0;
0001a6 2100 MOVS r1,#0
0001a8 9102 STR r1,[sp,#8]
;;;122 for (y=yMax; y>=yMin; y--) {
0001aa 4604 MOV r4,r0
0001ac 9101 STR r1,[sp,#4]
0001ae e040 B |L5.562|
|L5.432|
;;;123 _CalcX(&xMin, y, ri2);
0001b0 4621 MOV r1,r4
0001b2 a802 ADD r0,sp,#8
0001b4 9a04 LDR r2,[sp,#0x10]
0001b6 f7fffffe BL _CalcX
;;;124 _CalcX(&xMax, y, ro2);
0001ba 4621 MOV r1,r4
0001bc a801 ADD r0,sp,#4
0001be 9a03 LDR r2,[sp,#0xc]
0001c0 f7fffffe BL _CalcX
;;;125 if ((float)y< afy[1]) {
0001c4 4620 MOV r0,r4
0001c6 f7fffffe BL __aeabi_i2f
0001ca 4659 MOV r1,r11
0001cc 900f STR r0,[sp,#0x3c]
0001ce f7fffffe BL __aeabi_cfcmple
0001d2 d20b BCS |L5.492|
;;;126 xMaxDisp = _CalcInterSectLin(y,afy[0], afy[1], afx[0], afx[1]);
0001d4 9b0c LDR r3,[sp,#0x30]
0001d6 9300 STR r3,[sp,#0]
0001d8 465a MOV r2,r11
0001da 9b0b LDR r3,[sp,#0x2c]
0001dc 9909 LDR r1,[sp,#0x24]
0001de 980f LDR r0,[sp,#0x3c]
0001e0 f7fffffe BL _CalcInterSectLin
0001e4 f7fffffe BL __aeabi_f2iz
0001e8 4605 MOV r5,r0
0001ea e000 B |L5.494|
|L5.492|
;;;127 } else {
;;;128 xMaxDisp = xMax;
0001ec 9d01 LDR r5,[sp,#4]
|L5.494|
;;;129 }
;;;130 if ((float)y > afy[2]) {
0001ee 4651 MOV r1,r10
0001f0 980f LDR r0,[sp,#0x3c]
0001f2 f7fffffe BL __aeabi_cfrcmple
0001f6 d20a BCS |L5.526|
;;;131 xMinDisp = _CalcInterSectLin(y,afy[2], afy[3], afx[2], afx[3]);
0001f8 9b0e LDR r3,[sp,#0x38]
0001fa 9300 STR r3,[sp,#0]
0001fc 4651 MOV r1,r10
0001fe 9b0d LDR r3,[sp,#0x34]
000200 9a0a LDR r2,[sp,#0x28]
000202 980f LDR r0,[sp,#0x3c]
000204 f7fffffe BL _CalcInterSectLin
000208 f7fffffe BL __aeabi_f2iz
00020c e000 B |L5.528|
|L5.526|
;;;132 } else {
;;;133 xMinDisp = xMin;
00020e 9802 LDR r0,[sp,#8]
|L5.528|
;;;134 }
;;;135 if (xMul>0)
000210 991c LDR r1,[sp,#0x70]
000212 2900 CMP r1,#0
000214 dd04 BLE |L5.544|
;;;136 LCD_HL_DrawHLine(xMinDisp+x0, yMul*y+y0, xMaxDisp+x0);
000216 fb087104 MLA r1,r8,r4,r7
00021a 19aa ADDS r2,r5,r6
00021c 4430 ADD r0,r0,r6
00021e e003 B |L5.552|
|L5.544|
;;;137 else
;;;138 LCD_HL_DrawHLine(-xMaxDisp+x0, yMul*y+y0, -xMinDisp+x0);
000220 1a32 SUBS r2,r6,r0
000222 fb087104 MLA r1,r8,r4,r7
000226 1b70 SUBS r0,r6,r5
|L5.552|
000228 4b04 LDR r3,|L5.572|
00022a 6d9b LDR r3,[r3,#0x58] ; GUI_Context
00022c 681b LDR r3,[r3,#0]
00022e 4798 BLX r3
000230 1e64 SUBS r4,r4,#1 ;122
|L5.562|
000232 454c CMP r4,r9 ;122
000234 dabc BGE |L5.432|
;;;139 }
;;;140 }
;;;141 #if 0 /* Test code */
;;;142 {
;;;143 int i;
;;;144 GUI_SetColor( GUI_WHITE );
;;;145 for (i=0; i<4; i++)
;;;146 LCD_HL_DrawPixel(afx[i]+x0, afy[i]+y0);
;;;147 }
;;;148 #endif
;;;149 GUI_USE_PARA(ry);
;;;150 }
000236 b011 ADD sp,sp,#0x44
000238 e8bd8ff0 POP {r4-r11,pc}
;;;151
ENDP
|L5.572|
DCD GUI_Context
|L5.576|
000240 00000000
000244 3ff80000 DCFD 0x3ff8000000000000 ; 1.5
|L5.584|
000248 4d12d84a
00024c 400921fb DCFD 0x400921fb4d12d84a ; 3.1415926000000001
|L5.592|
000250 00000000
000254 40668000 DCFD 0x4066800000000000 ; 180
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?