Эта реализация не слишком отличается от эффекта линза, единственное отличие - по другой формуле расчитывается таблица.
#include <math.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h>
#define PI 3.1415926 #define FILTERW 120 #define FILTERH 120 #define FILTERW_2 (FILTERW/2) #define FILTERH_2 (FILTERH/2)
int FILTER_W=FILTERW; int FILTER_H=FILTERH; double sp_Amp=2*PI; double sp_Pow=6;
char bmp[64000]; char p[1024]; int filter[FILTERW*FILTERH];
extern void setvmode(int); #pragma aux setvmode = \ " int 10h " \ parm [eax] \ modify exact [eax];
void wait_retrace() { while ((inp(0x3DA) & 0x08) == 0); while ((inp(0x3DA) & 0x08) != 0); }
void fload() { FILE *f;
if ((f=fopen("1.bmp", "rb")) == NULL) { printf("error: file %s not found.\n 1.bmp"); exit(1); } fseek(f,1024+54,0); if (fread(&bmp, 1, 64000, f)!=64000) { printf("error: can't read data from %s.\n 1.bmp"); exit(1); } fclose(f); if ((f=fopen("1.bmp", "rb")) == NULL) { printf("error: file %s not found.\n 1.bmp"); exit(1); } fseek(f,54,0); if (fread(&p, 1, 1024, f)!=1024) { printf("error: can't read data from %s.\n 1.bmp"); exit(1); } fclose(f); }
void apply_filter(char *dst, char *src, int *filter, int x, int y) { int i, j, o = x + 320 * y, *f = filter; char *d = dst + o, *s = src + o;
for (i = 0; i < FILTERW; i++) { for (j = 0; j < FILTERH; j++) *d++ = *(s++ + *f++); d += (320 - FILTERW); s += (320 - FILTERW); } }
void make_filter() { int i, j, i1, j1, v; double r, a, t0, t1;
for (i = 0; i < FILTERW; i++) for (j = 0; j < FILTERH; j++) { r = sqrt(((double)i / FILTERW - 0.5) * ((double)i / FILTERW - 0.5) + ((double)j / FILTERH - 0.5) * ((double)j / FILTERH - 0.5)); if (r < 0.5) { a = sp_Amp * pow(1 - 2 * r, sp_Pow); i1 = (i - FILTERW_2) * cos(a) - (j - FILTERH_2) * sin(a) + FILTERW_2 - i; j1 = (i - FILTERW_2) * sin(a) + (j - FILTERH_2) * cos(a) + FILTERH_2 - j; v = i1 + j1 * 320; } else v = 0; filter[i + FILTERW * j] = v; } }
void main () { int i = 0, x, y, f = 0, t; char c;
make_filter(); fload(); setvmode(0x13); for(i=0;i<256;i++) { outp(0x3C8,i); outp(0x3C9,p[(i*4)+2] >> 2); outp(0x3C9,p[(i*4)+1] >> 2); outp(0x3C9,p[(i*4)+0] >> 2); }
do { x = (1 + cos ((double)f / 13)) * (160 - FILTERW_2); y = (1 + sin ((double)f / 23)) * (100 - FILTERH_2); wait_retrace(); wait_retrace(); memcpy((char*)0xA0000L, (char*)&bmp, 64000); apply_filter((char*)0xA0000L, (char*)&bmp, (int*)&filter, x, y); f++; c = kbhit() ? getch() : 0; } while (c != 0x1B); setvmode(0x03); printf(" Coded by Misha Krivij");}
8 8 8
|