;******************************** ;* * ;* DESKTOP ICON MANAGER * ;* * ;* Compile with flat assembler * ;* * ;******************************** ; 22.02.05 was modified for work with new multi-thread ICON. ; 8.03.07 70 by SPraid ;****************************************************************************** RAW_SIZE equ 350000 ICON_SIZE equ 32*32*3 GIF_SIZE equ 45000 REC_SIZE equ 80 ICONS_DAT equ '/sys/ICONS.DAT' ICON_APP equ '/sys/ICON' ICON_STRIP equ '/sys/ICONSTRP.GIF' use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd I_END ; size of image dd icon_data+0x30000 ; memory for app dd icon_data+0x30000 ; esp dd I_Param , 0x0 ; I_Param , I_Icon include '..\..\..\macros.inc' include 'lang.inc' COLOR_ORDER equ MENUETOS include 'gif_lite.inc' ;include 'debug.inc' purge newline ;****************************************************************************** START: ; start of execution mcall 70,finfo cmp ebx,GIF_SIZE ja close mov esi,gif_file mov edi,strip_file mov eax,icon_data call ReadGIF mov eax,dword[edi+4] shr eax,5 mov [icon_count],eax call load_ic boot_str: cmp [I_Param],dword 'BOOT' je load_icon_list2 call load_icon_list red: call draw_window ; at first, draw the window mov esi,[current_icon] jmp band still: mov eax,10 ; wait here for event mcall dec eax ; redraw request ? jz red dec eax ; key in buffer ? jz key button: ; button mov al,17 ; get id mcall shr eax,8 cmp eax,1 ; button id=1 ? je close noclose: mov esi,[current_icon] add esi,12 mov ebx,[cur_band];eax cmp eax,31 jne .no_back add ebx,8 mov eax,[icon_count] cmp eax,ebx jae .drwic2 xor ebx,ebx jmp .drwic2 .no_back: cmp eax,30 jne .no_side test ebx,ebx jnz .dec mov ebx,[icon_count] and ebx,0xfffffff8 add ebx,8 .dec: sub ebx,8 .drwic2: mov [cur_band],ebx .drwic1: call draw_icon jmp still .no_side: cmp eax,32 jne .no_ico push ebx mcall 37,1 pop ebx shr eax,16 sub eax,33-19 mov edi,34 xor edx,edx div edi lea ecx,[ebx+eax] cmp ecx,[icon_count] jae still mov [sel_icon1],eax mov ecx,eax add eax,ebx call itoa jmp .drwic1 .no_ico: cmp eax,11 jb no_str cmp eax,13 jg no_str call read_string jmp still no_str: cmp eax,21 ; apply changes jne no_apply ; (1) save list mov ebx,finfo ; Change by spraid mov dword[ebx],2 mov edx,REC_SIZE imul edx,dword [icons] mov [ebx+12],edx mov esi,iconlst call lst_path mov eax,70 mcall ; (2) terminate all icons mov eax,9 mov ebx,I_END or ecx,-1 mcall mov edi,[ebx+30] newread2: mov esi,1 newread: inc esi mov eax,9 mov ebx,I_END mov ecx,esi mcall cmp edi,[ebx+30] je newread cmp esi,eax jg all_terminated mov eax,[I_END+10] and eax,not 20202020h cmp eax,'@ICO' jz @f cmp eax,'ICON' jne newread @@: mov eax,51 cmp eax,[I_END+42] jne newread cmp eax,[I_END+46] jne newread mov eax,18 mov ebx,2 mov ecx,esi mcall jmp newread2 finfo_start: dd 7 dd 0 .params dd 0 dd 0 dd 0 db 0 dd finfo.path finfo: dd 0 dd 0 dd 0 dd GIF_SIZE dd gif_file .path: db ICON_STRIP,0 rb 31-($-.path) all_terminated: apply_changes: mov ebx, finfo_start mov dword [ebx+8], boot_str+6 mov esi, iconname call lst_path mov eax, 70 mcall jmp still no_apply: cmp eax,22 ; user pressed the 'add icon' button jne no_add_icon mov eax,4 mov ebx,24*65536+250+8*14 mov ecx,0xc0ff0000 mov edx,add_text mov edi,0xffffff mcall mov eax,10 mcall cmp eax,3 jne still mov eax,17 mcall shr eax,8 cmp eax,40 jb no_f mov edi,eax sub eax,40 xor edx,edx ; bcd -> 10 mov ebx,16 div ebx imul eax,10 add eax,edx mov ebx,eax add ebx,icons_reserved cmp [ebx],byte 'x' je no_f mov [ebx],byte 'x' mov [cur_btn],edi xor edx,edx mov ebx,10 div ebx add eax,65 add edx,65 mov [icon_default+0],dl mov [icon_default+1],al inc dword [icons] mov edi,[icons] dec edi imul edi,REC_SIZE add edi,icon_data mov [current_icon],edi mov esi,icon_default mov ecx,REC_SIZE cld rep movsb mov esi,[current_icon] jmp band no_f: call draw_btns;draw_window jmp still no_add_icon: cmp eax,23 ; user pressed the remove icon button jne no_remove_icon mov eax,4 mov ebx,24*65536+250+8*14 mov ecx,0xc0ff0000 mov edx,rem_text mov edi,0xffffff mcall mov eax,10 mcall cmp eax,3 jne no_f;ound mov eax,17 mcall shr eax,8 cmp eax,40 jb red;no_f;ound sub eax,40 xor edx,edx mov ebx,16 div ebx imul eax,10 add eax,edx mov ebx,eax add ebx,icons_reserved cmp [ebx],byte 'x' jne red mov [ebx],byte ' ' xor edx,edx mov ebx,10 div ebx shl eax,8 mov al,dl add eax,65*256+65 mov esi,icon_data mov edi,REC_SIZE imul edi,[icons] add edi,icon_data news: cmp word [esi],ax je foundi add esi,REC_SIZE cmp esi,edi jb news jmp red foundi: mov ecx,edi sub ecx,esi mov edi,esi add esi,REC_SIZE cld rep movsb dec [icons] mov eax,icon_data mov [current_icon],eax movzx ebx,word[eax] sub bx,'AA' shl bl,4 shr ebx,4 add ebx,40 mov [cur_btn],ebx jmp red no_remove_icon: cmp eax,40 ; user pressed button for icon position jb no_on_screen_button mov edi,eax sub eax,40 mov edx,eax shl eax,4 and edx,0xf mov dh,ah add edx,65*256+65 mov esi,icon_data mov ecx,[icons] cld findl1: cmp dx,[esi] je foundl1 add esi,REC_SIZE loop findl1 jmp still foundl1: mov [current_icon],esi mov [cur_btn],edi band: add esi,12 call atoi and eax,0xfffff8 mov [cur_band],eax call draw_btns jmp still no_on_screen_button: jmp still current_icon dd icon_data print_strings: pusha mov eax,13 ; clear text area mov ebx,100*65536+180 mov ecx,(278+12)*65536+40 mov edx,0xffffff mcall xor edi,edi mov eax,4 ; icon text mov ebx,100*65536+278+14 mov ecx,3 .ll: push ecx mov ecx,0x000000 mov edx,[current_icon] add edx,[positions+edi*4] movzx esi,byte[str_lens+edi] inc edi mcall add ebx,14 pop ecx loop .ll popa ret iconlst db ICONS_DAT,0 load_icon_list: mov edi,icons_reserved ; clear reserved area mov eax,32 mov ecx,10*9 cld rep stosb mov ecx,[icons] ; set used icons to reserved area mov esi,icon_data ldl1: movzx ebx,byte [esi+1] sub ebx,65 imul ebx,10 movzx eax,byte [esi] add ebx,eax sub ebx,65 add ebx,icons_reserved mov [ebx],byte 'x' add esi,REC_SIZE loop ldl1 ret lst_path: mov ecx,30 mov edi,finfo.path rep movsb ret load_ic: mov ebx,finfo mov dword[ebx+12],48*REC_SIZE mov dword[ebx+16],icon_data mov esi,iconlst call lst_path mcall 70 lea eax,[ebx+10] xor edx,edx mov ebx,REC_SIZE div ebx mov [icons],eax ret positions dd 3,16,47 str_lens db 8,30,30 read_string: pusha sub eax,11 movzx ecx,byte[str_lens+eax] mov [cur_str],ecx mov eax,[positions+eax*4] mov edi,[current_icon] add edi,eax mov [addr],edi add edi,ecx .l1: dec edi cmp byte[edi],' ' jne .found mov byte[edi],'_' loop .l1 dec edi .found: inc edi push edi call print_strings pop edi f11: mov eax,10 mcall cmp eax,2 jz fbu jmp rs_done fbu: mov eax,2 mcall shr eax,8 cmp eax,13 je rs_done cmp eax,8 jnz nobsl cmp edi,[addr] jz f11 dec edi mov [edi],byte '_' call print_strings jmp f11 nobsl: cmp eax,31 jbe f11 mov [edi],al call print_strings inc edi mov esi,[addr] add esi,[cur_str] cmp esi,edi jnz f11 rs_done: mov ecx,[addr] add ecx,[cur_str] sub ecx,edi mov eax,32 cld rep stosb call print_strings popa ret key: ; key mov al,2 ; just read it and ignore mcall jmp still ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW xor eax,eax mov ebx,210*65536+300 mov ecx,30*65536+390-14 mov edx,0x14ffffff mov edi,title ; WINDOW LABEL mcall mov eax,13 ; WINDOW AREA mov ebx,20*65536+260 mov ecx,35*65536+200 mov edx,0x3366cc mcall mov eax,38 ; VERTICAL LINE ON WINDOW AREA mov ebx,150*65536+150 mov ecx,35*65536+235 mov edx,0xffffff mcall mov eax,38 ; HOROZONTAL LINE ON WINDOW AREA mov ebx,20*65536+280 mov ecx,135*65536+135 mov edx,0xffffff mcall mov eax,8 ; TEXT ENTER BUTTONS mov ebx,20*65536+72 mov ecx,(275+1+14)*65536+13-2 mov edx,11 mov esi,[bcolor] mcall inc edx add ecx,14*65536 mcall inc edx add ecx,14*65536 mcall ; mov eax,8 ; APPLY AND SAVE CHANGES BUTTON mov ebx,20*65536+259 mov ecx,(329+2)*65536+15-4 mov edx,21 mov esi,[bcolor] mcall ; mov eax,8 ; ADD ICON BUTTON mov ebx,20*65536+129-2 add ecx,14*65536 inc edx mcall ; mov eax,8 ; REMOVE ICON BUTTON add ebx,(130+2)*65536 inc edx mcall mcall ,<20-14,8>,<260-23,32>,30+1 shl 30 ; IMAGE BUTTON inc edx add ebx,(36*7+26) shl 16 mcall add edx,1+1 shl 29 mov ebx,(33-19) shl 16+(34*8) mcall mcall 4,<23-15,273-24>,0,arrows,1 add ebx,(36*7+27)shl 16 add edx,2 mcall dec edx mcall ,<120,250> lea edx,[ebx+8 shl 16] mov ecx,[icon_count] mcall 47,0x30000,,,0 ;; mov eax,4 mov ebx,24*65536+250+14+14+14 mov ecx,0xffffff mov edx,text mov esi,47 newline: mov ecx,[edx] add edx,4 mcall add ebx,14 add edx,47 cmp [edx],byte 'x' jne newline draw_btns: ;; mov eax,0 ; DRAW BUTTONS ON WINDOW AREA mov ebx,20*65536+25 mov ecx,35*65536+19 mov edi,icon_table mov edx,40 newbline: cmp [edi],byte 'x' jne no_button mov esi,0x5577cc cmp [edi+90],byte 'x' jne nores mov esi,0xcc5555 cmp edx,[cur_btn] jne nores mov esi,0xe7e05a nores: push eax mov eax,8 mcall pop eax no_button: add ebx,26*65536 inc edi inc edx inc al cmp al,9 jbe newbline mov al,0 add edx,6 ror ebx,16 mov bx,20 ror ebx,16 add ecx,20*65536 inc ah cmp ah,8;9 jbe newbline call print_strings call draw_icon mov eax,12 ; function 12:tell os about windowdraw mov ebx,2 ; 2, end of draw mcall ret draw_icon: mcall 13,<33-20,34*8+2>,<260-24,37+15-2>,0xffffff mov esi,[current_icon] add esi,12 call atoi push eax cmp eax,[cur_band] jb .nou sub eax,[cur_band] cmp eax,7 ja .nou imul eax,34 shl 16 lea ebx,[eax+(33-19) shl 16] mov bx,34 mcall 13,,<236+35,3>,0xff0000 mov eax,[esp] .nou: mov eax,[cur_band] and eax,0xfffffff8 push eax imul eax,ICON_SIZE lea ebx,[strip_file+8+eax] mov ecx,8 mov edx,(33-18) shl 16+238 .nxt: push ecx mcall 7,,<32,32> pop ecx add ebx,ICON_SIZE add edx,34 shl 16 loop .nxt mcall 4,<45,280-2>,0,rep_text,rep_text_len-rep_text lea edx,[ebx+(8*5)shl 16] pop ecx mcall 47,0x30000,,,0xff add ecx,7 add edx,(3*8+4)shl 16 mcall mov ecx,[icon_count] add edx,(5*8+4)shl 16 mcall pop ecx add edx,(10*8+4)shl 16 mcall ,,,,0xff0000 ret ; DATA AREA bcolor dd 0x335599 icon_table: times 4 db 'xxxx xxxx' times 2 db ' ' times 1 db ' ' times 2 db 'xxxx xxxx' ; times 1 db ' ' icons_reserved: times 9 db ' ' if lang eq ru text: db 255,255,255,0, ' ' db 255,255,255,0, ' ' db 255,255,255,0, ' ' db 255,255,255,0, ' ' db 255,255,255,0, ' ' db 0,0,0,0, ' ' db 'x' ; <- END MARKER, DONT DELETE add_text db ' ',0 rem_text db ' ',0 title db ' ',0 else if lang eq ge text: db 255,255,255,0, ' TITLE ' db 255,255,255,0, ' APP NAME ' db 255,255,255,0, ' PARAMETER ' db 255,255,255,0, ' ANWENDEN ' db 255,255,255,0, ' HINZUFUEGEN ENTFERNEN ' db 0,0,0,0, 'AUF BUTTON KLICKEN, UM ICON ZU EDITIEREN ' db 'x' ; <- END MARKER, DONT DELETE add_text db 'AUF UNBENUTZTE ICONPOSITION KLICKEN ',0 rem_text db 'ICON ANKLICKEN; DAS GELOESCHT WERDEN SOLL ',0 title db 'Icon Manager',0 else text: db 255,255,255,0, ' TITLE ' db 255,255,255,0, ' APP NAME ' db 255,255,255,0, ' PARAMETERS ' db 255,255,255,0, ' APPLY CHANGES ' db 255,255,255,0, ' ADD ICON REMOVE ICON ' db 0,0,0,0, 'CLICK BUTTON ON ICON POSITION FOR EDIT ' db 'x' ; <- END MARKER, DONT DELETE add_text db 'CLICK ON A NOT USED POSITION ',0 rem_text db 'CLICK ICON POSITION; YOU WANT TO DELETE ',0 title db 'Icon Manager',0 end if arrows db '' iconname: db ICON_APP,0 icon_default: db 'AA-SYSXTREE-000-/RD/1/SYSXTREE ' db '- *' db 13,10 rep_text: if lang eq ru db ' - , #' else db 'ICONS - OF , SELECTED' end if rep_text_len: ;////////////////////////// get_bg_info: mov eax,39 mov ebx,4 mcall mov [bgrdrawtype],eax mov eax,39 ; get background size mov ebx,1 mcall mov [bgrxy],eax mov ebx,eax shr eax,16 and ebx,0xffff mov [bgrx],eax mov [bgry],ebx ret calc_icon_pos: movzx eax,byte [ebp-20] ; x position sub eax,'A' ;eax - number of letter cmp eax,4 jg no_left shl eax,6 ;imul eax,64 add eax,16 movzx ebx,[warea.left] add eax,ebx jmp x_done no_left: sub eax,9 sal eax,6 ;imul eax,64 sub eax,16+52-1 movzx ebx,[warea.right] add eax,ebx x_done: mov [ebp-12],eax movzx eax,byte [ebp-20+1] ; y position sub eax,'A' ; eax - number of letter cmp eax,4 jg no_up shl eax,6 ;imul eax,80 add eax,16 movzx ebx,[warea.top] add eax,ebx jmp y_done no_up: sub eax,9 shl eax,6 ;imul eax,80 sub eax,16-1 movzx ebx,[warea.bottom] add eax,ebx y_done: mov [ebp-8],eax ret ;START2: load_icon_list2: call get_bg_info mcall 48,5 mov [warea.by_x],eax mov [warea.by_y],ebx mov eax,14 mcall add eax,0x00010001 mov [scrxy],eax apply_changes2: mov edi,[icons] mov esi,icon_data mov ebp,0x5000 ; threads stack starting point start_new: mov eax,[esi] mov [ebp-20],eax call calc_icon_pos mov eax,51 mov ebx,1 mov ecx,thread mov edx,ebp mov dword[ebp-4],esi mcall add ebp,0x100 mov eax,5 mov ebx,1 wait_thread_start: ;wait until thread draw itself first time cmp [create_thread_event],bl jz wait_thread_end mcall jmp wait_thread_start wait_thread_end: dec [create_thread_event] ;reset event add esi,REC_SIZE dec edi jnz start_new close: or eax,-1 mcall thread: ; pop ebp ;ebp - address of our icon sub esp,12 mov ebp,esp sub esp,16 call draw_window2 mov [create_thread_event],1 mov eax,40 mov ebx,010101b mcall still2: mov eax,10 mcall cmp eax,1 je red2 cmp eax,3 je button2 call get_bg_info mov eax,5 mov ebx,1 call draw_icon2 jmp still2 red2: mcall 14 add eax,0x00010001 mov [scrxy],eax mcall 48,5 mov [warea.by_x],eax mov [warea.by_y],ebx add ebp,+12 call calc_icon_pos add ebp,-12 mcall 9,I_END,-1 mov eax,[I_END+process_information.box.left] cmp eax,[ebp+0] jne @f mov eax,[I_END+process_information.box.top] cmp eax,[ebp+4] je .lp1 @@: call get_bg_info mcall 67,[ebp+0],[ebp+4],51,51 .lp1: call draw_window2 jmp still2 button2: mov al,17 mcall mov esi,[ebp+8] mov ebx,1 mov edi,finfo.path call fill_paths inc ebx mov edi,param_str mov dword[finfo_start+8],edi call fill_paths cmp byte[edi],0 jne .no0 and dword[finfo_start+8],0 .no0: mov ebx,finfo_start mov eax,70 mcall jmp still2 fill_paths: push esi edi ; dps '>' movzx ecx,byte[str_lens+ebx] add esi,[positions+ebx*4] push esi add esi,ecx .l1: dec esi cmp byte[esi],' ' jnz .found loop .l1 pop esi jmp .noms .found: lea ecx,[esi+1] pop esi sub ecx,esi rep movsb .noms: and byte[edi],0 ; call debug_outstr ; dps <'<',13,10> pop edi esi ret atoi: push esi xor eax,eax xor ebx,ebx .nxt: lodsb cmp al,'0' jb .done cmp al,'9' ja .done sub eax,'0' imul ebx,10 add ebx,eax jmp .nxt .done: pop esi mov eax,ebx ret itoa: add esi,2 mov ebx,10 mov ecx,3 .l0: xor edx,edx div ebx add dl,'0' mov [esi],dl dec esi loop .l0 ret draw_picture: mov [image],0x3000 mov edi,[ebp+8] lea esi,[edi+12] call atoi cmp eax,[icon_count] ja toponly.ex imul eax,(32*3*32) lea edi,[eax+strip_file+8] xor ebx,ebx xor ecx,ecx mov esi,edi;strip_file+8+(32*3*32)*2 mov [pixpos],0 newb: push ebx push ecx cmp ebx,10 jb yesbpix cmp ebx,42 jge yesbpix cmp ecx,31;2 jg yesbpix push esi mov esi,edi add esi,[pixpos] no_correction_pixpos: add [pixpos],3 mov eax,[esi] and eax,0xffffff pop esi cmp eax,0 je yesbpix cmp eax,0xfffcff ;f5f5f5 je yesbpix jmp nobpix yesbpix: stretch: cmp [bgrdrawtype],dword 2 jne nostretch mov eax,[ebp+4] add eax,ecx imul eax,[bgry] cdq movzx ebx,word [scrxy] div ebx imul eax,[bgrx] push eax mov eax,[ebp+0] add eax,[esp+8] imul eax,[bgrx] cdq movzx ebx,word [scrxy+2] div ebx add eax,[esp] add esp,4 jmp notiled nostretch: cmp [bgrdrawtype],dword 1 jne notiled mov eax,[ebp+4] add eax,ecx cdq movzx ebx,word [bgrxy] div ebx mov eax,edx imul eax,[bgrx] push eax mov eax,[ebp+0] add eax,[esp+8] movzx ebx,word [bgrxy+2] cdq div ebx mov eax,edx add eax,[esp] add esp,4 notiled: lea ecx,[eax+eax*2] mov eax,39 mov ebx,2 mcall nobpix: pop ecx pop ebx mov edx,eax mov eax,[image] mov [eax],edx mov [eax],dl inc eax ror edx,8 mov [eax],dl inc eax ror edx,8 mov [eax],dl inc eax mov [image],eax inc ebx mov eax,[yw] inc eax cmp ebx,eax jnz newb xor ebx,ebx inc ecx mov eax,[ya] add [pixpos],eax cmp [top],1 jne notop cmp ecx,38 je toponly notop: cmp ecx,52 jnz newb toponly: mov eax,7 mov ebx,0x3000 mov ecx,52 shl 16 + 52 xor edx,edx mcall .ex: mov [load_pic],0 ret draw_text: mov esi,[ebp+8] add esi,3 push edi mov edi,title mov ecx,8 cld rep movsb pop edi mov eax,title news2: cmp [eax],byte 33 jb founde inc eax cmp eax,title+8;11 jb news2 founde: sub eax,title mov [tl],eax mov eax,[tl] lea eax,[eax+eax*2] ; eax *= char_width/2 shl eax,16 mov ebx,27*65536+40 sub ebx,eax mov eax,4 xor ecx,ecx ; black shade of text mov edx,title mov esi,[tl] add ebx,1 shl 16 ;*65536+1 mcall inc ebx mcall add ebx,1 shl 16 mcall inc ebx mcall sub ebx,1 shl 16 mcall dec ebx sub ebx,1 shl 16 mcall sub ebx,1 shl 16 dec ebx mcall dec ebx add ebx,1 shl 16 mcall inc ebx mov ecx,0xffffff mcall mov [draw_pic],0 ret ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window2: mov eax,12 ; function 12:tell os about windowdraw mov ebx,1 ; 1, start of draw mcall ; DRAW WINDOW xor eax,eax ; function 0 : define and draw window mov ebx,[ebp+0-2] mov ecx,[ebp+4-2] add ebx,[yw] ; [x start] *65536 + [x size] add ecx,51 ; [y start] *65536 + [y size] mov edx,0x01000000 ; color of work area RRGGBB,8->color gl mcall mov eax,8 ; button mov ebx,51 mov ecx,50 mov edx,0x40000001 mcall mov eax,5 mov ebx,1 draw_icon2: xchg [load_pic],bl test bl,bl je draw_icon_end mcall jmp draw_icon2 draw_icon_end: mov eax,5 mov ebx,1 draw_icon_2: xchg [draw_pic],bl test bl,bl je draw_icon_end_2 mcall jmp draw_icon_2 draw_icon_end_2: mov eax,9 mov ebx,process_table mov ecx,-1 mcall call draw_picture call draw_text mov eax,12 mov ebx,2 mcall ret tl dd 8 yw dd 51 ya dd 0 cur_btn dd 40 draw_pic db 0 load_pic db 0 create_thread_event db 0 image dd 0x3000 I_Param: icon_data = I_END+0x1400 process_table = I_END+0x2400 bgrx dd ? bgry dd ? param_str rb 31 ;////////////////////////// bgrxy dd ? warea: .by_x: .right dw ? .left dw ? .by_y: .bottom dw ? .top dw ? scrxy dd ? bgrdrawtype dd ? pixpos dd ? top dd ? icons dd ? addr dd ? cur_str dd ? cur_band dd ? sel_icon1 rd 1 icon_count rd 1 gif_file rb GIF_SIZE strip_file rb RAW_SIZE IncludeUGlobals I_END: