test_pie/external/exiftool/lib/Image/ExifTool/MNG.pm

685 lines
16 KiB
Perl

#------------------------------------------------------------------------------
# File: MNG.pm
#
# Description: MNG and JNG meta information tags
#
# Revisions: 06/23/2005 - P. Harvey Created
#
# References: 1) http://www.libpng.org/pub/mng/
#------------------------------------------------------------------------------
package Image::ExifTool::MNG;
use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
$VERSION = '1.00';
# MNG chunks
%Image::ExifTool::MNG::Main = (
GROUPS => { 2 => 'Image' },
NOTES => q{
This table contains definitions for tags found in MNG and JNG images. MNG
is a superset of PNG and JNG, so a MNG image may contain any of these tags
as well as any PNG tags. Conversely, only some of these tags are valid for
JNG images.
},
BACK => {
Name => 'Background',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::Background' },
},
BASI => {
Name => 'BasisObject',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::BasisObject' },
},
CLIP => {
Name => 'ClipObjects',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::ClipObjects' },
},
CLON => {
Name => 'CloneObject',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::CloneObject' },
},
DBYK => {
Name => 'DropByKeyword',
Binary => 1,
},
DEFI => {
Name => 'DefineObject',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::DefineObject' },
},
DHDR => {
Name => 'DeltaPNGHeader',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::DeltaPNGHeader' },
},
DISC => {
Name => 'DiscardObjects',
ValueConv => 'join(" ",unpack("n*",$val))',
},
DROP => {
Name => 'DropChunks',
ValueConv => 'join(" ",$val=~/..../g)',
},
# ENDL
eXPi => {
Name => 'ExportImage',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::ExportImage' },
},
fPRI => {
Name => 'FramePriority',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::FramePriority' },
},
FRAM => {
Name => 'Frame',
Binary => 1,
},
# IJNG
# IPNG
# JDAA (JNG)
# JDAT (JNG)
JHDR => { # (JNG)
Name => 'JNGHeader',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::JNGHeader' },
},
# JSEP (JNG)
LOOP => {
Name => 'Loop',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::Loop' },
},
MAGN => {
Name => 'MagnifyObject',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::MagnifyObject' },
},
# MEND
MHDR => {
Name => 'MNGHeader',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::MNGHeader' },
},
MOVE => {
Name => 'MoveObjects',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::MoveObjects' },
},
nEED => {
Name => 'ResourcesNeeded',
Binary => 1,
},
ORDR => {
Name => 'OrderingRestrictions',
Binary => 1,
},
PAST => {
Name => 'PasteImage',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::PasteImage' },
},
pHYg => {
Name => 'GlobalPixelSize',
SubDirectory => { TagTable => 'Image::ExifTool::PNG::PhysicalPixel' },
},
PPLT => {
Name => 'PartialPalette',
Binary => 1,
},
PROM => {
Name => 'PromoteParent',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::PromoteParent' },
},
SAVE => {
Name => 'SaveObjects',
Binary => 1,
},
SEEK => {
Name => 'SeekPoint',
ValueConv => '$val=~s/\0.*//s; $val',
},
SHOW => {
Name => 'ShowObjects',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::ShowObjects' },
},
TERM => {
Name => 'TerminationAction',
SubDirectory => { TagTable => 'Image::ExifTool::MNG::TerminationAction' },
},
);
# MNG MHDR chunk
%Image::ExifTool::MNG::MNGHeader = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
FORMAT => 'int32u',
0 => 'ImageWidth',
1 => 'ImageHeight',
2 => 'TicksPerSecond',
3 => 'NominalLayerCount',
4 => 'NominalFrameCount',
5 => 'NominalPlayTime',
6 => {
Name => 'SimplicityProfile',
PrintConv => 'sprintf("0x%.8x", $val)',
},
);
# MNG BASI chunk
%Image::ExifTool::MNG::BasisObject = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'ImageWidth',
Format => 'int32u',
},
4 => {
Name => 'ImageHeight',
Format => 'int32u',
},
8 => 'BitDepth',
9 => {
Name => 'ColorType',
RawConv => '$Image::ExifTool::PNG::colorType = $val',
PrintConv => {
0 => 'Grayscale',
2 => 'RGB',
3 => 'Palette',
4 => 'Grayscale with Alpha',
6 => 'RGB with Alpha',
},
},
10 => {
Name => 'Compression',
PrintConv => { 0 => 'Deflate/Inflate' },
},
11 => {
Name => 'Filter',
PrintConv => { 0 => 'Adaptive' },
},
12 => {
Name => 'Interlace',
PrintConv => { 0 => 'Noninterlaced', 1 => 'Adam7 Interlace' },
},
13 => {
Name => 'RedSample',
Format => 'int32u',
},
17 => {
Name => 'GreenSample',
Format => 'int32u',
},
21 => {
Name => 'BlueSample',
Format => 'int32u',
},
25 => {
Name => 'AlphaSample',
Format => 'int32u',
},
26 => 'Viewable',
);
# MNG LOOP chunk
%Image::ExifTool::MNG::Loop = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => 'NestLevel',
1 => {
Name => 'IterationCount',
Format => 'int32u',
},
5 => {
Name => 'TerminationCondition',
PrintConv => {
0 => 'Deterministic, not cacheable',
1 => 'Decoder discretion, not cacheable',
2 => 'User discretion, not cacheable',
3 => 'External signal, not cacheable',
4 => 'Deterministic, cacheable',
5 => 'Decoder discretion, cacheable',
6 => 'User discretion, cacheable',
7 => 'External signal, cacheable',
},
},
6 => {
Name => 'IterationMinMax',
Format => 'int32u[2]',
},
14 => {
Name => 'SignalNumber',
Format => 'int32u',
},
);
# MNG DEFI chunk
%Image::ExifTool::MNG::DefineObject = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'ObjectID',
Format => 'int16u',
},
2 => 'DoNotShow',
3 => 'ConcreteFlag',
4 => {
Name => 'XYLocation',
Format => 'int32u[2]',
},
12 => {
Name => 'ClippingBoundary',
Format => 'int32u[4]',
},
);
# MNG CLON chunk
%Image::ExifTool::MNG::CloneObject = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'SourceID',
Format => 'int16u',
},
2 => {
Name => 'CloneID',
Format => 'int16u',
},
4 => {
Name => 'CloneType',
PrintConv => { 0 => 'Full', 1 => 'Parital', 2 => 'Renumber object' },
},
5 => 'DoNotShow',
6 => 'ConcreteFlag',
7 => {
Name => 'LocalDeltaType',
PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
},
8 => {
Name => 'DeltaXY',
Format => 'int32u[2]',
},
);
# MNG PAST chunk
%Image::ExifTool::MNG::PasteImage = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'DestinationID',
Format => 'int16u',
},
2 => {
Name => 'TargetDeltaType',
PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
},
3 => {
Name => 'TargetXY',
Format => 'int32u[2]',
},
11 => {
Name => 'SourceID',
Format => 'int16u',
},
13 => {
Name => 'CompositionMode',
PrintConv => { 0 => 'Over', 1 => 'Replace', 2 => 'Under' },
},
14 => {
Name => 'Orientation',
PrintConv => {
0 => 'Same as source',
2 => 'Flipped left-right, then up-down',
4 => 'Flipped left-right',
6 => 'Flipped up-down',
8 => 'Tiled',
},
},
15 => {
Name => 'OffsetOrigin',
PrintConv => { 0 => 'Desination Origin', 1 => 'Target Origin' },
},
16 => {
Name => 'OffsetXY',
Format => 'int32u[2]',
},
24 => {
Name => 'BoundaryOrigin',
PrintConv => { 0 => 'Desination Origin', 1 => 'Target Origin' },
},
25 => {
Name => 'PastClippingBoundary',
Format => 'int32u[4]',
},
);
my %magMethod = (
0 => 'No Magnification',
1 => 'Pixel Replication',
2 => 'Linear Interpolation',
3 => 'Closest Pixel',
4 => 'Color Linear Interpolation and Alpha Closest Pixel',
5 => 'Color Closest Pixel and Alpha Linear Interpolation',
);
# MNG MAGN chunk
%Image::ExifTool::MNG::MagnifyObject = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'FirstObjectID',
Format => 'int16u',
},
2 => {
Name => 'LastObjectID',
Format => 'int16u',
},
4 => {
Name => 'XMethod',
PrintConv => \%magMethod,
},
5 => {
Name => 'XMag',
Format => 'int16u',
},
7 => {
Name => 'YMag',
Format => 'int16u',
},
9 => {
Name => 'LeftMag',
Format => 'int16u',
},
11 => {
Name => 'RightMag',
Format => 'int16u',
},
13 => {
Name => 'TopMag',
Format => 'int16u',
},
15 => {
Name => 'BottomMag',
Format => 'int16u',
},
17 => {
Name => 'YMethod',
PrintConv => \%magMethod,
},
);
# MNG TERM chunk
%Image::ExifTool::MNG::TerminationAction = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'TerminationAction',
PrintConv => {
0 => 'Show Last Frame',
1 => 'Display Nothing',
2 => 'Show First Frame',
3 => 'Repeat Sequence',
},
},
1 => {
Name => 'IterationEndAction',
PrintConv => {
0 => 'Show Last Frame',
1 => 'Display Nothing',
2 => 'Show First Frame',
},
},
2 => {
Name => 'Delay',
Format => 'int32u',
},
6 => {
Name => 'IterationMax',
Format => 'int32u',
},
);
# MNG BACK chunk
%Image::ExifTool::MNG::Background = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'BackgroundColor',
Format => 'int16u[3]',
},
6 => {
Name => 'MandatoryBackground',
PrintConv => {
0 => 'Color and Image Advisory',
1 => 'Color Mandatory, Image Advisory',
2 => 'Color Advisory, Image Mandatory',
3 => 'Color and Image Mandatory',
},
},
7 => {
Name => 'BackgroundImageID',
Format => 'int16u',
},
9 => {
Name => 'BackgroundTiling',
PrintConv => { 0 => 'No', 1 => 'Yes' },
},
);
# MNG MOVE chunk
%Image::ExifTool::MNG::MoveObjects = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'FirstObject',
Format => 'int16u',
},
2 => {
Name => 'LastObject',
Format => 'int16u',
},
4 => {
Name => 'DeltaType',
PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
},
5 => {
Name => 'DeltaXY',
Format => 'int32u[2]',
},
);
# MNG CLIP chunk
%Image::ExifTool::MNG::ClipObjects = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'FirstObject',
Format => 'int16u',
},
2 => {
Name => 'LastObject',
Format => 'int16u',
},
4 => {
Name => 'DeltaType',
PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
},
5 => {
Name => 'ClipBoundary',
Format => 'int32u[4]',
},
);
# MNG SHOW chunk
%Image::ExifTool::MNG::ShowObjects = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'FirstObject',
Format => 'int16u',
},
2 => {
Name => 'LastObject',
Format => 'int16u',
},
4 => 'ShowMode',
);
# MNG eXPI chunk
%Image::ExifTool::MNG::ExportImage = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'SnapshotID',
Format => 'int16u',
},
2 => {
Name => 'SnapshotName',
Format => 'string',
},
);
# MNG fPRI chunk
%Image::ExifTool::MNG::FramePriority = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'DeltaType',
PrintConv => { 0 => 'Absolute', 1 => 'Relative' },
},
2 => 'Priority',
);
# MNG DHDR chunk
%Image::ExifTool::MNG::DeltaPNGHeader = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'ObjectID',
Format => 'int16u',
},
2 => {
Name => 'ImageType',
PrintConv => {
0 => 'Unspecified',
1 => 'PNG',
2 => 'JNG',
},
},
3 => {
Name => 'DeltaType',
PrintConv => {
0 => 'Full Replacement',
1 => 'Pixel Addition',
2 => 'Alpha Addition',
3 => 'Color Addition',
4 => 'Pixel Replacement',
5 => 'Alpha Replacement',
6 => 'Color Replacement',
7 => 'No Change',
},
},
4 => {
Name => 'BlockSize',
Format => 'int32u[2]',
},
12 => {
Name => 'BlockLocation',
Format => 'int32u[2]',
},
);
# MNG PROM chunk
%Image::ExifTool::MNG::PromoteParent = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => 'NewColorType',
1 => 'NewBitDepth',
2 => {
Name => 'FillMethod',
PrintConv => { 0 => 'Bit Replication', 1 => 'Zero Fill' },
},
);
# JNG JHDR chunk
%Image::ExifTool::MNG::JNGHeader = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
GROUPS => { 2 => 'Image' },
0 => {
Name => 'ImageWidth',
Format => 'int32u',
},
4 => {
Name => 'ImageHeight',
Format => 'int32u',
},
8 => {
Name => 'ColorType',
PrintConv => {
8 => 'Gray',
10 => 'Color',
12 => 'Gray Alpha',
14 => 'Color Alpha',
},
},
9 => 'BitDepth',
10 => {
Name => 'Compression',
PrintConv => { 8 => 'Huffman-coded baseline JPEG' },
},
11 => {
Name => 'Interlace',
PrintConv => { 0 => 'Sequential', 8 => 'Progressive' },
},
12 => 'AlphaBitDepth',
13 => {
Name => 'AlphaCompression',
PrintConv => {
0 => 'MNG Grayscale IDAT',
8 => 'JNG 8-bit Grayscale JDAA',
},
},
14 => {
Name => 'AlphaFilter',
PrintConv => { 0 => 'Adaptive MNG (N/A for JPEG)' },
},
15 => {
Name => 'AlphaInterlace',
PrintConv => { 0 => 'Noninterlaced' },
},
);
1; # end
__END__
=head1 NAME
Image::ExifTool::MNG - MNG and JNG meta information tags
=head1 SYNOPSIS
This module is used by Image::ExifTool
=head1 DESCRIPTION
This module contains definitions required by Image::ExifTool to read MNG
(Multi-image Network Graphics) and JNG (JPEG Network Graphics) images.
=head1 AUTHOR
Copyright 2003-2018, Phil Harvey (phil at owl.phy.queensu.ca)
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=head1 REFERENCES
=over 4
=item L<http://www.libpng.org/pub/mng/>
=back
=head1 SEE ALSO
L<Image::ExifTool::TagNames/MNG Tags>,
L<Image::ExifTool::TagNames/PNG Tags>,
L<Image::ExifTool(3pm)|Image::ExifTool>
=cut