ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra/Deliantra/Tilecache.pm
Revision: 1.3
Committed: Sun Feb 12 04:50:24 2006 UTC (18 years, 3 months ago) by root
Branch: MAIN
Changes since 1.2: +6 -7 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.2 Crossfire::Tilecache - Tile Cache using Gtk2::Gdk::Pixbuf
4 root 1.1
5     =cut
6    
7 root 1.2 package Crossfire::Tilecache;
8 root 1.1
9     our $VERSION = '0.1';
10    
11     use strict;
12    
13     use Gtk2;
14    
15     use Crossfire;
16    
17     sub init_tilecache($) {
18     my ($cacheprefix) = @_;
19    
20     eval {
21     -M "$cacheprefix.pst" < -M "$Crossfire::LIB/crossfire.0"
22 root 1.3 && ($Crossfire::TILE = new_from_file Gtk2::Gdk::Pixbuf "$cacheprefix.png")
23     && (*Crossfire::FACE = Storable::retrieve "$cacheprefix.pst")
24 root 1.1 } or do {
25     my $tile = read_pak "$Crossfire::LIB/crossfire.0";
26    
27     my %cache;
28    
29     my $idx = 0;
30    
31     for my $name (sort keys %$tile) {
32     my $file = "/tmp/map2png.$$~";
33    
34     open my $fh, ">:raw", $file
35     or die "$file: $!";
36     print $fh $tile->{$name};
37     close $fh;
38    
39     my $tile = $cache{$name} = {};
40    
41     my $pb = $tile->{$name} = new_from_file Gtk2::Gdk::Pixbuf $file;
42    
43     unlink $file;
44    
45     $tile->{pb} = $pb;
46     $tile->{idx} = $idx;
47     $tile->{w} = int $pb->get_width / TILESIZE;
48     $tile->{h} = int $pb->get_height / TILESIZE;
49    
50     $idx += $tile->{w} * $tile->{h};
51     }
52    
53     my $pb = new Gtk2::Gdk::Pixbuf "rgb", 1, 8, 64 * TILESIZE, TILESIZE * int +($idx + 63) / 64;
54    
55     while (my ($name, $tile) = each %cache) {
56     my $tpb = delete $tile->{pb};
57     my $ofs = $tile->{idx};
58    
59     for my $x (0 .. $tile->{w} - 1) {
60     for my $y (0 .. $tile->{h} - 1) {
61     my $idx = $ofs + $x + $y * $tile->{w};
62     $tpb->copy_area ($x * TILESIZE, $y * TILESIZE, TILESIZE, TILESIZE,
63     $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64);
64     }
65     }
66     }
67    
68     $pb->save ("$cacheprefix.png", "png");
69     Storable::nstore \%cache, "$cacheprefix.pst";
70    
71 root 1.3 $Crossfire::TILE = $pb;
72     *Crossfire::FACE = \%cache;
73 root 1.1 }
74     }
75    
76 root 1.3 init_tilecache "$Crossfire::CACHEDIR/tilecache";
77    
78 root 1.1 =head1 AUTHOR
79    
80     Marc Lehmann <schmorp@schmorp.de>
81     http://home.schmorp.de/
82    
83     Robin Redeker <elmex@ta-sa.org>
84     http://www.ta-sa.org/
85    
86     =cut
87    
88     1