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 (13 months, 1 week ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.56: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 package Gtk2::CV;
2
3 use common::sense;
4 use Gtk2;
5 use Glib;
6
7 use IO::AIO;
8
9 BEGIN {
10 use XSLoader;
11
12 our $VERSION = '2.0';
13
14 XSLoader::load "Gtk2::CV", $VERSION;
15 }
16
17 magic_buffer ""; # preload magic tables
18
19 our $MPV = $ENV{CV_MPV} || $ENV{CV_MPLAYER} || "mpv";
20
21 our $FAST_TMP = -w "/run/shm" ? "/run/shm"
22 : -w "/dev/shm" ? "/dev/shm"
23 : "/tmp";
24
25 our $THREAD_MAX = $ENV{NUMBER_OF_PROCESSORS}*1 || 1;
26 if (open my $fh, "<", "/proc/cpuinfo") {
27 local $/;
28 $THREAD_MAX = scalar (() = <$fh> =~ /^processor/mg) || 1
29 }
30 $THREAD_MAX = $ENV{CV_THREAD_MAX} if $ENV{CV_THREAD_MAX} > 0;
31 set_thread_max $THREAD_MAX;
32
33 my $aio_source;
34
35 IO::AIO::min_parallel 32;
36 IO::AIO::max_poll_reqs 2;
37
38 # we use a low priority watcher to give GUI interactions as high a priority
39 # as possible.
40 sub enable_aio {
41 $aio_source ||=
42 add_watch Glib::IO IO::AIO::poll_fileno,
43 in => sub {
44 IO::AIO::poll_cb;
45 1
46 },
47 undef,
48 &Glib::G_PRIORITY_LOW;
49 }
50
51 sub disable_aio {
52 remove Glib::Source $aio_source if $aio_source;
53 undef $aio_source;
54 }
55
56 sub flush_aio {
57 enable_aio;
58 IO::AIO::flush;
59 }
60
61 enable_aio;
62
63 sub find_rcfile($) {
64 my $path;
65
66 for (@INC) {
67 $path = "$_/Gtk2/CV/$_[0]";
68 return $path if -r $path;
69 }
70
71 die "FATAL: can't find required file $_[0]\n";
72 }
73
74 sub require_image($) {
75 new_from_file Gtk2::Gdk::Pixbuf find_rcfile "images/$_[0]";
76 }
77
78 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 'nearest', 255, 16, 0xffc0c0c0, 0xff606060,
84 )
85 }
86
87 # TODO: make preferences
88 sub dealpha($) {
89 &dealpha_compose
90 }
91
92 sub load_jpeg($;$$$) {
93 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 decode_jpeg $data, $thumbnail, $iw, $ih
100 }
101
102 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 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 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 decode_avif $data, $thumbnail, $iw, $ih
130 }
131
132 1;
133