#!/usr/bin/perl use X11::Protocol; use IO::Select; $pi = 3.1415926535898; $r = 1; $theta = 0; $size = 250; $x = X11::Protocol->new; $win = $x->new_rsrc; $x->CreateWindow($win, $x->root, 'InputOutput', $x->root_depth, 'CopyFromParent', (0, 0), 2 * $size, 2 * $size, 1, # 'backing_store' => 'Always', 'background_pixel' => $x->white_pixel); $x->ChangeProperty($win, $x->atom('WM_NAME'), $x->atom('STRING'), 8, 'Replace', "Animation test"); $x->MapWindow($win); $pm = $x->new_rsrc; $x->CreatePixmap($pm, $win, $x->root_depth, 2 * $size, 2 * $size); $gc = $x->new_rsrc; $x->CreateGC($gc, $pm, 'foreground' => $x->black_pixel, 'graphics_exposures' => 0); $egc = $x->new_rsrc; $x->CreateGC($egc, $pm, 'foreground' => $x->white_pixel, 'graphics_exposures' => 0); $x->PolyFillRectangle($pm, $egc, [(0, 0), 2 * $size, 2 * $size]); $sel = IO::Select->new($x->connection->fh); sub r2p { my($x, $y) = @_; $x -= .5; $x *= .75; $y -= .5; return [-atan2($y, $x), sqrt($x*$x + $y*$y)]; } $P = [[['Simple', $gc], [r2p(0, 0), r2p(.75, 0), r2p(1, .25), r2p(.75, .5), r2p(.15, .5), r2p(.15, 1), r2p(0, 1)]], [['Convex', $egc], [r2p(.15, .15), r2p(.75, .15), r2p(.85, .25), r2p(.75, .35), r2p(.15, .35)]]]; $E = [[['Simple', $gc], [r2p(0, 0), r2p(1, 0), r2p(1, .2), r2p(.2, .2), r2p(.2, .4), r2p(.75, .4), r2p(.75, .6), r2p(.2, .6), r2p(.2, .8), r2p(1, .8), r2p(1, 1), r2p(0, 1)]]]; $R = [[['Simple', $gc], [r2p(0, 0), r2p(.75, 0), r2p(1, .25), r2p(.75, .5), r2p(1, 1), r2p(.85, 1), r2p(.6, .5), r2p(.15, .5), r2p(.15, 1), r2p(0, 1)]], [['Convex', $egc], [r2p(.15, .15), r2p(.75, .15), r2p(.85, .25), r2p(.75, .35), r2p(.15, .35)]]]; $L = [[['Simple', $gc], [r2p(0, 0), r2p(.2, 0), r2p(.2, .8), r2p(1, .8), r2p(1, 1), r2p(0, 1)]]]; for (;;) { for $img ($P, $E, $R, $L) { $r = 5; while ($r < 6.25 * $size) { @polys = (); for $poly (@$img) { @a = ($poly->[0]); for $p (@{$poly->[1]}) { push @{$a[1]}, $size + $r * $p->[1] * sin($theta + $p->[0]); push @{$a[1]}, $size + $r * $p->[1] * cos($theta + $p->[0]); } push @polys, [@a]; } for $poly (@old_polys) { $x->FillPoly($pm, $egc, $poly->[0][0], 'Origin', @{$poly->[1]}) if $poly->[0][1] != $egc; } for $poly (@polys) { $x->FillPoly($pm, $poly->[0][1], $poly->[0][0], 'Origin', @{$poly->[1]}); } $x->CopyArea($pm, $win, $gc, (0, 0), 2 * $size, 2 * $size, (0, 0)); # On my Linux/x86 2.0, anything less than 1/100 sec causes # other things (e.g., mouse tracking) to slow down terribly. $x->flush(); select(undef, undef, undef, 1/99); @old_polys = @polys; $r *= 1.05; $theta += .1; $x->handle_input if $sel->can_read(0); } } }