Scrolling images and text
Java Applet that displays scrolling images and text.
AI
AI Summary: This codebase represents a historical implementation of the logic described in the metadata. Our preservation engine analyzes the structure to provide context for modern developers.
Source Code
import java.applet.*;
import java.awt.*;
import java.awt.image.PixelGrabber;
import java.awt.image.MemoryImageSource;
public class CoolScroll extends Applet implements Runnable
{
private Thread m_CoolScroll = null;
boolean asodreadisegna = false;
private double rad = 20.0,
rad_inc = 0.5,
RAD = 3.1415926535 / 180,
ang_x = 0.0,
angolo_x = 0.0,
inc_factor = 1.5;
int asciioffset = 0;
int veloce;
char msg[];
int msgbounceindex [];
int lametable[];
int xadd = 0;
int scrollpos = 0;
int mirrorpic[],
swappic[];
int startx = 0,
starty = 0,
msglenght;
Color forecolor,
backcolor;
Image backdrop;
Image appletimage;
Image cropfont,
upperimage,
lowerimage;
int redmaskadd = 90,
greenmaskadd = 120,
bluemaskadd = 140;
int redadd = 5,
greenadd = 5,
blueadd = 5;
Image letter;
int extent_x,
extent_y;
int letterwidth = 0,
letterheight = 0;
private MemoryImageSource screenMem;
Graphics gfx,
lettergfx,
appletgfx;
public void init()
{
String messaggio;
messaggio = getParameter("scrolltext");
if(messaggio == null)
{
messaggio="SAY SOMETHING TO THE WORLD...WRITE IT!";
}
veloce = Integer.parseInt(getParameter("scrollspeed"));
asciioffset = Integer.parseInt(getParameter("asciioffset"));
//Single letter build
letterwidth = Integer.parseInt(getParameter("fontx"));
letterheight = Integer.parseInt(getParameter("fonty"));
letter = createImage(letterwidth , letterheight );
lettergfx = letter.getGraphics();
//Single letter build
appletimage = createImage(size().width , size().height);
appletgfx = appletimage.getGraphics();
//Half scroll build
extent_x = size().width / 2;
extent_y = size().height / 4;
upperimage = createImage( extent_x , extent_y );
gfx = upperimage.getGraphics();
scrollpos = extent_x;
swappic = new int[extent_x * extent_y + extent_x];
mirrorpic = new int[extent_x * extent_y + extent_x];
//Half scroll build
//ScrollText build
msglenght = messaggio.length();
msg = new char[msglenght+1];
//Get ready to bounce...
msgbounceindex = new int[msglenght+1];
lametable = new int[16];
loadlameBounce();
int nowind = 0;
for (int loop=0; loop < msglenght; loop++)
{
msgbounceindex[loop] = nowind;
if(++nowind>15)
nowind = 0;
}
msg = messaggio.toCharArray();
//ScrollText build
MediaTracker tracker = new MediaTracker(this);
cropfont = getImage(getDocumentBase(), getParameter("fontimage"));
tracker.addImage(cropfont, 0);
try
{
tracker.waitForID(0);
}
catch (InterruptedException e)
{
}
MediaTracker tracker2 = new MediaTracker(this);
backdrop = getImage(getDocumentBase(), getParameter("backimage"));
tracker2.addImage(backdrop, 1);
try
{
tracker2.waitForID(1);
}
catch (InterruptedException e)
{
}
forecolor = new Color(255,0,0);
backcolor = new Color(0,0,0);
screenMem = new MemoryImageSource(extent_x,
extent_y,
mirrorpic,
0,
extent_x);
}
public void update(Graphics g)
{
gfx.drawImage(backdrop,0,0,this);
BounceScroll();
loadPix();
renderPix();
appletgfx.drawImage(upperimage,0,0, extent_x * 2, extent_y * 2, this);
appletgfx.drawImage(lowerimage,0,extent_y*2, extent_x * 2, (extent_y * 2)+xadd, this);
paint(g);
}
public void paint(Graphics g)
{
if (appletgfx != null)
{
g.drawImage(appletimage ,0,0, this);
}
}
public void start()
{
if (m_CoolScroll == null)
{
m_CoolScroll = new Thread(this);
m_CoolScroll.start();
}
}
public void stop()
{
if (m_CoolScroll != null)
{
m_CoolScroll.stop();
m_CoolScroll = null;
}
}
public void run()
{
while (true)
{
try
{
repaint();
Thread.sleep(50);
System.gc();
}
catch (InterruptedException e)
{
stop();
}
}
}
private void loadPix()
{
int punto = 0;
int themask = 0;
asodreadisegna = true;
PixelGrabber grabber = new PixelGrabber( upperimage,
0,
0,
extent_x,
extent_y,
swappic ,
0,
extent_x);
boolean done = false;
do
{
try
{
done = grabber.grabPixels( 500 );
}
catch ( InterruptedException e ) {}
}
while( !done );
asodreadisegna = false;
}
private void renderPix()
{
int punto = 0;
int themask = 0;
int red = 0;
int green = 0;
int blue = 0;
int yindex = extent_y-1;
redmaskadd += redadd;
greenmaskadd += greenadd;
bluemaskadd += blueadd;
if(redmaskadd == 255 || redmaskadd == 90 )
redadd = redadd * -1;
if(greenmaskadd == 255 || greenmaskadd == 90 )
greenadd = greenadd * -1;
if(bluemaskadd == 255 || bluemaskadd == 90 )
blueadd = blueadd * -1;
for(int loopy = 0; loopy < extent_y; loopy++)
{
for(int loopx = 0; loopx < extent_x; loopx++)
{
punto = swappic[extent_x * yindex + loopx];
themask = punto & 0x00ff0000;
red = themask >> 16;
themask = punto & 0x0000ff00;
green = themask >> 8;
themask = punto & 0x000000ff;
blue = themask;
//red = blue;
//green = blue;
red = red;
green = green;
red = (int)((red * redmaskadd)<<8);
green = (int)((green * greenmaskadd));
blue = (int)((blue * bluemaskadd)>>8);
mirrorpic[extent_x * loopy + loopx] = 0xff000000 |(red & 0x00ff0000) | (green & 0x0000ff00) | (blue & 0xff);
}
yindex--;
}
lowerimage = createImage(screenMem);
}
// Lame Pre-Calc bounce table....
private void loadlameBounce()
{
lametable[0] = 0;
lametable[1] = 0;
lametable[2] = 0;
lametable[3] = 1;
lametable[4] = 1;
lametable[5] = 2;
lametable[6] = 4;
lametable[7] = 6;
lametable[8] = 10;
lametable[9] = 15;
lametable[10] = 10;
lametable[11] = 6;
lametable[12] = 4;
lametable[13] = 2;
lametable[14] = 1;
lametable[15] = 1;
}
private void BounceScroll()
{
int retval = 0;
double CX;
for (int loopx = 0; loopx < msglenght; loopx++)
{
if( scrollpos + (loopx * letterwidth ) < extent_x && scrollpos + (loopx * letterwidth ) > letterwidth * -1)
{
getletterIndex((int)msg[loopx]);
//Simulating transparent color....
lettergfx.drawImage(backdrop, -(scrollpos + (loopx * letterwidth)), -(1+lametable [msgbounceindex[loopx]]),this);
lettergfx.drawImage(cropfont, -(startx * letterwidth), -(starty * letterheight),this);
gfx.drawImage(letter,scrollpos + (loopx * letterwidth),1+lametable [msgbounceindex[loopx]],this);
lettergfx.fillRect(0,0,letterwidth, letterheight);
}
if(++msgbounceindex[loopx] > 15)
msgbounceindex[loopx] = 0;
}
scrollpos -= veloce;
if(scrollpos * -1 > msglenght * letterwidth)
scrollpos = extent_x;
//sinus stuff
angolo_x += inc_factor;
if (angolo_x > 90 || angolo_x < 0)
{
inc_factor = inc_factor * -1;
}
CX = Math.cos((angolo_x ) * RAD);
xadd = (int)(angolo_x * CX);
//end of sinus stuff
}
private void getletterIndex(int ASCIIcode)
{
int retval = 0;
retval = ((int)ASCIIcode)-asciioffset;
if(retval<=0)
{
startx = 0;
starty = 0;
}
else
{
starty = ((int)(retval / 10));
startx = (retval%10);
}
}
}
Original Comments (3)
Recovered from Wayback Machine