NOTICE: Many of the documentation comments (or docstrings) in this file were copied from or derived from the Portable Network Graphics (PNG) Specification (Third Edition). Copyright © 1996-2025 World Wide Web Consortium. https://www.w3.org/copyright/software-license-2023/
The full text of the license for the original W3C PNG specification is provided below:
Software and Document license - 2023 version
This work is being provided by the copyright holders under the following license.
License
By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications:
- The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
- Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C software and document short notice should be included.
- Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright © [$year-of-document] World Wide Web Consortium. https://www.w3.org/copyright/software-license-2023/"
Disclaimers
THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders.
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>89 50 4E 47 0D 0A 1A 0A</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 COLSPAN="4" PORT="ihdr_len__valid">must be equal to 13</TD></TR>
<TR><TD PORT="ihdr_type_pos">12</TD><TD PORT="ihdr_type_size">4</TD><TD>49 48 44 52</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>u4be</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__adobe_fireworks_chunk {
label="Png::AdobeFireworksChunk";
graph[style=dotted];
adobe_fireworks_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="preview_data_pos">0</TD><TD PORT="preview_data_size">⇲</TD><TD></TD><TD PORT="preview_data_type">preview_data</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__atch_chunk {
label="Png::AtchChunk";
graph[style=dotted];
atch_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="file_name_pos">0</TD><TD PORT="file_name_size">...</TD><TD>str(term=0, UTF-8)</TD><TD PORT="file_name_type">file_name</TD></TR>
<TR><TD COLSPAN="4" PORT="file_name__valid">must satisfy ((_.size != 0) && (_[0...1] != ".")) </TD></TR>
<TR><TD PORT="compression_pos">...</TD><TD PORT="compression_size">1</TD><TD>u1→CompressionAttachMethods</TD><TD PORT="compression_type">compression</TD></TR>
<TR><TD COLSPAN="4" PORT="compression__valid">must be defined in the enum</TD></TR>
<TR><TD PORT="data_plain_pos">...</TD><TD PORT="data_plain_size">⇲</TD><TD></TD><TD PORT="data_plain_type">data_plain</TD></TR>
<TR><TD COLSPAN="4" PORT="data_plain__if">if compression == :compression_attach_methods_none</TD></TR>
<TR><TD PORT="data_zlib_pos">...</TD><TD PORT="data_zlib_size">⇲</TD><TD></TD><TD PORT="data_zlib_type">data_zlib</TD></TR>
<TR><TD COLSPAN="4" PORT="data_zlib__if">if compression == :compression_attach_methods_zlib</TD></TR>
</TABLE>>];
atch_chunk__inst__data [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>data</TD><TD>(compression == :compression_attach_methods_none ? data_plain : data_zlib)</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_greyscale</TD><TD PORT="case0">BkgdGreyscale</TD></TR>
<TR><TD>:color_type_greyscale_alpha</TD><TD PORT="case1">BkgdGreyscale</TD></TR>
<TR><TD>:color_type_indexed</TD><TD PORT="case2">BkgdIndexed</TD></TR>
<TR><TD>:color_type_truecolor</TD><TD PORT="case3">BkgdTruecolor</TD></TR>
<TR><TD>:color_type_truecolor_alpha</TD><TD PORT="case4">BkgdTruecolor</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__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__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__chrm_chromaticity {
label="Png::ChrmChromaticity";
graph[style=dotted];
chrm_chromaticity__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>>];
chrm_chromaticity__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>>];
chrm_chromaticity__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__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>ChrmChromaticity</TD><TD PORT="white_point_type">white_point</TD></TR>
<TR><TD PORT="red_pos">8</TD><TD PORT="red_size">8</TD><TD>ChrmChromaticity</TD><TD PORT="red_type">red</TD></TR>
<TR><TD PORT="green_pos">16</TD><TD PORT="green_size">8</TD><TD>ChrmChromaticity</TD><TD PORT="green_type">green</TD></TR>
<TR><TD PORT="blue_pos">24</TD><TD PORT="blue_size">8</TD><TD>ChrmChromaticity</TD><TD PORT="blue_type">blue</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_raw_pos">4</TD><TD PORT="type_raw_size">4</TD><TD></TD><TD PORT="type_raw_type">type_raw</TD></TR>
<TR><TD COLSPAN="4" PORT="type_raw__valid">must satisfy (( (( ((_[0].ord >= 65) && (_[0].ord <= 90)) ) || ( ((_[0].ord >= 97) && (_[0].ord <= 122)) )) ) && ( (( ((_[1].ord >= 65) && (_[1].ord <= 90)) ) || ( ((_[1].ord >= 97) && (_[1].ord <= 122)) )) ) && ( (( ((_[2].ord >= 65) && (_[2].ord <= 90)) ) || ( ((_[2].ord >= 97) && (_[2].ord <= 122)) )) ) && ( (( ((_[3].ord >= 65) && (_[3].ord <= 90)) ) || ( ((_[3].ord >= 97) && (_[3].ord <= 122)) )) )) </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>u4be</TD><TD PORT="crc_type">crc</TD></TR>
</TABLE>>];
chunk__inst__is_ancillary [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>is_ancillary</TD><TD>type_raw[0].ord & 32 != 0</TD></TR>
</TABLE>>];
chunk__inst__is_private [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>is_private</TD><TD>type_raw[1].ord & 32 != 0</TD></TR>
</TABLE>>];
chunk__inst__is_safe_to_copy [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>is_safe_to_copy</TD><TD>type_raw[3].ord & 32 != 0</TD></TR>
</TABLE>>];
chunk__inst__reserved_bit [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>reserved_bit</TD><TD>type_raw[2].ord & 32 != 0</TD></TR>
</TABLE>>];
chunk__inst__type [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>type</TD><TD>(type_raw).force_encoding("ASCII").encode('UTF-8')</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>"PLTE"</TD><TD PORT="case0">PlteChunk</TD></TR>
<TR><TD>"acTL"</TD><TD PORT="case1">AnimationControlChunk</TD></TR>
<TR><TD>"atCh"</TD><TD PORT="case2">AtchChunk</TD></TR>
<TR><TD>"bKGD"</TD><TD PORT="case3">BkgdChunk</TD></TR>
<TR><TD>"cHRM"</TD><TD PORT="case4">ChrmChunk</TD></TR>
<TR><TD>"cICP"</TD><TD PORT="case5">CicpChunk</TD></TR>
<TR><TD>"cLLI"</TD><TD PORT="case6">ClliChunk</TD></TR>
<TR><TD>"eXIf"</TD><TD PORT="case7">ExifChunk</TD></TR>
<TR><TD>"fcTL"</TD><TD PORT="case8">FrameControlChunk</TD></TR>
<TR><TD>"fdAT"</TD><TD PORT="case9">FrameDataChunk</TD></TR>
<TR><TD>"gAMA"</TD><TD PORT="case10">GamaChunk</TD></TR>
<TR><TD>"hIST"</TD><TD PORT="case11">HistChunk</TD></TR>
<TR><TD>"iCCP"</TD><TD PORT="case12">IccpChunk</TD></TR>
<TR><TD>"iTXt"</TD><TD PORT="case13">InternationalTextChunk</TD></TR>
<TR><TD>"mDCV"</TD><TD PORT="case14">MdcvChunk</TD></TR>
<TR><TD>"mkBS"</TD><TD PORT="case15">AdobeFireworksChunk</TD></TR>
<TR><TD>"mkTS"</TD><TD PORT="case16">AdobeFireworksChunk</TD></TR>
<TR><TD>"pHYs"</TD><TD PORT="case17">PhysChunk</TD></TR>
<TR><TD>"prVW"</TD><TD PORT="case18">AdobeFireworksChunk</TD></TR>
<TR><TD>"sBIT"</TD><TD PORT="case19">SbitChunk</TD></TR>
<TR><TD>"sPLT"</TD><TD PORT="case20">SpltChunk</TD></TR>
<TR><TD>"sRGB"</TD><TD PORT="case21">SrgbChunk</TD></TR>
<TR><TD>"skMf"</TD><TD PORT="case22">EvernoteSkmfChunk</TD></TR>
<TR><TD>"skRf"</TD><TD PORT="case23">EvernoteSkrfChunk</TD></TR>
<TR><TD>"tEXt"</TD><TD PORT="case24">TextChunk</TD></TR>
<TR><TD>"tIME"</TD><TD PORT="case25">TimeChunk</TD></TR>
<TR><TD>"tRNS"</TD><TD PORT="case26">TrnsChunk</TD></TR>
<TR><TD>"zTXt"</TD><TD PORT="case27">CompressedTextChunk</TD></TR>
</TABLE>>];
}
subgraph cluster__cicp_chunk {
label="Png::CicpChunk";
graph[style=dotted];
cicp_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="color_primaries_pos">0</TD><TD PORT="color_primaries_size">1</TD><TD>u1</TD><TD PORT="color_primaries_type">color_primaries</TD></TR>
<TR><TD PORT="transfer_function_pos">1</TD><TD PORT="transfer_function_size">1</TD><TD>u1</TD><TD PORT="transfer_function_type">transfer_function</TD></TR>
<TR><TD PORT="matrix_coefficients_pos">2</TD><TD PORT="matrix_coefficients_size">1</TD><TD>u1</TD><TD PORT="matrix_coefficients_type">matrix_coefficients</TD></TR>
<TR><TD COLSPAN="4" PORT="matrix_coefficients__valid">must be equal to 0</TD></TR>
<TR><TD PORT="video_full_range_flag_pos">3</TD><TD PORT="video_full_range_flag_size">1</TD><TD>u1</TD><TD PORT="video_full_range_flag_type">video_full_range_flag</TD></TR>
<TR><TD COLSPAN="4" PORT="video_full_range_flag__valid">must be any of 0, 1</TD></TR>
</TABLE>>];
}
subgraph cluster__clli_chunk {
label="Png::ClliChunk";
graph[style=dotted];
clli_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="max_content_light_level_int_pos">0</TD><TD PORT="max_content_light_level_int_size">4</TD><TD>u4be</TD><TD PORT="max_content_light_level_int_type">max_content_light_level_int</TD></TR>
<TR><TD PORT="max_frame_average_light_level_int_pos">4</TD><TD PORT="max_frame_average_light_level_int_size">4</TD><TD>u4be</TD><TD PORT="max_frame_average_light_level_int_type">max_frame_average_light_level_int</TD></TR>
</TABLE>>];
clli_chunk__inst__max_content_light_level [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>max_content_light_level</TD><TD>max_content_light_level_int * 0.0001</TD></TR>
</TABLE>>];
clli_chunk__inst__max_frame_average_light_level [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>max_frame_average_light_level</TD><TD>max_frame_average_light_level_int * 0.0001</TD></TR>
</TABLE>>];
}
subgraph cluster__compressed_text {
label="Png::CompressedText";
graph[style=dotted];
compressed_text__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">⇲</TD><TD>str(ISO-8859-1)</TD><TD PORT="value_type">value</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(term=0, ISO-8859-1)</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 COLSPAN="4" PORT="compression_method__valid">must be equal to :compression_methods_zlib</TD></TR>
<TR><TD PORT="text_pos">...</TD><TD PORT="text_size">⇲</TD><TD>CompressedText</TD><TD PORT="text_type">text</TD></TR>
</TABLE>>];
}
subgraph cluster__evernote_skmf_chunk {
label="Png::EvernoteSkmfChunk";
graph[style=dotted];
evernote_skmf_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="json_pos">0</TD><TD PORT="json_size">⇲</TD><TD>str(UTF-8)</TD><TD PORT="json_type">json</TD></TR>
</TABLE>>];
}
subgraph cluster__evernote_skrf_chunk {
label="Png::EvernoteSkrfChunk";
graph[style=dotted];
evernote_skrf_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="uuid_pos">0</TD><TD PORT="uuid_size">16</TD><TD></TD><TD PORT="uuid_type">uuid</TD></TR>
<TR><TD PORT="orig_img_pos">16</TD><TD PORT="orig_img_size">⇲</TD><TD></TD><TD PORT="orig_img_type">orig_img</TD></TR>
</TABLE>>];
}
subgraph cluster__exif_chunk {
label="Png::ExifChunk";
graph[style=dotted];
exif_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="exif_pos">0</TD><TD PORT="exif_size">8</TD><TD>Exif</TD><TD PORT="exif_type">exif</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 COLSPAN="4" PORT="width__valid">must be between 1 and _root.ihdr.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 COLSPAN="4" PORT="height__valid">must be between 1 and _root.ihdr.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 COLSPAN="4" PORT="x_offset__valid">must be at most _root.ihdr.width - width</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 COLSPAN="4" PORT="y_offset__valid">must be at most _root.ihdr.height - height</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 COLSPAN="4" PORT="dispose_op__valid">must be defined in the enum</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>
<TR><TD COLSPAN="4" PORT="blend_op__valid">must be defined in the enum</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__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__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>
<TR><TD COLSPAN="4" PORT="gamma_int__valid">must satisfy _ != 0</TD></TR>
</TABLE>>];
gama_chunk__inst__gamma [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>gamma</TD><TD>gamma_int / 100000.0</TD></TR>
</TABLE>>];
gama_chunk__inst__inv_gamma [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>inv_gamma</TD><TD>100000.0 / gamma_int</TD></TR>
</TABLE>>];
}
subgraph cluster__hist_chunk {
label="Png::HistChunk";
graph[style=dotted];
hist_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="usage_freqs_pos">0</TD><TD PORT="usage_freqs_size">2</TD><TD>u2be</TD><TD PORT="usage_freqs_type">usage_freqs</TD></TR>
<TR><TD COLSPAN="4" PORT="usage_freqs__repeat">repeat to end of stream</TD></TR>
</TABLE>>];
}
subgraph cluster__iccp_chunk {
label="Png::IccpChunk";
graph[style=dotted];
iccp_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="profile_name_pos">0</TD><TD PORT="profile_name_size">...</TD><TD>str(term=0, ISO-8859-1)</TD><TD PORT="profile_name_type">profile_name</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 COLSPAN="4" PORT="compression_method__valid">must be equal to :compression_methods_zlib</TD></TR>
<TR><TD PORT="profile_pos">...</TD><TD PORT="profile_size">⇲</TD><TD>Icc4</TD><TD PORT="profile_type">profile</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 COLSPAN="4" PORT="width__valid">must be at least 1</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 COLSPAN="4" PORT="height__valid">must be at least 1</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 COLSPAN="4" PORT="bit_depth__valid">must be any of 1, 2, 4, 8, 16</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 COLSPAN="4" PORT="color_type__valid">must be defined in the enum</TD></TR>
<TR><TD PORT="compression_method_pos">10</TD><TD PORT="compression_method_size">1</TD><TD>u1→CompressionMethods</TD><TD PORT="compression_method_type">compression_method</TD></TR>
<TR><TD COLSPAN="4" PORT="compression_method__valid">must be defined in the enum</TD></TR>
<TR><TD PORT="filter_method_pos">11</TD><TD PORT="filter_method_size">1</TD><TD>u1→FilterMethod</TD><TD PORT="filter_method_type">filter_method</TD></TR>
<TR><TD COLSPAN="4" PORT="filter_method__valid">must be defined in the enum</TD></TR>
<TR><TD PORT="interlace_method_pos">12</TD><TD PORT="interlace_method_size">1</TD><TD>u1→InterlaceMethod</TD><TD PORT="interlace_method_type">interlace_method</TD></TR>
<TR><TD COLSPAN="4" PORT="interlace_method__valid">must be defined in the enum</TD></TR>
</TABLE>>];
}
subgraph cluster__international_text {
label="Png::InternationalText";
graph[style=dotted];
international_text__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">⇲</TD><TD>str(UTF-8)</TD><TD PORT="value_type">value</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(term=0, ISO-8859-1)</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 COLSPAN="4" PORT="compression_flag__valid">must be any of 0, 1</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 COLSPAN="4" PORT="compression_method__valid">must be equal to (compression_flag == 1 ? :compression_methods_zlib : compression_method)</TD></TR>
<TR><TD PORT="language_tag_pos">...</TD><TD PORT="language_tag_size">...</TD><TD>str(term=0, 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(term=0, UTF-8)</TD><TD PORT="translated_keyword_type">translated_keyword</TD></TR>
<TR><TD PORT="text_plain_pos">...</TD><TD PORT="text_plain_size">⇲</TD><TD>InternationalText</TD><TD PORT="text_plain_type">text_plain</TD></TR>
<TR><TD COLSPAN="4" PORT="text_plain__if">if compression_flag == 0</TD></TR>
<TR><TD PORT="text_zlib_pos">...</TD><TD PORT="text_zlib_size">⇲</TD><TD>InternationalText</TD><TD PORT="text_zlib_type">text_zlib</TD></TR>
<TR><TD COLSPAN="4" PORT="text_zlib__if">if compression_flag == 1</TD></TR>
</TABLE>>];
international_text_chunk__inst__text [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>text</TD><TD>(compression_flag == 0 ? text_plain : text_zlib).value</TD></TR>
</TABLE>>];
}
subgraph cluster__mdcv_chromaticity {
label="Png::MdcvChromaticity";
graph[style=dotted];
mdcv_chromaticity__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">2</TD><TD>u2be</TD><TD PORT="x_int_type">x_int</TD></TR>
<TR><TD PORT="y_int_pos">2</TD><TD PORT="y_int_size">2</TD><TD>u2be</TD><TD PORT="y_int_type">y_int</TD></TR>
</TABLE>>];
mdcv_chromaticity__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 * 0.00002</TD></TR>
</TABLE>>];
mdcv_chromaticity__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 * 0.00002</TD></TR>
</TABLE>>];
}
subgraph cluster__mdcv_chunk {
label="Png::MdcvChunk";
graph[style=dotted];
mdcv_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="red_pos">0</TD><TD PORT="red_size">4</TD><TD>MdcvChromaticity</TD><TD PORT="red_type">red</TD></TR>
<TR><TD PORT="green_pos">4</TD><TD PORT="green_size">4</TD><TD>MdcvChromaticity</TD><TD PORT="green_type">green</TD></TR>
<TR><TD PORT="blue_pos">8</TD><TD PORT="blue_size">4</TD><TD>MdcvChromaticity</TD><TD PORT="blue_type">blue</TD></TR>
<TR><TD PORT="white_point_pos">12</TD><TD PORT="white_point_size">4</TD><TD>MdcvChromaticity</TD><TD PORT="white_point_type">white_point</TD></TR>
<TR><TD PORT="max_luminance_int_pos">16</TD><TD PORT="max_luminance_int_size">4</TD><TD>u4be</TD><TD PORT="max_luminance_int_type">max_luminance_int</TD></TR>
<TR><TD PORT="min_luminance_int_pos">20</TD><TD PORT="min_luminance_int_size">4</TD><TD>u4be</TD><TD PORT="min_luminance_int_type">min_luminance_int</TD></TR>
</TABLE>>];
mdcv_chunk__inst__max_luminance [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>max_luminance</TD><TD>max_luminance_int * 0.0001</TD></TR>
</TABLE>>];
mdcv_chunk__inst__min_luminance [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>min_luminance</TD><TD>min_luminance_int * 0.0001</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>
<TR><TD COLSPAN="4" PORT="unit__valid">must be defined in the enum</TD></TR>
</TABLE>>];
phys_chunk__inst__dots_per_inch_x [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>dots_per_inch_x</TD><TD>pixels_per_unit_x * 0.0254</TD></TR>
</TABLE>>];
phys_chunk__inst__dots_per_inch_y [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>dots_per_inch_y</TD><TD>pixels_per_unit_y * 0.0254</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__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__sbit_chunk {
label="Png::SbitChunk";
graph[style=dotted];
sbit_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="significant_bits_pos">0</TD><TD PORT="significant_bits_size">...</TD><TD>switch (_root.ihdr.color_type)</TD><TD PORT="significant_bits_type">significant_bits</TD></TR>
</TABLE>>];
sbit_chunk__inst__sample_depth [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>sample_depth</TD><TD>(_root.ihdr.color_type == :color_type_indexed ? 8 : _root.ihdr.bit_depth)</TD></TR>
</TABLE>>];
sbit_chunk__seq_significant_bits_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_greyscale</TD><TD PORT="case0">SbitGreyscale</TD></TR>
<TR><TD>:color_type_greyscale_alpha</TD><TD PORT="case1">SbitGreyscale</TD></TR>
<TR><TD>:color_type_indexed</TD><TD PORT="case2">SbitTruecolor</TD></TR>
<TR><TD>:color_type_truecolor</TD><TD PORT="case3">SbitTruecolor</TD></TR>
<TR><TD>:color_type_truecolor_alpha</TD><TD PORT="case4">SbitTruecolor</TD></TR>
</TABLE>>];
}
subgraph cluster__sbit_greyscale {
label="Png::SbitGreyscale";
graph[style=dotted];
sbit_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="grey_pos">0</TD><TD PORT="grey_size">1</TD><TD>u1</TD><TD PORT="grey_type">grey</TD></TR>
<TR><TD COLSPAN="4" PORT="grey__valid">must be between 1 and _parent.sample_depth</TD></TR>
<TR><TD PORT="alpha_pos">1</TD><TD PORT="alpha_size">1</TD><TD>u1</TD><TD PORT="alpha_type">alpha</TD></TR>
<TR><TD COLSPAN="4" PORT="alpha__valid">must be between 1 and _parent.sample_depth</TD></TR>
<TR><TD COLSPAN="4" PORT="alpha__if">if has_alpha</TD></TR>
</TABLE>>];
}
subgraph cluster__sbit_truecolor {
label="Png::SbitTruecolor";
graph[style=dotted];
sbit_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">1</TD><TD>u1</TD><TD PORT="red_type">red</TD></TR>
<TR><TD COLSPAN="4" PORT="red__valid">must be between 1 and _parent.sample_depth</TD></TR>
<TR><TD PORT="green_pos">1</TD><TD PORT="green_size">1</TD><TD>u1</TD><TD PORT="green_type">green</TD></TR>
<TR><TD COLSPAN="4" PORT="green__valid">must be between 1 and _parent.sample_depth</TD></TR>
<TR><TD PORT="blue_pos">2</TD><TD PORT="blue_size">1</TD><TD>u1</TD><TD PORT="blue_type">blue</TD></TR>
<TR><TD COLSPAN="4" PORT="blue__valid">must be between 1 and _parent.sample_depth</TD></TR>
<TR><TD PORT="alpha_pos">3</TD><TD PORT="alpha_size">1</TD><TD>u1</TD><TD PORT="alpha_type">alpha</TD></TR>
<TR><TD COLSPAN="4" PORT="alpha__valid">must be between 1 and _parent.sample_depth</TD></TR>
<TR><TD COLSPAN="4" PORT="alpha__if">if has_alpha</TD></TR>
</TABLE>>];
}
subgraph cluster__splt_chunk {
label="Png::SpltChunk";
graph[style=dotted];
splt_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="palette_name_pos">0</TD><TD PORT="palette_name_size">...</TD><TD>str(term=0, ISO-8859-1)</TD><TD PORT="palette_name_type">palette_name</TD></TR>
<TR><TD PORT="sample_depth_pos">...</TD><TD PORT="sample_depth_size">1</TD><TD>u1</TD><TD PORT="sample_depth_type">sample_depth</TD></TR>
<TR><TD COLSPAN="4" PORT="sample_depth__valid">must be any of 8, 16</TD></TR>
<TR><TD PORT="entries_pos">...</TD><TD PORT="entries_size">...</TD><TD>SpltEntry</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__splt_entry {
label="Png::SpltEntry";
graph[style=dotted];
splt_entry__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">...</TD><TD>switch (_parent.sample_depth)</TD><TD PORT="red_type">red</TD></TR>
<TR><TD PORT="green_pos">...</TD><TD PORT="green_size">...</TD><TD>switch (_parent.sample_depth)</TD><TD PORT="green_type">green</TD></TR>
<TR><TD PORT="blue_pos">...</TD><TD PORT="blue_size">...</TD><TD>switch (_parent.sample_depth)</TD><TD PORT="blue_type">blue</TD></TR>
<TR><TD PORT="alpha_pos">...</TD><TD PORT="alpha_size">...</TD><TD>switch (_parent.sample_depth)</TD><TD PORT="alpha_type">alpha</TD></TR>
<TR><TD PORT="freq_pos">...</TD><TD PORT="freq_size">2</TD><TD>u2be</TD><TD PORT="freq_type">freq</TD></TR>
</TABLE>>];
splt_entry__seq_red_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
</TABLE>>];
splt_entry__seq_green_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
</TABLE>>];
splt_entry__seq_blue_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
</TABLE>>];
splt_entry__seq_alpha_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</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>
<TR><TD COLSPAN="4" PORT="render_intent__valid">must be defined in the enum</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(term=0, ISO-8859-1)</TD><TD PORT="keyword_type">keyword</TD></TR>
<TR><TD PORT="text_pos">...</TD><TD PORT="text_size">⇲</TD><TD>str(ISO-8859-1)</TD><TD PORT="text_type">text</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>>];
}
subgraph cluster__trns_chunk {
label="Png::TrnsChunk";
graph[style=dotted];
trns_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="palette_alphas_pos">0</TD><TD PORT="palette_alphas_size">1</TD><TD>u1</TD><TD PORT="palette_alphas_type">palette_alphas</TD></TR>
<TR><TD COLSPAN="4" PORT="palette_alphas__repeat">repeat to end of stream</TD></TR>
<TR><TD COLSPAN="4" PORT="palette_alphas__if">if _root.ihdr.color_type == :color_type_indexed</TD></TR>
<TR><TD PORT="transparent_color_pos">...</TD><TD PORT="transparent_color_size">...</TD><TD>switch (_root.ihdr.color_type)</TD><TD PORT="transparent_color_type">transparent_color</TD></TR>
</TABLE>>];
trns_chunk__inst__sample_mask [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>sample_mask</TD><TD>(1 << _root.ihdr.bit_depth) - 1</TD></TR>
</TABLE>>];
trns_chunk__seq_transparent_color_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_greyscale</TD><TD PORT="case0">TrnsGreyscaleColor</TD></TR>
<TR><TD>:color_type_truecolor</TD><TD PORT="case1">TrnsTruecolorColor</TD></TR>
</TABLE>>];
}
subgraph cluster__trns_greyscale_color {
label="Png::TrnsGreyscaleColor";
graph[style=dotted];
trns_greyscale_color__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="grey_raw_pos">0</TD><TD PORT="grey_raw_size">2</TD><TD>u2be</TD><TD PORT="grey_raw_type">grey_raw</TD></TR>
</TABLE>>];
trns_greyscale_color__inst__grey [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>grey</TD><TD>grey_raw & _parent.sample_mask</TD></TR>
</TABLE>>];
}
subgraph cluster__trns_truecolor_color {
label="Png::TrnsTruecolorColor";
graph[style=dotted];
trns_truecolor_color__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_raw_pos">0</TD><TD PORT="red_raw_size">2</TD><TD>u2be</TD><TD PORT="red_raw_type">red_raw</TD></TR>
<TR><TD PORT="green_raw_pos">2</TD><TD PORT="green_raw_size">2</TD><TD>u2be</TD><TD PORT="green_raw_type">green_raw</TD></TR>
<TR><TD PORT="blue_raw_pos">4</TD><TD PORT="blue_raw_size">2</TD><TD>u2be</TD><TD PORT="blue_raw_type">blue_raw</TD></TR>
</TABLE>>];
trns_truecolor_color__inst__blue [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>blue</TD><TD>blue_raw & _parent.sample_mask</TD></TR>
</TABLE>>];
trns_truecolor_color__inst__green [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>green</TD><TD>green_raw & _parent.sample_mask</TD></TR>
</TABLE>>];
trns_truecolor_color__inst__red [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>red</TD><TD>red_raw & _parent.sample_mask</TD></TR>
</TABLE>>];
}
}
png__seq:ihdr_type -> ihdr_chunk__seq [style=bold];
png__seq:chunks_type -> chunk__seq [style=bold];
chunk__inst__type:type_type -> png__seq:chunks__repeat [color="#404040"];
atch_chunk__seq:compression_type -> atch_chunk__seq:data_plain__if [color="#404040"];
atch_chunk__seq:compression_type -> atch_chunk__seq:data_zlib__if [color="#404040"];
atch_chunk__seq:compression_type -> atch_chunk__inst__data [color="#404040"];
atch_chunk__seq:data_plain_type -> atch_chunk__inst__data [color="#404040"];
atch_chunk__seq:data_zlib_type -> atch_chunk__inst__data [color="#404040"];
bkgd_chunk__seq:bkgd_type -> bkgd_chunk__seq_bkgd_switch [style=bold];
bkgd_chunk__seq_bkgd_switch:case0 -> bkgd_greyscale__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case1 -> bkgd_greyscale__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case2 -> bkgd_indexed__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case3 -> bkgd_truecolor__seq [style=bold];
bkgd_chunk__seq_bkgd_switch:case4 -> bkgd_truecolor__seq [style=bold];
ihdr_chunk__seq:color_type_type -> bkgd_chunk__seq:bkgd_type [color="#404040"];
chrm_chromaticity__seq:x_int_type -> chrm_chromaticity__inst__x [color="#404040"];
chrm_chromaticity__seq:y_int_type -> chrm_chromaticity__inst__y [color="#404040"];
chrm_chunk__seq:white_point_type -> chrm_chromaticity__seq [style=bold];
chrm_chunk__seq:red_type -> chrm_chromaticity__seq [style=bold];
chrm_chunk__seq:green_type -> chrm_chromaticity__seq [style=bold];
chrm_chunk__seq:blue_type -> chrm_chromaticity__seq [style=bold];
chunk__seq:body_type -> chunk__seq_body_switch [style=bold];
chunk__seq_body_switch:case0 -> plte_chunk__seq [style=bold];
chunk__seq_body_switch:case1 -> animation_control_chunk__seq [style=bold];
chunk__seq_body_switch:case2 -> atch_chunk__seq [style=bold];
chunk__seq_body_switch:case3 -> bkgd_chunk__seq [style=bold];
chunk__seq_body_switch:case4 -> chrm_chunk__seq [style=bold];
chunk__seq_body_switch:case5 -> cicp_chunk__seq [style=bold];
chunk__seq_body_switch:case6 -> clli_chunk__seq [style=bold];
chunk__seq_body_switch:case7 -> exif_chunk__seq [style=bold];
chunk__seq_body_switch:case8 -> frame_control_chunk__seq [style=bold];
chunk__seq_body_switch:case9 -> frame_data_chunk__seq [style=bold];
chunk__seq_body_switch:case10 -> gama_chunk__seq [style=bold];
chunk__seq_body_switch:case11 -> hist_chunk__seq [style=bold];
chunk__seq_body_switch:case12 -> iccp_chunk__seq [style=bold];
chunk__seq_body_switch:case13 -> international_text_chunk__seq [style=bold];
chunk__seq_body_switch:case14 -> mdcv_chunk__seq [style=bold];
chunk__seq_body_switch:case15 -> adobe_fireworks_chunk__seq [style=bold];
chunk__seq_body_switch:case16 -> adobe_fireworks_chunk__seq [style=bold];
chunk__seq_body_switch:case17 -> phys_chunk__seq [style=bold];
chunk__seq_body_switch:case18 -> adobe_fireworks_chunk__seq [style=bold];
chunk__seq_body_switch:case19 -> sbit_chunk__seq [style=bold];
chunk__seq_body_switch:case20 -> splt_chunk__seq [style=bold];
chunk__seq_body_switch:case21 -> srgb_chunk__seq [style=bold];
chunk__seq_body_switch:case22 -> evernote_skmf_chunk__seq [style=bold];
chunk__seq_body_switch:case23 -> evernote_skrf_chunk__seq [style=bold];
chunk__seq_body_switch:case24 -> text_chunk__seq [style=bold];
chunk__seq_body_switch:case25 -> time_chunk__seq [style=bold];
chunk__seq_body_switch:case26 -> trns_chunk__seq [style=bold];
chunk__seq_body_switch:case27 -> compressed_text_chunk__seq [style=bold];
chunk__inst__type:type_type -> chunk__seq:body_type [color="#404040"];
chunk__seq:type_raw_type -> chunk__inst__is_ancillary [color="#404040"];
chunk__seq:type_raw_type -> chunk__inst__is_private [color="#404040"];
chunk__seq:type_raw_type -> chunk__inst__is_safe_to_copy [color="#404040"];
chunk__seq:type_raw_type -> chunk__inst__reserved_bit [color="#404040"];
chunk__seq:type_raw_type -> chunk__inst__type [color="#404040"];
clli_chunk__seq:max_content_light_level_int_type -> clli_chunk__inst__max_content_light_level [color="#404040"];
clli_chunk__seq:max_frame_average_light_level_int_type -> clli_chunk__inst__max_frame_average_light_level [color="#404040"];
compressed_text_chunk__seq:text_type -> compressed_text__seq [style=bold];
exif_chunk__seq:exif_type -> exif__seq [style=bold];
ihdr_chunk__seq:width_type -> frame_control_chunk__seq:width__valid [color="#404040"];
ihdr_chunk__seq:height_type -> frame_control_chunk__seq:height__valid [color="#404040"];
ihdr_chunk__seq:width_type -> frame_control_chunk__seq:x_offset__valid [color="#404040"];
frame_control_chunk__seq:width_type -> frame_control_chunk__seq:x_offset__valid [color="#404040"];
ihdr_chunk__seq:height_type -> frame_control_chunk__seq:y_offset__valid [color="#404040"];
frame_control_chunk__seq:height_type -> frame_control_chunk__seq:y_offset__valid [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"];
gama_chunk__seq:gamma_int_type -> gama_chunk__inst__gamma [color="#404040"];
gama_chunk__seq:gamma_int_type -> gama_chunk__inst__inv_gamma [color="#404040"];
iccp_chunk__seq:profile_type -> icc_4__seq [style=bold];
international_text_chunk__seq:compression_flag_type -> international_text_chunk__seq:compression_method__valid [color="#404040"];
international_text_chunk__seq:compression_method_type -> international_text_chunk__seq:compression_method__valid [color="#404040"];
international_text_chunk__seq:text_plain_type -> international_text__seq [style=bold];
international_text_chunk__seq:compression_flag_type -> international_text_chunk__seq:text_plain__if [color="#404040"];
international_text_chunk__seq:text_zlib_type -> international_text__seq [style=bold];
international_text_chunk__seq:compression_flag_type -> international_text_chunk__seq:text_zlib__if [color="#404040"];
international_text__seq:value_type -> international_text_chunk__inst__text [color="#404040"];
mdcv_chromaticity__seq:x_int_type -> mdcv_chromaticity__inst__x [color="#404040"];
mdcv_chromaticity__seq:y_int_type -> mdcv_chromaticity__inst__y [color="#404040"];
mdcv_chunk__seq:red_type -> mdcv_chromaticity__seq [style=bold];
mdcv_chunk__seq:green_type -> mdcv_chromaticity__seq [style=bold];
mdcv_chunk__seq:blue_type -> mdcv_chromaticity__seq [style=bold];
mdcv_chunk__seq:white_point_type -> mdcv_chromaticity__seq [style=bold];
mdcv_chunk__seq:max_luminance_int_type -> mdcv_chunk__inst__max_luminance [color="#404040"];
mdcv_chunk__seq:min_luminance_int_type -> mdcv_chunk__inst__min_luminance [color="#404040"];
phys_chunk__seq:pixels_per_unit_x_type -> phys_chunk__inst__dots_per_inch_x [color="#404040"];
phys_chunk__seq:pixels_per_unit_y_type -> phys_chunk__inst__dots_per_inch_y [color="#404040"];
plte_chunk__seq:entries_type -> rgb__seq [style=bold];
sbit_chunk__seq:significant_bits_type -> sbit_chunk__seq_significant_bits_switch [style=bold];
sbit_chunk__seq_significant_bits_switch:case0 -> sbit_greyscale__seq [style=bold];
sbit_chunk__seq_significant_bits_switch:case1 -> sbit_greyscale__seq [style=bold];
sbit_chunk__seq_significant_bits_switch:case2 -> sbit_truecolor__seq [style=bold];
sbit_chunk__seq_significant_bits_switch:case3 -> sbit_truecolor__seq [style=bold];
sbit_chunk__seq_significant_bits_switch:case4 -> sbit_truecolor__seq [style=bold];
ihdr_chunk__seq:color_type_type -> sbit_chunk__seq:significant_bits_type [color="#404040"];
ihdr_chunk__seq:color_type_type -> sbit_chunk__inst__sample_depth [color="#404040"];
ihdr_chunk__seq:bit_depth_type -> sbit_chunk__inst__sample_depth [color="#404040"];
sbit_chunk__inst__sample_depth:sample_depth_type -> sbit_greyscale__seq:grey__valid [color="#404040"];
sbit_chunk__inst__sample_depth:sample_depth_type -> sbit_greyscale__seq:alpha__valid [color="#404040"];
sbit_greyscale__params:has_alpha_type -> sbit_greyscale__seq:alpha__if [color="#404040"];
sbit_chunk__inst__sample_depth:sample_depth_type -> sbit_truecolor__seq:red__valid [color="#404040"];
sbit_chunk__inst__sample_depth:sample_depth_type -> sbit_truecolor__seq:green__valid [color="#404040"];
sbit_chunk__inst__sample_depth:sample_depth_type -> sbit_truecolor__seq:blue__valid [color="#404040"];
sbit_chunk__inst__sample_depth:sample_depth_type -> sbit_truecolor__seq:alpha__valid [color="#404040"];
sbit_truecolor__params:has_alpha_type -> sbit_truecolor__seq:alpha__if [color="#404040"];
splt_chunk__seq:entries_type -> splt_entry__seq [style=bold];
splt_entry__seq:red_type -> splt_entry__seq_red_switch [style=bold];
splt_chunk__seq:sample_depth_type -> splt_entry__seq:red_type [color="#404040"];
splt_entry__seq:green_type -> splt_entry__seq_green_switch [style=bold];
splt_chunk__seq:sample_depth_type -> splt_entry__seq:green_type [color="#404040"];
splt_entry__seq:blue_type -> splt_entry__seq_blue_switch [style=bold];
splt_chunk__seq:sample_depth_type -> splt_entry__seq:blue_type [color="#404040"];
splt_entry__seq:alpha_type -> splt_entry__seq_alpha_switch [style=bold];
splt_chunk__seq:sample_depth_type -> splt_entry__seq:alpha_type [color="#404040"];
ihdr_chunk__seq:color_type_type -> trns_chunk__seq:palette_alphas__if [color="#404040"];
trns_chunk__seq:transparent_color_type -> trns_chunk__seq_transparent_color_switch [style=bold];
trns_chunk__seq_transparent_color_switch:case0 -> trns_greyscale_color__seq [style=bold];
trns_chunk__seq_transparent_color_switch:case1 -> trns_truecolor_color__seq [style=bold];
ihdr_chunk__seq:color_type_type -> trns_chunk__seq:transparent_color_type [color="#404040"];
ihdr_chunk__seq:bit_depth_type -> trns_chunk__inst__sample_mask [color="#404040"];
trns_greyscale_color__seq:grey_raw_type -> trns_greyscale_color__inst__grey [color="#404040"];
trns_chunk__inst__sample_mask:sample_mask_type -> trns_greyscale_color__inst__grey [color="#404040"];
trns_truecolor_color__seq:blue_raw_type -> trns_truecolor_color__inst__blue [color="#404040"];
trns_chunk__inst__sample_mask:sample_mask_type -> trns_truecolor_color__inst__blue [color="#404040"];
trns_truecolor_color__seq:green_raw_type -> trns_truecolor_color__inst__green [color="#404040"];
trns_chunk__inst__sample_mask:sample_mask_type -> trns_truecolor_color__inst__green [color="#404040"];
trns_truecolor_color__seq:red_raw_type -> trns_truecolor_color__inst__red [color="#404040"];
trns_chunk__inst__sample_mask:sample_mask_type -> trns_truecolor_color__inst__red [color="#404040"];
}