📄 guiaalib.txt
字号:
|L10.32|
DCD ||.data||
|L10.36|
DCD 0xffffc001
AREA ||i._DrawHLine||, CODE, READONLY, ALIGN=2
_DrawHLine PROC
;;;114 */
;;;115 static void _DrawHLine (int x0, int y, int x1) {
000000 e92d41f0 PUSH {r4-r8,lr}
000004 4604 MOV r4,r0
000006 460f MOV r7,r1
000008 4615 MOV r5,r2
;;;116 int x0Real, x1Real;
;;;117 /* Make sure there is something to do */
;;;118 if (x1<x0)
00000a 4282 CMP r2,r0
00000c db56 BLT |L11.188|
;;;119 return;
;;;120 /* Flush line if we are in an other pixel (real) line */
;;;121 if (y/GUI_Context.AA_Factor != _y) {
00000e f8df80b0 LDR r8,|L11.192|
000012 4e2c LDR r6,|L11.196|
000014 f898005c LDRB r0,[r8,#0x5c] ; GUI_Context
000018 68f1 LDR r1,[r6,#0xc] ; _y
00001a fb97f0f0 SDIV r0,r7,r0
00001e 4288 CMP r0,r1
000020 d006 BEQ |L11.48|
;;;122 _FlushLine();
000022 f7fffffe BL _FlushLine
;;;123 _y = y/GUI_Context.AA_Factor;
000026 f898105c LDRB r1,[r8,#0x5c] ; GUI_Context
00002a fb97f0f1 SDIV r0,r7,r1
00002e 60f0 STR r0,[r6,#0xc] ; _y
|L11.48|
;;;124 }
;;;125 x0Real = x0/GUI_Context.AA_Factor;
000030 f898005c LDRB r0,[r8,#0x5c] ; GUI_Context
;;;126 x1Real = x1/GUI_Context.AA_Factor;
;;;127 /* Handle used area (speed optimization for drawing) */
;;;128 if (x0Real < _x0_InUse)
000034 6932 LDR r2,[r6,#0x10] ; _x0_InUse
000036 fb94f3f0 SDIV r3,r4,r0 ;125
00003a fb95f1f0 SDIV r1,r5,r0 ;126
00003e 4293 CMP r3,r2
000040 da00 BGE |L11.68|
;;;129 _x0_InUse = x0Real;
000042 6133 STR r3,[r6,#0x10] ; _x0_InUse
|L11.68|
;;;130 if (x1Real > _x1_InUse)
000044 6972 LDR r2,[r6,#0x14] ; _x1_InUse
000046 4291 CMP r1,r2
000048 dd00 BLE |L11.76|
;;;131 _x1_InUse = x1Real;
00004a 6171 STR r1,[r6,#0x14] ; _x1_InUse
|L11.76|
;;;132 /* Clip (should not be necessary ... Just to be on the safe side ! */
;;;133 if (x0Real < _x0) {
00004c 6872 LDR r2,[r6,#4] ; _x0
00004e 4293 CMP r3,r2
000050 da01 BGE |L11.86|
;;;134 x0 = _x0 * GUI_Context.AA_Factor;
000052 fb00f402 MUL r4,r0,r2
|L11.86|
;;;135 }
;;;136 if (x1Real > _x1) {
000056 68b3 LDR r3,[r6,#8] ; _x1
000058 4299 CMP r1,r3
00005a dd03 BLE |L11.100|
;;;137 x1 = (_x1+1)*GUI_Context.AA_Factor-1;
00005c 1c5b ADDS r3,r3,#1
00005e fb00f503 MUL r5,r0,r3
000062 1e6d SUBS r5,r5,#1
|L11.100|
;;;138 }
;;;139 /* Make sure there is still something to do (after clipping) */
;;;140 if (x1<x0)
000064 42a5 CMP r5,r4
000066 db29 BLT |L11.188|
;;;141 return;
;;;142 /* Inc. hit counters in buffer */
;;;143 {
;;;144 int x0_Off = x0/GUI_Context.AA_Factor-_x0;
000068 fb94f1f0 SDIV r1,r4,r0
00006c 1a8b SUBS r3,r1,r2
;;;145 int x1_Off = x1/GUI_Context.AA_Factor-_x0;
00006e fb95f1f0 SDIV r1,r5,r0
000072 1a8f SUBS r7,r1,r2
;;;146 int iRem = x1_Off-x0_Off+1;
000074 1af9 SUBS r1,r7,r3
;;;147 U8 *pDest = pabAABuffer+x0_Off;
000076 6836 LDR r6,[r6,#0] ; pabAABuffer
000078 1c49 ADDS r1,r1,#1 ;146
;;;148 if (iRem ==1) {
00007a 2901 CMP r1,#1
00007c 441e ADD r6,r6,r3 ;147
00007e d104 BNE |L11.138|
;;;149 *(pDest) += x1-x0+1;
000080 7831 LDRB r1,[r6,#0]
000082 1b28 SUBS r0,r5,r4
000084 1c40 ADDS r0,r0,#1
000086 4408 ADD r0,r0,r1
000088 e017 B |L11.186|
|L11.138|
;;;150 } else {
;;;151 /* First Pixel */
;;;152 *pDest++ += ((x0_Off+_x0+1)*GUI_Context.AA_Factor-x0);
00008a 4413 ADD r3,r3,r2
00008c 1c5b ADDS r3,r3,#1
00008e 4343 MULS r3,r0,r3
000090 7830 LDRB r0,[r6,#0]
000092 1b1b SUBS r3,r3,r4
000094 4418 ADD r0,r0,r3
;;;153 /* Middle Pixels */
;;;154 for (;--iRem>1; ) {
000096 e003 B |L11.160|
|L11.152|
;;;155 *pDest++ +=GUI_Context.AA_Factor;
000098 7830 LDRB r0,[r6,#0]
00009a f898305c LDRB r3,[r8,#0x5c] ; GUI_Context
00009e 4418 ADD r0,r0,r3
|L11.160|
0000a0 1e49 SUBS r1,r1,#1 ;154
0000a2 f8060b01 STRB r0,[r6],#1 ;152
0000a6 2901 CMP r1,#1 ;154
0000a8 dcf6 BGT |L11.152|
;;;156 }
;;;157 /* Last Pixel */
;;;158 *pDest += (1+x1- (x1_Off+_x0) *GUI_Context.AA_Factor);
0000aa 18b8 ADDS r0,r7,r2
0000ac f898105c LDRB r1,[r8,#0x5c] ; GUI_Context
0000b0 7832 LDRB r2,[r6,#0]
0000b2 fb005011 MLS r0,r0,r1,r5
0000b6 1c40 ADDS r0,r0,#1
0000b8 4410 ADD r0,r0,r2
|L11.186|
0000ba 7030 STRB r0,[r6,#0] ;149
|L11.188|
;;;159 }
;;;160 }
;;;161 }
0000bc e8bd81f0 POP {r4-r8,pc}
;;;162
ENDP
|L11.192|
DCD GUI_Context
|L11.196|
DCD ||.data||
AREA ||i._FlushLine||, CODE, READONLY, ALIGN=2
_FlushLine PROC
;;;74 */
;;;75 static void _FlushLine(void) {
000000 e92d47f0 PUSH {r4-r10,lr}
;;;76 int i;
;;;77 int iEnd = _x1_InUse-_x0;
000004 f8df808c LDR r8,|L12.148|
;;;78 int IMax = GUI_Context.AA_Factor * GUI_Context.AA_Factor;
000008 f8df908c LDR r9,|L12.152|
00000c f8d83014 LDR r3,[r8,#0x14] ;77 ; _x1_InUse
000010 f8d80004 LDR r0,[r8,#4] ;77 ; _x0
000014 f899605c LDRB r6,[r9,#0x5c] ; GUI_Context
;;;79 for (i =_x0_InUse-_x0; i<=iEnd; i++) {
000018 f8d81010 LDR r1,[r8,#0x10] ; _x0_InUse
00001c 1a1f SUBS r7,r3,r0 ;77
00001e 4376 MULS r6,r6,r6 ;78
000020 1a0c SUBS r4,r1,r0
000022 e030 B |L12.134|
|L12.36|
;;;80 int Intens = *(pabAABuffer+i);
000024 f8d82000 LDR r2,[r8,#0] ; pabAABuffer
000028 4641 MOV r1,r8
00002a 5d10 LDRB r0,[r2,r4]
;;;81 if (Intens) {
00002c b350 CBZ r0,|L12.132|
;;;82 /* Check we can use line draw */
;;;83 if (Intens == IMax) {
00002e 42b0 CMP r0,r6
000030 d11a BNE |L12.104|
;;;84 int j;
;;;85 for (j=i; j<iEnd; ) {
000032 4625 MOV r5,r4
000034 e004 B |L12.64|
|L12.54|
;;;86 if (*(pabAABuffer+j+1) != IMax) {
000036 1950 ADDS r0,r2,r5
000038 7840 LDRB r0,[r0,#1]
00003a 42b0 CMP r0,r6
00003c d102 BNE |L12.68|
;;;87 break;
;;;88 }
;;;89 j++;
00003e 1c6d ADDS r5,r5,#1
|L12.64|
000040 42bd CMP r5,r7 ;85
000042 dbf8 BLT |L12.54|
|L12.68|
;;;90 }
;;;91 /* Draw the full pixel(s) */
;;;92 if (j!=i) {
000044 6848 LDR r0,[r1,#4] ; _x0
000046 42a5 CMP r5,r4
000048 d007 BEQ |L12.90|
;;;93 pLCD_HLPrev->pfDrawHLine(_x0+i, _y, _x0+j);
00004a 698b LDR r3,[r1,#0x18] ; pLCD_HLPrev
00004c 1942 ADDS r2,r0,r5
00004e 681b LDR r3,[r3,#0]
000050 4420 ADD r0,r0,r4
000052 68c9 LDR r1,[r1,#0xc] ; _y
000054 4798 BLX r3
;;;94 i = j; /*xxx*/
000056 462c MOV r4,r5
000058 e014 B |L12.132|
|L12.90|
;;;95 } else {
;;;96 LCD_HL_DrawPixel (_x0+i,_y);
00005a f8d92058 LDR r2,[r9,#0x58] ; GUI_Context
00005e 4420 ADD r0,r0,r4
000060 6852 LDR r2,[r2,#4]
000062 68c9 LDR r1,[r1,#0xc] ; _y
000064 4790 BLX r2
000066 e00d B |L12.132|
|L12.104|
;;;97 }
;;;98 } else {
;;;99 LCD_SetPixelAA(_x0+i,_y, (15*Intens+IMax/2)/IMax);
000068 ebc01000 RSB r0,r0,r0,LSL #4
00006c eb0672d6 ADD r2,r6,r6,LSR #31
000070 eb000062 ADD r0,r0,r2,ASR #1
000074 fb90f0f6 SDIV r0,r0,r6
000078 b2c2 UXTB r2,r0
00007a 6848 LDR r0,[r1,#4] ; _x0
00007c 68c9 LDR r1,[r1,#0xc] ; _y
00007e 4420 ADD r0,r0,r4
000080 f7fffffe BL LCD_SetPixelAA
|L12.132|
000084 1c64 ADDS r4,r4,#1 ;79
|L12.134|
000086 42bc CMP r4,r7 ;79
000088 ddcc BLE |L12.36|
;;;100 }
;;;101 }
;;;102 }
;;;103 _CleanLine();
00008a e8bd47f0 POP {r4-r10,lr}
00008e f7ffbffe B.W _CleanLine
;;;104 }
;;;105
ENDP
000092 0000 DCW 0x0000
|L12.148|
DCD ||.data||
|L12.152|
DCD GUI_Context
AREA ||.bss||, DATA, NOINIT, ALIGN=0
abAABuffer
% 320
AREA ||.data||, DATA, ALIGN=2
pabAABuffer
DCD 0x00000000
_x0
DCD 0x00000000
_x1
DCD 0x00000000
||_y||
DCD 0x00000000
_x0_InUse
DCD 0x00000000
_x1_InUse
DCD 0x00000000
pLCD_HLPrev
DCD 0x00000000
ClipRect_HL
% 8
DrawAPICopy
% 8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -