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 + -
显示快捷键?