CSS-SpriteBuilder

 view release on metacpan or  search on metacpan

lib/CSS/SpriteBuilder/ImageDriver/GD.pm  view on Meta::CPAN

} <DATA>;

# Use truecolor by default
GD::Image->trueColor(1);

sub driver         { 'GD'                                            }
sub width          { $_[0]->{_image} ? $_[0]->{_image}->width()  : 0 }
sub height         { $_[0]->{_image} ? $_[0]->{_image}->height() : 0 }

sub reset {
    my ($self, $image) = @_;

    $self->{_image} = $image ? $image->{_image}->clone() : undef;

    return;
}

sub read {
    my ($self, $filename) = @_;

    $self->{_image} = GD::Image->new($filename)
        or die "Failed to read image from '$filename' due: $!";

    $self->{_image}->alphaBlending(0);
    $self->{_image}->saveAlpha(1);

    return;
}

sub write {
    my ($self, $filename) = @_;

    return unless $self->{_image};

    if ($filename =~ /\.(png|jpg|gif)$/i) {
        my $ext = lc $1;
        my $data;
        if ($ext eq 'png') {
            $data = $self->{_image}->png();
        }
        elsif ($ext eq 'jpg') {
            $data = $self->{_image}->jpeg( $self->{_quality} );
        }
        else {
            $data = $self->{_image}->gif();
        }
        die "Failed to write image due: $!" unless $data;

        open(my $fh, '>', $filename) or die "Failed to open file '$filename' due: $!";
        binmode $fh;
        print $fh $data;
        close $fh or die "Failed to close file '$filename' due: $!";
    }
    else {
        die "Unknown extension of the file '$filename'";
    }

    return;
}

sub set_transparent_color {
    my ($self, $color) = @_;

    return unless $self->{_image};

    my $rgb   = $COLOR_MAP{ lc $color } or die "Unknown color '$color'";
    my $index = $self->{_image}->colorClosest(@$rgb);
    $self->{_image}->transparent($index);

    return;
}

sub extent {
    my ($self, $width, $height) = @_;

    my $old_image = $self->{_image};
    my $new_image = GD::Image->new($width, $height, 1);

    $new_image->alphaBlending(0);
    $new_image->saveAlpha(1);
    $new_image->copy( $old_image, 0, 0, 0, 0, $old_image->width(), $old_image->height() )
        if $old_image;

    $self->{_image} = $new_image;

    return;
}

sub composite {
    my ($self, $image, $x, $y) = @_;

    $self->{_image}->copy( $image->{_image}, $x, $y, 0, 0, $image->width(), $image->height() );

    return;
}

1;

__DATA__
white                FF           FF            FF
black                00           00            00
aliceblue            F0           F8            FF
antiquewhite         FA           EB            D7
aqua                 00           FF            FF
aquamarine           7F           FF            D4
azure                F0           FF            FF
beige                F5           F5            DC
bisque               FF           E4            C4
blanchedalmond       FF           EB            CD
blue                 00           00            FF
blueviolet           8A           2B            E2
brown                A5           2A            2A
burlywood            DE           B8            87
cadetblue            5F           9E            A0
chartreuse           7F           FF            00
chocolate            D2           69            1E
coral                FF           7F            50
cornflowerblue       64           95            ED
cornsilk             FF           F8            DC
crimson              DC           14            3C
cyan                 00           FF            FF
darkblue             00           00            8B
darkcyan             00           8B            8B
darkgoldenrod        B8           86            0B
darkgray             A9           A9            A9
darkgreen            00           64            00
darkkhaki            BD           B7            6B
darkmagenta          8B           00            8B



( run in 2.037 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )