/usr/local/CPAN/Image-WorldMap/Image/WorldMap/Label.pm
package Image::WorldMap::Label;
use strict;
use warnings;
use Image::Imlib2;
use Exporter;
use vars qw($XOFFSET $YOFFSET);
$XOFFSET = 0;
$YOFFSET = 0;
# Class method, creates a new label, given x, y and text
sub new {
my ( $class, $x, $y, $text, $image, $dot_colour ) = @_;
my $self = {};
$self->{X} = $x;
$self->{Y} = $y;
$self->{LABELX} = $x + $XOFFSET;
$self->{LABELY} = $y + $YOFFSET;
$self->{TEXT} = $text;
$self->{DOTCOLOUR} = $dot_colour;
bless $self, $class;
my ( $w, $h ) = ( 0, 0 );
( $w, $h ) = $self->_boundingbox( $image, $text ) if defined $text;
$self->{LABELW} = $w;
$self->{LABELH} = $h;
return $self;
}
sub x {
my $self = shift;
return $self->{X};
}
sub y {
my $self = shift;
return $self->{Y};
}
sub labelx {
my $self = shift;
return $self->{LABELX};
}
sub labely {
my $self = shift;
return $self->{LABELY};
}
sub text {
my $self = shift;
return $self->{TEXT};
}
sub labelwidth {
my $self = shift;
return $self->{LABELW};
}
sub labelheight {
my $self = shift;
return $self->{LABELH};
}
sub move {
my ( $self, $x, $y ) = @_;
$self->{LABELX} = $x;
$self->{LABELY} = $y;
}
sub draw_label {
my ( $self, $image ) = @_;
my ( $x, $y, $labelx, $labely, $text ) = (
$self->{X}, $self->{Y}, $self->{LABELX},
$self->{LABELY}, $self->{TEXT}
);
if ( defined $text ) {
# Draw the white outline
$image->set_color( 255, 255, 255, 32 );
$image->draw_text( $labelx + 1, $labely + 1, $text );
$image->draw_text( $labelx - 1, $labely - 1, $text );
$image->draw_text( $labelx + 1, $labely - 1, $text );
$image->draw_text( $labelx - 1, $labely + 1, $text );
$image->draw_text( $labelx + 1, $labely, $text );
$image->draw_text( $labelx - 1, $labely, $text );
$image->draw_text( $labelx, $labely - 1, $text );
$image->draw_text( $labelx, $labely + 1, $text );
# And finally draw the black text in the middle
$image->set_color( 0, 0, 0, 255 );
$image->draw_text( $labelx, $labely, $text );
}
}
sub draw_dot {
my ( $self, $image ) = @_;
my ( $x, $y, $labelx, $labely, $text, $dot_colour ) = (
$self->{X}, $self->{Y}, $self->{LABELX}, $self->{LABELY},
$self->{TEXT}, $self->{DOTCOLOUR}
);
@$dot_colour = ( 255, 0, 0 ) if ( !defined $dot_colour );
@$dot_colour = ( 255, 0, 0 ) if ( !defined $dot_colour );
my @colour = @$dot_colour;
my @quarter_colour = map { int( $_ / 4 ); } @$dot_colour;
my @half_colour = map { int( $_ / 2 ); } @$dot_colour;
my $radius = 1;
if ( 0 && ( $labelx != $x or $labely != $y ) ) {
# moved
my ( $q, $w ) = ( $labelx, $labely );
$image->set_color( 255, 255, 255, 32 );
$image->draw_line( $x - 1, $y - 1, $q - 1, $w - 1 );
$image->draw_line( $x + 1, $y + 1, $q + 1, $w + 1 );
$image->set_colour( @quarter_colour, 255 );
$image->draw_line( $x, $y, $q, $w );
$image->set_colour( 0, 0, 0, 255 );
$image->draw_point( $q - 1, $w - 1 );
$image->draw_point( $q + 1, $w - 1 );
$image->draw_point( $q - 1, $w + 1 );
$image->draw_point( $q + 1, $w + 1 );
$image->draw_point( $q - 1, $w );
$image->draw_point( $q + 1, $w );
$image->draw_point( $q, $w - 1 );
$image->draw_point( $q, $w + 1 );
$image->set_colour( 0, 0, 0, 128 );
$image->draw_point( $q - 2, $w );
$image->draw_point( $q + 2, $w );
$image->draw_point( $q, $w - 2 );
$image->draw_point( $q, $w + 2 );
$image->set_colour( 0, 0, 0, 64 );
$image->draw_point( $q - 2, $w + 1 );
$image->draw_point( $q - 2, $w - 1 );
$image->draw_point( $q + 2, $w - 1 );
$image->draw_point( $q + 2, $w + 1 );
$image->draw_point( $q - 1, $w - 2 );
$image->draw_point( $q + 1, $w - 2 );
$image->draw_point( $q - 1, $w + 2 );
$image->draw_point( $q + 1, $w + 2 );
$image->set_colour( 255, 255, 255, 255 );
$image->draw_point( $q, $w );
$image->set_colour( 255, 255, 255, 192 );
$image->draw_point( $q - 1, $w );
$image->draw_point( $q + 1, $w );
$image->draw_point( $q, $w - 1 );
$image->draw_point( $q, $w + 1 );
$image->set_colour( 255, 255, 255, 128 );
$image->draw_point( $q - 1, $w - 1 );
$image->draw_point( $q + 1, $w - 1 );
$image->draw_point( $q - 1, $w + 1 );
$image->draw_point( $q + 1, $w + 1 );
}
$image->set_colour( 0, 0, 0, 255 );
$image->draw_point( $x - 1, $y - 1 );
$image->draw_point( $x + 1, $y - 1 );
$image->draw_point( $x - 1, $y + 1 );
$image->draw_point( $x + 1, $y + 1 );
$image->draw_point( $x - 1, $y );
$image->draw_point( $x + 1, $y );
$image->draw_point( $x, $y - 1 );
$image->draw_point( $x, $y + 1 );
$image->set_colour( 0, 0, 0, 128 );
$image->draw_point( $x - 2, $y );
$image->draw_point( $x + 2, $y );
$image->draw_point( $x, $y - 2 );
$image->draw_point( $x, $y + 2 );
$image->set_colour( 0, 0, 0, 64 );
$image->draw_point( $x - 2, $y + 1 );
$image->draw_point( $x - 2, $y - 1 );
$image->draw_point( $x + 2, $y - 1 );
$image->draw_point( $x + 2, $y + 1 );
$image->draw_point( $x - 1, $y - 2 );
$image->draw_point( $x + 1, $y - 2 );
$image->draw_point( $x - 1, $y + 2 );
$image->draw_point( $x + 1, $y + 2 );
$image->set_colour( @$dot_colour, 255 );
$image->draw_point( $x, $y );
$image->set_colour( @$dot_colour, 192 );
$image->draw_point( $x - 1, $y );
$image->draw_point( $x + 1, $y );
$image->draw_point( $x, $y - 1 );
$image->draw_point( $x, $y + 1 );
$image->set_colour( @$dot_colour, 128 );
$image->draw_point( $x - 1, $y - 1 );
$image->draw_point( $x + 1, $y - 1 );
$image->draw_point( $x - 1, $y + 1 );
$image->draw_point( $x + 1, $y + 1 );
}
# private method
sub _boundingbox($) {
my ( $self, $image, $text ) = @_;
return $image->get_text_size($text);
}
1;