object draw()
{
  return Clock(30,2200, Dial(), "#aa9999", 54);
}
object draw()
{
  return Clock(30,0, Roxen(), "#bb7700");
}
#20 "pimage.html"
#define HEIGHT 59*2
#define WIDTH 145*2
object roxen_image;
int frame_no= 7;
mapping vertical_wiggly_images = ([]);
// The number of vertical wigglie frames (what to call them?).
#define STEPS 20
// A white and a black image. Pasted with an alpha value over the
// image to generate shadow and highlight regions
object highlight = image(1,HEIGHT,255,255,255);
object shadow = image(1,HEIGHT+4,0,0);
object frame()
{
  float offset, doffset, oldoffset;
  int cache_index;
  object  current;
  frame_no++;
  cache_index = frame_no % STEPS ;
  int ys = roxen_image->ysize();
  int xs = roxen_image->xsize();
  
  if(vertical_wiggly_images[ cache_index ])
    current = vertical_wiggly_images[ cache_index ]->copy();
  else
  {
    // Generate a new image for one wiggly direction, and add highlights.
    // The magic numbers (15, 14 etc) have beed manualy adjusted.
    //  There are no deep thoughts behinds them....
    current = roxen_image->copy();
    for(int i=15; ipaste(current->copy(i,0,i,ys-4), i, (int)offset);
      if(doffset < 0.0)
	current->paste_alpha(highlight,255+(int)(doffset*99),i,(int)offset+18);
      else
	current->paste_alpha(shadow,255-(int)(doffset*300), i,(int)offset+14);
    }
    vertical_wiggly_images[ cache_index ] = current->copy();
  }
  // Move the lines around in the X-direction.
  for(int i=0; i 0)
      current->paste(current->copy(0,i,xs-offset,i),offset,i);
    else
      current->paste(current->copy(-offset,i,xs+offset+1,i),0,i);
  }
  return current->scale(0.5);
}
object draw()
{
  // Generate a Roxen logotype image, scale it to 50%.
  roxen_image = Roxen();
  // Use white ink.
  roxen_image->setcolor(@parse_color("darkgreen"));
  // Add a white border around the roxen logotype
  roxen_image = roxen_image->copy(-2,-2,roxen_image->xsize()+2,roxen_image->ysize()+2);
  // Use black ink
  roxen_image->setcolor(255,255,255);
  // Generate some empty space around the image. The sizes are quite arbitary
  roxen_image = roxen_image->copy(-15,-15,WIDTH+19,HEIGHT+20)->image;
  // Start an animation, the function 'frame' will be called with a delay of
  // 0.0 seconds (you guessed it, this is _really_ a CPU hog...) when somewone
  // is watching the image (not otherwise, though)
  return Anim(frame, 0.0);
}
| float q=1.0;
   int t()
   {
     if(q<=100.0) q+=0.1; else q=0.0;
     return (int)(q);
   }
   object draw()
   {
     return Progress( t );
   } |