sub
SetResourceName($$$)
{
my
(
$tagInfo
,
$name
,
$valPt
) =
@_
;
my
$setName
=
$$tagInfo
{SetResourceName};
if
(
defined
$setName
) {
if
(
$$valPt
=~ m{.*/
$name
= $1;
$$valPt
=
substr
(
$$valPt
, 0, -4 -
length
(
$name
));
}
elsif
(
$setName
eq
'1'
) {
return
;
}
else
{
$name
=
$setName
;
}
$name
=
chr
(
length
$name
) .
$name
;
$name
.=
"\0"
if
length
(
$name
) & 0x01;
$_
[1] =
$name
;
}
}
sub
WritePhotoshop($$$)
{
my
(
$exifTool
,
$dirInfo
,
$tagTablePtr
) =
@_
;
$exifTool
or
return
1;
my
$dataPt
=
$$dirInfo
{DataPt};
unless
(
$dataPt
) {
my
$emptyData
=
''
;
$dataPt
= \
$emptyData
;
}
my
$start
=
$$dirInfo
{DirStart} || 0;
my
$dirLen
=
$$dirInfo
{DirLen} || (
length
(
$$dataPt
) -
$start
);
my
$dirEnd
=
$start
+
$dirLen
;
my
$verbose
=
$exifTool
->Options(
'Verbose'
);
my
$out
=
$exifTool
->Options(
'TextOut'
);
my
$newData
=
''
;
my
$newTags
=
$exifTool
->GetNewTagInfoHash(
$tagTablePtr
);
my
(
$addDirs
,
$editDirs
) =
$exifTool
->GetAddDirHash(
$tagTablePtr
);
SetByteOrder(
'MM'
);
my
(
$pos
,
$value
,
$size
,
$tagInfo
,
$tagID
);
for
(
$pos
=
$start
;
$pos
+8<
$dirEnd
;
$pos
+=
$size
) {
++
$pos
if
(
$pos
^
$start
) & 0x01;
my
$type
=
substr
(
$$dataPt
,
$pos
, 4);
if
(
$type
!~ /^(8BIM|PHUT|DCSR|AgHg)$/) {
$exifTool
->Error(
"Bad Photoshop IRB resource"
);
undef
$newData
;
last
;
}
$tagID
= Get16u(
$dataPt
,
$pos
+ 4);
my
$namelen
= 1 + Get8u(
$dataPt
,
$pos
+ 6);
++
$namelen
if
$namelen
& 0x01;
if
(
$pos
+
$namelen
+ 10 >
$dirEnd
) {
$exifTool
->Error(
"Bad APP13 resource block"
);
undef
$newData
;
last
;
}
my
$name
=
substr
(
$$dataPt
,
$pos
+ 6,
$namelen
);
$size
= Get32u(
$dataPt
,
$pos
+ 6 +
$namelen
);
$pos
+=
$namelen
+ 10;
if
(
$size
+
$pos
>
$dirEnd
) {
$exifTool
->Error(
"Bad APP13 resource data size $size"
);
undef
$newData
;
last
;
}
if
(
$$newTags
{
$tagID
} and
$type
eq
'8BIM'
) {
$tagInfo
=
$$newTags
{
$tagID
};
delete
$$newTags
{
$tagID
};
my
$newValueHash
=
$exifTool
->GetNewValueHash(
$tagInfo
);
$value
=
substr
(
$$dataPt
,
$pos
,
$size
);
if
(Image::ExifTool::IsOverwriting(
$newValueHash
,
$value
)) {
$exifTool
->VerboseValue(
"- Photoshop:$$tagInfo{Name}"
,
$value
);
if
(
$tagID
== 0x0425) {
$$newTags
{
$tagID
} =
$tagInfo
;
$value
=
undef
;
}
else
{
$value
= Image::ExifTool::GetNewValues(
$newValueHash
);
}
++
$exifTool
->{CHANGED};
next
unless
defined
$value
;
SetResourceName(
$tagInfo
,
$name
, \
$value
);
$exifTool
->VerboseValue(
"+ Photoshop:$$tagInfo{Name}"
,
$value
);
}
}
else
{
if
(
$type
eq
'8BIM'
) {
$tagInfo
=
$$editDirs
{
$tagID
};
unless
(
$tagInfo
) {
my
$tmpInfo
=
$exifTool
->GetTagInfo(
$tagTablePtr
,
$tagID
);
if
(
$tmpInfo
and
$$tmpInfo
{SubDirectory} and
$tmpInfo
->{SubDirectory}->{TagTable} ne
'Image::ExifTool::Exif::Main'
)
{
my
$table
= Image::ExifTool::GetTagTable(
$tmpInfo
->{SubDirectory}->{TagTable});
$tagInfo
=
$tmpInfo
if
$$table
{WRITE_PROC};
}
}
}
if
(
$tagInfo
) {
$$addDirs
{
$tagID
} and
delete
$$addDirs
{
$tagID
};
my
%subdirInfo
= (
DataPt
=>
$dataPt
,
DirStart
=>
$pos
,
DataLen
=>
$dirLen
,
DirLen
=>
$size
,
Parent
=>
$$dirInfo
{DirName},
);
my
$subTable
= Image::ExifTool::GetTagTable(
$tagInfo
->{SubDirectory}->{TagTable});
my
$writeProc
=
$tagInfo
->{SubDirectory}->{WriteProc};
my
$newValue
=
$exifTool
->WriteDirectory(\
%subdirInfo
,
$subTable
,
$writeProc
);
if
(
defined
$newValue
) {
next
unless
length
$newValue
;
$value
=
$newValue
;
SetResourceName(
$tagInfo
,
$name
, \
$value
);
}
else
{
$value
=
substr
(
$$dataPt
,
$pos
,
$size
);
}
}
else
{
$value
=
substr
(
$$dataPt
,
$pos
,
$size
);
}
}
my
$newSize
=
length
$value
;
$newData
.=
$type
. Set16u(
$tagID
) .
$name
. Set32u(
$newSize
) .
$value
;
$newData
.=
"\0"
if
$newSize
& 0x01;
}
my
@tagsLeft
=
sort
{
$a
<=>
$b
}
keys
(
%$newTags
),
keys
(
%$addDirs
);
foreach
$tagID
(
@tagsLeft
) {
my
$name
=
"\0\0"
;
if
(
$$newTags
{
$tagID
}) {
$tagInfo
=
$$newTags
{
$tagID
};
my
$newValueHash
=
$exifTool
->GetNewValueHash(
$tagInfo
);
$value
= Image::ExifTool::GetNewValues(
$newValueHash
);
if
(
$tagID
== 0x0425 and
defined
$value
and
$value
eq
'new'
) {
$value
=
$$exifTool
{NewIPTCDigest};
}
next
unless
defined
$value
;
next
unless
Image::ExifTool::IsCreating(
$newValueHash
);
$exifTool
->VerboseValue(
"+ Photoshop:$$tagInfo{Name}"
,
$value
);
++
$exifTool
->{CHANGED};
}
else
{
$tagInfo
=
$$addDirs
{
$tagID
};
my
%subdirInfo
= (
Parent
=>
$$dirInfo
{DirName},
);
my
$subTable
= Image::ExifTool::GetTagTable(
$tagInfo
->{SubDirectory}->{TagTable});
my
$writeProc
=
$tagInfo
->{SubDirectory}->{WriteProc};
$value
=
$exifTool
->WriteDirectory(\
%subdirInfo
,
$subTable
,
$writeProc
);
next
unless
$value
;
}
SetResourceName(
$tagInfo
,
$name
, \
$value
);
$size
=
length
(
$value
);
$newData
.=
'8BIM'
. Set16u(
$tagID
) .
$name
. Set32u(
$size
) .
$value
;
$newData
.=
"\0"
if
$size
& 0x01;
++
$exifTool
->{CHANGED};
}
return
$newData
;
}
1;