#!/usr/bin/perl -w
use Gtk -init;
use Time::HiRes qw (time);
use constant WIDTH => 640;
use constant HEIGHT => 480;
use constant FALSE => 0;
use constant TRUE => 1;
use constant NUM_ITERS => 100;
#use Benchmark 'cmpthese';
#cmpthese(2, {
# 'append' => 'use integer;$buf="";$val = 0; for ($j = 0; $j < WIDTH * HEIGHT * 6; $j++) {$buf .=chr(($val + (($val + int(rand (256))) >> 1)) >> 1)}',
# #'pack' => '$buf="";$val = 0;$buf .= pack("C*", map {($val + (($val + int(rand (256))) >> 1)) >> 1} 0..WIDTH*6) foreach (0..HEIGHT);',
# 'pack2' => 'use integer;$buf="";$val = 0;$buf .= pack("C*", map {($val + (($val + int(rand (256))) >> 1)) >> 1} 0..WIDTH) foreach (0..HEIGHT*6);',
#});
sub testrgb_rgb_test {
my $drawing_area = shift;
my $buf = '';
my ($j, $i, $val, $offset, $dither, $start_time, $total_time, $x, $y, $dith_max);
$val = 0;
#for ($j = 0; $j < WIDTH * HEIGHT * 6; $j++)
# {
# $val = ($val + (($val + int(rand (256))) >> 1)) >> 1;
# $buf .= chr($val);
# }
{
use integer;
$buf .= pack("c*", map {($val + (($val + int(rand (256))) >> 1)) >> 1} 0..WIDTH) foreach (0..HEIGHT*6);
}
# Let's warm up the cache, and also wait for the window manager
# to settle.
print "warm up the cache\n";
for ($i = 0; 0 && $i < NUM_ITERS/10; $i++)
{
$offset = int(rand (WIDTH * HEIGHT * 3)) & -4;
$drawing_area->window->draw_rgb_image (
$drawing_area->style->white_gc,
0, 0, WIDTH, HEIGHT,
'none',
substr($buf, $offset), WIDTH * 3);
#$buf, WIDTH * 3);
}
$dith_max = Gtk::Gdk::Rgb->ditherable ? 2 : 1;
print "start\n";
for ($dither = 0; $dither < $dith_max; $dither++)
{
$start_time = time ();
for ($i = 0; $i < NUM_ITERS; $i++)
{
$offset = int(rand (WIDTH * HEIGHT * 3)) & -4;
$drawing_area->window->draw_rgb_image (
$drawing_area->style->white_gc,
0, 0, WIDTH, HEIGHT,
$dither ? 'max' : 'none',
#Gtk::constsubstr($buf, $offset), WIDTH * 3);
substr($buf, $offset), WIDTH * 3);
#$buf, WIDTH * 3);
}
$total_time = time () - $start_time;
printf "Color test%s time elapsed: %.2fs, %.1f fps, %.2f megapixels/s\n",
$dither ? " (dithered)" : "",
$total_time,
NUM_ITERS / $total_time,
NUM_ITERS * (WIDTH * HEIGHT * 1e-6) / $total_time;
}
for ($dither = 0; $dither < $dith_max; $dither++)
{
$start_time = time ();
for ($i = 0; $i < NUM_ITERS; $i++)
{
$offset = int(rand (WIDTH * HEIGHT)) & -4;
$drawing_area->window->draw_gray_image(
$drawing_area->style->white_gc,
0, 0, WIDTH, HEIGHT,
$dither ? 'max' : 'none',
#Gtk::constsubstr($buf, $offset), WIDTH);
substr($buf, $offset), WIDTH);
#$buf, WIDTH);
}
$total_time = time () - $start_time;
printf "Grayscale test%s time elapsed: %.2fs, %.1f fps, %.2f megapixels/s\n",
$dither ? " (dithered)" : "",
$total_time,
NUM_ITERS / $total_time,
NUM_ITERS * (WIDTH * HEIGHT * 1e-6) / $total_time;
}
print ("Please submit these results to http://www.levien.com/gdkrgb/survey.html\n");
}
Gtk::Gdk::Rgb->init;
$window = Gtk::Widget->new ('Gtk::Window',
"GtkWindow::type", 'toplevel',
"GtkWindow::title", "testrgb",
"GtkWindow::allow_shrink", FALSE);
$window->signal_connect( "destroy", sub {Gtk->main_quit});
$vbox = new Gtk::VBox (FALSE, 0);
$drawing_area = new Gtk::DrawingArea;
$drawing_area->set_usize (WIDTH, HEIGHT);
$vbox->pack_start ($drawing_area, FALSE, FALSE, 0);
$drawing_area->show;
$button = new Gtk::Button ("Quit");
$vbox->pack_start ($button, FALSE, FALSE, 0);
$button->signal_connect ("clicked", sub {$window->destroy});
$button->show;
$window->add ($vbox);
$vbox->show;
$window->show;
testrgb_rgb_test ($drawing_area);
Gtk->main;