Test files for APNG can be found at the following locations:
This page hosts a formal specification of PNG (Portable Network Graphics) file using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__png {
label="Png";
graph[style=dotted];
png__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="magic_pos">0</TD><TD PORT="magic_size">8</TD><TD></TD><TD PORT="magic_type">magic</TD></TR>
<TR><TD PORT="ihdr_len_pos">8</TD><TD PORT="ihdr_len_size">4</TD><TD>u4be</TD><TD PORT="ihdr_len_type">ihdr_len</TD></TR>
<TR><TD PORT="ihdr_type_pos">12</TD><TD PORT="ihdr_type_size">4</TD><TD></TD><TD PORT="ihdr_type_type">ihdr_type</TD></TR>
<TR><TD PORT="ihdr_pos">16</TD><TD PORT="ihdr_size">13</TD><TD>IhdrChunk</TD><TD PORT="ihdr_type">ihdr</TD></TR>
<TR><TD PORT="ihdr_crc_pos">29</TD><TD PORT="ihdr_crc_size">4</TD><TD></TD><TD PORT="ihdr_crc_type">ihdr_crc</TD></TR>
<TR><TD PORT="chunks_pos">33</TD><TD PORT="chunks_size">...</TD><TD>Chunk</TD><TD PORT="chunks_type">chunks</TD></TR>
<TR><TD COLSPAN="4" PORT="chunks__repeat">repeat until ((_.type == "IEND") || (_io.eof?)) </TD></TR>
</TABLE>>];
subgraph cluster__rgb {
label="Png::Rgb";
graph[style=dotted];
rgb__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="r_pos">0</TD><TD PORT="r_size">1</TD><TD>u1</TD><TD PORT="r_type">r</TD></TR>
<TR><TD PORT="g_pos">1</TD><TD PORT="g_size">1</TD><TD>u1</TD><TD PORT="g_type">g</TD></TR>
<TR><TD PORT="b_pos">2</TD><TD PORT="b_size">1</TD><TD>u1</TD><TD PORT="b_type">b</TD></TR>
</TABLE>>];
}
subgraph cluster__chunk {
label="Png::Chunk";
graph[style=dotted];
chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">4</TD><TD>u4be</TD><TD PORT="len_type">len</TD></TR>
<TR><TD PORT="type_pos">4</TD><TD PORT="type_size">4</TD><TD>str(UTF-8)</TD><TD PORT="type_type">type</TD></TR>
<TR><TD PORT="body_pos">8</TD><TD PORT="body_size">...</TD><TD>switch (type)</TD><TD PORT="body_type">body</TD></TR>
<TR><TD PORT="crc_pos">...</TD><TD PORT="crc_size">4</TD><TD></TD><TD PORT="crc_type">crc</TD></TR>
</TABLE>>];
chunk__seq_body_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>"iTXt"</TD><TD PORT="case0">InternationalTextChunk</TD></TR>
<TR><TD>"gAMA"</TD><TD PORT="case1">GamaChunk</TD></TR>
<TR><TD>"tIME"</TD><TD PORT="case2">TimeChunk</TD></TR>
<TR><TD>"PLTE"</TD><TD PORT="case3">PlteChunk</TD></TR>
<TR><TD>"bKGD"</TD><TD PORT="case4">BkgdChunk</TD></TR>
<TR><TD>"pHYs"</TD><TD PORT="case5">PhysChunk</TD></TR>
<TR><TD>"fdAT"</TD><TD PORT="case6">FrameDataChunk</TD></TR>
<TR><TD>"tEXt"</TD><TD PORT="case7">TextChunk</TD></TR>
<TR><TD>"cHRM"</TD><TD PORT="case8">ChrmChunk</TD></TR>
<TR><TD>"acTL"</TD><TD PORT="case9">AnimationControlChunk</TD></TR>
<TR><TD>"sRGB"</TD><TD PORT="case10">SrgbChunk</TD></TR>
<TR><TD>"zTXt"</TD><TD PORT="case11">CompressedTextChunk</TD></TR>
<TR><TD>"fcTL"</TD><TD PORT="case12">FrameControlChunk</TD></TR>
</TABLE>>];
}
subgraph cluster__bkgd_indexed {
label="Png::BkgdIndexed";
graph[style=dotted];
bkgd_indexed__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="palette_index_pos">0</TD><TD PORT="palette_index_size">1</TD><TD>u1</TD><TD PORT="palette_index_type">palette_index</TD></TR>
</TABLE>>];
}
subgraph cluster__point {
label="Png::Point";
graph[style=dotted];
point__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="x_int_pos">0</TD><TD PORT="x_int_size">4</TD><TD>u4be</TD><TD PORT="x_int_type">x_int</TD></TR>
<TR><TD PORT="y_int_pos">4</TD><TD PORT="y_int_size">4</TD><TD>u4be</TD><TD PORT="y_int_type">y_int</TD></TR>
</TABLE>>];
point__inst__x [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>x</TD><TD>(x_int / 100000.0)</TD></TR>
</TABLE>>];
point__inst__y [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>y</TD><TD>(y_int / 100000.0)</TD></TR>
</TABLE>>];
}
subgraph cluster__bkgd_greyscale {
label="Png::BkgdGreyscale";
graph[style=dotted];
bkgd_greyscale__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="value_pos">0</TD><TD PORT="value_size">2</TD><TD>u2be</TD><TD PORT="value_type">value</TD></TR>
</TABLE>>];
}
subgraph cluster__chrm_chunk {
label="Png::ChrmChunk";
graph[style=dotted];
chrm_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="white_point_pos">0</TD><TD PORT="white_point_size">8</TD><TD>Point</TD><TD PORT="white_point_type">white_point</TD></TR>
<TR><TD PORT="red_pos">8</TD><TD PORT="red_size">8</TD><TD>Point</TD><TD PORT="red_type">red</TD></TR>
<TR><TD PORT="green_pos">16</TD><TD PORT="green_size">8</TD><TD>Point</TD><TD PORT="green_type">green</TD></TR>
<TR><TD PORT="blue_pos">24</TD><TD PORT="blue_size">8</TD><TD>Point</TD><TD PORT="blue_type">blue</TD></TR>
</TABLE>>];
}
subgraph cluster__ihdr_chunk {
label="Png::IhdrChunk";
graph[style=dotted];
ihdr_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="width_pos">0</TD><TD PORT="width_size">4</TD><TD>u4be</TD><TD PORT="width_type">width</TD></TR>
<TR><TD PORT="height_pos">4</TD><TD PORT="height_size">4</TD><TD>u4be</TD><TD PORT="height_type">height</TD></TR>
<TR><TD PORT="bit_depth_pos">8</TD><TD PORT="bit_depth_size">1</TD><TD>u1</TD><TD PORT="bit_depth_type">bit_depth</TD></TR>
<TR><TD PORT="color_type_pos">9</TD><TD PORT="color_type_size">1</TD><TD>u1→ColorType</TD><TD PORT="color_type_type">color_type</TD></TR>
<TR><TD PORT="compression_method_pos">10</TD><TD PORT="compression_method_size">1</TD><TD>u1</TD><TD PORT="compression_method_type">compression_method</TD></TR>
<TR><TD PORT="filter_method_pos">11</TD><TD PORT="filter_method_size">1</TD><TD>u1</TD><TD PORT="filter_method_type">filter_method</TD></TR>
<TR><TD PORT="interlace_method_pos">12</TD><TD PORT="interlace_method_size">1</TD><TD>u1</TD><TD PORT="interlace_method_type">interlace_method</TD></TR>
</TABLE>>];
}
subgraph cluster__plte_chunk {
label="Png::PlteChunk";
graph[style=dotted];
plte_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="entries_pos">0</TD><TD PORT="entries_size">3</TD><TD>Rgb</TD><TD PORT="entries_type">entries</TD></TR>
<TR><TD COLSPAN="4" PORT="entries__repeat">repeat to end of stream</TD></TR>
</TABLE>>];
}
subgraph cluster__srgb_chunk {
label="Png::SrgbChunk";
graph[style=dotted];
srgb_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="render_intent_pos">0</TD><TD PORT="render_intent_size">1</TD><TD>u1→Intent</TD><TD PORT="render_intent_type">render_intent</TD></TR>
</TABLE>>];
}
subgraph cluster__compressed_text_chunk {
label="Png::CompressedTextChunk";
graph[style=dotted];
compressed_text_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="keyword_pos">0</TD><TD PORT="keyword_size">...</TD><TD>str(UTF-8)</TD><TD PORT="keyword_type">keyword</TD></TR>
<TR><TD PORT="compression_method_pos">...</TD><TD PORT="compression_method_size">1</TD><TD>u1→CompressionMethods</TD><TD PORT="compression_method_type">compression_method</TD></TR>
<TR><TD PORT="text_datastream_pos">...</TD><TD PORT="text_datastream_size">⇲</TD><TD></TD><TD PORT="text_datastream_type">text_datastream</TD></TR>
</TABLE>>];
}
subgraph cluster__frame_data_chunk {
label="Png::FrameDataChunk";
graph[style=dotted];
frame_data_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="sequence_number_pos">0</TD><TD PORT="sequence_number_size">4</TD><TD>u4be</TD><TD PORT="sequence_number_type">sequence_number</TD></TR>
<TR><TD PORT="frame_data_pos">4</TD><TD PORT="frame_data_size">⇲</TD><TD></TD><TD PORT="frame_data_type">frame_data</TD></TR>
</TABLE>>];
}
subgraph cluster__bkgd_truecolor {
label="Png::BkgdTruecolor";
graph[style=dotted];
bkgd_truecolor__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="red_pos">0</TD><TD PORT="red_size">2</TD><TD>u2be</TD><TD PORT="red_type">red</TD></TR>
<TR><TD PORT="green_pos">2</TD><TD PORT="green_size">2</TD><TD>u2be</TD><TD PORT="green_type">green</TD></TR>
<TR><TD PORT="blue_pos">4</TD><TD PORT="blue_size">2</TD><TD>u2be</TD><TD PORT="blue_type">blue</TD></TR>
</TABLE>>];
}
subgraph cluster__gama_chunk {
label="Png::GamaChunk";
graph[style=dotted];
gama_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="gamma_int_pos">0</TD><TD PORT="gamma_int_size">4</TD><TD>u4be</TD><TD PORT="gamma_int_type">gamma_int</TD></TR>
</TABLE>>];
gama_chunk__inst__gamma_ratio [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>gamma_ratio</TD><TD>(100000.0 / gamma_int)</TD></TR>
</TABLE>>];
}
subgraph cluster__bkgd_chunk {
label="Png::BkgdChunk";
graph[style=dotted];
bkgd_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="bkgd_pos">0</TD><TD PORT="bkgd_size">...</TD><TD>switch (_root.ihdr.color_type)</TD><TD PORT="bkgd_type">bkgd</TD></TR>
</TABLE>>];
bkgd_chunk__seq_bkgd_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>:color_type_indexed</TD><TD PORT="case0">BkgdIndexed</TD></TR>
<TR><TD>:color_type_truecolor_alpha</TD><TD PORT="case1">BkgdTruecolor</TD></TR>
<TR><TD>:color_type_greyscale_alpha</TD><TD PORT="case2">BkgdGreyscale</TD></TR>
<TR><TD>:color_type_truecolor</TD><TD PORT="case3">BkgdTruecolor</TD></TR>
<TR><TD>:color_type_greyscale</TD><TD PORT="case4">BkgdGreyscale</TD></TR>
</TABLE>>];
}
subgraph cluster__phys_chunk {
label="Png::PhysChunk";
graph[style=dotted];
phys_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="pixels_per_unit_x_pos">0</TD><TD PORT="pixels_per_unit_x_size">4</TD><TD>u4be</TD><TD PORT="pixels_per_unit_x_type">pixels_per_unit_x</TD></TR>
<TR><TD PORT="pixels_per_unit_y_pos">4</TD><TD PORT="pixels_per_unit_y_size">4</TD><TD>u4be</TD><TD PORT="pixels_per_unit_y_type">pixels_per_unit_y</TD></TR>
<TR><TD PORT="unit_pos">8</TD><TD PORT="unit_size">1</TD><TD>u1→PhysUnit</TD><TD PORT="unit_type">unit</TD></TR>
</TABLE>>];
}
subgraph cluster__frame_control_chunk {
label="Png::FrameControlChunk";
graph[style=dotted];
frame_control_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="sequence_number_pos">0</TD><TD PORT="sequence_number_size">4</TD><TD>u4be</TD><TD PORT="sequence_number_type">sequence_number</TD></TR>
<TR><TD PORT="width_pos">4</TD><TD PORT="width_size">4</TD><TD>u4be</TD><TD PORT="width_type">width</TD></TR>
<TR><TD PORT="height_pos">8</TD><TD PORT="height_size">4</TD><TD>u4be</TD><TD PORT="height_type">height</TD></TR>
<TR><TD PORT="x_offset_pos">12</TD><TD PORT="x_offset_size">4</TD><TD>u4be</TD><TD PORT="x_offset_type">x_offset</TD></TR>
<TR><TD PORT="y_offset_pos">16</TD><TD PORT="y_offset_size">4</TD><TD>u4be</TD><TD PORT="y_offset_type">y_offset</TD></TR>
<TR><TD PORT="delay_num_pos">20</TD><TD PORT="delay_num_size">2</TD><TD>u2be</TD><TD PORT="delay_num_type">delay_num</TD></TR>
<TR><TD PORT="delay_den_pos">22</TD><TD PORT="delay_den_size">2</TD><TD>u2be</TD><TD PORT="delay_den_type">delay_den</TD></TR>
<TR><TD PORT="dispose_op_pos">24</TD><TD PORT="dispose_op_size">1</TD><TD>u1→DisposeOpValues</TD><TD PORT="dispose_op_type">dispose_op</TD></TR>
<TR><TD PORT="blend_op_pos">25</TD><TD PORT="blend_op_size">1</TD><TD>u1→BlendOpValues</TD><TD PORT="blend_op_type">blend_op</TD></TR>
</TABLE>>];
frame_control_chunk__inst__delay [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>delay</TD><TD>(delay_num / (delay_den == 0 ? 100.0 : delay_den))</TD></TR>
</TABLE>>];
}
subgraph cluster__international_text_chunk {
label="Png::InternationalTextChunk";
graph[style=dotted];
international_text_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="keyword_pos">0</TD><TD PORT="keyword_size">...</TD><TD>str(UTF-8)</TD><TD PORT="keyword_type">keyword</TD></TR>
<TR><TD PORT="compression_flag_pos">...</TD><TD PORT="compression_flag_size">1</TD><TD>u1</TD><TD PORT="compression_flag_type">compression_flag</TD></TR>
<TR><TD PORT="compression_method_pos">...</TD><TD PORT="compression_method_size">1</TD><TD>u1→CompressionMethods</TD><TD PORT="compression_method_type">compression_method</TD></TR>
<TR><TD PORT="language_tag_pos">...</TD><TD PORT="language_tag_size">...</TD><TD>str(ASCII)</TD><TD PORT="language_tag_type">language_tag</TD></TR>
<TR><TD PORT="translated_keyword_pos">...</TD><TD PORT="translated_keyword_size">...</TD><TD>str(UTF-8)</TD><TD PORT="translated_keyword_type">translated_keyword</TD></TR>
<TR><TD PORT="text_pos">...</TD><TD PORT="text_size">⇲</TD><TD>str(UTF-8)</TD><TD PORT="text_type">text</TD></TR>
</TABLE>>];
}
subgraph cluster__text_chunk {
label="Png::TextChunk";
graph[style=dotted];
text_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="keyword_pos">0</TD><TD PORT="keyword_size">...</TD><TD>str(iso8859-1)</TD><TD PORT="keyword_type">keyword</TD></TR>
<TR><TD PORT="text_pos">...</TD><TD PORT="text_size">⇲</TD><TD>str(iso8859-1)</TD><TD PORT="text_type">text</TD></TR>
</TABLE>>];
}
subgraph cluster__animation_control_chunk {
label="Png::AnimationControlChunk";
graph[style=dotted];
animation_control_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="num_frames_pos">0</TD><TD PORT="num_frames_size">4</TD><TD>u4be</TD><TD PORT="num_frames_type">num_frames</TD></TR>
<TR><TD PORT="num_plays_pos">4</TD><TD PORT="num_plays_size">4</TD><TD>u4be</TD><TD PORT="num_plays_type">num_plays</TD></TR>
</TABLE>>];
}
subgraph cluster__time_chunk {
label="Png::TimeChunk";
graph[style=dotted];
time_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="year_pos">0</TD><TD PORT="year_size">2</TD><TD>u2be</TD><TD PORT="year_type">year</TD></TR>
<TR><TD PORT="month_pos">2</TD><TD PORT="month_size">1</TD><TD>u1</TD><TD PORT="month_type">month</TD></TR>
<TR><TD PORT="day_pos">3</TD><TD PORT="day_size">1</TD><TD>u1</TD><TD PORT="day_type">day</TD></TR>
<TR><TD PORT="hour_pos">4</TD><TD PORT="hour_size">1</TD><TD>u1</TD><TD PORT="hour_type">hour</TD></TR>
<TR><TD PORT="minute_pos">5</TD><TD PORT="minute_size">1</TD><TD>u1</TD><TD PORT="minute_type">minute</TD></TR>
<TR><TD PORT="second_pos">6</TD><TD PORT="second_size">1</TD><TD>u1</TD><TD PORT="second_type">second</TD></TR>
</TABLE>>];
}
}
png__seq:ihdr_type -> ihdr_chunk__seq [style=bold];
png__seq:chunks_type -> chunk__seq [style=bold];
chunk__seq:type_type -> png__seq:chunks__repeat [color="#404040"];
chunk__seq:body_type -> chunk__seq_body_switch [style=bold];
chunk__seq_body_switch:case0 -> international_text_chunk__seq [style=bold];
chunk__seq_body_switch:case1 -> gama_chunk__seq [style=bold];
chunk__seq_body_switch:case2 -> time_chunk__seq [style=bold];
chunk__seq_body_switch:case3 -> plte_chunk__seq [style=bold];
chunk__seq_body_switch:case4 -> bkgd_chunk__seq [style=bold];
chunk__seq_body_switch:case5 -> phys_chunk__seq [style=bold];
chunk__seq_body_switch:case6 -> frame_data_chunk__seq [style=bold];
chunk__seq_body_switch:case7 -> text_chunk__seq [style=bold];
chunk__seq_body_switch:case8 -> chrm_chunk__seq [style=bold];
chunk__seq_body_switch:case9 -> animation_control_chunk__seq [style=bold];
chunk__seq_body_switch:case10 -> srgb_chunk__seq [style=bold];
chunk__seq_body_switch:case11 -> compressed_text_chunk__seq [style=bold];
chunk__seq_body_switch:case12 -> frame_control_chunk__seq [style=bold];
chunk__seq:type_type -> chunk__seq:body_type [color="#404040"];
point__seq:x_int_type -> point__inst__x [color="#404040"];
point__seq:y_int_type -> point__inst__y [color="#404040"];
chrm_chunk__seq:white_point_type -> point__seq [style=bold];
chrm_chunk__seq:red_type -> point__seq [style=bold];
chrm_chunk__seq:green_type -> point__seq [style=bold];
chrm_chunk__seq:blue_type -> point__seq [style=bold];
plte_chunk__seq:entries_type -> rgb__seq [style=bold];
gama_chunk__seq:gamma_int_type -> gama_chunk__inst__gamma_ratio [color="#404040"];
bkgd_chunk__seq:bkgd_type -> bkgd_chunk__seq_bkgd_switch [style=bold];
bkgd_chunk__seq_bkgd_switch:case0 -> bkgd_indexed__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case1 -> bkgd_truecolor__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case2 -> bkgd_greyscale__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case3 -> bkgd_truecolor__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case4 -> bkgd_greyscale__seq [style=bold];
ihdr_chunk__seq:color_type_type -> bkgd_chunk__seq:bkgd_type [color="#404040"];
frame_control_chunk__seq:delay_num_type -> frame_control_chunk__inst__delay [color="#404040"];
frame_control_chunk__seq:delay_den_type -> frame_control_chunk__inst__delay [color="#404040"];
frame_control_chunk__seq:delay_den_type -> frame_control_chunk__inst__delay [color="#404040"];
}