📄 gui_fillpolygon.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_fillpolygon.o --depend=.\Obj\gui_fillpolygon.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_FillPolygon.c]
THUMB
AREA ||i.GL_FillPolygon||, CODE, READONLY, ALIGN=2
GL_FillPolygon PROC
;;;207 */
;;;208 void GL_FillPolygon (const GUI_POINT*paPoint, int NumPoints, int xOff, int yOff) {
000000 e92d4ffe PUSH {r1-r11,lr}
000004 4606 MOV r6,r0
;;;209 int i, y;
;;;210 int yMin = GUI_YMAX;
000006 f64074ff MOV r4,#0xfff
;;;211 int yMax = GUI_YMIN;
00000a 4260 RSBS r0,r4,#0
00000c 4689 MOV r9,r1 ;208
00000e 4617 MOV r7,r2 ;208
000010 469a MOV r10,r3 ;208
;;;212 /* First step : find uppermost and lowermost coordinates */
;;;213 for (i=0; i<NumPoints; i++) {
000012 2100 MOVS r1,#0
000014 9001 STR r0,[sp,#4]
000016 e00b B |L1.48|
|L1.24|
;;;214 y = (paPoint + i)->y;
000018 eb060081 ADD r0,r6,r1,LSL #2
00001c f9b00002 LDRSH r0,[r0,#2]
;;;215 if (y < yMin)
000020 42a0 CMP r0,r4
000022 da00 BGE |L1.38|
;;;216 yMin = y;
000024 4604 MOV r4,r0
|L1.38|
;;;217 if (y > yMax)
000026 9a01 LDR r2,[sp,#4]
000028 4290 CMP r0,r2
00002a dd00 BLE |L1.46|
;;;218 yMax = y;
00002c 9001 STR r0,[sp,#4]
|L1.46|
00002e 1c49 ADDS r1,r1,#1 ;213
|L1.48|
000030 4549 CMP r1,r9 ;213
000032 dbf1 BLT |L1.24|
;;;219 }
;;;220 /* Use Clipping rect to reduce calculation (if possible) */
;;;221 if (GUI_Context.pClipRect_HL) {
000034 4861 LDR r0,|L1.444|
000036 6900 LDR r0,[r0,#0x10] ; GUI_Context
000038 b170 CBZ r0,|L1.88|
;;;222 if (yMax > (GUI_Context.pClipRect_HL->y1 - yOff))
00003a f9b02006 LDRSH r2,[r0,#6]
00003e eba2010a SUB r1,r2,r10
000042 9a01 LDR r2,[sp,#4]
000044 4291 CMP r1,r2
000046 da00 BGE |L1.74|
;;;223 yMax = (GUI_Context.pClipRect_HL->y1 - yOff);
000048 9101 STR r1,[sp,#4]
|L1.74|
;;;224 if (yMin < (GUI_Context.pClipRect_HL->y0 - yOff))
00004a f9b01002 LDRSH r1,[r0,#2]
00004e eba1000a SUB r0,r1,r10
000052 42a0 CMP r0,r4
000054 dd00 BLE |L1.88|
;;;225 yMin = (GUI_Context.pClipRect_HL->y0 - yOff);
000056 4604 MOV r4,r0
|L1.88|
;;;226 }
;;;227 /* Second step: Calculate and draw horizontal lines */
;;;228 for (y=yMin; y<=yMax; y++) {
;;;229 _Init();
;;;230 /* find next intersection and count lines*/
;;;231 for (i=0; i<NumPoints; i++) {
;;;232 int i1 = (i < (NumPoints - 1)) ? i + 1 : 0;
000058 f1a90001 SUB r0,r9,#1
00005c 9002 STR r0,[sp,#8] ;228
00005e e0a7 B |L1.432|
|L1.96|
000060 f04f0800 MOV r8,#0 ;228
000064 f8dfb158 LDR r11,|L1.448|
000068 4645 MOV r5,r8 ;231
00006a f8cb8000 STR r8,[r11,#0] ;231 ; GL_FP_Cnt
00006e e07e B |L1.366|
|L1.112|
000070 9902 LDR r1,[sp,#8]
000072 4640 MOV r0,r8
000074 428d CMP r5,r1
000076 da00 BGE |L1.122|
000078 1c68 ADDS r0,r5,#1
|L1.122|
;;;233 int y0 = (paPoint + i )->y;
00007a eb060185 ADD r1,r6,r5,LSL #2
00007e f9b13002 LDRSH r3,[r1,#2]
000082 468c MOV r12,r1
;;;234 int y1 = (paPoint + i1)->y;
000084 eb060e80 ADD lr,r6,r0,LSL #2
000088 f9be1002 LDRSH r1,[lr,#2]
;;;235 /* Check if starting point is on line */
;;;236 if (y0 == y) {
00008c 42a3 CMP r3,r4
00008e 460a MOV r2,r1 ;234
000090 d138 BNE |L1.260|
;;;237 if (y1 == y) { /* Add the entire line */
000092 42a1 CMP r1,r4
000094 d112 BNE |L1.188|
000096 4a49 LDR r2,|L1.444|
;;;238 _DrawHLine((paPoint + i )->x + xOff , y + yOff, (paPoint + i1)->x + xOff);
000098 f9361025 LDRSH r1,[r6,r5,LSL #2]
00009c f9360020 LDRSH r0,[r6,r0,LSL #2]
0000a0 6d92 LDR r2,[r2,#0x58] ; GUI_Context
0000a2 eb010c07 ADD r12,r1,r7
0000a6 4438 ADD r0,r0,r7
0000a8 6813 LDR r3,[r2,#0]
0000aa eb04010a ADD r1,r4,r10
0000ae 4584 CMP r12,r0
0000b0 da02 BGE |L1.184|
0000b2 4602 MOV r2,r0
0000b4 4660 MOV r0,r12
0000b6 e023 B |L1.256|
|L1.184|
0000b8 4662 MOV r2,r12
0000ba e021 B |L1.256|
|L1.188|
;;;239 } else { /* Add only one point */
;;;240 int yPrev = _GetPrevPointDiffy(paPoint, i, NumPoints, y);
0000bc 4628 MOV r0,r5
0000be 2200 MOVS r2,#0
0000c0 e00b B |L1.218|
|L1.194|
0000c2 1e43 SUBS r3,r0,#1
0000c4 b908 CBNZ r0,|L1.202|
0000c6 f1a90301 SUB r3,r9,#1
|L1.202|
0000ca 4618 MOV r0,r3
0000cc eb060383 ADD r3,r6,r3,LSL #2
0000d0 f9b33002 LDRSH r3,[r3,#2]
0000d4 42a3 CMP r3,r4
0000d6 d104 BNE |L1.226|
0000d8 1c52 ADDS r2,r2,#1
|L1.218|
0000da 9b02 LDR r3,[sp,#8]
0000dc 429a CMP r2,r3
0000de dbf0 BLT |L1.194|
0000e0 4623 MOV r3,r4
|L1.226|
;;;241 if (yPrev != y) {
0000e2 42a3 CMP r3,r4
0000e4 d042 BEQ |L1.364|
;;;242 _AddPoint((paPoint + i)->x, y, yPrev - y, y1 - y, xOff, yOff);
0000e6 1b1a SUBS r2,r3,r4
0000e8 f9360025 LDRSH r0,[r6,r5,LSL #2]
0000ec 1b09 SUBS r1,r1,r4
0000ee 404a EORS r2,r2,r1
0000f0 d43a BMI |L1.360|
0000f2 4a32 LDR r2,|L1.444|
0000f4 4438 ADD r0,r0,r7
0000f6 6d92 LDR r2,[r2,#0x58] ; GUI_Context
0000f8 eb04010a ADD r1,r4,r10
0000fc 6813 LDR r3,[r2,#0]
0000fe 4602 MOV r2,r0
|L1.256|
000100 4798 BLX r3
000102 e033 B |L1.364|
|L1.260|
;;;243 }
;;;244 }
;;;245 } else if (y1 != y) { /* Ignore if end-point is on the line */
000104 42a1 CMP r1,r4
000106 d031 BEQ |L1.364|
;;;246 if (((y1 >= y) && (y0 <= y)) || ((y0 >= y) && (y1 <= y))) {
000108 db01 BLT |L1.270|
00010a 42a3 CMP r3,r4
00010c dd03 BLE |L1.278|
|L1.270|
00010e 42a3 CMP r3,r4
000110 db2c BLT |L1.364|
000112 42a1 CMP r1,r4
000114 dc2a BGT |L1.364|
|L1.278|
000116 4661 MOV r1,r12
000118 4293 CMP r3,r2
00011a dc09 BGT |L1.304|
00011c 4618 MOV r0,r3
00011e 42a3 CMP r3,r4
000120 dc24 BGT |L1.364|
000122 42a2 CMP r2,r4
000124 db22 BLT |L1.364|
000126 f9b1c000 LDRSH r12,[r1,#0]
00012a f9be1000 LDRSH r1,[lr,#0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -