use
vars
qw(@ISA $new_gdef)
;
@ISA
=
qw(PDF::API2::Basic::TTF::Table)
;
sub
read
{
my
(
$self
) =
@_
;
my
(
$fh
) =
$self
->{
' INFILE'
};
my
(
$boff
) =
$self
->{
' OFFSET'
};
my
(
$dat
,
$goff
,
$loff
,
$aoff
,
$moff
,
$r
,
$s
,
$bloc
);
$self
->SUPER::
read
or
return
$self
;
$bloc
=
$fh
->
tell
();
$fh
->
read
(
$dat
, 10);
(
$self
->{
'Version'
},
$goff
,
$aoff
,
$loff
) = TTF_Unpack(
'fS3'
,
$dat
);
if
(
$new_gdef
)
{
$fh
->
read
(
$dat
, 12);
(
$self
->{
'Version'
},
$goff
,
$aoff
,
$loff
,
$moff
) = TTF_Unpack(
'fS4'
,
$dat
);
}
if
(
$goff
> 0)
{
$fh
->
seek
(
$goff
+
$boff
, 0);
$self
->{
'GLYPH'
} = PDF::API2::Basic::TTF::Coverage->new(0)->
read
(
$fh
);
}
if
(
$new_gdef
&&
$moff
> 0)
{
$fh
->
seek
(
$moff
+
$boff
, 0);
$self
->{
'MARKS'
} = PDF::API2::Basic::TTF::Coverage->new(0)->
read
(
$fh
);
}
if
(
$aoff
> 0)
{
my
(
$off
,
$gcount
,
$pcount
);
$fh
->
seek
(
$aoff
+
$boff
, 0);
$fh
->
read
(
$dat
, 4);
(
$off
,
$gcount
) = TTF_Unpack(
'SS'
,
$dat
);
$fh
->
read
(
$dat
,
$gcount
<< 1);
$fh
->
seek
(
$aoff
+
$boff
+
$off
, 0);
$self
->{
'ATTACH'
}{
'COVERAGE'
} = PDF::API2::Basic::TTF::Coverage->new(1)->
read
(
$fh
);
foreach
$r
(TTF_Unpack(
'S*'
,
$dat
))
{
unless
(
$r
)
{
push
(@{
$self
->{
'ATTACH'
}{
'POINTS'
}}, []);
next
;
}
$fh
->
seek
(
$aoff
+
$boff
+
$r
, 0);
$fh
->
read
(
$dat
, 2);
$pcount
= TTF_Unpack(
'S'
,
$dat
);
$fh
->
read
(
$dat
,
$pcount
<< 1);
push
(@{
$self
->{
'ATTACH'
}{
'POINTS'
}}, [TTF_Unpack(
'S*'
,
$dat
)]);
}
}
if
(
$loff
> 0)
{
my
(
$lcount
,
$off
,
$ccount
,
$srec
,
$comp
);
$fh
->
seek
(
$loff
+
$boff
, 0);
$fh
->
read
(
$dat
, 4);
(
$off
,
$lcount
) = TTF_Unpack(
'SS'
,
$dat
);
$fh
->
read
(
$dat
,
$lcount
<< 1);
$fh
->
seek
(
$off
+
$loff
+
$boff
, 0);
$self
->{
'LIG'
}{
'COVERAGE'
} = PDF::API2::Basic::TTF::Coverage->new(1)->
read
(
$fh
);
foreach
$r
(TTF_Unpack(
'S*'
,
$dat
))
{
$fh
->
seek
(
$r
+
$loff
+
$boff
, 0);
$fh
->
read
(
$dat
, 2);
$ccount
= TTF_Unpack(
'S'
,
$dat
);
$fh
->
read
(
$dat
,
$ccount
<< 1);
$srec
= [];
foreach
$s
(TTF_Unpack(
'S*'
,
$dat
))
{
$comp
= {};
$fh
->
seek
(
$s
+
$r
+
$loff
+
$boff
, 0);
$fh
->
read
(
$dat
, 4);
(
$comp
->{
'FMT'
},
$comp
->{
'VAL'
}) = TTF_Unpack(
'S*'
,
$dat
);
if
(
$comp
->{
'FMT'
} == 3)
{
$fh
->
read
(
$dat
, 2);
$off
= TTF_Unpack(
'S'
,
$dat
);
if
(
defined
$self
->{
' CACHE'
}{
$off
+
$s
+
$r
})
{
$comp
->{
'DEVICE'
} =
$self
->{
' CACHE'
}{
$off
+
$s
+
$r
}; }
else
{
$fh
->
seek
(
$off
+
$s
+
$r
+
$loff
+
$boff
, 0);
$comp
->{
'DEVICE'
} = PDF::API2::Basic::TTF::Delta->new->
read
(
$fh
);
$self
->{
' CACHE'
}{
$off
+
$s
+
$r
} =
$comp
->{
'DEVICE'
};
}
}
push
(
@$srec
,
$comp
);
}
push
(@{
$self
->{
'LIG'
}{
'LIGS'
}},
$srec
);
}
}
$self
;
}
sub
out
{
my
(
$self
,
$fh
) =
@_
;
my
(
$goff
,
$aoff
,
$loff
,
$moff
,
@offs
,
$loc1
,
$coff
,
$loc
);
return
$self
->SUPER::out(
$fh
)
unless
$self
->{
' read'
};
$loc
=
$fh
->
tell
();
if
(
$new_gdef
)
{
$fh
->
print
(TTF_Pack(
'fSSSS'
,
$self
->{
'Version'
}, 0, 0, 0, 0)); }
else
{
$fh
->
print
(TTF_Pack(
'fSSS'
,
$self
->{
'Version'
}, 0, 0, 0)); }
if
(
defined
$self
->{
'GLYPH'
})
{
$goff
=
$fh
->
tell
() -
$loc
;
$self
->{
'GLYPH'
}->out(
$fh
);
}
if
(
defined
$self
->{
'ATTACH'
})
{
my
(
$r
);
$aoff
=
$fh
->
tell
() -
$loc
;
$fh
->
print
(
pack
(
'n*'
, (0) x ($
foreach
$r
(@{
$self
->{
'ATTACH'
}{
'POINTS'
}})
{
push
(
@offs
,
$fh
->
tell
() -
$loc
-
$aoff
);
$fh
->
print
(
pack
(
'n*'
, $
}
$coff
=
$fh
->
tell
() -
$loc
-
$aoff
;
$self
->{
'ATTACH'
}{
'COVERAGE'
}->out(
$fh
);
$loc1
=
$fh
->
tell
();
$fh
->
seek
(
$aoff
+
$loc
, 0);
$fh
->
print
(
pack
(
'n*'
,
$coff
,
$#offs
+ 1,
@offs
));
$fh
->
seek
(
$loc1
, 0);
}
if
(
defined
$self
->{
'LIG'
})
{
my
(
@reftables
,
$ltables
,
$i
,
$j
,
$out
,
$r
,
$s
);
$ltables
= {};
$loff
=
$fh
->
tell
() -
$loc
;
$out
=
pack
(
'n*'
,
PDF::API2::Basic::TTF::Ttopen->ref_cache(
$self
->{
'LIG'
}{
'COVERAGE'
},
$ltables
, 0),
0, $
(0) x ($
push
(
@reftables
, [
$ltables
, 0]);
$i
= 0;
foreach
$r
(@{
$self
->{
'LIG'
}{
'LIGS'
}})
{
$ltables
= {};
$loc1
=
length
(
$out
);
substr
(
$out
, (
$i
<< 1) + 4, 2) = TTF_Pack(
'S'
,
$loc1
);
$out
.=
pack
(
'n*'
, $
@offs
= ();
$j
= 0;
foreach
$s
(
@$r
)
{
substr
(
$out
, (
$j
<< 1) + 2 +
$loc1
, 2) =
TTF_Pack(
'S'
,
length
(
$out
) -
$loc1
);
$out
.= TTF_Pack(
'SS'
,
$s
->{
'FMT'
},
$s
->{
'VAL'
});
$out
.=
pack
(
'n'
, PDF::API2::Basic::TTF::Ttopen->ref_cache(
$s
->{
'DEVICE'
},
$ltables
,
length
(
$out
)))
if
(
$s
->{
'FMT'
} == 3);
$j
++;
}
push
(
@reftables
, [
$ltables
,
$loc1
]);
$i
++;
}
PDF::API2::Basic::TTF::Ttopen::out_final(
$fh
,
$out
, \
@reftables
);
}
if
(
$new_gdef
&&
defined
$self
->{
'MARKS'
})
{
$moff
=
$fh
->
tell
() -
$loc
;
$self
->{
'MARKS'
}->out(
$fh
);
}
$loc1
=
$fh
->
tell
();
$fh
->
seek
(
$loc
+ 4, 0);
if
(
$new_gdef
)
{
$fh
->
print
(TTF_Pack(
'S4'
,
$goff
,
$aoff
,
$loff
,
$moff
)); }
else
{
$fh
->
print
(TTF_Pack(
'S3'
,
$goff
,
$aoff
,
$loff
)); }
$fh
->
seek
(
$loc1
, 0);
$self
;
}
1;