summaryrefslogtreecommitdiffstats
path: root/perl-install/mygtk2.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/mygtk2.pm')
-rw-r--r--perl-install/mygtk2.pm26
1 files changed, 23 insertions, 3 deletions
diff --git a/perl-install/mygtk2.pm b/perl-install/mygtk2.pm
index ece5dbaea..07992705c 100644
--- a/perl-install/mygtk2.pm
+++ b/perl-install/mygtk2.pm
@@ -274,21 +274,32 @@ sub _gtk__Pixbuf {
$w;
}
+# Image_using_pixmap is rendered using DITHER_MAX which is much better on 16bpp displays
+sub _gtk__Image_using_pixmap { &_gtk__Image }
sub _gtk__Image {
my ($w, $opts, $class) = @_;
if (!$w) {
- $w = "Gtk2::$class"->new;
+ $w = Gtk2::Image->new;
$w->{format} = delete $opts->{format} if exists $opts->{format};
+
+ $w->{set_from_file} = $class =~ /using_pixmap/ ? sub {
+ my ($w, $file) = @_;
+ my $pixmap = mygtk2::pixmap_from_pixbuf($w, gtknew('Pixbuf', file => $file));
+ $w->set_from_pixmap($pixmap, undef);
+ } : sub {
+ my ($w, $file) = @_;
+ $w->set_from_file($file);
+ };
}
if (my $name = delete $opts->{file}) {
my $file = _find_imgfile(may_apply($w->{format}, $name)) or internal_error("can not find image $name");
- $w->set_from_file($file);
+ $w->{set_from_file}->($w, $file);
} elsif (my $file_ref = delete $opts->{file_ref}) {
my $set = sub {
my $file = _find_imgfile(may_apply($w->{format}, $$file_ref)) or internal_error("can not find image $$file_ref");
- $w->set_from_file($file);
+ $w->{set_from_file}->($w, $file);
};
gtkval_register($w, $file_ref, $set);
$set->() if $$file_ref;
@@ -979,4 +990,13 @@ sub set_root_window_background_with_gc {
$root->draw_rectangle($gc, 1, 0, 0, $w, $h);
}
+sub pixmap_from_pixbuf {
+ my ($widget, $pixbuf) = @_;
+ my $window = $widget->window or internal_error("you can't use this function if the widget is not realised");
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ my $pixmap = Gtk2::Gdk::Pixmap->new($window, $width, $height, $window->get_depth);
+ $pixbuf->render_to_drawable($pixmap, $widget->style->fg_gc('normal'), 0, 0, 0, 0, $width, $height, 'max', 0, 0);
+ $pixmap;
+}
+
1;