ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/CV/lib/Gtk2/CV.pm
Revision: 1.57
Committed: Tue Sep 16 08:49:03 2025 UTC (12 months, 2 weeks ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.56: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 package Gtk2::CV;
2    
3 root 1.39 use common::sense;
4 root 1.20 use Gtk2;
5     use Glib;
6 root 1.1
7 root 1.20 use IO::AIO;
8 root 1.3
9 root 1.20 BEGIN {
10     use XSLoader;
11 root 1.1
12 root 1.54 our $VERSION = '2.0';
13 root 1.13
14 root 1.20 XSLoader::load "Gtk2::CV", $VERSION;
15     }
16 root 1.14
17 root 1.48 magic_buffer ""; # preload magic tables
18    
19 root 1.51 our $MPV = $ENV{CV_MPV} || $ENV{CV_MPLAYER} || "mpv";
20 root 1.44
21 root 1.43 our $FAST_TMP = -w "/run/shm" ? "/run/shm"
22     : -w "/dev/shm" ? "/dev/shm"
23     : "/tmp";
24    
25 root 1.57 our $THREAD_MAX = $ENV{NUMBER_OF_PROCESSORS}*1 || 1;
26 root 1.56 if (open my $fh, "<", "/proc/cpuinfo") {
27     local $/;
28     $THREAD_MAX = scalar (() = <$fh> =~ /^processor/mg) || 1
29     }
30 root 1.57 $THREAD_MAX = $ENV{CV_THREAD_MAX} if $ENV{CV_THREAD_MAX} > 0;
31 root 1.56 set_thread_max $THREAD_MAX;
32    
33 root 1.17 my $aio_source;
34    
35 root 1.30 IO::AIO::min_parallel 32;
36 root 1.35 IO::AIO::max_poll_reqs 2;
37 root 1.30
38 root 1.28 # we use a low priority watcher to give GUI interactions as high a priority
39 root 1.19 # as possible.
40 root 1.17 sub enable_aio {
41     $aio_source ||=
42     add_watch Glib::IO IO::AIO::poll_fileno,
43 root 1.28 in => sub {
44 root 1.42 IO::AIO::poll_cb;
45 root 1.28 1
46     },
47     undef,
48     &Glib::G_PRIORITY_LOW;
49 root 1.17 }
50    
51     sub disable_aio {
52 root 1.18 remove Glib::Source $aio_source if $aio_source;
53 root 1.17 undef $aio_source;
54     }
55    
56 root 1.32 sub flush_aio {
57     enable_aio;
58     IO::AIO::flush;
59     }
60    
61 root 1.17 enable_aio;
62 root 1.2
63 root 1.9 sub find_rcfile($) {
64 root 1.2 my $path;
65    
66     for (@INC) {
67 root 1.4 $path = "$_/Gtk2/CV/$_[0]";
68     return $path if -r $path;
69 root 1.2 }
70    
71 root 1.4 die "FATAL: can't find required file $_[0]\n";
72     }
73    
74 root 1.9 sub require_image($) {
75 root 1.4 new_from_file Gtk2::Gdk::Pixbuf find_rcfile "images/$_[0]";
76 root 1.2 }
77    
78 root 1.20 sub dealpha_compose($) {
79     return $_[0] unless $_[0]->get_has_alpha;
80    
81     Gtk2::CV::dealpha_expose $_[0]->composite_color_simple (
82     $_[0]->get_width, $_[0]->get_height,
83 root 1.22 'nearest', 255, 16, 0xffc0c0c0, 0xff606060,
84 root 1.20 )
85     }
86    
87     # TODO: make preferences
88     sub dealpha($) {
89     &dealpha_compose
90     }
91    
92 root 1.55 sub load_jpeg($;$$$) {
93 root 1.46 my ($path, $thumbnail, $iw, $ih) = @_;
94    
95     open my $fh, "<:raw", $path
96     or die "$path: $!\n";
97     IO::AIO::mmap my $data, -s $fh, IO::AIO::PROT_READ, IO::AIO::MAP_SHARED, $fh
98     or die "$path: $!\n";
99 root 1.55 decode_jpeg $data, $thumbnail, $iw, $ih
100 root 1.46 }
101    
102 root 1.52 sub load_jxl($;$$$) {
103     my ($path, $thumbnail, $iw, $ih) = @_;
104    
105     open my $fh, "<:raw", $path
106     or die "$path: $!\n";
107     IO::AIO::mmap my $data, -s $fh, IO::AIO::PROT_READ, IO::AIO::MAP_SHARED, $fh
108     or die "$path: $!\n";
109     decode_jxl $data, $thumbnail, $iw, $ih
110     }
111    
112 root 1.55 sub load_webp($;$$$) {
113     my ($path, $thumbnail, $iw, $ih) = @_;
114    
115     open my $fh, "<:raw", $path
116     or die "$path: $!\n";
117     IO::AIO::mmap my $data, -s $fh, IO::AIO::PROT_READ, IO::AIO::MAP_SHARED, $fh
118     or die "$path: $!\n";
119     decode_webp $data, $thumbnail, $iw, $ih
120     }
121    
122     sub load_avif($;$$$) {
123 root 1.47 my ($path, $thumbnail, $iw, $ih) = @_;
124    
125     open my $fh, "<:raw", $path
126     or die "$path: $!\n";
127     IO::AIO::mmap my $data, -s $fh, IO::AIO::PROT_READ, IO::AIO::MAP_SHARED, $fh
128     or die "$path: $!\n";
129 root 1.55 decode_avif $data, $thumbnail, $iw, $ih
130 root 1.47 }
131    
132 root 1.1 1;
133