… | |
… | |
24 | sub TRAD_WIDTH (){ 42.42 } # traditional board width |
24 | sub TRAD_WIDTH (){ 42.42 } # traditional board width |
25 | sub TRAD_HEIGHT (){ 45.45 } # traditional board height |
25 | sub TRAD_HEIGHT (){ 45.45 } # traditional board height |
26 | sub TRAD_SIZE_B (){ 2.18 } # traditional black stone size |
26 | sub TRAD_SIZE_B (){ 2.18 } # traditional black stone size |
27 | sub TRAD_SIZE_W (){ 2.12 } # traditional white stone size |
27 | sub TRAD_SIZE_W (){ 2.12 } # traditional white stone size |
28 | |
28 | |
|
|
29 | sub SHADOW (){ 0.07 } |
|
|
30 | |
29 | sub INIT_INSTANCE { |
31 | sub INIT_INSTANCE { |
30 | my $self = shift; |
32 | my $self = shift; |
31 | |
33 | |
32 | $self->double_buffered (0); |
34 | $self->double_buffered (0); |
33 | $self->set (border_width => 0, shadow_type => 'none', |
35 | $self->set (border_width => 0, shadow_type => 'none', |
… | |
… | |
46 | sub configure_event { |
48 | sub configure_event { |
47 | my ($self, $event) = @_; |
49 | my ($self, $event) = @_; |
48 | |
50 | |
49 | $self->{window} = $self->{canvas}->window; |
51 | $self->{window} = $self->{canvas}->window; |
50 | |
52 | |
|
|
53 | my $drawable = $self->{window}; |
|
|
54 | |
51 | $self->{window}->set_back_pixmap (undef, 0); |
55 | $drawable->set_back_pixmap (undef, 0); |
52 | # would need to use find color in colormap etc. |
56 | |
53 | $self->{window}->set_background (new Gtk2::Gdk::Color 0xe4e, 0xb4b4, 0x5f5f); |
57 | #my $gc = new Gtk2::Gdk::GC $drawable; |
|
|
58 | #$gc->set_rgb_fg_color (new Gtk2::Gdk::Color 0xe0e0, 0xb2b2, 0x5e5e); |
54 | $self->{window}->clear_area (0, 0, $self->allocation->width, $self->allocation->height); |
59 | #$drawable->draw_rectangle ($gc, 1, 0, 0, $self->allocation->width, $self->allocation->height); |
55 | |
60 | |
56 | #^remove Glib::Source $self->{idle}; |
61 | # remove Glib::Source $self->{idle}; |
57 | $self->{idle} ||= add Glib::Idle sub { |
62 | $self->{idle} ||= add Glib::Idle sub { |
58 | delete $self->{stack}; |
63 | delete $self->{stack}; |
59 | |
64 | |
60 | $self->{width} = $self->{canvas}->allocation->width; |
65 | $self->{width} = $self->{canvas}->allocation->width; |
61 | $self->{height} = $self->{canvas}->allocation->height; |
66 | $self->{height} = $self->{canvas}->allocation->height; |
… | |
… | |
151 | # TODO: smaller == buggy, want visual perfectness |
156 | # TODO: smaller == buggy, want visual perfectness |
152 | my $borderw = int ($w / ($size + 3) * 0.5); |
157 | my $borderw = int ($w / ($size + 3) * 0.5); |
153 | my $borderh = $borderw; |
158 | my $borderh = $borderw; |
154 | my $w2 = $w - $borderw * 2; |
159 | my $w2 = $w - $borderw * 2; |
155 | my $h2 = $h - $borderh * 2; |
160 | my $h2 = $h - $borderh * 2; |
156 | my $edge = $self->{edge} = $w2 / ($size + 1) * 0.975 - 1; |
161 | my $edge = $self->{edge} = ceil ($w2 / ($size + 1)); |
157 | my $ofs = $edge * 0.5; |
162 | my $ofs = $edge * 0.5; |
158 | |
163 | |
159 | my @kx = map int ($w2 * $_ / ($size+1) + $borderw + 0.5), 0 .. $size; $self->{kx} = \@kx; |
164 | my @kx = map int ($w2 * $_ / ($size+1) + $borderw + 0.5), 0 .. $size; $self->{kx} = \@kx; |
160 | my @ky = map int ($h2 * $_ / ($size+1) + $borderh + 0.5), 0 .. $size; $self->{ky} = \@ky; |
165 | my @ky = map int ($h2 * $_ / ($size+1) + $borderh + 0.5), 0 .. $size; $self->{ky} = \@ky; |
161 | |
166 | |
… | |
… | |
246 | my ($self, $mark, $size) = @_; |
251 | my ($self, $mark, $size) = @_; |
247 | |
252 | |
248 | $self->{stack}{$mark} ||= do { |
253 | $self->{stack}{$mark} ||= do { |
249 | my @stack; |
254 | my @stack; |
250 | my $csize = ceil $size; |
255 | my $csize = ceil $size; |
251 | my $shadow = $size * 0.05; |
256 | my $shadow = $size * SHADOW; |
252 | |
257 | |
253 | for my $stone ($mark & MARK_W ? @::white_img : @::black_img) { |
258 | for my $stone ($mark & MARK_W ? @::white_img : @::black_img) { |
254 | my $base = new_pixbuf +(ceil $size + $shadow) x2, 1, 0x00000000; |
259 | my $base = new_pixbuf +(ceil $size + $shadow) x2, 1, 0x00000000; |
255 | |
260 | |
256 | # zeroeth the shadow |
261 | # zeroeth the shadow |
… | |
… | |
327 | for my $y (1 .. $size) { |
332 | for my $y (1 .. $size) { |
328 | my $mark = $board->{board}[$x-1][$y-1]; |
333 | my $mark = $board->{board}[$x-1][$y-1]; |
329 | my $mold = $old->{board}[$x-1][$y-1]; |
334 | my $mold = $old->{board}[$x-1][$y-1]; |
330 | |
335 | |
331 | if ($mold != $mark) { |
336 | if ($mold != $mark) { |
332 | my $rand = ($x ^ $y ^ 0x5555); |
337 | my $rand = $x ^ $y; |
333 | |
338 | |
334 | my $shadow = $edge * 0.05; |
339 | my $shadow = $edge * SHADOW; |
335 | my @area = ($kx->[$x] - $ofs, $ky->[$y] - $ofs, |
340 | my @area = ($kx->[$x] - $ofs, $ky->[$y] - $ofs, |
336 | $edge + $shadow, $edge + $shadow); |
341 | $edge + $shadow, $edge + $shadow); |
337 | my @areai = ((ceil $area[0]), (ceil $area[1]), |
342 | my @areai = ((ceil $area[0]), (ceil $area[1]), |
338 | (int $area[2]), (int $area[3])); # area, integer |
343 | (int $area[2]), (int $area[3])); # area, integer |
339 | |
344 | |
340 | my $pb = new_pixbuf @areai[2,3]; |
345 | my $pb = new_pixbuf @areai[2,3]; |
341 | $self->{backgroundpb}->copy_area (@areai, $pb, 0, 0); |
346 | $self->{backgroundpb}->copy_area (@areai, $pb, 0, 0); |
342 | |
347 | |
|
|
348 | my $put_stack = sub { |
|
|
349 | my ($x, $y, $dx, $dy, $ox, $oy) = @_; |
|
|
350 | |
|
|
351 | my $mark = $board->{board}[$x-1][$y-1]; |
|
|
352 | |
343 | if ($mark & ~MARK_LABEL) { |
353 | if ($mark & ~MARK_LABEL) { |
344 | my $stack = $self->get_stack ($mark, $edge); |
354 | my $stack = $self->get_stack ($mark, $edge); |
345 | |
355 | |
346 | $stack->[$rand % @$stack] |
356 | $stack->[$rand % @$stack] |
347 | ->composite ($pb, 0, 0, @areai[2,3], 0, 0, |
357 | ->composite ($pb, |
|
|
358 | $ox, $oy, |
|
|
359 | $areai[2] + $dx - $ox, $areai[3] + $dy - $oy, |
|
|
360 | $dx + $ox, $dy + $oy, |
348 | 1, 1, 'nearest', 255); |
361 | 1, 1, 'nearest', 255); |
|
|
362 | } |
349 | } |
363 | }; |
|
|
364 | |
|
|
365 | $put_stack->($x-1, $y, $kx->[$x-1] - $kx->[$x], 0, 0, 0) if $x > 1; |
|
|
366 | $put_stack->($x, $y-1, 0, $ky->[$y-1] - $ky->[$y], 0, 0) if $y > 1; |
|
|
367 | $put_stack->($x , $y , 0, 0); |
|
|
368 | $put_stack->($x+1, $y, 0, 0, $kx->[$x+1] - $kx->[$x], 0) if $x < $size; |
|
|
369 | $put_stack->($x, $y+1, 0, 0, 0, $ky->[$y+1] - $ky->[$y]) if $y < $size; |
350 | |
370 | |
351 | # speed none, normal, max |
371 | # speed none, normal, max |
352 | $self->{backgroundpm}->draw_pixbuf ($self->style->black_gc, $pb, |
372 | $self->{backgroundpm}->draw_pixbuf ($self->style->black_gc, $pb, |
353 | 0, 0, @areai, 'max', 0, 0); |
373 | 0, 0, @areai, 'max', 0, 0); |
354 | |
374 | |