# -*- perl -*- # # Copyright (C) 2013 Slaven Rezic. All rights reserved. # This package is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # package Image::Info::WBMP; use strict; use vars qw($VERSION @EXPORT_OK); $VERSION = '0.01'; require Exporter; *import = \&Exporter::import; @EXPORT_OK = qw(wbmp_image_info); sub process_file { my($info, $fh) = @_; # wbmp files have no magic, so no signature check $info->push_info(0, 'file_media_type' => 'image/vnd.wap.wbmp'); $info->push_info(0, 'file_ext' => 'wbmp'); # logic taken from netpbm's wbmptopbm.c and adapted to perl my $readint = sub { my $sum = 0; my $pos = 0; my $c; do { $c = ord(getc $fh); $sum = ($sum << 7*$pos++) | ($c & 0x7f); } while($c & 0x80); return $sum; }; my $readheader = sub { my $h = shift; if ($h & 0x60 == 0) { # type 00: read multi-byte bitfield my $c; do { $c = ord(getc $fh) } while($c & 0x80); } elsif ($h & 0x60 == 0x60) { # type 11: read name/value pair for(my $i=0; $i < (($h & 0x70) >> 4) + ($h & 0x0f); $i++) { getc $fh } } }; my $c; $c = $readint->(); $c == 0 or die "Unrecognized WBMP type (got $c)"; $c = ord(getc $fh); # FixHeaderField while($c & 0x80) { # ExtheaderFields $c = ord(getc $fh); $readheader->($c); } my $w = $readint->(); my $h = $readint->(); $info->push_info(0, 'width', $w); $info->push_info(0, 'height', $h); } sub wbmp_image_info { my $source = Image::Info::_source(shift); return $source if ref $source eq 'HASH'; # Pass on errors return Image::Info::_image_info_for_format('WBMP', $source); } 1; __END__ =head1 NAME Image::Info::WBMP - WBMP support for Image::Info =head1 SYNOPSIS use Image::Info qw(dim); use Image::Info::WBMP qw(wbmp_image_info); my $info = wbmp_image_info("image.xpm"); if (my $error = $info->{error}) { die "Can't parse image info: $error\n"; } my($w, $h) = dim($info); =head1 DESCRIPTION wbmp is a magic-less file format, so using L's C or C does not work here. Instead, the user has to determine the file type himself, e.g. by relying on the file suffix or mime type, and use the C function instead. The returned value looks the same like L's C and may be used in a call to the C function. =head1 AUTHOR Slaven Rezic =begin register NO MAGIC: true wbmp files have no magic, so cannot be used with the normal Image::Info functions. See L for more information. =end register =cut