Blame filter.icy.inc.c

ea5919
ea5919
ade35a
void filterIcy(Img *img, double size, int withWind) {
ea5919
  if (!img->data) return;
ea5919
  size = fabs(size);
ea5919
  if (!(size > IMG_PRECISION)) withWind = FALSE;
ea5919
ea5919
  const int    optNoiseWidth0 = (int)round(size/4);
ea5919
  const int    optNoiseWidth1 = (int)round(size);
ea5919
  const double optNoise0 = 1;
ea5919
  const double optNoise1 = 0.75;
ea5919
  const double optBright0 = 1.1;
ea5919
  const double optBright1 = 1.4;
ea5919
ea5919
  const double optWind = 0.75;
ea5919
  const int    optWindWidth0 = (int)round(size/4);
ea5919
  const int    optWindWidth1 = (int)round(size/2);
ea5919
  const double optWindNoise0 = 0.5;
ea5919
  const double optWindNoise1 = 0.75;
ea5919
  const double optWindAtt = withWind ? pow(0.95, 4/size) : 0;
ea5919
ade35a
  double curve[][3] = {
ade35a
    {  0   , 0   , 0 },
ade35a
    {  0.15, 0.65, 0 },
ade35a
    {  0.35, 0.15, 0 },
ade35a
    {  0.65, 0.85, 0 },
ade35a
    {  0.85, 0.35, 0 },
ade35a
    {  1   , 1   , 0 } };
ade35a
  double curveColor[][5] = {
ade35a
    { 0  ,  0  , 0  , 0  , 1 },
ade35a
    { 0.6,  0.4, 0.4, 0.6, 1 },
ade35a
    { 1  ,  1  , 1  , 1  , 1 } };
ade35a
ade35a
ea5919
  double blurSize = size/2;
ea5919
  if (optNoiseWidth0) filterMulNoiseGray(img, img->w/optNoiseWidth0, img->h/optNoiseWidth0, 1-optNoise0, 1);
ea5919
  if (optNoiseWidth1) filterMulNoiseGray(img, img->w/optNoiseWidth1, img->h/optNoiseWidth1, 1-optNoise1, 1);
ea5919
  filterFillCh(img, 3, 1);
ea5919
  filterBlurGauss(img, blurSize, blurSize);
ea5919
ea5919
  ClMat m;
ea5919
  clmMulColor(&m, optBright0);
ea5919
  filterMatrix(img, &m);
ea5919
ade35a
  Img imgC = {};
ade35a
  imgInit(&imgC, 512, 1);
ade35a
ade35a
  curve[0][0] = curve[1][0]*(1 - 4/size);
ade35a
  filterRasterizeTCurve(&imgC, curve[0], sizeof(curve)/sizeof(*curve), curve[0][0], 1);
ade35a
  filterFillCh(&imgC, 3, 1);
ade35a
  filterCurveByCh(img, &imgC, 0);
ea5919
ea5919
  clmMulColor(&m, optBright1);
ea5919
  filterMatrix(img, &m);
ea5919
ea5919
  if (withWind) {
ea5919
    Img wind = {};
ea5919
    imgCopy(&wind, img);
ea5919
ea5919
    Img pat = {};
ea5919
    imgInit(&pat, img->w, 1);
ea5919
    double clOne[] = {1,1,1,1};
ea5919
    filterFill(&pat, clOne);
ea5919
    if (optWindWidth0) filterMulNoiseGray(&pat, img->w/optWindWidth0, 1, 1-optWindNoise0, 1);
ea5919
    if (optWindWidth1) filterMulNoiseGray(&pat, img->w/optWindWidth1, 1, 1-optWindNoise1, 1);
ea5919
    filterWind(&wind, &pat, optWindAtt);
ea5919
    imgDestroy(&pat);
ea5919
ea5919
    filterBlend(&wind, img, &bfuncSum, -1);
ea5919
    filterBlend(img, &wind, &bfuncSum, optWind);
ea5919
    imgDestroy(&wind);
ea5919
  }
ea5919
ade35a
  filterRasterizeCurveColor(&imgC, curveColor[0], sizeof(curveColor)/sizeof(*curveColor), 0, 1);
ade35a
  filterCurveByCh(img, &imgC, 0);
ade35a
  imgDestroy(&imgC);
ea5919
ea5919
  //clmScreenToCompositeYUV(&m);
ea5919
  //filterMatrix(img, &m);
ea5919
  filterScreenToCompositeHSV(img);
ea5919
}
ea5919
ea5919
ea5919
int icyGenerate(Img *img, int argc, char **argv) {
ea5919
  if (img) imgDestroy(img);
ea5919
ea5919
  char *inFile = "", *outFile = "";
ea5919
  double size = 4;
ea5919
  int withWind = TRUE;
ea5919
  int withoutWind = FALSE;
ea5919
  ArgDesc descs[] = {
ea5919
    { 'i', &inFile, &pargString, "path to input image" },
ea5919
    { 'o', &outFile, &pargString, "path to output image" },
ea5919
    { 's', &size, &pargDouble, "effect size" },
ea5919
    { 'w', &withWind, NULL, "add icicles (default)" },
ea5919
    { 'n', &withoutWind, NULL, "no icicles" },
ea5919
    {}
ea5919
  };
ea5919
ea5919
  if (!parseArgs(descs, argc, argv) || !inFile[0] || !outFile[0]) {
ea5919
    printUsage(descs);
ea5919
    return FALSE;
ea5919
  }
ea5919
ea5919
  if (withoutWind) withWind = FALSE;
ea5919
ea5919
  Img imgC = {};
ea5919
  if (!imgLoad(&imgC, inFile))
ea5919
    return FALSE;
ea5919
ade35a
  filterIcy(&imgC, size, withWind);
ea5919
ea5919
  if (!imgSave(&imgC, outFile))
ea5919
    imgDestroy(&imgC);
ea5919
  int success = !!imgC.data;
ea5919
ea5919
  if (img) imgSwap(img, &imgC);
ea5919
  imgDestroy(&imgC);
ea5919
ea5919
  return success;
ea5919
}
ea5919
ea5919