Image-GIF-Encoder-PP
view release on metacpan or search on metacpan
# add the varying size right bar
for (my $i = 50; $i > 0; $i--) {
for (my $j = 60; $j < 65; $j++) {
vec($gif->{'frame'}, ($i*100)+$j, 8) = $i > MIN($t, 100 - $t);
}
}
print sprintf("frame %03d: \n", $frameindex++);
add_frame($gif, 5);
}
undef $gif;
}
sub run_gif_test {
my ($test, $outfilename) = @_;
$test->{generate}($outfilename);
my $expectedflag = decode_base64($test->{'expected_b64'});
my $flagfh;
if(! open($flagfh, '<', $outfilename)) {
warn('unable to open flag file');
return 0;
}
my $newflag;
read($flagfh, $newflag, length($expectedflag)+1);
if((! defined $newflag) || (length($newflag) != length($expectedflag))) {
warn('unable read flag file');
return 0;
}
if($expectedflag ne $newflag) {
warn('flags are not equal');
return 0;
}
return 1;
}
# Declare the tests
my @tests = (
{
'generate' => \&generate_flag_gif,
'expected_b64' => 'R0lGODlhQABAAPMAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwPgAAAD4APj4AAAA+PgA+AD4
+Pj4+CH/C05FVFNDQVBFMi4wAwEAAAAh+QQJIAAAACwAAAAAQABAAAAE//DJSau9OOvNu/9gKI5k
aV5ACpxsp65tjL1yXdF2/u587/MgnOVHLAI/wptxSQyqZszo0ZOkVCc+qLSJenanyu1PCxv2yGKw
1WtWY9PZ71ievEqM6DOd/bD3i3lud3qDKYE7h35xhWVhc22Pjop8eHuCf5d1gJaInGRrXJCLknyg
jZWQh59vmaWsjaaThq+ysK+qcrGujKuiu5inhI69pLO+xsDEprjHwcjLuZ7SvNGp08XOttTNtZrP
tMK6rWDd4eDjndvY5eje2sCj4unrlPWh9N+Mo+7x5/Py7gD+QoUvm8B88OCkUeZPYRSG+hxugZhQ
4sNqw3JUjESRhRQOfjc8XtQQ8sTHDSU1jkipMgTLlkh+wRTxciZImTZjIsyp8x1PKjh/ogwqNEPN
ohmRKl3KtKlTpREAACH5BAUgAAAALAAAAABAAEAAAAT/8MlJq7046827/2AojmRpXkAKnGynrm2M
vXJd0Xb+7vwO9kCYJkgUuoq4IbL3W6Y4Tl7TCVXNosArUWukYLOoIpf7tYa35+6kLE2DLcjxmumm
w8Vpr/2Gv6P9Rm98f4NBchKCeoSKhnNPeY4+kICCSYWMloxke5mRmGaAm22IoJeRnaSPoXWqD6iu
e5qThZaviZ6zn622sbirlKW8o6a/xLDDwo3FsqmSzaLOxszH0cm3z7OVpbrR3Mnc0Na92M3iw97b
vtTm3afj1OCs7eWc6eTr9vDytfn85+rodvUL9o6dPzX3rukDRgWgu4YMl0wLqIxWlIkPJe7rs9Ai
RGkbQLBMQdixykeTJF+Fe3cIpJKTIQe2yhFDJU0SNm+KyKlzZM+a+X6G4CkUZdETRI9mSKo0V9MP
TJ9KnUq1qlWhEQAAOw==',
},
{
'generate' => \&generate_transparent_gif,
'expected_b64' => 'R0lGODlhZABkAPAAAP///9oJ/yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQAAACwAAAAAZABkAAAC
/4SPqcvtD6OctK6Asd2816x54kiCAYmmH6i2LmO+shzPdlrfupfv/pr5CSm9IcCETCqXrEZxyIxK
kY6ncIqVVptGQ/ar3Aa7XrB5DON2z2xxiMw+u0/kYxw8r9vv2Xyd/+UHB4gluEY4ZWiEmOiktsgY
pQgVyTR5Vbl0+ZOp6Yh22En1+RYq+phgxXmqWgYKyfqaiooZW6rQumMri5Crs3s7y7u6u+kDTJc2
fAxsrNtMmmwa6/wLrRxca1t9g8xt4x2tF44tDbst/nd9QUuMXj6+jtvOXJw+aA+vnq8HQd7/4B/A
aKwG+pNncB6/hArfMWxI7SG7hRJdOaxoMSLGA1MCMXas+FFiyIcjGZZMeNJgyoErAbbs9zIeRZAI
ac4UWRPnTZI5ee402RPoT5RBiQ5VWRTpUZZJmS512RTq041Uq1q9ijWr1q1cu3r9CjasWAQFAAAh
+QQJBQAAACwLAAIANgBYAAAC1YSPqcuNAaGbtJ4ord4X829hAUg6YokqZ8oCa4u+MCnW9o3jZs73
+e4LCoHC4q9hTOqQyqaH6XQSo8kptWi9BrPaHrd7ZICN37GtbJap0j40OyN+89xvOtuexpv1Yz7Y
3wWoJXhFSGUYhSgFJXej2PSoFFnF2FgzSVZp+RS3eanpOQLqiYkVEqoRKlqhmop6Sgq76RrL+mpb
S9Eqa0k7y9vo2wssJxxMXId8p5zHvOfcB/0nHUg9aF2IfaidyL2I+ws+LH5MXuwNiS6pTmme7L4M
31xRAAAh+QQJBQAAACwLAAMANgBXAAAC0oSPqcuNAaGbtJ4ord4X829hAUg6YokqZ8oCa4uK8kzX
tWnnuo3v/t/7CXmNofFWPCo9yeUy6DRCo8Ip1We96rJaIqM75IJn4vFrYcY20140O1d+x9nzdN18
H+fB+25f+3cVSDUYVeh0+LT2RrbIeKbySJOoRHlkKeUomfG1KYMZprmp4TkS4kmKejq6KpnKWlH6
6tr6OGtby3irmyvXS/drF4w3rFfMd+yXDLgs2Ez4bBiNOK0Yq3oNSyFbXdl9+Z2ZTTuOW8577psO
vC7cTlxRAAAh+QQJBQAAACwLAAQANgBWAAAC0ISPqcuNAaGbtJ4ord4X829hAUg6YokqZ8oC4gvH
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
( run in 0.517 second using v1.01-cache-2.11-cpan-e1769b4cff6 )