source: trunk/fsource/pack_f.for @ 176

Last change on this file since 176 was 176, checked in by vondreele, 13 years ago

fix to pack_f.for

File size: 3.7 KB
Line 
1      SUBROUTINE PACK_F(N,CMPR,M,IMG)
2
3Cf2py intent(in) N
4Cf2py intent(in) CMPR
5Cf2py depend(N) CMPR
6Cf2py intent(in) M
7Cf2py intent(in,out) IMG
8Cf2py depend(M) IMG
9
10      IMPLICIT NONE
11      INTEGER*4 IPOS,ISIZE,BITDECODE(0:7),SETBITS(0:16),IN,N,M,BITNUM
12      INTEGER*4 PIXEL,SPILLBITS,USEDBITS,VALIDS,WINDOW,TOTAL,IR
13      INTEGER*4 IMG(0:M-1,0:M-1),NEXTINT,I     
14      INTEGER*4 SPILL,ROW,COL,PIXNUM,MM1
15      INTEGER*2 TMP
16      CHARACTER*(*) CMPR(0:N-1)
17      DATA BITDECODE /0,4,5,6,7,8,16,32/
18      DATA SETBITS /Z'0000',Z'0001',Z'0003',Z'0007',Z'000F',Z'001F',
19     1  Z'003F',Z'007F',Z'00FF',Z'01FF',Z'03FF',Z'07FF',Z'0FFF',
20     1  Z'1FFF',Z'3FFF',Z'7FFF',Z'FFFF'/
21
22      PIXEL = 0
23      SPILLBITS = 0
24      SPILL = 0
25      USEDBITS = 0
26      VALIDS = 0
27      WINDOW = 0
28      ROW = 0
29      COL = 0
30      TOTAL = M**2
31      MM1 = M-1
32      IN = 0
33      DO WHILE (PIXEL .LT. TOTAL)
34        IF (VALIDS .LT. 6) THEN
35          IF (SPILLBITS .GT. 0) THEN
36            WINDOW = IOR(WINDOW,ISHFT(SPILL,VALIDS))
37            VALIDS = VALIDS + SPILLBITS
38            SPILLBITS = 0
39          ELSE
40            SPILL = ICHAR(CMPR(IN))
41            IN = IN+1
42            SPILLBITS = 8
43          END IF
44        ELSE
45          PIXNUM = ISHFT(1,IAND(WINDOW,SETBITS(3)))
46          WINDOW = ISHFT(WINDOW,-3)
47          BITNUM = BITDECODE(IAND(WINDOW,SETBITS(3)))
48          WINDOW = ISHFT(WINDOW,-3)
49          VALIDS = VALIDS-6
50          DO WHILE ( (PIXNUM .GT. 0) .AND. (PIXEL .LT. TOTAL) )
51            IF ( VALIDS .LT. BITNUM ) THEN
52              IF ( SPILLBITS .GT. 0 ) THEN
53                WINDOW = IOR(WINDOW,ISHFT(SPILL,VALIDS))
54                IF ( (32-VALIDS) .GT. SPILLBITS ) THEN
55                  VALIDS = VALIDS + SPILLBITS
56                  SPILLBITS = 0
57                ELSE
58                  USEDBITS = 32-VALIDS
59                  SPILL = ISHFT(SPILL,-USEDBITS)
60                  SPILLBITS = SPILLBITS-USEDBITS
61                  VALIDS = 32
62                END IF
63              ELSE
64                SPILL = ICHAR(CMPR(IN))
65                IN = IN+1
66                SPILLBITS = 8
67              END IF               
68            ELSE
69              PIXNUM = PIXNUM-1
70              IF ( BITNUM .EQ. 0 ) THEN
71                NEXTINT = 0
72              ELSE
73                NEXTINT = IAND(WINDOW,SETBITS(BITNUM))
74                VALIDS = VALIDS-BITNUM
75                WINDOW = ISHFT(WINDOW,-BITNUM)
76                IF ( BTEST(NEXTINT,BITNUM-1) ) 
77     1            NEXTINT = IOR(NEXTINT,NOT(SETBITS(BITNUM)))
78              END IF
79
80              ROW = PIXEL/M
81              COL = MOD(PIXEL,M)
82              IF ( PIXEL .GT. M ) THEN
83                IF ( COL .EQ. 0 ) THEN
84                  TMP = NEXTINT +
85     1              (IMG(MM1,ROW-1)+IMG(COL+1,ROW-1)+
86     1              IMG(COL,ROW-1)+IMG(MM1,ROW-2) +2)/4
87                ELSE IF ( COL.EQ.MM1 ) THEN
88                  TMP = NEXTINT +
89     1              (IMG(COL-1,ROW)+IMG(0,ROW)+
90     1              IMG(MM1,ROW-1)+IMG(MM1-1,ROW-1) +2)/4
91                ELSE
92                  TMP = NEXTINT + 
93     1              (IMG(COL-1,ROW)+IMG(COL+1,ROW-1)+
94     1              IMG(COL,ROW-1)+IMG(COL-1,ROW-1) +2)/4
95                END IF
96              ELSE IF (PIXEL .NE. 0) THEN
97                TMP = IMG(COL-1,ROW)+NEXTINT
98              ELSE
99                TMP = NEXTINT
100              END IF
101              IMG(COL,ROW) = TMP
102              PIXEL = PIXEL+1
103            END IF
104          END DO
105        END IF     
106      END DO
107      DO ROW=0,MM1
108        DO COL=0,MM1
109            IF ( IMG(COL,ROW).LT.0 ) IMG(COL,ROW) = IMG(COL,ROW)+65536
110        END DO
111      END DO
112     
113      RETURN
114      END
115
116     
Note: See TracBrowser for help on using the repository browser.