📄 lcdrle8.txt
字号:
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\lcdrle8.o --depend=.\Obj\lcdrle8.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\LCDRLE8.c]
THUMB
AREA ||i._DrawBitmap_RLE8||, CODE, READONLY, ALIGN=2
_DrawBitmap_RLE8 PROC
;;;47 */
;;;48 static void _DrawBitmap_RLE8(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) {
000000 e92d4fff PUSH {r0-r11,lr}
000004 b085 SUB sp,sp,#0x14
;;;49 LCD_PIXELINDEX aColorIndex[2];
;;;50 LCD_PIXELINDEX PixelIndex;
;;;51 int xi,y;
;;;52 int xL, yL;
;;;53 const U8 GUI_UNI_PTR * pPixelOrg = pPixel;
;;;54 char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS);
000006 4c72 LDR r4,|L1.464|
000008 4681 MOV r9,r0 ;48
00000a 7b23 LDRB r3,[r4,#0xc] ; GUI_Context
00000c 468a MOV r10,r1 ;48
;;;55 const LCD_PIXELINDEX* pTrans =NULL;
00000e f8ddb054 LDR r11,[sp,#0x54]
000012 f3430340 SBFX r3,r3,#1,#1 ;54
000016 e9dd6012 LDRD r6,r0,[sp,#0x48] ;53
00001a 2100 MOVS r1,#0
00001c 1c5b ADDS r3,r3,#1 ;54
;;;56 char IsMagnified = ((yMag | xMag) != 1);
00001e 9d14 LDR r5,[sp,#0x50]
000020 9101 STR r1,[sp,#4]
000022 9302 STR r3,[sp,#8]
000024 2101 MOVS r1,#1
000026 ea4b0305 ORR r3,r11,r5
00002a 4637 MOV r7,r6 ;53
00002c 2b01 CMP r3,#1
00002e d100 BNE |L1.50|
000030 2100 MOVS r1,#0
|L1.50|
;;;57 aColorIndex[0] = LCD_ACOLORINDEX[0];
000032 9100 STR r1,[sp,#0]
000034 4966 LDR r1,|L1.464|
000036 880b LDRH r3,[r1,#0] ; GUI_Context
;;;58 aColorIndex[1] = LCD_ACOLORINDEX[1];
000038 8849 LDRH r1,[r1,#2] ; GUI_Context
00003a f363020f BFI r2,r3,#0,#16
00003e f361421f BFI r2,r1,#16,#16
;;;59 /* Handle color translation */
;;;60 if ((pLogPal) && (pLogPal->pPalEntries)) {
000042 9203 STR r2,[sp,#0xc]
000044 b130 CBZ r0,|L1.84|
000046 6881 LDR r1,[r0,#8]
000048 b121 CBZ r1,|L1.84|
;;;61 if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) {
00004a f7fffffe BL LCD_GetpPalConvTable
00004e 9001 STR r0,[sp,#4]
000050 2800 CMP r0,#0
000052 d072 BEQ |L1.314|
|L1.84|
;;;62 return;
;;;63 }
;;;64 }
;;;65 /* Check if we can limit the number of lines due to clipping) */
;;;66 if (yMag == 1) {
000054 f1bb0f01 CMP r11,#1
000058 d10a BNE |L1.112|
;;;67 if (ysize > GUI_Context.ClipRect.y1 - y0 + 1)
00005a 485d LDR r0,|L1.464|
00005c 9a08 LDR r2,[sp,#0x20]
00005e f9b0100a LDRSH r1,[r0,#0xa] ; GUI_Context
000062 eba1000a SUB r0,r1,r10
000066 1c41 ADDS r1,r0,#1
000068 4291 CMP r1,r2
00006a da01 BGE |L1.112|
;;;68 ysize = GUI_Context.ClipRect.y1 - y0 + 1;
00006c 1c40 ADDS r0,r0,#1
00006e 9008 STR r0,[sp,#0x20]
|L1.112|
;;;69 }
;;;70 /* Init variables for looping */
;;;71 xi=0;
000070 2400 MOVS r4,#0
;;;72 y =0;
;;;73 /* Check if we can use the cache to save some unnecessary iterations */
;;;74 if (!IsMagnified) {
;;;75 int yDiff = GUI_Context.ClipRect.y0 - y0;
;;;76 if ((Cache.pPixelStart == pPixel) && (yDiff > Cache.y)) {
000072 4958 LDR r1,|L1.468|
000074 9800 LDR r0,[sp,#0] ;74
000076 4625 MOV r5,r4 ;72
000078 b968 CBNZ r0,|L1.150|
00007a 4855 LDR r0,|L1.464|
00007c f9b00006 LDRSH r0,[r0,#6] ;75 ; GUI_Context
000080 eba0020a SUB r2,r0,r10 ;75
000084 68c8 LDR r0,[r1,#0xc] ; Cache
000086 42b0 CMP r0,r6
000088 d105 BNE |L1.150|
00008a 6848 LDR r0,[r1,#4] ; Cache
00008c 4290 CMP r0,r2
00008e da02 BGE |L1.150|
;;;77 /* Accept cache values */
;;;78 y = Cache.y;
;;;79 xi = Cache.x;
;;;80 pPixel = Cache.pPixel;
000090 688e LDR r6,[r1,#8] ; Cache
000092 680c LDR r4,[r1,#0] ; Cache
000094 4605 MOV r5,r0 ;78
|L1.150|
;;;81 }
;;;82 }
;;;83 /* Init values for caching */
;;;84 Cache.pPixel = Cache.pPixelStart = pPixelOrg;
000096 494f LDR r1,|L1.468|
;;;85 Cache.x = Cache.y = 0;
000098 2000 MOVS r0,#0
00009a 60cf STR r7,[r1,#0xc] ;84 ; Cache
00009c e9c10701 STRD r0,r7,[r1,#4]
;;;86 /* Repeat until we have reached bottom */
;;;87 for (; y < ysize; ) {
0000a0 6008 STR r0,[r1,#0] ; Cache
0000a2 e088 B |L1.438|
|L1.164|
;;;88 U8 Cmd = *pPixel++;
0000a4 f8968000 LDRB r8,[r6,#0]
;;;89 U8 Data = *pPixel++;
0000a8 f8167f01 LDRB r7,[r6,#1]!
0000ac 1c76 ADDS r6,r6,#1
;;;90 if (Cmd) {
0000ae f1b80f00 CMP r8,#0
0000b2 d043 BEQ |L1.316|
;;;91 /* Save cache info */
;;;92 Cache.pPixel = pPixel-2;
0000b4 4847 LDR r0,|L1.468|
0000b6 1eb1 SUBS r1,r6,#2
;;;93 Cache.x = xi;
;;;94 Cache.y = y;
;;;95 LCD_ACOLORINDEX[1] = pTrans ? *(pTrans+Data) : Data;
0000b8 e9c04500 STRD r4,r5,[r0,#0]
0000bc 6081 STR r1,[r0,#8] ; Cache
0000be 9901 LDR r1,[sp,#4]
0000c0 4638 MOV r0,r7
0000c2 b109 CBZ r1,|L1.200|
0000c4 f8310017 LDRH r0,[r1,r7,LSL #1]
|L1.200|
0000c8 4941 LDR r1,|L1.464|
0000ca 8048 STRH r0,[r1,#2]
;;;96 while (Cmd) {
;;;97 int xi1 = xi+Cmd;
;;;98 if (xi1>=xsize)
;;;99 xi1 = xsize;
;;;100 Cmd -= (xi1-xi);
;;;101 if (Data || NoTrans) { /* Skip transparent pixels */
0000cc 9802 LDR r0,[sp,#8]
0000ce 4307 ORRS r7,r7,r0
0000d0 f8cd7010 STR.W r7,[sp,#0x10]
|L1.212|
0000d4 9807 LDR r0,[sp,#0x1c] ;98
0000d6 eb040708 ADD r7,r4,r8 ;97
0000da 4287 CMP r7,r0 ;98
0000dc db00 BLT |L1.224|
0000de 4607 MOV r7,r0 ;99
|L1.224|
0000e0 1b3a SUBS r2,r7,r4 ;100
0000e2 eba80002 SUB r0,r8,r2 ;100
0000e6 f00008ff AND r8,r0,#0xff ;100
0000ea 9804 LDR r0,[sp,#0x10]
0000ec b1d8 CBZ r0,|L1.294|
;;;102 if (IsMagnified) {
0000ee 9800 LDR r0,[sp,#0]
0000f0 2800 CMP r0,#0
;;;103 xL = xMag * xi + x0;
0000f2 4648 MOV r0,r9
0000f4 d00f BEQ |L1.278|
0000f6 9914 LDR r1,[sp,#0x50]
;;;104 yL = yMag * y + y0;
;;;105 LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1);
0000f8 f8ddc050 LDR r12,[sp,#0x50]
0000fc fb010004 MLA r0,r1,r4,r0 ;103
000100 fb0ba105 MLA r1,r11,r5,r10 ;104
000104 1e44 SUBS r4,r0,#1
000106 eb01030b ADD r3,r1,r11
00010a fb0c4202 MLA r2,r12,r2,r4
00010e 1e5b SUBS r3,r3,#1
000110 f7fffffe BL LCD_FillRect
000114 e007 B |L1.294|
|L1.278|
;;;106 } else {
;;;107 LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1);
000116 183a ADDS r2,r7,r0
000118 1e52 SUBS r2,r2,#1
00011a eb05010a ADD r1,r5,r10
00011e eb090004 ADD r0,r9,r4
000122 f7fffffe BL LCD_DrawHLine
|L1.294|
;;;108 }
;;;109 }
;;;110 xi =xi1;
;;;111 if (xi1==xsize) {
000126 9807 LDR r0,[sp,#0x1c]
000128 463c MOV r4,r7
00012a 4287 CMP r7,r0
00012c d101 BNE |L1.306|
;;;112 y++;
00012e 1c6d ADDS r5,r5,#1
;;;113 xi=0;
000130 2400 MOVS r4,#0
|L1.306|
000132 f1b80f00 CMP r8,#0 ;96
000136 d1cd BNE |L1.212|
000138 e03d B |L1.438|
|L1.314|
00013a e046 B |L1.458|
|L1.316|
;;;114 }
;;;115 }
;;;116 } else {
;;;117 do {
;;;118 U8 Index = *pPixel++;
00013c f8162b01 LDRB r2,[r6],#1
;;;119 if (Index || NoTrans) { /* Skip transparent pixels */
000140 9802 LDR r0,[sp,#8]
000142 4310 ORRS r0,r0,r2
000144 d02a BEQ |L1.412|
;;;120 int x = x0+xi;
;;;121 PixelIndex = pTrans ? *(pTrans+Index) : Index;
000146 9901 LDR r1,[sp,#4]
000148 eb090004 ADD r0,r9,r4 ;120
00014c b109 CBZ r1,|L1.338|
00014e f8312012 LDRH r2,[r1,r2,LSL #1]
|L1.338|
;;;122 if (IsMagnified) {
000152 9900 LDR r1,[sp,#0]
000154 b181 CBZ r1,|L1.376|
;;;123 LCD_SetColorIndex(PixelIndex);
000156 4610 MOV r0,r2
000158 f7fffffe BL LCD_SetColorIndex
;;;124 xL = xMag * xi + x0;
00015c 9914 LDR r1,[sp,#0x50]
;;;125 yL = yMag * y + y0;
;;;126 LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1);
00015e 9a14 LDR r2,[sp,#0x50]
000160 fb019004 MLA r0,r1,r4,r9 ;124
000164 fb0ba105 MLA r1,r11,r5,r10 ;125
000168 eb01030b ADD r3,r1,r11
00016c 4402 ADD r2,r2,r0
00016e 1e5b SUBS r3,r3,#1
000170 1e52 SUBS r2,r2,#1
000172 f7fffffe BL LCD_FillRect
000176 e011 B |L1.412|
|L1.376|
;;;127 } else {
;;;128 #if 1 /* High speed variant */
;;;129 if (y + y0>= GUI_Context.ClipRect.y0)
000178 4b15 LDR r3,|L1.464|
00017a eb05010a ADD r1,r5,r10
00017e f9b3c006 LDRSH r12,[r3,#6] ; GUI_Context
000182 4561 CMP r1,r12
000184 db0a BLT |L1.412|
;;;130 if (x >= GUI_Context.ClipRect.x0)
000186 f9b3c004 LDRSH r12,[r3,#4] ; GUI_Context
00018a 4584 CMP r12,r0
00018c dc06 BGT |L1.412|
;;;131 if (x <= GUI_Context.ClipRect.x1)
00018e f9b3c008 LDRSH r12,[r3,#8] ; GUI_Context
000192 4584 CMP r12,r0
000194 db02 BLT |L1.412|
;;;132 LCDDEV_L0_SetPixelIndex(x, y + y0, PixelIndex);
000196 6c9b LDR r3,[r3,#0x48] ; GUI_Context
000198 6a5b LDR r3,[r3,#0x24]
00019a 4798 BLX r3
|L1.412|
;;;133 #else
;;;134 LCD_SetPixelIndex(x, y + y0, PixelIndex);
;;;135 #endif
;;;136 }
;;;137 }
;;;138 if (++xi >= xsize) {
00019c 9807 LDR r0,[sp,#0x1c]
00019e 1c64 ADDS r4,r4,#1
0001a0 4284 CMP r4,r0
0001a2 db04 BLT |L1.430|
;;;139 xi=0; y++;
;;;140 if (y >= ysize)
0001a4 9808 LDR r0,[sp,#0x20]
0001a6 2400 MOVS r4,#0 ;139
0001a8 1c6d ADDS r5,r5,#1 ;139
0001aa 4285 CMP r5,r0
0001ac da03 BGE |L1.438|
|L1.430|
;;;141 break;
;;;142 }
;;;143 } while (--Data);
0001ae 1e7f SUBS r7,r7,#1
0001b0 f01707ff ANDS r7,r7,#0xff
0001b4 d1c2 BNE |L1.316|
|L1.438|
0001b6 9808 LDR r0,[sp,#0x20] ;87
0001b8 4285 CMP r5,r0 ;87
0001ba f6ffaf73 BLT |L1.164|
;;;144 }
;;;145 }
;;;146 LCD_ACOLORINDEX[0] = aColorIndex[0];
0001be 4804 LDR r0,|L1.464|
0001c0 9903 LDR r1,[sp,#0xc]
0001c2 8001 STRH r1,[r0,#0]
;;;147 LCD_ACOLORINDEX[1] = aColorIndex[1];
0001c4 9903 LDR r1,[sp,#0xc]
0001c6 0c09 LSRS r1,r1,#16
0001c8 8041 STRH r1,[r0,#2]
|L1.458|
;;;148 }
0001ca b009 ADD sp,sp,#0x24
0001cc e8bd8ff0 POP {r4-r11,pc}
;;;149
ENDP
|L1.464|
DCD GUI_Context
|L1.468|
DCD ||.bss||
AREA ||.bss||, DATA, NOINIT, ALIGN=2
Cache
% 16
AREA ||.constdata||, DATA, READONLY, ALIGN=2
GUI_BitmapMethodsRLE8
DCD _DrawBitmap_RLE8
DCD 0x00000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -