SvgaLib/demos/cursor.c

231 lines
6.1 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <vga.h>
#include <vgamouse.h>
#include <sys/fcntl.h>
#include <stdint.h>
int mode = G1024x768x64K;
uint32_t mag_glass_bits[] = {
0x3f8, 0x60c, 0x9e2, 0x1a13, 0x1401, 0x1401, 0x1001, 0x1001,
0x1001, 0x1003, 0x1802, 0x340c, 0x6ff8, 0xd800, 0xb000, 0xe000,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x3f8, 0x60c, 0x9e2, 0x1a13, 0x1401, 0x1401, 0x1001, 0x1001,
0x1001, 0x1003, 0x1802, 0x340c, 0x6ff8, 0xd800, 0xb000, 0xe000,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
uint32_t mag_glass_filled[] = {
0x3f8, 0x60c, 0x9e2, 0x1a13, 0x1401, 0x1401, 0x1001, 0x1001,
0x1001, 0x1003, 0x1802, 0x340c, 0x6ff8, 0xd800, 0xb000, 0xe000,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x3f8, 0x7fc, 0xffe, 0x1fff, 0x1fff, 0x1fff, 0x1fff, 0x1fff,
0x1fff, 0x1fff, 0x1ffe, 0x3ffc, 0x7ff8, 0xf800, 0xe000, 0xe000,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
uint32_t *c2;
static unsigned char line[2048*4];
static void drawpattern(void)
{
int xmax, ymax, i, x, y, yw, ys, c;
vga_modeinfo *modeinfo;
modeinfo = vga_getmodeinfo(mode);
xmax = vga_getxdim() - 1;
ymax = vga_getydim() - 1;
vga_setcolor(vga_white());
vga_drawline(0, 0, xmax, 0);
vga_drawline(xmax, 0, xmax, ymax);
vga_drawline(xmax, ymax, 0, ymax);
vga_drawline(0, ymax, 0, 0);
for (i = 0; i <= 15; i++) {
vga_setegacolor(i);
vga_drawline(10 + i * 5, 10, 90 + i * 5, 90);
}
for (i = 0; i <= 15; i++) {
vga_setegacolor(i);
vga_drawline(90 + i * 5, 10, 10 + i * 5, 90);
}
vga_screenon();
ys = 100;
yw = (ymax - 100) / 4;
switch (vga_getcolors()) {
case 256:
for (i = 0; i < 60; ++i) {
c = (i * 64) / 60;
vga_setpalette(i + 16, c, c, c);
vga_setpalette(i + 16 + 60, c, 0, 0);
vga_setpalette(i + 16 + (2 * 60), 0, c, 0);
vga_setpalette(i + 16 + (3 * 60), 0, 0, c);
}
line[0] = line[xmax] = 15;
line[1] = line[xmax - 1] = 0;
for (x = 2; x < xmax - 1; ++x)
line[x] = (((x - 2) * 60) / (xmax - 3)) + 16;
for (y = ys; y < ys + yw; ++y) /* gray */
vga_drawscanline(y, line);
for (x = 2; x < xmax - 1; ++x)
line[x] += 60;
ys += yw;
for (y = ys; y < ys + yw; ++y) /* red */
vga_drawscanline(y, line);
for (x = 2; x < xmax - 1; ++x)
line[x] += 60;
ys += yw;
for (y = ys; y < ys + yw; ++y) /* green */
vga_drawscanline(y, line);
for (x = 2; x < xmax - 1; ++x)
line[x] += 60;
ys += yw;
for (y = ys; y < ys + yw; ++y) /* blue */
vga_drawscanline(y, line);
break;
case 1 << 15:
case 1 << 16:
case 1 << 24:
for (x = 2; x < xmax - 1; ++x) {
c = ((x - 2) * 256) / (xmax - 3);
y = ys;
vga_setrgbcolor(c, c, c);
vga_drawline(x, y, x, y + yw - 1);
y += yw;
vga_setrgbcolor(c, 0, 0);
vga_drawline(x, y, x, y + yw - 1);
y += yw;
vga_setrgbcolor(0, c, 0);
vga_drawline(x, y, x, y + yw - 1);
y += yw;
vga_setrgbcolor(0, 0, c);
vga_drawline(x, y, x, y + yw - 1);
}
for (x = 0; x < 64; x++) {
for (y = 0; y < 64; y++) {
vga_setrgbcolor(x * 4 + 3, y * 4 + 3, 0);
vga_drawpixel(xmax / 2 - 160 + x, y + ymax / 2 - 80);
vga_setrgbcolor(x * 4 + 3, 0, y * 4 + 3);
vga_drawpixel(xmax / 2 - 32 + x, y + ymax / 2 - 80);
vga_setrgbcolor(0, x * 4 + 3, y * 4 + 3);
vga_drawpixel(xmax / 2 + 160 - 64 + x, y + ymax / 2 - 80);
vga_setrgbcolor(x * 4 + 3, y * 4 + 3, 255);
vga_drawpixel(xmax / 2 - 160 + x, y + ymax / 2 + 16);
vga_setrgbcolor(x * 4 + 3, 255, y * 4 + 3);
vga_drawpixel(xmax / 2 - 32 + x, y + ymax / 2 + 16);
vga_setrgbcolor(255, x * 4 + 3, y * 4 + 3);
vga_drawpixel(xmax / 2 + 160 - 64 + x, y + ymax / 2 + 16);
}
}
break;
default:
if (vga_getcolors() == 16) {
for (i = 0; i < xmax - 1; i++)
line[i] = (i + 2) % 16;
line[0] = line[xmax] = 15;
line[1] = line[xmax - 1] = 0;
}
if (vga_getcolors() == 2) {
for (i = 0; i <= xmax; i++)
line[i] = 0x11;
line[0] = 0x91;
}
for (i = 100; i < ymax - 1; i++)
vga_drawscanline(i, line);
break;
}
}
int main(int argc, char *argv[]) {
int i,s,j;
unsigned char *g;
vga_init();
vga_setmousesupport(1);
printf("%i\n",vga_initcursor(argc-1));
vga_setmode(mode);
vga_setlinearaddressing();
vga_setcursorposition(100,100);
c2=malloc(256);
j=1;
for(i=0;i<32;i++) {
*(c2+i)=j;
*(c2+32+i)=j;
j<<=1;
}
if(vga_getcolors()==256)
for (i = 0; i < 60; ++i) {
j = (i * 64) / 60;
vga_setpalette(i + 16, j, j, j);
vga_setpalette(i + 16 + 60, j, 0, 0);
vga_setpalette(i + 16 + (2 * 60), 0, j, 0);
vga_setpalette(i + 16 + (3 * 60), 0, 0, j);
}
vga_setcursorimage(0,0,0,0xff0000,(unsigned char *)c2);
vga_setcursorimage(1,0,0,0xffffff,(unsigned char *)mag_glass_bits);
vga_setcursorimage(2,0,0xff1080,0x0f0fff,(unsigned char *)mag_glass_filled);
vga_selectcursor(1);
vga_showcursor(1);
vga_showcursor(2);
g=vga_getgraphmem();
#if 1
drawpattern();
#else
for(j=0;j<256*1024;j++) {
if((j&0x3ff)==0x3ff)usleep(1000);
*(g+2*j)=0x00;
*(g+2*j+1)=(j*83/69)&0xff;
}
for(j=256*1024;j<384*1024;j++) {
if((j&0x3ff)==0x3ff)usleep(1000);
*(g+2*j)=0;
*(g+2*j+1)=0;
}
for(j=384*1024;j<512*1024;j++) {
// if((j&0x3ff)==0x3ff)usleep(1000);
*(g+2*j)=0xff;
*(g+2*j+1)=0x7f;
}
for(j=512*1024;j<2048*1024;j++) {
// if((j&0x3ff)==0x3ff)usleep(1000);
*(g+2*j)=((j>>9)&1)*(((~j)>>4)&0x1f);
*(g+2*j+1)=(1-((j>>9)&1)) * ((j>>2)&0x7c);
}
#endif
i=1;
vga_showcursor(3);
s=3;
while(!(mouse_getbutton()&4)) {
mouse_waitforupdate();
vga_setcursorposition(mouse_getx(),mouse_gety());
if(mouse_getbutton()&1) {
vga_selectcursor(i=(i+1)%3);
}
#if 1
if(mouse_getbutton()&2) {
vga_showcursor(s=(s+1)%4);
}
#else
if(mouse_getbutton()&2) {
vga_dumpregs();
}
#endif
}
vga_setmode(TEXT);
return 0;
}