28 subroutine pngpack(fld, width, height, idrstmpl, cpack, lcpack)
31 integer,
intent(in) :: width, height
32 real,
intent(in) :: fld(width * height)
33 character(len = 1),
intent(out) :: cpack(*)
34 integer,
intent(inout) :: idrstmpl(*)
35 integer,
intent(out) :: lcpack
40 integer :: ifld(width * height), nbits
41 integer,
parameter :: zero = 0
42 character(len = 1),
allocatable :: ctemp(:)
43 real :: bscale, dscale, temp
44 integer :: imax, imin, j, maxdif, nbytes, ndpts
47 function enc_png(data, width, height, nbits, pngbuf)
bind(c, name="enc_png")
49 character(kind = c_char),
intent(in) :: data(*)
50 integer(c_int),
intent(in) :: width, height
51 integer(c_int),
intent(inout) :: nbits
52 character(kind = c_char),
intent(out) :: pngbuf(*)
53 integer(c_int) :: enc_png
57 ndpts = width * height
58 bscale = 2.0**real(-idrstmpl(2))
59 dscale = 10.0**real(idrstmpl(3))
70 if (fld(j) .gt. rmax) rmax = fld(j)
71 if (fld(j) .lt. rmin) rmin = fld(j)
73 maxdif = nint((rmax - rmin) * dscale * bscale)
78 if (rmin .ne. rmax .AND. maxdif .ne. 0)
then
82 if (idrstmpl(2) .eq. 0)
then
85 imin = nint(rmin * dscale)
86 imax = nint(rmax * dscale)
88 temp = alog(real(maxdif + 1)) / alog(2.0)
93 ifld(j) = nint(fld(j) * dscale) - imin
100 maxdif = nint((rmax - rmin) * bscale)
101 temp = alog(real(maxdif + 1)) / alog(2.0)
102 nbits = ceiling(temp)
105 ifld(j) = max(0, nint(((fld(j) * dscale) - rmin) * bscale))
111 if (nbits .le. 8)
then
113 elseif (nbits .le. 16)
then
115 elseif (nbits .le. 24)
then
120 nbytes = (nbits / 8) * ndpts
121 allocate(ctemp(nbytes))
122 call g2_sbytesc(ctemp, ifld, 0, nbits, 0, ndpts)
125 lcpack =
enc_png(ctemp, width, height, nbits, cpack)
126 if (lcpack .le. 0)
then
127 print *,
'pngpack: ERROR Encoding PNG = ', lcpack
137 rmin4 = real(rmin, 4)
138 call mkieee(rmin4, ref, 1)
139 iref = transfer(ref, iref)
int enc_png(char *data, g2int *width, g2int *height, g2int *nbits, char *pngbuf)
create png_structs to write png stream into memory.
subroutine g2_sbytesc(out, in, iskip, nbits, nskip, n)
Put arbitrary size values into a packed bit string, taking the low order bits from each value in the ...
subroutine mkieee(a, rieee, num)
Copy an array of real to an array of 32-bit IEEE floating points.
subroutine pngpack(fld, width, height, idrstmpl, cpack, lcpack)
This subroutine packs up a data field into PNG image format.