… | |
… | |
5 | |
5 | |
6 | use base KGS::Listener::Game; |
6 | use base KGS::Listener::Game; |
7 | use base KGS::Game; |
7 | use base KGS::Game; |
8 | |
8 | |
9 | use base gtk::widget; |
9 | use base gtk::widget; |
|
|
10 | |
|
|
11 | use POSIX qw(ceil); |
10 | |
12 | |
11 | sub new { |
13 | sub new { |
12 | my $self = shift; |
14 | my $self = shift; |
13 | $self = $self->SUPER::new(@_); |
15 | $self = $self->SUPER::new(@_); |
14 | |
16 | |
… | |
… | |
69 | gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80; |
71 | gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80; |
70 | |
72 | |
71 | $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow); |
73 | $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow); |
72 | $sw->set_policy("automatic", "always"); |
74 | $sw->set_policy("automatic", "always"); |
73 | |
75 | |
74 | $sw->add(($self->{userlist} = new gtk::userlist)->widget); |
76 | $sw->add(($self->{userlist} = new userlist)->widget); |
75 | |
77 | |
76 | $self->{vpane}->add(my $vbox = new Gtk2::VBox); |
78 | $self->{vpane}->add(my $vbox = new Gtk2::VBox); |
77 | |
79 | |
78 | $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); |
80 | $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); |
79 | $sw->set_policy("never", "always"); |
81 | $sw->set_policy("never", "always"); |
… | |
… | |
89 | |
91 | |
90 | $self; |
92 | $self; |
91 | } |
93 | } |
92 | |
94 | |
93 | sub event_update_users { |
95 | sub event_update_users { |
94 | my ($self) = @_; |
96 | my ($self, $add, $update, $remove) = @_; |
95 | |
97 | |
96 | $self->{userlist}->update($self->{users}); |
98 | $self->{userlist}->update ($add, $update, $remove); |
97 | } |
99 | } |
98 | |
100 | |
99 | sub join { |
101 | sub join { |
100 | my ($self) = @_; |
102 | my ($self) = @_; |
101 | $self->SUPER::join; |
103 | $self->SUPER::join; |
… | |
… | |
176 | for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { |
178 | for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { |
177 | my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000; |
179 | my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000; |
178 | |
180 | |
179 | # zeroeth the shadow |
181 | # zeroeth the shadow |
180 | if ($mark & (MARK_B | MARK_W)) { |
182 | if ($mark & (MARK_B | MARK_W)) { |
181 | $::black_img[0]->composite ( |
183 | $::shadow_img->composite ( |
182 | $base, $shadow, $shadow, $size, $size, $shadow, $shadow, |
184 | $base, $shadow, $shadow, $size, $size, $shadow - 0.5, $shadow - 0.5, |
183 | $size / $stone->get_width, $size / $stone->get_height, |
185 | $size / $stone->get_width, $size / $stone->get_height, |
184 | $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192 |
186 | $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192 |
185 | ); |
187 | ); |
186 | } |
188 | } |
187 | |
189 | |
… | |
… | |
204 | for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]], |
206 | for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]], |
205 | [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) { |
207 | [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) { |
206 | my ($mask, $img) = @$_; |
208 | my ($mask, $img) = @$_; |
207 | if ($mark & $mask) { |
209 | if ($mark & $mask) { |
208 | $img->composite ( |
210 | $img->composite ( |
209 | $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4) x 2, |
211 | $base, (ceil ($size / 4)) x2, (ceil ($size / 2)) x2, (ceil ($size / 4)) x2, |
210 | $size / $img->get_width / 2, $size / $img->get_height / 2, |
212 | $size / $img->get_width / 2, $size / $img->get_height / 2, |
211 | $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192 |
213 | $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 224 |
212 | ); |
214 | ); |
213 | } |
215 | } |
214 | } |
216 | } |
215 | |
217 | |
216 | # and lastly any markers |
218 | # and lastly any markers |
… | |
… | |
251 | $x -= ($W * $s + $spacing * (@c - 1)) * 0.5; |
253 | $x -= ($W * $s + $spacing * (@c - 1)) * 0.5; |
252 | $y -= $height * 0.5; |
254 | $y -= $height * 0.5; |
253 | |
255 | |
254 | for (@c) { |
256 | for (@c) { |
255 | my $w = $_->get_width * $s; |
257 | my $w = $_->get_width * $s; |
|
|
258 | # +2 == don't fight the rounding |
256 | $_->composite ($pixbuf, |
259 | $_->composite ($pixbuf, |
257 | $x, $y, $w+1, $height+1, $x, $y, $s, $s, |
260 | $x, $y, $w+2, $height+2, $x, $y, $s, $s, |
258 | $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255); |
261 | $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255); |
259 | |
262 | |
260 | $x += $w + $spacing; |
263 | $x += $w + $spacing; |
261 | } |
264 | } |
262 | } |
265 | } |
… | |
… | |
285 | |
288 | |
286 | $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s]; |
289 | $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s]; |
287 | |
290 | |
288 | my $size = $self->{size}; |
291 | my $size = $self->{size}; |
289 | |
292 | |
|
|
293 | # we leave enough space for the shadows.. I like smaller stones, and we |
|
|
294 | # do no need to do the nifty recursive screen updates that goban2 does |
290 | my $border = int ($s / ($size + 3) * 0.5); |
295 | my $border = int ($s / ($size + 3) * 0.5); |
291 | my $s2 = $s - $border * 2; |
296 | my $s2 = $s - $border * 2; |
292 | my $edge = int ($s2 / ($size + 1) * 0.96) - ($::config->{randomize} ? 3 : 0); |
297 | my $edge = int ($s2 / ($size + 1) * 0.96) - ($::config->{randomize} ? 3 : 0); |
293 | my $ofs = int ($edge / 2); |
298 | my $ofs = int ($edge / 2); |
294 | |
299 | |