979 lines
22 KiB
C
979 lines
22 KiB
C
#include "epplet.h"
|
|
#include "esdcloak.h"
|
|
|
|
#define VARIANCE 40
|
|
#define VARTREND 16
|
|
#define HSPREAD 10
|
|
#define VSPREAD 160
|
|
#define RESIDUAL 75
|
|
#define MAXVAL 255
|
|
|
|
extern RGB_buf rgbbuf;
|
|
|
|
int load_val = 35;
|
|
int load_r = 0;
|
|
int load_l = 0;
|
|
|
|
static int *flame = NULL;
|
|
static int *vspread, *hspread, *residual;
|
|
static unsigned char rm[255], gm[255], bm[255];
|
|
static int g_rr, g_gg, g_bb;
|
|
|
|
static void aa_line(int x1, int y1, int x2, int y2, unsigned char b,
|
|
unsigned char rr, unsigned char gg,
|
|
unsigned char bb);
|
|
static void set_col_pixel(int x, int y, unsigned char c,
|
|
unsigned char rrr, unsigned char ggg,
|
|
unsigned char bbb);
|
|
/* static void set_pixel (int x, int y, unsigned char c); */
|
|
static void aa_pixel(double wx, double wy, unsigned char c,
|
|
unsigned char rrr, unsigned char ggg,
|
|
unsigned char bbb);
|
|
static void color_buf(unsigned char rr, unsigned char gg,
|
|
unsigned char bb);
|
|
static void fade_buf(int percent);
|
|
static void scroll_buf(void);
|
|
|
|
/* Raster's flame colors */
|
|
/* Look, even US spelling of colours ;-) */
|
|
static const int colors[] = {
|
|
120, 0, 169,
|
|
217, 152, 249,
|
|
255, 255, 255,
|
|
|
|
30, 90, 90,
|
|
50, 255, 255,
|
|
255, 255, 255,
|
|
|
|
255, 0, 0,
|
|
255, 255, 0,
|
|
255, 255, 255,
|
|
|
|
0, 255, 0,
|
|
255, 255, 0,
|
|
255, 255, 255,
|
|
|
|
0, 0, 255,
|
|
255, 0, 255,
|
|
255, 255, 255,
|
|
|
|
0, 0, 200,
|
|
40, 80, 255,
|
|
100, 200, 255,
|
|
|
|
80, 90, 140,
|
|
140, 150, 180,
|
|
255, 230, 200,
|
|
|
|
20, 40, 180,
|
|
255, 160, 0,
|
|
255, 255, 100
|
|
};
|
|
|
|
void
|
|
set_flame_col(int j)
|
|
{
|
|
flame_col(colors[j], colors[j + 1], colors[j + 2], colors[j + 3],
|
|
colors[j + 4], colors[j + 5], colors[j + 6], colors[j + 7],
|
|
colors[j + 8]);
|
|
g_rr = colors[j];
|
|
g_gg = colors[j + 1];
|
|
g_bb = colors[j + 2];
|
|
if (g_rr == 0)
|
|
g_rr = 1;
|
|
if (g_gg == 0)
|
|
g_gg = 1;
|
|
if (g_bb == 0)
|
|
g_bb = 1;
|
|
}
|
|
|
|
void
|
|
flame_col(int r1, int g1, int b1, int r2, int g2, int b2, int r3, int g3,
|
|
int b3)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < 25; i++)
|
|
{
|
|
rm[i] = (r1 * i) / 25;
|
|
gm[i] = (g1 * i) / 25;
|
|
bm[i] = (b1 * i) / 25;
|
|
}
|
|
for (i = 0; i < 25; i++)
|
|
{
|
|
rm[25 + i] = ((r2 * i) + (r1 * (25 - i))) / 25;
|
|
gm[25 + i] = ((g2 * i) + (g1 * (25 - i))) / 25;
|
|
bm[25 + i] = ((b2 * i) + (b1 * (25 - i))) / 25;
|
|
}
|
|
for (i = 0; i < 25; i++)
|
|
{
|
|
rm[50 + i] = ((r3 * i) + (r2 * (25 - i))) / 25;
|
|
gm[50 + i] = ((g3 * i) + (g2 * (25 - i))) / 25;
|
|
bm[50 + i] = ((b3 * i) + (b2 * (25 - i))) / 25;
|
|
}
|
|
for (i = 75; i < 255; i++)
|
|
{
|
|
rm[i] = rm[74];
|
|
gm[i] = gm[74];
|
|
bm[i] = bm[74];
|
|
}
|
|
}
|
|
|
|
/* I use this to black-out the rgb-buf */
|
|
/* There must be a faster way, but I'm not used to this stuff yet */
|
|
void
|
|
blank_buf(void)
|
|
{
|
|
int x, y;
|
|
unsigned char *rgb, *rptr;
|
|
|
|
for (y = 0; y < 40; y++)
|
|
{
|
|
rgb = Epplet_get_rgb_pointer(rgbbuf);
|
|
rptr = rgb + (y * 40 * 4);
|
|
for (x = 0; x < 40; x++)
|
|
{
|
|
rptr[0] = rptr[1] = rptr[2] = 0;
|
|
rptr += 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Same as blank_buf, but not black ;-) */
|
|
void
|
|
color_buf(unsigned char rr, unsigned char gg, unsigned char bb)
|
|
{
|
|
int x, y;
|
|
unsigned char *rgb, *rptr;
|
|
|
|
for (y = 0; y < 40; y++)
|
|
{
|
|
rgb = Epplet_get_rgb_pointer(rgbbuf);
|
|
rptr = rgb + (y * 40 * 4);
|
|
for (x = 0; x < 40; x++)
|
|
{
|
|
rptr[0] = rr;
|
|
rptr[1] = gg;
|
|
rptr[2] = bb;
|
|
rptr += 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Used to fade out the buf a bit before each draw */
|
|
/* Helps the radar look right */
|
|
void
|
|
fade_buf(int percentage)
|
|
{
|
|
int x, y;
|
|
unsigned char *rgb, *rptr;
|
|
|
|
for (y = 0; y < 40; y++)
|
|
{
|
|
rgb = Epplet_get_rgb_pointer(rgbbuf);
|
|
rptr = rgb + (y * 40 * 4);
|
|
for (x = 0; x < 40; x++)
|
|
{
|
|
rptr[0] = rptr[0] * percentage / 100;
|
|
rptr[1] = rptr[1] * percentage / 100;
|
|
rptr[2] = rptr[2] * percentage / 100;
|
|
rptr += 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Scrolls buf along one to the left */
|
|
static void
|
|
scroll_buf(void)
|
|
{
|
|
int x, y;
|
|
unsigned char *rgb, *rptr;
|
|
|
|
for (y = 0; y < 40; y++)
|
|
{
|
|
rgb = Epplet_get_rgb_pointer(rgbbuf);
|
|
rptr = rgb + (y * 40 * 4);
|
|
for (x = 0; x < 39; x++)
|
|
{
|
|
rptr[0] = rptr[4];
|
|
rptr[1] = rptr[5];
|
|
rptr[2] = rptr[6];
|
|
rptr += 4;
|
|
}
|
|
rptr[0] = 0;
|
|
rptr[1] = 0;
|
|
rptr[2] = 0;
|
|
}
|
|
}
|
|
|
|
/* RasterFire :) */
|
|
void
|
|
draw_flame(void)
|
|
{
|
|
unsigned char *rgb, *rptr;
|
|
int x, y, *ptr, val1, val2, val3, j;
|
|
|
|
if (!flame)
|
|
{
|
|
vspread = malloc(40 * sizeof(int));
|
|
hspread = malloc(40 * sizeof(int));
|
|
residual = malloc(40 * sizeof(int));
|
|
flame = calloc(40 * 40, sizeof(int));
|
|
}
|
|
|
|
ptr = flame + (39 * 40);
|
|
for (x = 0; x < 40; x++)
|
|
{
|
|
vspread[x] = VSPREAD + (load_val / 50);
|
|
hspread[x] = HSPREAD + (load_val / 50);
|
|
residual[x] = RESIDUAL + (load_val / 50);
|
|
ptr[x] = (rand() % (load_val + 155));
|
|
if (ptr[x] > MAXVAL)
|
|
ptr[x] = 0;
|
|
else if (ptr[x] < 0)
|
|
ptr[x] = 0;
|
|
}
|
|
|
|
for (x = (40 / (4)) - 1; x <= (40 / (4)) + 1; x++)
|
|
{
|
|
j = (load_l * 40) / 100;
|
|
ptr = flame + ((40 - j) * (40)) + (x);
|
|
for (y = 0; y < j; y++)
|
|
{
|
|
ptr[0] += ((y * 64 * load_l) / (j * 100));
|
|
ptr += 40;
|
|
}
|
|
}
|
|
|
|
for (x = (40 / (4)) - 1 + (1 * (40 / 2));
|
|
x <= (40 / (4)) + 1 + (1 * (40 / 2)); x++)
|
|
{
|
|
j = (load_r * 40) / 100;
|
|
ptr = flame + ((40 - j) * (40)) + (x);
|
|
for (y = 0; y < j; y++)
|
|
{
|
|
ptr[0] += ((y * 64 * load_r) / (j * 100));
|
|
ptr += 40;
|
|
}
|
|
}
|
|
|
|
for (y = 39; y >= 2; y--)
|
|
{
|
|
ptr = flame + (y * 40);
|
|
for (x = 1; x < 39; x++)
|
|
{
|
|
val1 = (ptr[x] * vspread[x]) >> 8;
|
|
val2 = (ptr[x] * hspread[x]) >> 8;
|
|
val3 = (ptr[x] * residual[x]) >> 8;
|
|
|
|
ptr[x - 1] += val2;
|
|
if (ptr[x - 1] > MAXVAL)
|
|
ptr[x - 1] = MAXVAL;
|
|
ptr[x - 40] += val1;
|
|
if (ptr[x - 40] > MAXVAL)
|
|
ptr[x - 40] = MAXVAL;
|
|
ptr[x + 1] += val2;
|
|
if (ptr[x + 1] > MAXVAL)
|
|
ptr[x + 1] = MAXVAL;
|
|
ptr[x] = val3;
|
|
}
|
|
}
|
|
for (x = 0; x < 40; x++)
|
|
flame[x] = 0;
|
|
for (x = 0; x < 40; x++)
|
|
flame[40 + x] /= 2;
|
|
for (y = 0; y < 40; y++)
|
|
flame[y * 40] = 0;
|
|
for (y = 0; y < 40; y++)
|
|
flame[(y * 40) + 39] = 0;
|
|
for (y = 0; y < 40; y++)
|
|
flame[(y * 40) + 38] /= 2;
|
|
rgb = Epplet_get_rgb_pointer(rgbbuf);
|
|
for (y = 0; y < 40; y++)
|
|
{
|
|
ptr = flame + (y * 40) + 1;
|
|
rptr = rgb + (y * 40 * 4);
|
|
for (x = 0; x < 40; x++)
|
|
{
|
|
val1 = ptr[x] & 0xff;
|
|
rptr[0] = rm[val1];
|
|
rptr[1] = gm[val1];
|
|
rptr[2] = bm[val1];
|
|
rptr += 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Scanner type thing */
|
|
void
|
|
draw_scanner(void)
|
|
{
|
|
static int y = 0, y2 = 0;
|
|
static int setup = 0;
|
|
|
|
if (!setup)
|
|
{
|
|
blank_buf();
|
|
setup = 1;
|
|
}
|
|
|
|
y = 37 - (37 * load_l / 100) + 1;
|
|
y2 = 37 - (37 * load_r / 100) + 1;
|
|
|
|
fade_buf(82);
|
|
aa_line(0, y, 38, y2, 255, 255, 0, 0);
|
|
}
|
|
|
|
/* Lame, but easy :) */
|
|
void
|
|
draw_aa_triangle(void)
|
|
{
|
|
int x1, y1;
|
|
int x2, y2;
|
|
int x3, y3;
|
|
static double x = 0.0;
|
|
int radius = 0;
|
|
|
|
radius = 55 * load_val / 100;
|
|
|
|
x += 0.05;
|
|
|
|
x1 = 19 + radius * cos(x) / 3;
|
|
y1 = 19 + radius * sin(x) / 3;
|
|
x2 = 19 + radius * cos(x + (2 * M_PI / 3)) / 3;
|
|
y2 = 19 + radius * sin(x + (2 * M_PI / 3)) / 3;
|
|
x3 = 19 + radius * cos(x + (4 * M_PI / 3)) / 3;
|
|
y3 = 19 + radius * sin(x + (4 * M_PI / 3)) / 3;
|
|
|
|
fade_buf(80);
|
|
aa_line(x1, y1, x2, y2, 255, 0, 0, 255);
|
|
aa_line(x2, y2, x3, y3, 255, 0, 0, 255);
|
|
aa_line(x3, y3, x1, y1, 255, 0, 0, 255);
|
|
}
|
|
|
|
/* Two triangles. */
|
|
void
|
|
draw_aa_star(void)
|
|
{
|
|
int x1, y1;
|
|
int x2, y2;
|
|
int x3, y3;
|
|
int x4, y4;
|
|
int x5, y5;
|
|
int x6, y6;
|
|
static double x = 0.0;
|
|
int radius = 0;
|
|
|
|
radius = 55 * load_val / 100;
|
|
|
|
x += 0.05;
|
|
|
|
x1 = 19 + radius * cos(x) / 3;
|
|
y1 = 19 + radius * sin(x) / 3;
|
|
x2 = 19 + radius * cos(x + (2 * M_PI / 3)) / 3;
|
|
y2 = 19 + radius * sin(x + (2 * M_PI / 3)) / 3;
|
|
x3 = 19 + radius * cos(x + (4 * M_PI / 3)) / 3;
|
|
y3 = 19 + radius * sin(x + (4 * M_PI / 3)) / 3;
|
|
|
|
x4 = 19 + radius * cos(x + (M_PI / 3)) / 3;
|
|
y4 = 19 + radius * sin(x + (M_PI / 3)) / 3;
|
|
x5 = 19 + radius * cos(x + (3 * M_PI / 3)) / 3;
|
|
y5 = 19 + radius * sin(x + (3 * M_PI / 3)) / 3;
|
|
x6 = 19 + radius * cos(x + (5 * M_PI / 3)) / 3;
|
|
y6 = 19 + radius * sin(x + (5 * M_PI / 3)) / 3;
|
|
|
|
fade_buf(80);
|
|
|
|
aa_line(x1, y1, x2, y2, 255, 255, 255, 0);
|
|
aa_line(x2, y2, x3, y3, 255, 255, 255, 0);
|
|
aa_line(x3, y3, x1, y1, 255, 255, 255, 0);
|
|
|
|
aa_line(x4, y4, x5, y5, 255, 255, 255, 0);
|
|
aa_line(x5, y5, x6, y6, 255, 255, 255, 0);
|
|
aa_line(x6, y6, x4, y4, 255, 255, 255, 0);
|
|
}
|
|
|
|
void
|
|
draw_colorwarp(void)
|
|
{
|
|
static int setup = 0;
|
|
static int rr = 0;
|
|
static int gg = 0;
|
|
static int bb = 0;
|
|
static int d_rr = 2;
|
|
static int d_gg = -3;
|
|
static int d_bb = 1;
|
|
|
|
if (!setup)
|
|
{
|
|
/* setup */
|
|
rr = rand() % 255;
|
|
gg = rand() % 255;
|
|
bb = rand() % 255;
|
|
setup = 1;
|
|
}
|
|
|
|
rr += d_rr;
|
|
gg += d_gg;
|
|
bb += d_bb;
|
|
|
|
if (rr <= 0)
|
|
{
|
|
d_rr = -d_rr;
|
|
rr = 0;
|
|
}
|
|
if (rr >= 255)
|
|
{
|
|
d_rr = -d_rr;
|
|
rr = 255;
|
|
}
|
|
if (gg <= 0)
|
|
{
|
|
d_gg = -d_gg;
|
|
gg = 0;
|
|
}
|
|
if (gg >= 255)
|
|
{
|
|
d_gg = -d_gg;
|
|
gg = 255;
|
|
}
|
|
if (bb <= 0)
|
|
{
|
|
d_bb = -d_bb;
|
|
bb = 0;
|
|
}
|
|
if (bb >= 255)
|
|
{
|
|
d_bb = -d_bb;
|
|
bb = 255;
|
|
}
|
|
|
|
color_buf(rr, gg, bb);
|
|
}
|
|
|
|
/* Bouncing ball */
|
|
void
|
|
draw_ball(void)
|
|
{
|
|
static int setup = 0;
|
|
static double ball_x, ball_y;
|
|
static double d_x, d_y;
|
|
|
|
if (!setup)
|
|
{
|
|
ball_x = rand() % 39;
|
|
ball_y = rand() % 39;
|
|
while (fabs(d_x) < 0.5)
|
|
d_x = ((double)rand() / RAND_MAX * 4) - 2.0;
|
|
while (fabs(d_y) < 0.5)
|
|
d_y = ((double)rand() / RAND_MAX * 4) - 2.0;
|
|
blank_buf();
|
|
setup = 1;
|
|
}
|
|
|
|
ball_x += d_x;
|
|
ball_y += d_y;
|
|
|
|
if (ball_x < 1)
|
|
{
|
|
ball_x = 1;
|
|
d_x = -d_x;
|
|
}
|
|
else if (ball_x > 37)
|
|
{
|
|
ball_x = 37;
|
|
d_x = -d_x;
|
|
}
|
|
|
|
if (ball_y < 1)
|
|
{
|
|
ball_y = 1;
|
|
d_y = -d_y;
|
|
}
|
|
else if (ball_y > 37)
|
|
{
|
|
ball_y = 37;
|
|
d_y = -d_y;
|
|
}
|
|
|
|
fade_buf(92);
|
|
|
|
set_col_pixel(ball_x, ball_y, 255, 255, 0, 0);
|
|
set_col_pixel(ball_x + 1, ball_y, 255, 255, 0, 0);
|
|
set_col_pixel(ball_x, ball_y + 1, 255, 255, 0, 0);
|
|
set_col_pixel(ball_x + 1, ball_y + 1, 155, 255, 0, 0);
|
|
|
|
set_col_pixel(ball_x - 1, ball_y, 255, 255, 0, 0);
|
|
set_col_pixel(ball_x, ball_y - 1, 255, 255, 0, 0);
|
|
set_col_pixel(ball_x - 1, ball_y - 1, 155, 255, 0, 0);
|
|
set_col_pixel(ball_x - 1, ball_y + 1, 155, 255, 0, 0);
|
|
set_col_pixel(ball_x + 1, ball_y - 1, 155, 255, 0, 0);
|
|
}
|
|
|
|
#define NUM_ATOMS 8
|
|
static double atom_x[NUM_ATOMS];
|
|
static double atom_y[NUM_ATOMS];
|
|
static double atom_d_x[NUM_ATOMS];
|
|
static double atom_d_y[NUM_ATOMS];
|
|
|
|
/* Bouncing atoms */
|
|
void
|
|
draw_atoms(void)
|
|
{
|
|
static int setup = 0;
|
|
int i;
|
|
|
|
if (!setup)
|
|
{
|
|
for (i = 0; i < NUM_ATOMS; i++)
|
|
{
|
|
atom_x[i] = rand() % 39;
|
|
atom_y[i] = rand() % 39;
|
|
while (fabs(atom_d_x[i]) < 0.3)
|
|
atom_d_x[i] = ((double)rand() / RAND_MAX * 3) - 1.5;
|
|
while (fabs(atom_d_y[i]) < 0.3)
|
|
atom_d_y[i] = ((double)rand() / RAND_MAX * 3) - 1.5;
|
|
blank_buf();
|
|
setup = 1;
|
|
}
|
|
}
|
|
else
|
|
fade_buf(87);
|
|
|
|
for (i = 0; i < NUM_ATOMS; i++)
|
|
{
|
|
atom_x[i] += atom_d_x[i];
|
|
atom_y[i] += atom_d_y[i];
|
|
|
|
if (atom_x[i] < 0)
|
|
{
|
|
atom_x[i] = 0;
|
|
atom_d_x[i] = -atom_d_x[i];
|
|
}
|
|
else if (atom_x[i] > 38)
|
|
{
|
|
atom_x[i] = 38;
|
|
atom_d_x[i] = -atom_d_x[i];
|
|
}
|
|
|
|
if (atom_y[i] < 0)
|
|
{
|
|
atom_y[i] = 0;
|
|
atom_d_y[i] = -atom_d_y[i];
|
|
}
|
|
else if (atom_y[i] > 38)
|
|
{
|
|
atom_y[i] = 38;
|
|
atom_d_y[i] = -atom_d_y[i];
|
|
}
|
|
aa_pixel(atom_x[i], atom_y[i], 255, 255, 255, 0);
|
|
}
|
|
}
|
|
|
|
void
|
|
draw_history(void)
|
|
{
|
|
static int setup = 0;
|
|
|
|
if (!setup)
|
|
{
|
|
blank_buf();
|
|
setup = 1;
|
|
}
|
|
else
|
|
scroll_buf();
|
|
|
|
set_col_pixel(39, 39 - ((load_val * 36) / 100), 255, 115, 255, 165);
|
|
}
|
|
|
|
void
|
|
draw_history_bar(void)
|
|
{
|
|
static int setup = 0;
|
|
|
|
if (!setup)
|
|
{
|
|
blank_buf();
|
|
setup = 1;
|
|
}
|
|
else
|
|
scroll_buf();
|
|
|
|
aa_line(39, 39 - ((load_val * 36) / 100), 39, 39, 255, 80, 255, 125);
|
|
}
|
|
|
|
/* ************************* */
|
|
|
|
/* ************************* */
|
|
/* Utility drawing functions */
|
|
/* ************************* */
|
|
|
|
/* Maybe I'll optimise this later ;-) */
|
|
static void
|
|
aa_line(int x1, int y1, int x2, int y2, unsigned char b,
|
|
unsigned char rr, unsigned char gg, unsigned char bb)
|
|
{
|
|
double grad, line_width, line_height, xgap, ygap, xend, yend,
|
|
yf, xf, brightness1, brightness2, db, xm, ym;
|
|
int ix1, ix2, iy1, iy2, i;
|
|
int temp;
|
|
|
|
unsigned char c1, c2;
|
|
|
|
line_width = (x2 - x1);
|
|
line_height = (y2 - y1);
|
|
|
|
if (fabs(line_width) > fabs(line_height))
|
|
{
|
|
if (x1 > x2)
|
|
{
|
|
temp = x1;
|
|
x1 = x2;
|
|
x2 = temp;
|
|
temp = y1;
|
|
y1 = y2;
|
|
y2 = temp;
|
|
line_width = (x2 - x1);
|
|
line_height = (y2 - y1);
|
|
}
|
|
|
|
/* This is currently broken. It is supposed to account
|
|
* for lines that don't span more than one pixel */
|
|
if (fabs(line_width) < 0.1)
|
|
{
|
|
x2 = x1 + 0.5;
|
|
x1 -= 0.5;
|
|
grad = 0;
|
|
}
|
|
else
|
|
{
|
|
grad = line_height / line_width;
|
|
if (line_width < 1)
|
|
{
|
|
xm = (x1 + x2) / 2;
|
|
ym = (y1 + y2) / 2;
|
|
|
|
x1 = xm - 0.5;
|
|
x2 = xm + 0.5;
|
|
y1 = ym - (grad / 2);
|
|
y2 = ym + (grad / 2);
|
|
|
|
line_width = 1;
|
|
line_height = grad;
|
|
}
|
|
}
|
|
|
|
xend = (int)x1 + 0.5;
|
|
yend = y1 + grad * (xend - x1);
|
|
|
|
xgap = (1 - modf(x1 + 0.5, &db));
|
|
ix1 = (int)xend;
|
|
iy1 = (int)yend;
|
|
|
|
brightness1 = (1 - modf(yend, &db)) * xgap;
|
|
brightness2 = modf(yend, &db) * xgap;
|
|
|
|
c1 = (unsigned char)(brightness1 * b);
|
|
c2 = (unsigned char)(brightness2 * b);
|
|
|
|
set_col_pixel(ix1, iy1, c1, rr, gg, bb);
|
|
set_col_pixel(ix1, iy1 + 1, c2, rr, gg, bb);
|
|
|
|
yf = yend + grad;
|
|
|
|
xend = (int)(x2 + .5);
|
|
yend = y2 + grad * (xend - x2);
|
|
|
|
xgap = 1 - modf(x2 - .5, &db);
|
|
|
|
ix2 = (int)xend;
|
|
iy2 = (int)yend;
|
|
|
|
brightness1 = (1 - modf(yend, &db)) * xgap;
|
|
brightness2 = modf(yend, &db) * xgap;
|
|
|
|
c1 = (unsigned char)(brightness1 * b);
|
|
c2 = (unsigned char)(brightness2 * b);
|
|
|
|
set_col_pixel(ix2, iy2, c1, rr, gg, bb);
|
|
set_col_pixel(ix2, iy2 + 1, c2, rr, gg, bb);
|
|
|
|
for (i = ix1 + 1; i < ix2; i++)
|
|
{
|
|
brightness1 = (1 - modf(yf, &db));
|
|
brightness2 = modf(yf, &db);
|
|
|
|
c1 = (unsigned char)(brightness1 * b);
|
|
c2 = (unsigned char)(brightness2 * b);
|
|
|
|
set_col_pixel(i, (int)yf, c1, rr, gg, bb);
|
|
set_col_pixel(i, (int)yf + 1, c2, rr, gg, bb);
|
|
|
|
yf = yf + grad;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (y2 < y1)
|
|
{
|
|
temp = x1;
|
|
x1 = x2;
|
|
x2 = temp;
|
|
temp = y1;
|
|
y1 = y2;
|
|
y2 = temp;
|
|
line_width = (x2 - x1);
|
|
line_height = (y2 - y1);
|
|
}
|
|
|
|
/* This is currently broken */
|
|
if (fabs(line_height) < 0.1)
|
|
{
|
|
y2 = y1 + 0.5;
|
|
y1 -= 0.5;
|
|
grad = 0;
|
|
}
|
|
else
|
|
{
|
|
grad = line_width / line_height;
|
|
if (line_height < 1)
|
|
{
|
|
xm = (x1 + x2) / 2;
|
|
ym = (y1 + y2) / 2;
|
|
|
|
x1 = xm - (grad / 2);
|
|
x2 = xm + (grad / 2);
|
|
y1 = ym - 0.5;
|
|
y2 = ym + 0.5;
|
|
|
|
line_height = 1;
|
|
line_width = grad;
|
|
}
|
|
}
|
|
|
|
yend = (int)(y1 + 0.5);
|
|
xend = x1 + grad * (yend - y1);
|
|
|
|
ygap = (1 - modf(y1 + 0.5, &db));
|
|
ix1 = (int)xend;
|
|
iy1 = (int)yend;
|
|
|
|
brightness1 = (1 - modf(xend, &db)) * ygap;
|
|
brightness2 = modf(xend, &db) * ygap;
|
|
|
|
c1 = (unsigned char)(brightness1 * b);
|
|
c2 = (unsigned char)(brightness2 * b);
|
|
|
|
set_col_pixel(ix1, iy1, c1, rr, gg, bb);
|
|
set_col_pixel(ix1 + 1, iy1, c2, rr, gg, bb);
|
|
|
|
xf = xend + grad;
|
|
|
|
yend = (int)(y2 + .5);
|
|
xend = x2 + grad * (yend - y2);
|
|
|
|
ygap = 1 - modf(y2 - .5, &db);
|
|
|
|
ix2 = (int)xend;
|
|
iy2 = (int)yend;
|
|
|
|
brightness1 = (1 - modf(xend, &db)) * ygap;
|
|
brightness2 = modf(xend, &db) * ygap;
|
|
|
|
c1 = (unsigned char)(brightness1 * b);
|
|
c2 = (unsigned char)(brightness2 * b);
|
|
|
|
set_col_pixel(ix2, iy2, c1, rr, gg, bb);
|
|
set_col_pixel(ix2 + 1, iy2, c2, rr, gg, bb);
|
|
|
|
for (i = iy1 + 1; i < iy2; i++)
|
|
{
|
|
brightness1 = (1 - modf(xf, &db));
|
|
brightness2 = modf(xf, &db);
|
|
|
|
c1 = (unsigned char)(brightness1 * b);
|
|
c2 = (unsigned char)(brightness2 * b);
|
|
|
|
set_col_pixel((int)xf, i, c1, rr, gg, bb);
|
|
set_col_pixel((int)(xf + 1), i, c2, rr, gg, bb);
|
|
|
|
xf += grad;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Draw an anti-aliased pixel */
|
|
static void
|
|
aa_pixel(double wx, double wy, unsigned char c, unsigned char rrr,
|
|
unsigned char ggg, unsigned char bbb)
|
|
{
|
|
int x, y;
|
|
double fx, fy;
|
|
int btl, btr, bbl, bbr;
|
|
|
|
x = (int)wx;
|
|
y = (int)wy;
|
|
fx = (double)wx - x;
|
|
fy = (double)wy - y;
|
|
|
|
btl = ((1.0 - fx) * (1.0 - fy)) * c;
|
|
btr = ((fx) * (1.0 - fy)) * c;
|
|
bbl = ((1.0 - fx) * (fy)) * c;
|
|
bbr = (fx * fy) * c;
|
|
|
|
set_col_pixel(x, y, btl, rrr, ggg, bbb);
|
|
set_col_pixel(x + 1, y, btr, rrr, ggg, bbb);
|
|
set_col_pixel(x, y + 1, bbl, rrr, ggg, bbb);
|
|
set_col_pixel(x + 1, y + 1, bbr, rrr, ggg, bbb);
|
|
}
|
|
|
|
/* Set a pixel, takes a brightness and a colour value */
|
|
static void
|
|
set_col_pixel(int x, int y, unsigned char c, unsigned char rrr,
|
|
unsigned char ggg, unsigned char bbb)
|
|
{
|
|
unsigned char *ptr;
|
|
|
|
if ((((int)c) == 0) || (x < 0) || (y < 0) || (x > 39) || (y > 39))
|
|
return;
|
|
|
|
ptr = Epplet_get_rgb_pointer(rgbbuf);
|
|
ptr += (imlib_image_get_width() * 4 * (y)) + (4 * x);
|
|
ptr[0] = ((double)rrr / 255 * (double)c);
|
|
ptr[1] = ((double)ggg / 255 * (double)c);
|
|
ptr[2] = ((double)bbb / 255 * (double)c);
|
|
}
|
|
|
|
/* Set a pixel, grayscale, takes a brightness value */
|
|
/*
|
|
static void
|
|
set_pixel (int x, int y, unsigned char c)
|
|
{
|
|
char *ptr;
|
|
|
|
if ((((int) c) == 0) || (x < 0) || (y < 0) || (x > 39) || (y > 39))
|
|
return;
|
|
|
|
ptr = (rgbbuf)->im->rgb_data + ((rgbbuf)->im->rgb_width * 3 * (y)) + (3 * x);
|
|
ptr[0] = ptr[1] = ptr[2] = c;
|
|
}
|
|
*/
|
|
|
|
/* Do *not* flame me for doing it this way... */
|
|
/* I know !!! */
|
|
/* ;-) */
|
|
void
|
|
draw_text(void)
|
|
{
|
|
/* 19 x 132 */
|
|
char enlighten[19][172] = {
|
|
"....+@@@@@@@@@@.............+@+..@#.............#@..................................................................................",
|
|
"....@$$$$$$$$$$.............@$@..$%.............%$..........&@................................................................&@....",
|
|
"....@$*@@@@@@@@.............@$@..@#.............%$.........@$@...............................................................@$@....",
|
|
"....@$%.....................@$@.................%$.........@$@...............................................................@$@....",
|
|
"....@$%..........+@++=%=#...@$@..@#....&%%#.@#..%$.#%%&...#=$=@....@%%=+....@#.&%%@....@#.&%=+.+=%=+.....#=%%#....#@.#%%&+..#=$=@...",
|
|
"....@$%..........@$=$$$$$@..@$@..$%...*$$$$%$%..%$%$$$$-+.%$$$$..+-$$$$$@...$%-$$$$%...$%-$$$-#-$$$-+...%$$$$$%...%$=$$$$-+.%$$$$...",
|
|
"....@$*@@@@@@@+..@$$&..&$*..@$@..$%..=$%+.&$$%..%$-#.+%$&.#=$=@..-$&..#*$#..$$%+.#-$+..$$%+.%$$%+.%$=..=$%+.+=$=..%$-#.+%$&.#=$=@...",
|
|
"....@$$$$$$$$$@..@$%....*$..@$@..$%..$*....&$%..%$@...+$%..@$@..@$&....+$%..$$....&$@..$$....$-....$%..$*.....*$..%$@...+$%..@$@....",
|
|
"....@$*@@@@@@@+..@$@....%$..@$@..$%.@$&....+$%..%$.....$%..@$@..=$@@@@@@*-..$%....@$@..$%....$%....$%.#$=@@@@@=$#.%$.....$%..@$@....",
|
|
"....@$%..........@$@....%$..@$@..$%.@$@.....$%..%$.....$%..@$@..%$$$$$$$$$..$%....@$@..$%....$%....$%.@$$$$$$$$$@.%$.....$%..@$@....",
|
|
"....@$%..........@$@....%$..@$@..$%.@$@.....$%..%$.....$%..@$@..%$@@@@@@@@..$%....@$@..$%....$%....$%.@$=@@@@@@@+.%$.....$%..@$@....",
|
|
"....@$%..........@$@....%$..@$@..$%.+$=....@$%..%$.....$%..@$@..=$#.....#...$%....@$@..$%....$%....$%.#$=.....++..%$.....$%..@$@....",
|
|
"....@$%..........@$@....%$..@$@..$%..*$@..+-$%..%$.....$%..@$@..#$*....+$*..$%....@$@..$%....$%....$%..-$+....*$+.%$.....$%..@$@....",
|
|
"....@$-%%%%%%%%#.@$@....%$..@$@..$%..+$$*%$$$%..%$.....$%..@$%@..%$-&@=-$#..$%....@$@..$%....$%....$%..@$$=@&*$=..%$.....$%..@$%@...",
|
|
"....@$$$$$$$$$$@.@$@....%$..@$@..$%...+%$$*+$%..%$.....$%...-$$#..=$$$$-@...$%....@$@..$%....$%....$%...@-$$$$=...%$.....$%...-$$#..",
|
|
".....................................@.....+$=...............@@+....@@#...................................#@@..................@@+..",
|
|
".....................................$-....%$@......................................................................................",
|
|
".....................................=$-%%-$%.......................................................................................",
|
|
"......................................&*$$-=........................................................................................"
|
|
};
|
|
|
|
static int setup = 0;
|
|
static int i = 0, j = 0, y = 0;
|
|
unsigned char b = 0;
|
|
|
|
if (!setup)
|
|
{
|
|
blank_buf();
|
|
setup = 1;
|
|
y = (rand() % 14) + 4;
|
|
}
|
|
else
|
|
{
|
|
scroll_buf();
|
|
}
|
|
|
|
if (j > 132)
|
|
{
|
|
/* Do nothing this time */
|
|
;
|
|
}
|
|
else
|
|
{
|
|
for (i = y; i < (y + 19); i++)
|
|
{
|
|
switch (enlighten[i - y][j])
|
|
{
|
|
case '.':
|
|
{
|
|
b = 0;
|
|
break;
|
|
}
|
|
case '@':
|
|
{
|
|
b = 85;
|
|
break;
|
|
}
|
|
case '$':
|
|
{
|
|
b = 255;
|
|
break;
|
|
}
|
|
case '-':
|
|
{
|
|
b = 224;
|
|
break;
|
|
}
|
|
case '=':
|
|
{
|
|
b = 141;
|
|
break;
|
|
}
|
|
case '#':
|
|
{
|
|
b = 56;
|
|
break;
|
|
}
|
|
case '+':
|
|
{
|
|
b = 28;
|
|
break;
|
|
}
|
|
case '*':
|
|
{
|
|
b = 98;
|
|
break;
|
|
}
|
|
case '%':
|
|
{
|
|
b = 70;
|
|
break;
|
|
}
|
|
case '&':
|
|
{
|
|
b = 113;
|
|
break;
|
|
}
|
|
}
|
|
set_col_pixel(39, i, b, 136, 221, 221);
|
|
}
|
|
}
|
|
|
|
++j;
|
|
if (j > 172)
|
|
{
|
|
j = 0;
|
|
y = (rand() % 14) + 4;
|
|
}
|
|
}
|