( Compression format gif. Version 1.30 du 27 Octobre 2002. Ecrit par jpb.forth . ) TELECHARGEMENT ( Logiciel experimental d'etude de l'algorithme de compression utilise dans les fichiers d'images au format GIF89a 1, 4 et 8 bits. ) DECIMAL FIND XMODEM_OUVRE 0= HERE ] >R DUP IF ." Il faut compiler 'xmodem.txt' avant ce programme. " THEN R> >HERE IF ABORT THEN EXIT [ DUP EXECUTE FORGET V_NPA 1 VARIABLE V_NPA : NPA ( - --> n nombre pseudoaleatoire de 1 a 2047 ) V_NPA DUP >R @ DUP DUP 4/ XOR 1 AND 11 LSH + 2/ DUP R> ! ; FIND MEMOIRE_ALLOUE 0= NOT CONSTANT MEMOIRE HERE 258 2/ ALLOT CONSTANT GIF_TAMPON 0 VARIABLE GIF_NB_COULEURS 0 VARIABLE GIF_NB_BITS 0 VARIABLE GIF_IND_BITS 0 VARIABLE GIF_TABLE 0 VARIABLE GIF_CODE 0 VARIABLE GIF_LARGEUR 0 VARIABLE GIF_HAUTEUR 0 VARIABLE GIF_ALGO 0 VARIABLE GIF_CHAINE 0 VARIABLE GIF_LIGNE 0 VARIABLE GIF_TRACE 0 VARIABLE NB_IMAGES " Image algorithme no 1 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_1 " Image algorithme no 2 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_2 " Image algorithme no 3 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_3 " Image algorithme no 4 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_4 " Image algorithme no 5 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_5 " Image algorithme no 6 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_6 " Image algorithme no 7 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_7 " Image algorithme no 8 Mini-systeme FORTH avec 68000 http://jpb.forth.free.fr/" STRING S_COMMENTAIRE_8 HERE BIN 00000110000000000110000000000000 2, 00011110000000000000000000110000 2, 0110000000000000 , 00000000011011100110111000000000 2, 00110011001111100101111001111100 2, 0110111000000000 , 00001111011100110111001100000000 2, 00110000011000110011001100110000 2, 0111001100000000 , 00000110011000110110001100000000 2, 01111100011000110011000000110000 2, 0110001100000000 , 00000110011100110111001100000000 2, 00110000011000110011000000110011 2, 0110001100000000 , 00000110011011100110111000011000 2, 00110000001111100111100000011110 2, 0110001100000000 , 01100110011000000000000000000000 2, 00000000000000000000000000000000 2, 0000000000000000 , 00111100011001111111111111111111 2, 11111111111111111111111111111111 2, 1111111100000000 , CONSTANT SIGNATURE DECIMAL ( : GIF_EXTRAIT_CODE ( - --> code, tampon_vide ) ( GIF_IND_BITS DUP >R @ DUP >R DUP 7 AND >R -3 LSH GIF_TAMPON + DUP >R 2+ C@ 8 LSH R@ 1+ C@ 255 AND + 8 LSH R> C@ 255 AND + R> NEGATE LSH 1 GIF_NB_BITS @ DUP >R LSH 1- AND R> DUP R> + DUP R> ! + 2039 > ; ) : GIF_CONCATENE ( code --> - ) GIF_IND_BITS DUP >R @ DUP >R DUP -3 LSH GIF_TAMPON + >R 7 AND DUP >R LSH 1 R> LSH 1- R@ C@ AND OVER OR R@ C! -8 LSH DUP R@ 1+ C! -8 LSH R> 2+ C! GIF_NB_BITS @ R> + DUP R> ! 2039 > IF 255 XMODEM_OCTET_EMET DROP GIF_TAMPON DUP 255+ OVER DO I C@ XMODEM_OCTET_EMET DROP LOOP DUP >R 255+ R> 3 CMOVE 2040 GIF_IND_BITS -! THEN ; : GIF_INIT GIF_TABLE 2@ DUP [ 5449 6 * LITERAL ] + SWAP DO -1 I ! 6 +LOOP 1 GIF_NB_COULEURS @ DUP 1 = - DUP 1+ GIF_NB_BITS ! LSH 2+ GIF_CODE ! ; : GIF_CHERCHE ( chaine --> chaine, index_table ) DUP -14 LSH OVER 255 AND 14 GIF_NB_COULEURS @ - LSH XOR DUP 2/ + DUP IF DUP [ 5449 6 * LITERAL ] - ELSE -6 THEN ( chaine, index, decalage ) GIF_TABLE 2@ >R BEGIN OVER R@ + @ 0< IF -1 ELSE OVER R@ + 2+ 2@ 4 PICK = IF -1 ELSE DUP >R + DUP 0< IF [ 5449 6 * LITERAL ] + THEN R> 0 THEN THEN UNTIL DROP R> + ; : GIF_ENTETE ( entete "GIF89a" ) 71 XMODEM_OCTET_EMET DROP 73 XMODEM_OCTET_EMET DROP 70 XMODEM_OCTET_EMET DROP 56 XMODEM_OCTET_EMET DROP 57 XMODEM_OCTET_EMET DROP 97 XMODEM_OCTET_EMET DROP ( largeur ecran 16 bits PC ) GIF_LARGEUR @ XMODEM_OCTET_EMET DROP GIF_LARGEUR @ -8 LSH XMODEM_OCTET_EMET DROP ( hauteur ecran 16 bits PC ) GIF_HAUTEUR @ XMODEM_OCTET_EMET DROP GIF_HAUTEUR @ -8 LSH XMODEM_OCTET_EMET DROP ( descriptif 1+3+1+3 bits 0xF7 ) 15 4 LSH GIF_NB_COULEURS @ 1- + XMODEM_OCTET_EMET DROP ( couleur du fond 8 bits ) 0 XMODEM_OCTET_EMET DROP ( dx/dy 8 bits 0x31 ) 49 XMODEM_OCTET_EMET DROP ; : GIF_COMMENTAIRE ( adresse --> - ) 33 XMODEM_OCTET_EMET DROP 254 XMODEM_OCTET_EMET DROP COUNT 1+ >R 1- DUP R> + SWAP DO I C@ XMODEM_OCTET_EMET DROP LOOP 0 XMODEM_OCTET_EMET DROP ; : GIF_DEBUT_IMAGE ( caractere "," 0x2C ) 44 XMODEM_OCTET_EMET DROP ( decalage x 16 bits PC ) 0 XMODEM_OCTET_EMET DROP 0 XMODEM_OCTET_EMET DROP ( decalage y 16 bits PC ) 0 XMODEM_OCTET_EMET DROP 0 XMODEM_OCTET_EMET DROP ( largeur image 16 bits PC ) GIF_LARGEUR @ XMODEM_OCTET_EMET DROP GIF_LARGEUR @ -8 LSH XMODEM_OCTET_EMET DROP ( hauteur image 16 bits PC ) GIF_HAUTEUR @ XMODEM_OCTET_EMET DROP GIF_HAUTEUR @ -8 LSH XMODEM_OCTET_EMET DROP ( descriptif 1+1+1+2+3 bits 0x00 ) 0 XMODEM_OCTET_EMET DROP ( largeur code ) GIF_NB_COULEURS @ DUP 1 = - XMODEM_OCTET_EMET DROP ; : GIF_COMPRIME ( caractere --> - ) GIF_CHAINE DUP >R 2@ 16 LSH + GIF_CODE @ IF GIF_CHERCHE DUP @ DUP 0< IF ( chaine, index_table, -1 ) DROP >R DUP SWAB GIF_CONCATENE DUP R@ 2+ 2! GIF_CODE DUP @ DUP R> ! 1+ DUP 1 GIF_NB_BITS @ LSH > IF DUP 4096 > IF DROP 1 GIF_NB_COULEURS @ DUP 1 = - LSH GIF_CONCATENE 0 ELSE 1 GIF_NB_BITS +! THEN THEN SWAP ! ELSE >R DROP DROP R> THEN ELSE GIF_INIT DUP SWAB GIF_CONCATENE GIF_CHERCHE >R DUP R@ 2+ 2! GIF_CODE DUP @ DUP R> ! 1+ SWAP ! THEN R> 2! ; : GIF_FIN_IMAGE ( paquet vide 8 bits ˆ 0 ) 0 XMODEM_OCTET_EMET DROP ( caractere ";" 0x3B ) 59 XMODEM_OCTET_EMET DROP ; HEX : GIF_EXTENSION_ANIMATION 21 XMODEM_OCTET_EMET DROP FF XMODEM_OCTET_EMET DROP 0B XMODEM_OCTET_EMET DROP 4E XMODEM_OCTET_EMET DROP 45 XMODEM_OCTET_EMET DROP 54 XMODEM_OCTET_EMET DROP 53 XMODEM_OCTET_EMET DROP 43 XMODEM_OCTET_EMET DROP 41 XMODEM_OCTET_EMET DROP 50 XMODEM_OCTET_EMET DROP 45 XMODEM_OCTET_EMET DROP 32 XMODEM_OCTET_EMET DROP 2E XMODEM_OCTET_EMET DROP 30 XMODEM_OCTET_EMET DROP 03 XMODEM_OCTET_EMET DROP 01 XMODEM_OCTET_EMET DROP 00 XMODEM_OCTET_EMET DROP 00 XMODEM_OCTET_EMET DROP 00 XMODEM_OCTET_EMET DROP ; DECIMAL : GIFS ( generation d'image au format gif ) MEMOIRE IF 65536 MEMOIRE_ALLOUE ?DUP IF GIF_TABLE 2! ELSE ." **** Memoire INSUFFISANTE !" CR ABORT THEN ELSE HERE GIF_TABLE 2! THEN BEGIN ( Choix du type de fichier ) ." 1 - image (256*256 en 256 couleurs) 2 - courbe (640*480 en 16 couleurs) 3 - animation (400*300 en noir et blanc) 4 - sortir Choisir un type de fichier ( 1 a 4 ) : " 0 BEGIN DROP BELL KEY 48- DUP 1 < OVER 4 > OR NOT UNTIL DUP 48+ EMIT CR CASE 1 OF 256 GIF_LARGEUR ! 256 GIF_HAUTEUR ! 8 GIF_NB_COULEURS ! BEGIN ( Choix de l'image. ) ." 1 - ! ! ! ! 2 - / / / / 3 - / / / / 4 - ) ) ) ) ! ! ! ! / / / / < < < < / / / / ! ! ! ! / / / / \ \ \ \ / / / / ! ! ! ! / / / / > > > > / / / /" ." 5 - ) ) ) ) 6 - ) ) ) ) 7 - ) ) ) ) < < < < < < < < ( ( ( ( ) ) ) ) > > > > ) ) ) ) < < < < ( ( ( ( ( ( ( ( Choisir un algorithme ( 1 a 7 ) : " 0 BEGIN DROP BELL KEY 48- DUP 1 < OVER 7 > OR NOT UNTIL DUP 48+ EMIT GIF_ALGO ! CR 0 XMODEM_OUVRE DROP GIF_ENTETE ( palette r-v-b ) 1 GIF_NB_COULEURS @ LSH 0 DO I 4* XMODEM_OCTET_EMET DROP I XMODEM_OCTET_EMET DROP I 2* XMODEM_OCTET_EMET DROP LOOP ( commentaire ) GIF_ALGO @ CASE 1 OF S_COMMENTAIRE_1 ENDOF 2 OF S_COMMENTAIRE_2 ENDOF 3 OF S_COMMENTAIRE_3 ENDOF 4 OF S_COMMENTAIRE_4 ENDOF 5 OF S_COMMENTAIRE_5 ENDOF 6 OF S_COMMENTAIRE_6 ENDOF S_COMMENTAIRE_7 ENDCASE GIF_COMMENTAIRE GIF_DEBUT_IMAGE ( paquets LZW ) 1 GIF_NB_COULEURS @ DUP 1+ GIF_NB_BITS ! 0 DUP GIF_IND_BITS ! GIF_CODE ! LSH GIF_CONCATENE GIF_HAUTEUR @ 0 DO I GIF_ALGO @ CASE 1 OF DROP 0 ENDOF 2 OF ENDOF 3 OF DUP >R 63 AND R> 64 AND IF NEGATE 64+ THEN ENDOF 4 OF DUP 256 */ ENDOF 5 OF DUP >R 63 AND R> 64 AND IF NEGATE 64+ THEN DUP 64 */ ENDOF 6 OF DUP >R 63 AND R@ 64 AND IF NEGATE 64+ THEN DUP 64 */ R> 128 AND IF NEGATE THEN ENDOF DUP >R 63 AND R@ 64 AND IF 64- THEN DUP 64 */ R> 64+ 128 AND IF NEGATE 128+ THEN ENDCASE 255 AND I GIF_HAUTEUR @ 12- < NOT IF I GIF_HAUTEUR @ 4- < IF 2147483648+ THEN THEN GIF_LARGEUR @ 0 DO DUP I + OVER 0< IF I GIF_LARGEUR @ 76- < NOT IF SIGNATURE J GIF_HAUTEUR @ 12- - DUP 4* + 2* + I GIF_LARGEUR @ 76- - DUP >R -3 LSH + C@ 1 R> 7 AND 7 XOR LSH AND IF COM THEN THEN THEN 255 AND I J OR IF GIF_COMPRIME ELSE GIF_CHAINE 2! THEN LOOP DROP LOOP GIF_CHAINE 2@ GIF_CONCATENE 1 GIF_NB_COULEURS @ LSH 1+ GIF_CONCATENE GIF_IND_BITS @ ?DUP IF 7+ -3 LSH DUP XMODEM_OCTET_EMET DROP GIF_TAMPON DUP >R + R> DO I C@ XMODEM_OCTET_EMET DROP LOOP THEN GIF_FIN_IMAGE XMODEM_FERME ." Une autre image ? " BEGIN BELL KEY DUP 79 = OVER 111 = OR IF DROP ." Oui" 0 -1 ELSE DUP 78 = SWAP 110 = OR IF ." Non" -1 -1 ELSE 0 THEN THEN UNTIL CR UNTIL ENDOF 2 OF 640 GIF_LARGEUR ! 480 GIF_HAUTEUR ! 4 GIF_NB_COULEURS ! GIF_TABLE 2@ 5449 6 * + DUP GIF_TRACE 2! GIF_LARGEUR @ 1+ 2* + GIF_LIGNE 2! BEGIN ( Choix de la courbe. ) ." 1 - y = x 2 - y = x^2 3 - y = 1/x 4 - y = 1/x^2 Choisir un algorithme ( 1 a 4 ) : " 0 BEGIN DROP BELL KEY 48- DUP 1 < OVER 4 > OR NOT UNTIL DUP 48+ EMIT GIF_ALGO ! CR 0 XMODEM_OUVRE DROP GIF_ENTETE ( palette r-v-b ) 1 GIF_NB_COULEURS @ LSH 0 DO I 8 AND -3 LSH 85 * DUP I 4 AND 4/ 170 * + XMODEM_OCTET_EMET DROP DUP I 2 AND 2/ 170 * + XMODEM_OCTET_EMET DROP DUP I 1 AND 170 * + XMODEM_OCTET_EMET DROP DROP LOOP ( commentaire ) GIF_ALGO @ CASE 1 OF S_COMMENTAIRE_1 ENDOF 2 OF S_COMMENTAIRE_2 ENDOF 3 OF S_COMMENTAIRE_3 ENDOF S_COMMENTAIRE_4 ENDCASE GIF_COMMENTAIRE GIF_DEBUT_IMAGE ( paquets LZW ) 1 GIF_NB_COULEURS @ DUP 1+ GIF_NB_BITS ! 0 DUP GIF_IND_BITS ! GIF_CODE ! LSH GIF_CONCATENE GIF_HAUTEUR @ GIF_LARGEUR @ GIF_TRACE 2@ OVER 1+ 0 DO 3 PICK I 4 PICK 2/ - GIF_ALGO @ CASE 1 OF ENDOF 2 OF DUP 64 */ ENDOF 3 OF ?DUP IF 4096 SWAP / ELSE 32767 THEN ENDOF 4 OF ?DUP IF 4096 64 ROT DUP * */ ELSE 32767 THEN ENDOF ENDCASE DUP 32767 = IF SWAP DROP ELSE OVER 2/ + - 32767 MIN -32768 MAX THEN OVER I 2* + ! LOOP 3 PICK 0 DO GIF_LIGNE 2@ I 5 PICK 16- < IF 3 PICK 5 PICK 2/ I = IF 1 FILL ELSE 5 PICK 2/ I - 64 MOD 0= IF 3 FILL ELSE 7 FILL THEN THEN ELSE 3 PICK -4 LSH 0 DO DUP I 4 LSH + 16 I 15 AND FILL LOOP DROP THEN GIF_LIGNE 2@ OVER @ I - 4 PICK 0 DO 3 PICK I 1+ 2* + @ J - SWAP OVER J + 32767 = OVER J + 32767 = OR IF DROP -1 ELSE ?DUP IF OVER 0< OVER 0> AND >R 0< OVER 0> AND R> OR IF 10 3 PICK C! 0 ELSE -1 THEN ELSE 10 3 PICK C! 0 THEN THEN IF 4 PICK 2/ I = IF 1 3 PICK C! ELSE 4 PICK 2/ I - 64 MOD 0= IF 3 3 PICK C! THEN THEN THEN J 6 PICK 12- < NOT IF J 6 PICK 4- < IF I 5 PICK 76- < NOT IF SIGNATURE J 7 PICK 12- - DUP 4* + 2* + I 6 PICK 76- - DUP >R -3 LSH + C@ 1 R> 7 AND 7 XOR LSH AND IF OVER DUP >R C@ 15 XOR R> C! THEN THEN THEN THEN >R 1+ R> LOOP DROP DROP GIF_LIGNE 2@ 3 PICK I IF 0 ELSE OVER C@ 255 AND GIF_CHAINE 2! >R 1+ R> 1 THEN DO DUP C@ 255 AND GIF_COMPRIME 1+ LOOP DROP LOOP DROP DROP DROP GIF_CHAINE 2@ GIF_CONCATENE 1 GIF_NB_COULEURS @ LSH 1+ GIF_CONCATENE GIF_IND_BITS @ ?DUP IF 7+ -3 LSH DUP XMODEM_OCTET_EMET DROP GIF_TAMPON DUP >R + R> DO I C@ XMODEM_OCTET_EMET DROP LOOP THEN GIF_FIN_IMAGE XMODEM_FERME ." Une autre courbe ? " BEGIN BELL KEY DUP 79 = OVER 111 = OR IF DROP ." Oui" 0 -1 ELSE DUP 78 = SWAP 110 = OR IF ." Non" -1 -1 ELSE 0 THEN THEN UNTIL CR UNTIL ENDOF 3 OF GIF_TABLE 2@ 5449 6 * + GIF_LIGNE 2! 400 GIF_LARGEUR ! 300 GIF_HAUTEUR ! 1 GIF_NB_COULEURS ! 10 NB_IMAGES ! BEGIN ( Choix de l'animation. ) ." 1 - bruit simple 2 - bruit horizontal 3 - bruit vertical 4 - bruit diagonal droit 5 - bruit diagonal gauche 6 - bruit rectangulaire 7 - bruit trapezoidal droit 8 - bruit trapezoidal gauche Choisir un algorithme ( 1 a 8 ) : " 0 BEGIN DROP BELL KEY 48- DUP 1 < OVER 8 > OR NOT UNTIL DUP 48+ EMIT GIF_ALGO ! CR 0 XMODEM_OUVRE DROP GIF_ENTETE ( palette r-v-b ) 1 GIF_NB_COULEURS @ LSH 0 DO I 1 AND 0= 3 0 DO DUP XMODEM_OCTET_EMET DROP LOOP DROP LOOP ( commentaire ) GIF_ALGO @ CASE 1 OF S_COMMENTAIRE_1 ENDOF 2 OF S_COMMENTAIRE_2 ENDOF 3 OF S_COMMENTAIRE_3 ENDOF 4 OF S_COMMENTAIRE_4 ENDOF 5 OF S_COMMENTAIRE_5 ENDOF 6 OF S_COMMENTAIRE_6 ENDOF 7 OF S_COMMENTAIRE_7 ENDOF S_COMMENTAIRE_8 ENDCASE GIF_COMMENTAIRE GIF_EXTENSION_ANIMATION NB_IMAGES @ 0 DO ( code extension "," 0x21 ) 33 XMODEM_OCTET_EMET DROP ( code controle graphique "," 0xF9 ) 249 XMODEM_OCTET_EMET DROP ( taille du bloc 4 ) 4 XMODEM_OCTET_EMET DROP ( descriptif 3+3+1+1 bits 0xFC ) 252 XMODEM_OCTET_EMET DROP ( temporisation en 100 eme de seconde 16 bits PC ) 4 XMODEM_OCTET_EMET DROP 10 -8 LSH XMODEM_OCTET_EMET DROP ( couleur de transparence 0 ) 0 XMODEM_OCTET_EMET DROP ( fin de bloc 0 ) 0 XMODEM_OCTET_EMET DROP GIF_DEBUT_IMAGE ( paquets LZW ) 1 GIF_NB_COULEURS @ DUP 1 = - DUP 1+ GIF_NB_BITS ! 0 DUP GIF_IND_BITS ! GIF_CODE ! LSH GIF_CONCATENE GIF_HAUTEUR @ 0 DO GIF_ALGO @ 1- ?DUP IF 1- ?DUP IF 1- ?DUP IF 1- ?DUP IF 1- ?DUP IF 1- ?DUP IF 1- IF J GIF_HAUTEUR @ NB_IMAGES @ */ I + GIF_HAUTEUR @ MOD GIF_HAUTEUR @ 2/ - ABS 2048 GIF_HAUTEUR @ 2/ */ GIF_LIGNE 2@ GIF_LARGEUR @ 0 DO OVER I J - K GIF_LARGEUR @ NB_IMAGES @ */ - ABS GIF_LARGEUR @ MOD GIF_LARGEUR @ 2/ - ABS 2048 GIF_LARGEUR @ 2/ */ MAX OVER ! 2+ LOOP DROP DROP ELSE J GIF_HAUTEUR @ NB_IMAGES @ */ I + GIF_HAUTEUR @ MOD GIF_HAUTEUR @ 2/ - ABS 2048 GIF_HAUTEUR @ 2/ */ GIF_LIGNE 2@ GIF_LARGEUR @ 0 DO OVER I J + K GIF_LARGEUR @ NB_IMAGES @ */ + GIF_LARGEUR @ MOD GIF_LARGEUR @ 2/ - ABS 2048 GIF_LARGEUR @ 2/ */ MAX OVER ! 2+ LOOP DROP DROP THEN ELSE J GIF_HAUTEUR @ NB_IMAGES @ */ I + GIF_HAUTEUR @ MOD GIF_HAUTEUR @ 2/ - ABS 2048 GIF_HAUTEUR @ 2/ */ GIF_LIGNE 2@ GIF_LARGEUR @ 0 DO OVER I K GIF_LARGEUR @ NB_IMAGES @ */ + GIF_LARGEUR @ MOD GIF_LARGEUR @ 2/ - ABS 2048 GIF_LARGEUR @ 2/ */ MAX OVER ! 2+ LOOP DROP DROP THEN ELSE GIF_LIGNE 2@ GIF_LARGEUR @ 0 DO I J - K GIF_LARGEUR @ NB_IMAGES @ */ - ABS GIF_LARGEUR @ MOD GIF_LARGEUR @ 2/ - ABS 2048 GIF_LARGEUR @ 2/ */ OVER ! 2+ LOOP DROP THEN ELSE GIF_LIGNE 2@ GIF_LARGEUR @ 0 DO I J + K GIF_LARGEUR @ NB_IMAGES @ */ + GIF_LARGEUR @ MOD GIF_LARGEUR @ 2/ - ABS 2048 GIF_LARGEUR @ 2/ */ OVER ! 2+ LOOP DROP THEN ELSE GIF_LIGNE 2@ GIF_LARGEUR @ 0 DO I K GIF_LARGEUR @ NB_IMAGES @ */ + GIF_LARGEUR @ MOD GIF_LARGEUR @ 2/ - ABS 2048 GIF_LARGEUR @ 2/ */ OVER ! 2+ LOOP DROP THEN ELSE J GIF_HAUTEUR @ NB_IMAGES @ */ I + GIF_HAUTEUR @ MOD GIF_HAUTEUR @ 2/ - ABS 2048 GIF_HAUTEUR @ 2/ */ GIF_LIGNE 2@ DUP >R GIF_LARGEUR @ 2* + R> DO DUP I ! 2 +LOOP DROP THEN ELSE 1024 GIF_LIGNE 2@ DUP >R GIF_LARGEUR @ 2* + R> DO DUP I ! 2 +LOOP DROP THEN I V_NPA DUP >R @ + 2047 AND 1 MAX R> ! 0 I GIF_HAUTEUR @ 12- < NOT IF I GIF_HAUTEUR @ 4- < IF 2147483648+ THEN THEN GIF_LIGNE 2@ GIF_LARGEUR @ 0 DO NPA OVER @ < 3 PICK 0< IF I GIF_LARGEUR @ 76- < NOT IF SIGNATURE J GIF_HAUTEUR @ 12- - DUP 4* + 2* + I GIF_LARGEUR @ 76- - DUP >R -3 LSH + C@ 1 R> 7 AND 7 XOR LSH AND IF COM THEN THEN THEN 1 AND I J OR IF GIF_COMPRIME ELSE GIF_CHAINE 2! THEN 2+ LOOP DROP DROP LOOP GIF_CHAINE 2@ GIF_CONCATENE 1 GIF_NB_COULEURS @ DUP 1 = - LSH 1+ GIF_CONCATENE GIF_IND_BITS @ ?DUP IF 7+ -3 LSH DUP XMODEM_OCTET_EMET DROP GIF_TAMPON DUP >R + R> DO I C@ XMODEM_OCTET_EMET DROP LOOP THEN 0 XMODEM_OCTET_EMET DROP LOOP 59 XMODEM_OCTET_EMET DROP XMODEM_FERME ." Une autre animation ? " BEGIN BELL KEY DUP 79 = OVER 111 = OR IF DROP ." Oui" 0 -1 ELSE DUP 78 = SWAP 110 = OR IF ." Non" -1 -1 ELSE 0 THEN THEN UNTIL CR UNTIL ENDOF ENDCASE ." Un autre type de fichier ? " BEGIN BELL KEY DUP 79 = OVER 111 = OR IF DROP ." Oui" 0 -1 ELSE DUP 78 = SWAP 110 = OR IF ." Non" -1 -1 ELSE 0 THEN THEN UNTIL CR UNTIL MEMOIRE IF GIF_TABLE 2@ MEMOIRE_LIBERE DROP THEN ; GIFS ( FIN )