PNG (Portable Network Graphics) files(PNG.rfh):
Class: Graphics and Sounds, Status: Headers only, Last change: 18.10.2023 14:23:54

set byteorder rev

type
TPNGHdr array[8] of Char

data
0 TPNGHdr Hdr

assert Hdr=''#137'PNG'#13#10#26#10;

descr ('PNG (Portable Network Graphics).',NL)
descr ('Info Source: PNG (Portable Network Graphics) Specification by T. Boutell at www.wotsit.org',NL)

type

u1 num+(1)
u2 num+(2)
u4 num+(4)
d1 num+(1):displ=(INT(@))
d2 num+(2):displ=(INT(@))
d4 num+(4):displ=(INT(@))
i1 num-(1)
i2 num-(2)
i4 num-(4)

TChunkType array[4]of char:displ=(@,
  '[aux=',INT(@[0]and 0x20<>0), //ancillary - ignore if unknown
  ',priv=',INT(@[1]and 0x20<>0), //private - nonstandard
  ',copy=',INT(@[3]and 0x20<>0), //safe to copy - (if unknown, to edited file)
  ']')

TColorType set 8 of (
  PaletteUsed ^ 0x1,
  ColorUsed ^ 0x2,
  AlphaUsed ^ 0x4
)

TInterlace enum d1 (
  No=0,
  Adam7=1
)

TIHDR struc
  d4 Width
  d4 Height
  d1 Depth //Bit depth
  TColorType Color //Color type
  d1 Compr //Compression method (always 0 => Deflate)
  d1 Filter //Filter method (always 0 => selection of 5 filter)
  TInterlace Interlace //Interlace method
ends

TRGB struc
  d1 R
  d1 G
  d1 B
ends

TResUnit enum d1 (unknown=0,meter=1)

TpHYs struc //Physical Pixel Dimensions
  d4 xRes //Pixels per unit, X axis
  d4 yRes //Pixels per unit, Y axis
  TResUnit Unit //Unit specifier
ends

TtEXt(Sz) struc
  PChar Keyword
  array of Char Val
ends:[@:Size=@:Sz]

TtIME struc
  d2 Y
  d1 Mon
  d1 Day
  d1 H
  d1 M
  d1 S
ends

TiCCP struc
  PChar Name
  byte Compression //=0
ends

TChunk struc
  u4 Length
  TChunkType Typ
  struc
    case @@.Typ of
     'IHDR': TIHDR
     'PLTE': array of TRGB:[@:Size=@@@@.Length]
     'iCCP': TiCCP
     //'IDAT': compressed data
     //'IEND': void - the last record
     'sBIT': array[@@@.Length] of d1 //original depth of color channels (depends on IHDR.Color)
     'pHYs': TpHYs
     'tEXt': TtEXt(@@@.Length)
     'gAMA': d4 //gamma times 100000
     'tIME': TtIME
    endc D
    raw[] Rest
  ends:[@:Size=@@.Length] Data
  u4 CRC //of Typ and Data
ends

data

0x8 array of TChunk?@.Typ='IEND';/*:[@:Size=FileSize-8]*/ Chunks


Other specifications.


FlexT home page, Author`s home page.