/* * SPECIAL EFFECTS * * Du code bien cracra / tTh / Tetalab */ #include #include #include #include #include #include "fonctions.h" /* -------------------------------------------------------------- */ /* here are global vars exported by the main module */ extern int verbosity; /* -------------------------------------------------------------- */ /* nouveau du 20 novembre 2020, pour encoder une vidz du vernissage * du festival Sauvageonnes de Mixart-Myrys */ int des_bords_sombres_a(FloatImg *pimg, int offset) { float coef; int xpos, xp2, lidx, y; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %d )\n", __func__, pimg, offset); #endif if (offset<0 || offset>=pimg->width) { fprintf(stderr, "%s offset %d is bad\n", __func__, offset); return -66; } for (y=0; yheight; y++) { lidx = y * pimg->width; /* start of the 'y' line */ for (xpos=0; xposR[xpos+lidx] *= coef; pimg->G[xpos+lidx] *= coef; pimg->B[xpos+lidx] *= coef; xp2 = pimg->width-xpos; pimg->R[xp2+lidx] *= coef; pimg->G[xp2+lidx] *= coef; pimg->B[xp2+lidx] *= coef; } } return 0; } /* -------------------------------------------------------------- */ int trinarize(FloatImg *pimg, int notused) { float mm[6], mRa, mGa, mBa, mRb, mGb, mBb; float val, *fptr; int foo, size; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %d )\n", __func__, pimg, notused); #endif foo = fimg_get_minmax_rgb(pimg, mm); mRa = (mm[1] - mm[0]) * 0.33333; mGa = (mm[3] - mm[2]) * 0.33333; mBa = (mm[5] - mm[4]) * 0.33333; mRb = (mm[1] - mm[0]) * 0.66666; mGb = (mm[3] - mm[2]) * 0.66666; mBb = (mm[5] - mm[4]) * 0.66666; size = pimg->width * pimg->height; #define VAL (255.0) for (foo=0; fooR; if (fptr[foo] < mRa || fptr[foo] > mRb) fptr[foo] = 0.0; else fptr[foo] = mm[1]; fptr = pimg->G; if (fptr[foo] < mGa || fptr[foo] > mGb) fptr[foo] = 0.0; else fptr[foo] = mm[3]; fptr = pimg->B; if (fptr[foo] < mBa || fptr[foo] > mBb) fptr[foo] = 0.0; else fptr[foo] = mm[5]; } return 0; } /* -------------------------------------------------------------- */ int binarize(FloatImg *pimg, int notused) { float mm[6], mR, mG, mB; int foo, size; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %d )\n", __func__, pimg, notused); #endif foo = fimg_get_minmax_rgb(pimg, mm); mR = (mm[1] - mm[0]) / 2.0; mG = (mm[3] - mm[2]) / 2.0; mB = (mm[5] - mm[4]) / 2.0; if (verbosity > 1) fprintf(stderr, "%s: %f %f %f\n", __func__, mR, mG, mB); size = pimg->width * pimg->height; for (foo=0; fooR[foo] < mR) pimg->R[foo] = mm[0]; else pimg->R[foo] = mm[1]; if (pimg->G[foo] < mG) pimg->G[foo] = mm[2]; else pimg->G[foo] = mm[3]; if (pimg->B[foo] < mB) pimg->B[foo] = mm[4]; else pimg->B[foo] = mm[5]; } return 0; } /* -------------------------------------------------------------- */ int brotche_rand48_a(FloatImg *fimg, float ratio, float mval) { int nbpix, todo, foo; int x, y; float fval; nbpix = fimg->width * fimg->height; todo = (int)((float)nbpix * ratio); if (verbosity > 1) { fprintf(stderr, "%s: ratio %f nbpix %d todo %d\n", __func__, ratio, nbpix, todo); } for (foo=0; foowidth; y = rand() % fimg->height; fimg_plot_rgb(fimg, x, y, fval, fval, fval); } return 0; } /* -------------------------------------------------------------- */ int brotche_rand48_b(FloatImg *fimg, float ratio, float mval) { int nbpix, todo, foo; int x, y; float fval; nbpix = fimg->width * fimg->height; todo = (int)((float)nbpix * ratio); if (verbosity > 1) { fprintf(stderr, "%s: ratio %f nbpix %d todo %d\n", __func__, ratio, nbpix, todo); } for (foo=0; foowidth-2)); y = rand() % fimg->height; fimg_plot_rgb(fimg, x-1, y, fval, 0.0, 0.0); fimg_plot_rgb(fimg, x , y, 0.0, 0.0, fval); fimg_plot_rgb(fimg, x+1, y, 0.0, fval, 0.0); } return 0; } /* -------------------------------------------------------------- */