/* * glitches.c * ---------- * * initially developped for the interpolator */ #include #include #include #include #include "../floatimg.h" #include "glitches.h" extern int verbosity; /* -------------------------------------------------------------- */ int kill_a_random_line(FloatImg *pvictime, float fval, int bits) { int line, xpos, offset; float ftmp; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %d )\n", __func__, pvictime, bits); #endif line = rand() % pvictime->height; if (verbosity > 2) { fprintf(stderr, "%s: try to kill line %d\n", __func__, line); } offset = pvictime->width * line; for (xpos=0; xposwidth; xpos++) { if (bits & 1) { ftmp = pvictime->R[offset+xpos] * fval; pvictime->R[offset+xpos] = sqrt(ftmp); } else pvictime->R[offset+xpos] = 0.0; if (bits & 2) { ftmp = pvictime->G[offset+xpos] * fval; pvictime->G[offset+xpos] = sqrt(ftmp); } else pvictime->G[offset+xpos] = 0.0; if (bits & 4) { ftmp = pvictime->B[offset+xpos] * fval; pvictime->B[offset+xpos] = sqrt(ftmp); } else pvictime->B[offset+xpos] = 0.0; } return 0; } /* -------------------------------------------------------------- */ int kill_a_few_lines(FloatImg *who, float fval, int number) { int idx, foo; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %f %d )\n", __func__, who, fval, number); #endif /* Frag the pixels */ for (idx=0; idxwidth * (y+ypos)); for (x=0; x<8; x++) { sr += picture->R[off]; sg += picture->G[off]; sb += picture->B[off]; off++; } } sr /= 64.0; sg /= 64.0; sb /= 64.0; for (y=0; y<8; y++) { off = xpos + (picture->width * (y+ypos)); for (x=0; x<8; x++) { picture->R[off] = sr; picture->G[off] = sg; picture->B[off] = sb; off++; } } return 0; } /* -------------------------------------------------------------- */ int random_blocks(FloatImg *picture, int percent) { int x, y; if ( (picture->width%16) || (picture->height%16) ) { fprintf(stderr, "%s: %d%d bad dims\n", __func__, picture->width, picture->height); } for (y=0; yheight; y+=16) { for (x=0; xwidth; x+=16) { if (percent < (rand()%100) ) { un_petit_flou_8x8(picture, x, y); un_petit_flou_8x8(picture, x+8, y); un_petit_flou_8x8(picture, x, y+8); un_petit_flou_8x8(picture, x+8, y+8); } } } return 0; } /* -------------------------------------------------------------- */ int un_moyen_flou_8x8(FloatImg *picture, int xpos, int ypos) { int i, j, x, y; /* * please add boundary check ? */ for (i=y=0; i<8; i++, y+=8) { for (j=x=0; j<8; j++, x+=8 ) { un_petit_flou_8x8(picture, x+xpos, y+ypos); } } return 0; } /* -------------------------------------------------------------- */ int poke_a_random_pixel(FloatImg *picz, float fval, int kaboo) { return -1; } /* -------------------------------------------------------------- */ /* * used by vertical_singlitch() */ static int x_delta(float dy, float phy) { float param, fv; param = dy + phy; fv = 9.999*sin(param) + 6.666*sin(param*3) + 3.333*sin(param*5); return (int)fv; } /* -------------------------------------------------------------- */ /* * please explain arguments */ int vertical_singlitch(FloatImg *picz, int xpos, float fval, float omega, float phi) { int y, x, w, h; float dy; float fv; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %d %f %f )\n", __func__, picz, xpos, omega, phi); #endif h = picz->height; w = picz->width; #define BB 4 for (y=BB; yBB) && (x>> %s ( %p %d %d )\n", __func__, picz, step, nombre); #endif buffline = alloca(picz->width * sizeof(float)); if (NULL==buffline) { fprintf(stderr, "%s: memory panic\n", __func__); abort(); } for (idx=0; idxheight; sptr = picz->R + (ypos * picz->width); shifter(sptr, buffline, step, picz->width); memcpy(sptr, buffline, picz->width*sizeof(float)); sptr = picz->G + (ypos * picz->width); shifter(sptr, buffline, step, picz->width); memcpy(sptr, buffline, picz->width*sizeof(float)); sptr = picz->B + (ypos * picz->width); shifter(sptr, buffline, step, picz->width); memcpy(sptr, buffline, picz->width*sizeof(float)); } return 0; } /* -------------------------------------------------------------- */