Image::XBin::Font - Manipulate XBin font data


Image-XBin documentation Contained in the Image-XBin distribution.

Index


Code Index:

NAME

Top

Image::XBin::Font - Manipulate XBin font data

SYNOPSIS

Top

	use Image::XBin::Font;

	# Create a new font
	my $fnt = Image::XBin::Font->new;

	# Set all of the chars
	$fnt->chars( $chars );

	# Set one of them
	$fnt->char( 65, $char );

	# Accessors
	my $width  = $fnt->width;
	my $height = $fnt->height;
	my $chars  = $fnt->characters;

	# Get output suitable for saving...
	my $out = $fnt->as_string;

	# Clear the data
	$fnt->clear;

DESCRIPTION

Top

Xbin images can contain font data. This module will allow you to create, and manipulate that data.

METHODS

Top

new( [$chars] )

Creates a new Image::XBin::Font object.

chars( [$chars] )

sets the character set. $chars should be an array (either 256 or 512 [the number of characters]) of arrays (from 1 to 32 [1 bitmask per scanline]).

as_string( )

Returns the font as a pack()'ed string - suitable for saving in an XBin.

as_gd( )

Returns a GD::Font object.

clear( )

Clears any in-memory data.

width( )

Returns "8".

char( $index, [$char] )

Get / set a char in the font.

characters( )

returns the number of characters in the font

height( [$height] )

returns the number of scanlines in each of the characters in the font

AUTHOR

Top

* Brian Cassidy <bricas@cpan.org>

COPYRIGHT AND LICENSE

Top


Image-XBin documentation Contained in the Image-XBin distribution.
package Image::XBin::Font;

use strict;
use warnings;

use GD;
use File::Temp;

our $VERSION = '0.06';

sub new {
	my $class = shift;
	my $self  = {};

	bless $self, $class;

	$self->clear;
	$self->chars( @_ ) if @_;

	return $self;
}

sub chars {
	my $self  = shift;
	my $chars = $_[ 0 ];

	if( @_ ) {
		if( @$chars == 0 ) {
			$self->{ _CHARS } = [];
			$self->height( 0 );
		}
		else {
			for( 0..@$chars - 1 ) {
				$self->char( $_, $chars->[ $_ ] );
			}
		}
	}

	return $self->{ _CHARS };
}

sub as_string {
	my $self = shift;

	my $output;

	for my $char ( @{ $self->chars } ) {
		$output .= pack( 'C', $_ ) for @{ $char };
	}

	return $output;	
}

sub as_gd {
	my $self = shift;
	my $temp = File::Temp->new;

	binmode( $temp );

	print $temp pack( 'LLLL', $self->characters, 0, $self->width, $self->height );
	for my $char ( @{ $self->chars } ) {
		print $temp pack( 'C*', split( //, sprintf( '%08b', $_ ) ) ) for @$char;
	}
	close $temp;

	return GD::Font->load( $temp->filename );
}

sub clear {
	my $self = shift;

	$self->chars( [] );
}

sub width {
	return 8;
}

sub char {
	my $self  = shift;
	my $index = shift;
	my $char  = $_[ 0 ];

	if( @_ ) {
		$self->{ _CHARS }->[ $index ] = $char;
		$self->height( scalar @$char );
	}
	
	return $self->{ _CHARS }->[ $index ];
}

sub characters {
	return scalar @{ $_[ 0 ]->chars };
}

sub height {
	my $self   = shift;
	my $height = $_[ 0 ];

	if( @_ ) {
		$self->{ _HEIGHT } = $height;
	}

	return $self->{ _HEIGHT };
}

1;