use
vars
qw(@ISA %fields @field_info)
;
@ISA
=
qw(PDF::API2::Basic::TTF::Table)
;
@field_info
= (
'version'
=>
'f'
,
'Ascender'
=>
's'
,
'Descender'
=>
's'
,
'LineGap'
=>
's'
,
'advanceWidthMax'
=>
'S'
,
'minLeftSideBearing'
=>
's'
,
'minRightSideBearing'
=>
's'
,
'xMaxExtent'
=>
's'
,
'caretSlopeRise'
=>
's'
,
'caretSlopeRun'
=>
's'
,
'metricDataFormat'
=>
'+10s'
,
'numberOfHMetrics'
=>
'S'
);
sub
init
{
my
(
$k
,
$v
,
$c
,
$i
);
for
(
$i
= 0;
$i
<
$#field_info
;
$i
+= 2)
{
(
$k
,
$v
,
$c
) = TTF_Init_Fields(
$field_info
[
$i
],
$c
,
$field_info
[
$i
+ 1]);
next
unless
defined
$k
&&
$k
ne
""
;
$fields
{
$k
} =
$v
;
}
}
sub
read
{
my
(
$self
) =
@_
;
my
(
$dat
);
$self
->SUPER::
read
or
return
$self
;
init
unless
defined
$fields
{
'Ascender'
};
$self
->{
' INFILE'
}->
read
(
$dat
, 36);
TTF_Read_Fields(
$self
,
$dat
, \
%fields
);
$self
;
}
sub
out
{
my
(
$self
,
$fh
) =
@_
;
return
$self
->SUPER::out(
$fh
)
unless
$self
->{
' read'
};
$self
->{
'numberOfHMetrics'
} =
$self
->{
' PARENT'
}{
'hmtx'
}->numMetrics ||
$self
->{
'numberOfHMetrics'
};
$fh
->
print
(TTF_Out_Fields(
$self
, \
%fields
, 36));
$self
;
}
sub
update
{
my
(
$self
) =
@_
;
my
(
$hmtx
) =
$self
->{
' PARENT'
}{
'hmtx'
};
my
(
$glyphs
);
my
(
$num
);
my
(
$i
,
$maw
,
$mlsb
,
$mrsb
,
$mext
,
$aw
,
$lsb
,
$ext
);
return
undef
unless
(
$self
->SUPER::update);
return
undef
unless
(
defined
$hmtx
&&
defined
$self
->{
' PARENT'
}{
'loca'
});
$hmtx
->
read
->update;
$self
->{
' PARENT'
}{
'loca'
}->
read
->update;
$glyphs
=
$self
->{
' PARENT'
}{
'loca'
}{
'glyphs'
};
$num
=
$self
->{
' PARENT'
}{
'maxp'
}{
'numGlyphs'
};
return
undef
unless
(
$hmtx
->{
' isDirty'
} ||
$self
->{
' PARENT'
}{
'loca'
}{
' isDirty'
});
for
(
$i
= 0;
$i
<
$num
;
$i
++)
{
$aw
=
$hmtx
->{
'advance'
}[
$i
];
$lsb
=
$hmtx
->{
'lsb'
}[
$i
];
if
(
defined
$glyphs
->[
$i
])
{
$ext
=
$lsb
+
$glyphs
->[
$i
]->
read
->{
'xMax'
} -
$glyphs
->[
$i
]{
'xMin'
}; }
else
{
$ext
=
$aw
; }
$maw
=
$aw
if
(
$aw
>
$maw
);
$mlsb
=
$lsb
if
(
$lsb
<
$mlsb
or
$i
== 0);
$mrsb
=
$aw
-
$ext
if
(
$aw
-
$ext
<
$mrsb
or
$i
== 0);
$mext
=
$ext
if
(
$ext
>
$mext
);
}
$self
->{
'advanceWidthMax'
} =
$maw
;
$self
->{
'minLeftSideBearing'
} =
$mlsb
;
$self
->{
'minRightSideBearing'
} =
$mrsb
;
$self
->{
'xMaxExtent'
} =
$mext
;
$self
->{
'numberOfHMetrics'
} =
$hmtx
->numMetrics;
$self
;
}
1;