$VERSION
=
'1.06'
;
my
$implementedRawzorVersion
= 199;
%Image::ExifTool::Rawzor::Main
= (
GROUPS
=> {
2
=>
'Other'
},
VARS
=> {
NO_ID
=> 1 },
NOTES
=>
q{
Rawzor files store compressed images of other formats. As well as the
information listed below, exiftool uncompresses and extracts the meta
information from the original image.
}
,
OriginalFileType
=> { },
OriginalFileSize
=> {
PrintConv
=>
$Image::ExifTool::Extra
{FileSize}->{PrintConv},
},
RawzorRequiredVersion
=> {
ValueConv
=>
'$val / 100'
,
PrintConv
=>
'sprintf("%.2f", $val)'
,
},
RawzorCreatorVersion
=> {
ValueConv
=>
'$val / 100'
,
PrintConv
=>
'sprintf("%.2f", $val)'
,
},
CompressionFactor
=> {
PrintConv
=>
'sprintf("%.2f", $val)'
},
);
sub
ProcessRWZ($$)
{
my
(
$et
,
$dirInfo
) =
@_
;
my
$raf
=
$$dirInfo
{RAF};
my
(
$buff
,
$buf2
);
$raf
->Read(
$buff
, 46) == 46 and
$buff
=~ /^rawzor/ or
return
0;
SetByteOrder(
'II'
);
my
$reqVers
= Get16u(\
$buff
, 6);
my
$creatorVers
= Get16u(\
$buff
, 8);
my
$rwzSize
= Get64u(\
$buff
, 10);
my
$origSize
= Get64u(\
$buff
, 18);
my
$tagTablePtr
= GetTagTable(
'Image::ExifTool::Rawzor::Main'
);
$et
->HandleTag(
$tagTablePtr
,
RawzorRequiredVersion
=>
$reqVers
);
$et
->HandleTag(
$tagTablePtr
,
RawzorCreatorVersion
=>
$creatorVers
);
$et
->HandleTag(
$tagTablePtr
,
OriginalFileSize
=>
$origSize
);
$et
->HandleTag(
$tagTablePtr
,
CompressionFactor
=>
$origSize
/
$rwzSize
)
if
$rwzSize
;
if
(
$reqVers
>
$implementedRawzorVersion
) {
$et
->Warn(
"Version $reqVers Rawzor images not yet supported"
);
return
1;
}
my
$metaOffset
= Get64u(\
$buff
, 38);
if
(
$metaOffset
> 0x7fffffff) {
$et
->Warn(
'Bad metadata offset'
);
return
1;
}
$et
->Warn(
'Install IO::Compress::Bzip2 to decode Rawzor bzip2 compression'
);
return
1;
}
unless
(
$raf
->Seek(
$metaOffset
, 0) and
$raf
->Read(
$buff
, 44) == 44) {
$et
->Warn(
'Error reading metadata header'
);
return
1;
}
my
$metaSize
= Get32u(\
$buff
, 36);
if
(
$metaSize
) {
$$et
{DontValidateImageData} = 1;
my
$end0
= Get64u(\
$buff
, 0);
my
$pos1
= Get64u(\
$buff
, 8);
my
$end1
= Get64u(\
$buff
, 16);
my
$pos2
= Get64u(\
$buff
, 24);
my
$len
= Get32u(\
$buff
, 40);
unless
(
$raf
->Read(
$buff
,
$len
) ==
$len
and
$end0
+ (
$end1
-
$pos1
) + (
$origSize
-
$pos2
) ==
$metaSize
and
$end0
<=
$pos1
and
$pos1
<=
$end1
and
$end1
<=
$pos2
)
{
$et
->Warn(
'Error reading image metadata'
);
return
1;
}
unless
(IO::Uncompress::Bunzip2::bunzip2(\
$buff
, \
$buf2
) and
length
(
$buf2
) eq
$metaSize
)
{
$et
->Warn(
'Error uncompressing image metadata'
);
return
1;
}
undef
$buff
;
$buff
=
substr
(
$buf2
, 0,
$end0
) . (
"\0"
x (
$pos1
-
$end0
)) .
substr
(
$buf2
,
$end0
,
$end1
-
$pos1
) . (
"\0"
x (
$pos2
-
$end1
)) .
substr
(
$buf2
,
$end0
+
$end1
-
$pos1
,
$origSize
-
$pos2
);
undef
$buf2
;
$et
->ExtractInfo(\
$buff
, {
ReEntry
=> 1 });
undef
$buff
;
}
my
$origFileType
=
$$et
{FileType};
if
(
$origFileType
) {
$et
->HandleTag(
$tagTablePtr
,
OriginalFileType
=>
$origFileType
);
$et
->OverrideFileType(
'RWZ'
);
}
else
{
$et
->HandleTag(
$tagTablePtr
,
OriginalFileType
=>
'Unknown'
);
$et
->SetFileType();
}
return
1;
}
1;