… | |
… | |
80 | |
80 | |
81 | my $state = -r $staterc ? Storable::retrieve($staterc) : {}; |
81 | my $state = -r $staterc ? Storable::retrieve($staterc) : {}; |
82 | my @widgets; |
82 | my @widgets; |
83 | |
83 | |
84 | $config = $state->{config} ||= {}; |
84 | $config = $state->{config} ||= {}; |
|
|
85 | |
|
|
86 | $config{speed} = 1;#d# optimize for speed or memory? |
|
|
87 | $config{conserve_memory} = 0; |
85 | |
88 | |
86 | # grr... more gtk+ brokenness |
89 | # grr... more gtk+ brokenness |
87 | my %get = ( |
90 | my %get = ( |
88 | hpane_position => sub { ($_[0]->children)[0]->allocation->[2] }, |
91 | hpane_position => sub { ($_[0]->children)[0]->allocation->[2] }, |
89 | vpane_position => sub { ($_[0]->children)[0]->allocation->[3] }, |
92 | vpane_position => sub { ($_[0]->children)[0]->allocation->[3] }, |
… | |
… | |
643 | |
646 | |
644 | # create a stack of stones |
647 | # create a stack of stones |
645 | sub create_stack { |
648 | sub create_stack { |
646 | my ($self, $mark, $size, $rand) = @_; |
649 | my ($self, $mark, $size, $rand) = @_; |
647 | |
650 | |
|
|
651 | my $shadow = $size * 0.06; |
|
|
652 | |
648 | my $c = \$self->{stack}{$mark}; |
653 | my $c = \$self->{stack}{$mark}; |
649 | unless ($$c) { |
654 | unless ($$c) { |
650 | for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { |
655 | for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { |
651 | my $base = new_pixbuf $size, $size, 1, 1; |
656 | my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 1; |
|
|
657 | |
|
|
658 | # zeroeth the shadow |
|
|
659 | $::black_img[0]->composite ( |
|
|
660 | $base, $shadow, $shadow, $size, $size, $shadow-0.5, $shadow-0.5, |
|
|
661 | $size / $stone->get_width, $size / $stone->get_height, |
|
|
662 | $::config{speed} ? INTERP_NEAREST : INTERP_TILES, 128 |
|
|
663 | ); |
652 | |
664 | |
653 | # first the big stones |
665 | # first the big stones |
654 | for ([MARK_B, 255], |
666 | for ([MARK_B, 255], |
655 | [MARK_W, 255], |
667 | [MARK_W, 255], |
656 | [MARK_GRAY_B, 128], |
668 | [MARK_GRAY_B, 128], |
… | |
… | |
658 | my ($mask, $alpha) = @$_; |
670 | my ($mask, $alpha) = @$_; |
659 | if ($mark & $mask) { |
671 | if ($mark & $mask) { |
660 | $stone->composite ( |
672 | $stone->composite ( |
661 | $base, 0, 0, $size, $size, -0.5, -0.5, |
673 | $base, 0, 0, $size, $size, -0.5, -0.5, |
662 | $size / $stone->get_width, $size / $stone->get_height, |
674 | $size / $stone->get_width, $size / $stone->get_height, |
663 | INTERP_HYPER, $alpha |
675 | $::config{speed} ? INTERP_NEAREST : INTERP_HYPER, $alpha |
664 | ); |
676 | ); |
665 | } |
677 | } |
666 | } |
678 | } |
667 | |
679 | |
668 | # then the samll stones |
680 | # then the samll stones |
… | |
… | |
671 | my ($mask, $img) = @$_; |
683 | my ($mask, $img) = @$_; |
672 | if ($mark & $mask) { |
684 | if ($mark & $mask) { |
673 | $img->composite ( |
685 | $img->composite ( |
674 | $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4 - 0.5) x 2, |
686 | $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4 - 0.5) x 2, |
675 | $size / $img->get_width / 2, $size / $img->get_height / 2, |
687 | $size / $img->get_width / 2, $size / $img->get_height / 2, |
676 | INTERP_HYPER, 192 |
688 | $::config{speed} ? INTERP_NEAREST : INTERP_HYPER, 192 |
677 | ); |
689 | ); |
678 | } |
690 | } |
679 | } |
691 | } |
680 | |
692 | |
681 | # and lastly any markers (labels NYI) |
693 | # and lastly any markers (labels NYI) |
… | |
… | |
687 | my ($mask, $img) = @$_; |
699 | my ($mask, $img) = @$_; |
688 | if ($mark & $mask) { |
700 | if ($mark & $mask) { |
689 | $img->composite ( |
701 | $img->composite ( |
690 | $base, 0, 0, $size, $size, -0.5, -0.5, |
702 | $base, 0, 0, $size, $size, -0.5, -0.5, |
691 | $size / $img->get_width, $size / $img->get_height, |
703 | $size / $img->get_width, $size / $img->get_height, |
692 | INTERP_HYPER, 255 |
704 | $::config{speed} ? INTERP_NEAREST : INTERP_HYPER, 255 |
693 | ); |
705 | ); |
694 | } |
706 | } |
695 | } |
707 | } |
696 | |
708 | |
697 | push @$$c, $base; |
709 | push @$$c, $base; |
… | |
… | |
713 | $x -= $w * $s * 0.5; |
725 | $x -= $w * $s * 0.5; |
714 | $y -= $height * 0.5; |
726 | $y -= $height * 0.5; |
715 | |
727 | |
716 | $c->composite ($pixbuf, |
728 | $c->composite ($pixbuf, |
717 | $x, $y, $w*$s+0.5, $height+0.5, $x-0.5, $y-0.5, $s, $s, |
729 | $x, $y, $w*$s+0.5, $height+0.5, $x-0.5, $y-0.5, $s, $s, |
718 | INTERP_BILINEAR, 192); |
730 | $::config{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192); |
719 | |
731 | |
720 | } else { |
732 | } else { |
721 | warn "unable to render character '$text'"; |
733 | warn "unable to render character '$text'"; |
722 | } |
734 | } |
723 | } |
735 | } |
… | |
… | |
749 | |
761 | |
750 | my $size = $self->{size}; |
762 | my $size = $self->{size}; |
751 | |
763 | |
752 | my $border = int ($s / $size); |
764 | my $border = int ($s / $size); |
753 | my $s2 = $s - $border * 2; |
765 | my $s2 = $s - $border * 2; |
754 | my $edge = int ($s2 / $size) | 1; |
766 | my $edge = int ($s2 / $size * 0.97); |
755 | my $ofs = int ($edge / 2); |
767 | my $ofs = int ($edge / 2); |
756 | |
768 | |
757 | my @k = map int ($s2 * $_ / $size - $ofs + $border + 0.5), 0 .. $size; |
769 | my @k = map int ($s2 * $_ / $size - $ofs + $border + 0.5), 0 .. $size; |
758 | |
770 | |
759 | unless ($self->{background}) { |
|
|
760 | my $pixbuf; |
771 | my $pixbuf; |
761 | |
772 | |
|
|
773 | if ($self->{background}) { |
|
|
774 | $pixbuf = $self->{background}->copy; |
|
|
775 | } else { |
762 | my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height); |
776 | my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height); |
763 | |
777 | |
764 | if ($s < $bw && $s < $bh) { |
778 | if ($s < $bw && $s < $bh) { |
765 | $pixbuf = new_pixbuf $s, $s, 1, 0; |
779 | $pixbuf = new_pixbuf $s, $s, $::config{conserve_memory} ? 0 : 1, 0; |
766 | $::board_img->copy_area (0, 0, $s, $s, $pixbuf, 0, 0); |
780 | $::board_img->copy_area (0, 0, $s, $s, $pixbuf, 0, 0); |
767 | } else { |
781 | } else { |
768 | $pixbuf = scale_pixbuf $::board_img, $s, $s, INTERP_TILES; |
782 | $pixbuf = scale_pixbuf $::board_img, $s, $s, $::config{speed} ? INTERP_NEAREST : INTERP_TILES; |
769 | } |
783 | } |
770 | |
784 | |
771 | my $linew = int ($s / 300); |
785 | my $linew = int ($s / 500); |
772 | |
786 | |
773 | my $a = "A"; |
787 | my $a = "A"; |
774 | for my $i (1 .. $size) { |
788 | for my $i (1 .. $size) { |
775 | pixbuf_rect $pixbuf, $k[$i] - $linew, $k[1] - $linew, $k[$i] + $linew, $k[$size] + $linew; |
789 | pixbuf_rect $pixbuf, $k[$i] - $linew, $k[1] - $linew, $k[$i] + $linew, $k[$size] + $linew; |
776 | pixbuf_rect $pixbuf, $k[1] - $linew, $k[$i] - $linew, $k[$size] + $linew, $k[$i] + $linew; |
790 | pixbuf_rect $pixbuf, $k[1] - $linew, $k[$i] - $linew, $k[$size] + $linew, $k[$i] + $linew; |
… | |
… | |
782 | |
796 | |
783 | $a++; |
797 | $a++; |
784 | $a++ if $a eq "I"; # not correct, instead of AA AB, we should get HH JJ KK... |
798 | $a++ if $a eq "I"; # not correct, instead of AA AB, we should get HH JJ KK... |
785 | } |
799 | } |
786 | |
800 | |
|
|
801 | unless ($::config->{conserve_memory}) { |
787 | $self->{background} = $pixbuf; |
802 | $self->{background} = $pixbuf; |
|
|
803 | $pixbuf = $pixbuf->copy; |
|
|
804 | } |
788 | } |
805 | } |
789 | |
806 | |
790 | my $pixbuf = $self->{pixbuf} = $self->{background}->copy; |
807 | $self->{pixbuf} = $pixbuf; |
791 | |
808 | |
792 | # hoshi-points(!)#d# |
809 | # hoshi-points(!)#d# |
793 | # caching of empty board gfx(!)#d# |
810 | # caching of empty board gfx(!)#d# |
794 | |
811 | |
795 | for my $x (1 .. $size) { |
812 | for my $x (1 .. $size) { |
… | |
… | |
798 | |
815 | |
799 | if ($mark) { |
816 | if ($mark) { |
800 | my ($dx, $dy) = ($k[$x] - $ofs, $k[$y] - $ofs); |
817 | my ($dx, $dy) = ($k[$x] - $ofs, $k[$y] - $ofs); |
801 | my $pb = $self->create_stack($mark, $edge, $x * 17 + $y * 11 ); |
818 | my $pb = $self->create_stack($mark, $edge, $x * 17 + $y * 11 ); |
802 | |
819 | |
803 | $pb->composite ($pixbuf, $dx, $dy, $edge, $edge, $dx, $dy, 1, 1, INTERP_NEAREST, 255); |
820 | $pb->composite ($pixbuf, $dx, $dy, $pb->get_width, $pb->get_height, |
|
|
821 | $dx, $dy, 1, 1, $::config{speed} ? INTERP_NEAREST : INTERP_NEAREST, 255); |
804 | |
822 | |
805 | #my ($pm, $bm) = $self->create_stack($gc, $mark, $edge, $x * 17 + $y * 11 ); |
823 | #my ($pm, $bm) = $self->create_stack($gc, $mark, $edge, $x * 17 + $y * 11 ); |
806 | |
824 | |
807 | #$gc->set_clip_mask ($bm); |
825 | #$gc->set_clip_mask ($bm); |
808 | #$gc->set_clip_origin ($dx, $dy); |
826 | #$gc->set_clip_origin ($dx, $dy); |