ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/board.pl
(Generate patch)

Comparing kgsueme/kgsueme/board.pl (file contents):
Revision 1.16 by pcg, Fri Jul 25 03:50:33 2003 UTC vs.
Revision 1.17 by pcg, Fri Jul 25 17:35:20 2003 UTC

24sub TRAD_WIDTH (){ 42.42 } # traditional board width 24sub TRAD_WIDTH (){ 42.42 } # traditional board width
25sub TRAD_HEIGHT (){ 45.45 } # traditional board height 25sub TRAD_HEIGHT (){ 45.45 } # traditional board height
26sub TRAD_SIZE_B (){ 2.18 } # traditional black stone size 26sub TRAD_SIZE_B (){ 2.18 } # traditional black stone size
27sub TRAD_SIZE_W (){ 2.12 } # traditional white stone size 27sub TRAD_SIZE_W (){ 2.12 } # traditional white stone size
28 28
29sub SHADOW (){ 0.07 }
30
29sub INIT_INSTANCE { 31sub 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',
46sub configure_event { 48sub 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines