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

Comparing kgsueme/bin/kgsueme (file contents):
Revision 1.17 by pcg, Fri May 30 09:15:37 2003 UTC vs.
Revision 1.25 by pcg, Fri May 30 15:50:20 2003 UTC

1#!/usr/bin/perl -I../lib/ 1#!/usr/bin/perl
2 2
3use Gtk; 3use Gtk;
4use Gtk::Gdk; 4use Gtk::Gdk;
5use Gtk::Gdk::Pixbuf; 5use Gtk::Gdk::Pixbuf;
6#use Gtk::Gdk::ImlibImage; 6#use Gtk::Gdk::ImlibImage;
10 10
11use Audio::Data; 11use Audio::Data;
12use Audio::Play; 12use Audio::Play;
13 13
14use IO::Socket::INET; 14use IO::Socket::INET;
15 15use List::Util;
16use Errno; 16use Errno;
17 17
18init Gtk; 18init Gtk;
19 19
20$HACK = 1; # do NEVER enable. ;) 20$HACK = 1; # do NEVER enable. ;)
21
22if ($HACK) {
23 $KGS::debug = 1;
24}
21 25
22our $config; 26our $config;
23our $LIBDIR = "."; 27our $LIBDIR = ".";
24our $IMGDIR = "$LIBDIR/images"; 28our $IMGDIR = "$LIBDIR/images";
25our $SNDDIR = "$LIBDIR/sounds"; 29our $SNDDIR = "$LIBDIR/sounds";
62 $sound{$_}->Load($snd); 66 $sound{$_}->Load($snd);
63 } 67 }
64 68
65 sub play_sound { 69 sub play_sound {
66 if (fork == 0) { 70 if (fork == 0) {
67 my $audioserver = new Audio::Play(1); 71 if (my $audioserver = new Audio::Play(1)) {
68 $audioserver->play ($sound{$_[0]}); 72 $audioserver->play ($sound{$_[0]});
73 }
69 Gtk->_exit(0); 74 Gtk->_exit(0);
70 } 75 }
71 } 76 }
72} 77}
73 78
79 84
80 my $state = -r $staterc ? Storable::retrieve($staterc) : {}; 85 my $state = -r $staterc ? Storable::retrieve($staterc) : {};
81 my @widgets; 86 my @widgets;
82 87
83 $config = $state->{config} ||= {}; 88 $config = $state->{config} ||= {};
89
90 $config{speed} = 1;#d# optimize for speed or memory?
91 $config{conserve_memory} = 0;
84 92
85 # grr... more gtk+ brokenness 93 # grr... more gtk+ brokenness
86 my %get = ( 94 my %get = (
87 hpane_position => sub { ($_[0]->children)[0]->allocation->[2] }, 95 hpane_position => sub { ($_[0]->children)[0]->allocation->[2] },
88 vpane_position => sub { ($_[0]->children)[0]->allocation->[3] }, 96 vpane_position => sub { ($_[0]->children)[0]->allocation->[3] },
178} 186}
179 187
180if (0) { 188if (0) {
181 use KGS::Constants; 189 use KGS::Constants;
182 190
191 for (19) {
183 my $board = new game size => 5; 192 my $board = new game size => $_;
184 $board->{board} = new KGS::Game::Board; 193 $board->{board} = new KGS::Game::Board;
185 $board->{board}{board}[0][0] = MARK_B; 194 $board->{board}{board}[0][0] = MARK_B;
186 $board->{board}{board}[1][1] = MARK_GRAY_B | MARK_SMALL_W; 195 $board->{board}{board}[1][1] = MARK_GRAY_B | MARK_SMALL_W;
187 $board->{board}{board}[2][2] = MARK_W | MARK_TRIANGLE; 196 $board->{board}{board}[2][2] = MARK_W | MARK_TRIANGLE;
197 $board->{board}{board}[1][2] = MARK_B | MARK_LABEL;
198 $board->{board}{label}[1][2] = "198";
199 $board->{board}{board}[0][2] = MARK_W | MARK_LABEL;
200 $board->{board}{label}[0][2] = "AWA";
188 $board->{window}->show_all; 201 $board->{window}->show_all;
202 }
189} 203}
190 204
191main Gtk; 205main Gtk;
192 206
193############################################################################# 207#############################################################################
202 216
203 $self->{conn} = new KGS::Protocol; 217 $self->{conn} = new KGS::Protocol;
204 218
205 KGS::Listener::Debug->new->listen($self->{conn}); #d# debug only :) 219 KGS::Listener::Debug->new->listen($self->{conn}); #d# debug only :)
206 220
207 $self->listen($self->{conn}); 221 $self->listen($self->{conn}, "login");
208 222
209 $self->{roomlist} = new roomlist conn => $self->{conn}; 223 $self->{roomlist} = new roomlist conn => $self->{conn};
210 224
211 $self->{window} = new Gtk::Window 'toplevel'; 225 $self->{window} = new Gtk::Window 'toplevel';
212 $self->{window}->set_title('kgsueme'); 226 $self->{window}->set_title('kgsueme');
379 393
380sub new { 394sub new {
381 my $self = shift; 395 my $self = shift;
382 $self = $self->SUPER::new(@_); 396 $self = $self->SUPER::new(@_);
383 397
384 $self->listen($self->{conn}); 398 $self->listen($self->{conn}, qw(msg_room:));
385 399
386 $self->{window} = new Gtk::Window 'toplevel'; 400 $self->{window} = new Gtk::Window 'toplevel';
387 $self->{window}->set_title("KGS Room $self->{name}"); 401 $self->{window}->set_title("KGS Room $self->{name}");
388 ::state $self->{window}, "room::window", $self->{name}, window_size => [600, 400]; 402 ::state $self->{window}, "room::window", $self->{name}, window_size => [600, 400];
389 403
432 ::state $self->{userlist}, "room::userlist", $self->{name}, clist_column_widths => [120, 30]; 446 ::state $self->{userlist}, "room::userlist", $self->{name}, clist_column_widths => [120, 30];
433 447
434 $self; 448 $self;
435} 449}
436 450
451sub join {
452 my ($self) = @_;
453 $self->SUPER::join;
454
455 $self->{window}->show_all;
456}
457
458sub part {
459 my ($self) = @_;
460 $self->SUPER::part;
461
462 delete $::config->{rooms}{$self->{channel}};
463 $self->{window}->hide_all;
464 $self->event_update_users;
465 $self->event_update_games;
466}
467
468sub inject_msg_room {
469 my ($self, $msg) = @_;
470
471 $self->{text}->insert(undef, undef, undef, "\n$msg->{name}: $msg->{message}");
472}
473
437sub event_update_users { 474sub event_update_users {
438 my ($self) = @_; 475 my ($self) = @_;
439 476
440 $self->{event_update} ||= Gtk->timeout_add(200, sub { 477 $self->{event_update} ||= Gtk->timeout_add(200, sub {
441 my $l = $self->{userlist}; 478 my $l = $self->{userlist};
480 delete $self->{event_update_games}; 517 delete $self->{event_update_games};
481 0; 518 0;
482 }); 519 });
483} 520}
484 521
485sub join {
486 my ($self) = @_;
487 $self->SUPER::join;
488
489 $self->{window}->show_all;
490}
491
492sub part {
493 my ($self) = @_;
494 $self->SUPER::part;
495
496 delete $::config->{rooms}{$self->{channel}};
497 $self->{window}->hide_all;
498 $self->event_update_users;
499 $self->event_update_games;
500}
501
502sub event_join { 522sub event_join {
503 my ($self) = @_; 523 my ($self) = @_;
504 $self->SUPER::event_join; 524 $self->SUPER::event_join;
505 525
506 $::config->{rooms}{$self->{channel}} = 1; 526 $::config->{rooms}{$self->{channel}} = 1;
508 528
509sub event_update_roominfo { 529sub event_update_roominfo {
510 my ($self) = @_; 530 my ($self) = @_;
511 531
512 $self->{text}->insert(undef, undef, undef, "\n$self->{owner}: $self->{description}\n"); 532 $self->{text}->insert(undef, undef, undef, "\n$self->{owner}: $self->{description}\n");
513}
514
515sub inject_msg_room {
516 my ($self, $msg) = @_;
517 return unless $self->{channel} == $msg->{channel};
518
519 $self->{text}->insert(undef, undef, undef, "\n$msg->{name}: $msg->{message}");
520} 533}
521 534
522############################################################################# 535#############################################################################
523 536
524package game; 537package game;
534 $self = $self->SUPER::new(@_); 547 $self = $self->SUPER::new(@_);
535 548
536 $self->listen($self->{conn}); 549 $self->listen($self->{conn});
537 550
538 $self->{window} = new Gtk::Window 'toplevel'; 551 $self->{window} = new Gtk::Window 'toplevel';
539 $self->{window}->set_title("KGS Game ".$self->user0." ".$self->user1) if $self->{channel};#d# 552 my $title = $self->{channel} ? $self->user0." ".$self->user1 : "Game Window";
553 $self->{window}->set_title("KGS Game $title");
540 ::state $self->{window}, "game::window", undef, window_size => [600, 500]; 554 ::state $self->{window}, "game::window", undef, window_size => [600, 500];
541 555
542 $self->{window}->signal_connect(delete_event => sub { $self->part; 1 }); 556 $self->{window}->signal_connect(delete_event => sub { $self->part; 1 });
543 557
544 $self->{window}->add(my $hpane = new Gtk::HPaned); 558 $self->{window}->add(my $hpane = new Gtk::HPaned);
545 ::state $hpane, "game::hpane", undef, hpane_position => 500; 559 ::state $hpane, "game::hpane", undef, hpane_position => 500;
546 560
561 $hpane->pack1(my $vbox = new Gtk::VBox);
562
563 $vbox->pack_start((my $frame = new Gtk::Frame), 0, 1, 0);
564
565 {
566 $frame->add(my $vbox = new Gtk::VBox);
567 $vbox->add($self->{title} = new Gtk::Label $title);
568
569 $self->{moveadj} = new Gtk::Adjustment 0, 0, 0, 1, 10, 0;
570 $vbox->add(my $scale = new Gtk::HScale $self->{moveadj});
571 $scale->set_draw_value (1);
572 $scale->set_digits (0);
573 $scale->set_value_pos('top');
574
575 $self->{moveadj}->signal_connect (value_changed => sub {
576 $self->{board} = new KGS::Game::Board $self->{size};
577 $self->{board}->interpret_path ([@{$self->{path}}[0 .. $self->{moveadj}->value - 1]]);
578
579 $self->repaint_board;
580
581 # force a redraw (not perfect(?))
582 expose_event($self->{canvas}, $self, { area => [0, 0, @{$self->{canvas}->allocation}[2,3]] });
583
584 $self->{text}->backward_delete($self->{text}->get_length);
585 $self->{text}->insert(undef, undef, undef, KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment});
586 });
587 }
588
547 Gtk::Widget->push_visual (Gtk::Gdk::Rgb->get_visual); 589 Gtk::Widget->push_visual (Gtk::Gdk::Rgb->get_visual);
548 Gtk::Widget->push_colormap (Gtk::Gdk::Rgb->get_cmap); 590 Gtk::Widget->push_colormap (Gtk::Gdk::Rgb->get_cmap);
549 $hpane->pack1(($self->{canvas} = new Gtk::DrawingArea), 1, 1); 591 $vbox->pack_start(($self->{canvas} = new Gtk::DrawingArea), 1, 1, 0);
550 Gtk::Widget->pop_colormap; 592 Gtk::Widget->pop_colormap;
551 Gtk::Widget->pop_visual; 593 Gtk::Widget->pop_visual;
552 594
553 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); 595 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self);
554 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); 596 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self);
601} 643}
602 644
603sub configure_event { 645sub configure_event {
604 my ($widget, $self, $event) = @_; 646 my ($widget, $self, $event) = @_;
605 delete $self->{stack}; 647 delete $self->{stack};
648 delete $self->{background};
606 $self->repaint_board; 649 $self->repaint_board;
607 1; 650 1;
608} 651}
609 652
610sub INTERP_NEAREST (){ 1 } 653sub INTERP_NEAREST (){ 1 }
641 684
642# create a stack of stones 685# create a stack of stones
643sub create_stack { 686sub create_stack {
644 my ($self, $mark, $size, $rand) = @_; 687 my ($self, $mark, $size, $rand) = @_;
645 688
689 my $shadow = $size * 0.06;
690
646 my $c = \$self->{stack}{$mark}; 691 my $c = \$self->{stack}{$mark};
647 unless ($$c) { 692 unless ($$c) {
648 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { 693 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) {
649 my $base = 694 my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 1;
650 $mark & (MARK_B | MARK_GRAY_B | MARK_W | MARK_GRAY_W)
651 ? scale_pixbuf $stone, $size, $size, INTERP_HYPER
652 : new_pixbuf $size, $size, 1, 1;
653 695
696 # zeroeth the shadow
654 if ($mark & (MARK_GRAY_B | MARK_GRAY_W)) { 697 if ($mark & (MARK_B | MARK_W)) {
655 # make transparent by stippling :( 698 $::black_img[0]->composite (
656 # fix this to use compositing if/when we have full compositing support 699 $base, $shadow, $shadow, $size, $size, $shadow-0.5, $shadow-0.5,
657 # in kgsueme 700 $size / $stone->get_width, $size / $stone->get_height,
658 my @row = ( 701 $::config{speed} ? INTERP_NEAREST : INTERP_TILES, 128
659 "\xff\xff\xff\xff\x00\x00\x00\x00" x ($size / 2 + 1), 702 );
660 "\x00\x00\x00\x00\xff\xff\xff\xff" x ($size / 2 + 1),
661 );
662 $base->put_pixels ($base->get_pixels ($_) & $row[$_ & 1], $_, 0)
663 for 0 .. $size - 1;
664 } 703 }
665 704
705 # first the big stones
706 for ([MARK_B, 255],
707 [MARK_W, 255],
708 [MARK_GRAY_B, 128],
709 [MARK_GRAY_W, 128]) {
710 my ($mask, $alpha) = @$_;
711 if ($mark & $mask) {
712 $stone->composite (
713 $base, 0, 0, $size, $size, -0.5, -0.5,
714 $size / $stone->get_width, $size / $stone->get_height,
715 $::config{speed} ? INTERP_NEAREST : INTERP_HYPER, $alpha
716 );
717 }
718 }
719
720 # then the samll stones
666 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]], 721 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]],
667 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) { 722 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) {
668 my ($mask, $img) = @$_; 723 my ($mask, $img) = @$_;
669 if ($mark & $mask) { 724 if ($mark & $mask) {
670 $img->composite ( 725 $img->composite (
671 $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4) x 2, 726 $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4 - 0.5) x 2,
672 $size / $img->get_width / 2, $size / $img->get_height / 2, 727 $size / $img->get_width / 2, $size / $img->get_height / 2,
673 INTERP_HYPER, 192 728 $::config{speed} ? INTERP_NEAREST : INTERP_HYPER, 192
674 ); 729 );
675 } 730 }
676 } 731 }
677 732
733 # and lastly any markers (labels NYI)
678 my $dark_bg = ! ! ($mark & (MARK_B | MARK_GRAY_B)); 734 my $dark_bg = ! ! ($mark & (MARK_B | MARK_GRAY_B));
679 735
680 for ([MARK_CIRCLE, $::circle_img[$dark_bg]], 736 for ([MARK_CIRCLE, $::circle_img[$dark_bg]],
681 [MARK_TRIANGLE, $::triangle_img[$dark_bg]], 737 [MARK_TRIANGLE, $::triangle_img[$dark_bg]],
682 [MARK_SQUARE, $::square_img[$dark_bg]]) { 738 [MARK_SQUARE, $::square_img[$dark_bg]]) {
683 my ($mask, $img) = @$_; 739 my ($mask, $img) = @$_;
684 if ($mark & $mask) { 740 if ($mark & $mask) {
685 $img->composite ( 741 $img->composite (
686 $base, 0, 0, $size, $size, 0, 0, 742 $base, 0, 0, $size, $size, -0.5, -0.5,
687 ($size - 1) / ($img->get_width - 1), ($size - 1) / ($img->get_height - 1), 743 $size / $img->get_width, $size / $img->get_height,
688 INTERP_HYPER, 255 744 $::config{speed} ? INTERP_NEAREST : INTERP_HYPER, 255
689 ); 745 );
690 } 746 }
691 } 747 }
692 748
693 #push @$$c, [$base->render_pixmap_and_mask (128)];
694 push @$$c, $base; 749 push @$$c, $base;
695 } 750 }
696 } 751 }
697 752
698 $$c->[$rand % @$$c]; 753 $$c->[$rand % @$$c];
699} 754}
700 755
701sub pixbuf_text { 756sub pixbuf_text {
702 my ($pixbuf, $colour, $x, $y, $height, $text) = @_; 757 my ($pixbuf, $colour, $x, $y, $height, $text) = @_;
703 758
704 my $c = $::font[$colour][$::fontmap{substr $text, 0, 1}]; 759 my @c = grep $_,
760 map $::font[$colour][$::fontmap{$_}],
761 split //, $text;
705 762
706 if ($c) { 763 if (@c) {
707 my ($w, $h) = ($c->get_width, $c->get_height);
708 my $s = $height / $h; 764 my $spacing = $height * 0.1;
765 my $s = $height / List::Util::max map $_->get_height, @c;
766 my $W = List::Util::sum map $_->get_width, @c;
709 767
710 $x -= $w * $s *0.5; 768 $x -= ($W * $s + $spacing * (@c - 1)) * 0.5;
711 $y -= $height * 0.5; 769 $y -= $height * 0.5;
712 770
771 for (@c) {
772 my $w = $_->get_width * $s;
713 $c->composite ($pixbuf, 773 $_->composite ($pixbuf,
714 $x, $y, $w*$s+1, $height+1, $x, $y, $s, $s, 774 $x, $y, $w+0.999, $height+0.999, $x, $y, $s, $s,
715 INTERP_HYPER, 128); 775 $::config{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255);
716 776
717 } else { 777 $x += $w + $spacing;
718 warn "unable to render character '$text'"; 778 }
719 } 779 }
720} 780}
721 781
722my $black_pb; 782my $black_pb;
723 783
727 unless ($black_pb) { 787 unless ($black_pb) {
728 $black_pb = new_pixbuf 1, 1, 0, 0; 788 $black_pb = new_pixbuf 1, 1, 0, 0;
729 $black_pb->put_pixels ("\x44\x11\x11", 0, 0); 789 $black_pb->put_pixels ("\x44\x11\x11", 0, 0);
730 } 790 }
731 791
732 $black_pb->scale ($pb, $x1, $y1, $x2 - $x1 + 1, $y2 - $y1 + 1, $x1, $y1, 10000, 10000, INTERP_NEAREST); 792 $black_pb->composite ($pb, $x1, $y1, $x2 - $x1 + 1, $y2 - $y1 + 1, $x1, $y1, 1, 1, INTERP_NEAREST, 192);
733} 793}
734 794
735sub repaint_board { 795sub repaint_board {
736 my ($self) = @_; 796 my ($self) = @_;
737 my $canvas = $self->{canvas}; 797 my $canvas = $self->{canvas};
738 798
739 return unless $self->{board}; 799 return unless $self->{board};
740
741 %cache = ();
742 800
743 my ($w, $h) = @{$canvas->allocation}[2,3]; 801 my ($w, $h) = @{$canvas->allocation}[2,3];
744 802
745 my $s = $w > $h ? $h : $w; 803 my $s = $w > $h ? $h : $w;
746 804
747 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s]; 805 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s];
748 806
807 my $size = $self->{size};
808
809 my $border = int ($s / ($size + 3) * 0.5);
810 my $s2 = $s - $border * 2;
811 my $edge = int ($s2 / ($size + 1) * 0.97);
812 my $ofs = int ($edge / 2);
813
814 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size;
815
749 my $pixbuf; 816 my $pixbuf;
750 817
751 { 818 if ($self->{background}) {
819 $pixbuf = $self->{background}->copy;
820 } else {
752 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height); 821 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height);
753 822
754 if ($s < $bw && $s < $bh) { 823 if ($s < $bw && $s < $bh) {
755 $pixbuf = new_pixbuf $s, $s, 0, 0; 824 $pixbuf = new_pixbuf $s, $s, $::config{conserve_memory} ? 0 : 1, 0;
756 $::board_img->copy_area (0, 0, $s, $s, $pixbuf, 0, 0); 825 $::board_img->copy_area (0, 0, $s, $s, $pixbuf, 0, 0);
757 } else { 826 } else {
758 $pixbuf = scale_pixbuf $::board_img, $s, $s, INTERP_TILES; 827 $pixbuf = scale_pixbuf $::board_img, $s, $s, $::config{speed} ? INTERP_NEAREST : INTERP_TILES;
828 }
829
830 my $linew = int ($s / 25 / $size);
831
832 for my $i (1 .. $size) {
833 pixbuf_rect $pixbuf, $k[$i] - $linew, $k[1] - $linew, $k[$i] + $linew, $k[$size] + $linew;
834 pixbuf_rect $pixbuf, $k[1] - $linew, $k[$i] - $linew, $k[$size] + $linew, $k[$i] + $linew;
835
836 # 38 max, but we allow a bit more
837 my $label = (qw(- A B C D E F G H J K L M N O P Q R S T U V W X Y Z
838 AA BB CC DD EE FF GG HH JJ KK LL MM NN OO PP QQ RR SS TT UU VV WW XX YY ZZ))[$i];
839
840 pixbuf_text $pixbuf, 0, $k[$i], $border, $ofs, $label;
841 pixbuf_text $pixbuf, 0, $k[$i], $s2 + $border, $ofs, $label;
842 pixbuf_text $pixbuf, 0, $border, $k[$i], $ofs, $size - $i + 1;
843 pixbuf_text $pixbuf, 0, $s2 + $border, $k[$i], $ofs, $size - $i + 1;
844
845 $a++;
846 $a++ if $a eq "I"; # not correct, instead of AA AB, we should get HH JJ KK...
847 }
848
849 unless ($::config->{conserve_memory}) {
850 $self->{background} = $pixbuf;
851 $pixbuf = $pixbuf->copy;
759 } 852 }
760 } 853 }
761 854
762 $self->{pixbuf} = $pixbuf; 855 $self->{pixbuf} = $pixbuf;
763
764 my $size = $self->{size};
765 my $border = int ($s / $size);
766 my $s2 = $s - $border * 2;
767 my $edge = int ($s2 / $size) | 1;
768 my $ofs = int ($edge / 2);
769
770 my @k = map int ($s2 * $_ / $size - $ofs + $border + 0.5), 0 .. $size;
771
772 my $linew = int ($s / 300);
773
774 my $a = "A";
775 for my $i (1 .. $size) {
776 pixbuf_rect $pixbuf, $k[$i] - $linew, $k[1] - $linew, $k[$i] + $linew, $k[$size] + $linew;
777 pixbuf_rect $pixbuf, $k[1] - $linew, $k[$i] - $linew, $k[$size] + $linew, $k[$i] + $linew;
778
779 pixbuf_text $pixbuf, 0, $k[$i], ($ofs +$border) / 2, $ofs, $a;
780 pixbuf_text $pixbuf, 0, $k[$i], $s2 + $border + $ofs / 2, $ofs, $a;
781 pixbuf_text $pixbuf, 0, ($ofs + $border) / 2, $k[$i], $ofs, $size - $i + 1;
782 pixbuf_text $pixbuf, 0, $s2 + $border + $ofs / 2, $k[$i], $ofs, $size - $i + 1;
783
784 $a++;
785 $a++ if $a eq "I"; # not correct, instead of AA AB, we should get HH JJ KK...
786 }
787 856
788 # hoshi-points(!)#d# 857 # hoshi-points(!)#d#
789 # caching of empty board gfx(!)#d# 858 # caching of empty board gfx(!)#d#
790 859
791 for my $x (1 .. $size) { 860 for my $x (1 .. $size) {
794 863
795 if ($mark) { 864 if ($mark) {
796 my ($dx, $dy) = ($k[$x] - $ofs, $k[$y] - $ofs); 865 my ($dx, $dy) = ($k[$x] - $ofs, $k[$y] - $ofs);
797 my $pb = $self->create_stack($mark, $edge, $x * 17 + $y * 11 ); 866 my $pb = $self->create_stack($mark, $edge, $x * 17 + $y * 11 );
798 867
799 $pb->composite ($pixbuf, $dx, $dy, $edge, $edge, $dx, $dy, 1, 1, INTERP_TILES, 192); 868 $pb->composite ($pixbuf, $dx, $dy, $pb->get_width, $pb->get_height,
869 $dx, $dy, 1, 1, $::config{speed} ? INTERP_NEAREST : INTERP_NEAREST, 255);
870
871 # labels are handled here because they are quite rare
872 if ($mark & MARK_LABEL) {
873 pixbuf_text $pixbuf, $mark & (MARK_W | MARK_GRAY_W) ? 0 : 1,
874 $k[$x], $k[$y], $ofs * 0.7,
875 $self->{board}{label}[$x-1][$y-1];
876 }
800 877
801 #my ($pm, $bm) = $self->create_stack($gc, $mark, $edge, $x * 17 + $y * 11 ); 878 #my ($pm, $bm) = $self->create_stack($gc, $mark, $edge, $x * 17 + $y * 11 );
802 879
803 #$gc->set_clip_mask ($bm); 880 #$gc->set_clip_mask ($bm);
804 #$gc->set_clip_origin ($dx, $dy); 881 #$gc->set_clip_origin ($dx, $dy);
834} 911}
835 912
836sub event_update_tree { 913sub event_update_tree {
837 my ($self) = @_; 914 my ($self) = @_;
838 915
839 $self->{board} = new KGS::Game::Board $self->{size}; 916 $self->{path} = $self->get_path;
840 $self->{board}->interpret_path ($self->get_path); 917
918 my $move = @{$self->{path}};
841 919
842 $self->repaint_board; 920 $self->{moveadj}->upper($move);
843 921
844 # force a redraw (not perfect(?)) 922 if ($self->{moveadj}->value >= $move - 1 || !$self->{moveadj}->value) {
845 expose_event $self->{canvas}, $self, { area => $self->{canvas}->allocation }; 923 $self->{moveadj}->set_value ($move);
846 924 }
847 $self->{text}->backward_delete($self->{text}->get_length);
848 $self->{text}->insert(undef, undef, undef, KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment});
849} 925}
850 926
851sub event_move { 927sub event_move {
852 ::play_sound "move"; 928 ::play_sound "move";
853} 929}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines