Blame filter.base.inc.c

ea5919
ea5919
ea5919
ea5919
void filterFill(Img *img, double *pix) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4)
ea5919
    memcpy(p, pix, sizeof(double)*4);
ea5919
}
ea5919
ea5919
ea5919
void filterFillCh(Img *img, int ch, double val) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data + ch, *e = p + 4*img->w*img->h; p < e; p += 4)
ea5919
    *p = val;
ea5919
}
ea5919
ea5919
ea5919
void filterMin(Img *img, double *pix) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4) {
ea5919
    if (!(p[0] >= pix[0])) p[0] = pix[0];
ea5919
    if (!(p[1] >= pix[1])) p[1] = pix[1];
ea5919
    if (!(p[2] >= pix[2])) p[2] = pix[2];
ea5919
    if (!(p[3] >= pix[3])) p[3] = pix[3];
ea5919
  }
ea5919
}
ea5919
void filterMinCh(Img *img, int ch, double val) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data + ch, *e = p + 4*img->w*img->h; p < e; p += 4)
ea5919
    if (!(*p <= val)) *p = val;
ea5919
}
ea5919
ea5919
ea5919
void filterMax(Img *img, double *pix) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4) {
ea5919
    if (!(p[0] <= pix[0])) p[0] = pix[0];
ea5919
    if (!(p[1] <= pix[1])) p[1] = pix[1];
ea5919
    if (!(p[2] <= pix[2])) p[2] = pix[2];
ea5919
    if (!(p[3] <= pix[3])) p[3] = pix[3];
ea5919
  }
ea5919
}
ea5919
void filterMaxCh(Img *img, int ch, double val) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data + ch, *e = p + 4*img->w*img->h; p < e; p += 4)
ea5919
    if (!(*p <= val)) *p = val;
ea5919
}
ea5919
ea5919
ea5919
void filterClampEx(Img *img, double *pmin, double *pmax) {
ea5919
  filterMax(img, pmax);
ea5919
  filterMin(img, pmin);
ea5919
}
ea5919
void filterClamp(Img *img) {
ea5919
  double pmin[4] = {}, pmax[4] = { 1, 1, 1, 1 };
ea5919
  filterClampEx(img, pmin, pmax);
ea5919
}
ea5919
void filterClampCh(Img *img, int ch, double vmin, double vmax) {
ea5919
  filterMaxCh(img, ch, vmax);
ea5919
  filterMinCh(img, ch, vmin);
ea5919
}
ea5919
ea5919
ea5919
void filterMulAlpha(Img *img) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4) {
ea5919
    double a = p[3];
ea5919
    p[0] *= a; p[1] *= a; p[2] *= a;
ea5919
  }
ea5919
}
ea5919
ea5919
ea5919
void filterDivAlpha(Img *img) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4) {
ea5919
    double k = p[3];
ea5919
    k = fabs(k) > IMG_PRECISION ? 1/k : 0;
ea5919
    p[0] *= k; p[1] *= k; p[2] *= k;
ea5919
  }
ea5919
}
ea5919
ea5919
ea5919
void filterResampleCubic(Img *img, int w, int h) {
ea5919
  Img imgC = {};
ea5919
  imgInit(&imgC, w, h);
ea5919
  imgSwap(img, &imgC);
ea5919
  if (img->data && imgC.data) {
ea5919
    double kx = (double)imgC.w/img->w;
ea5919
    double ky = (double)imgC.h/img->h;
ea5919
    for(int y = 0; y < img->h; ++y)
ea5919
      for(int x = 0; x < img->w; ++x)
ea5919
        imgCubic(&imgC, x*kx, y*ky, imgPixel(img, x, y));
ea5919
  }
ea5919
  imgDestroy(&imgC);
ea5919
}
ea5919
ea5919
ea5919
void filterCurve(Img *img, Img *icurve) {
ea5919
  if (!img->data || !icurve->data) return;
ea5919
  double k = icurve->w;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4) {
ea5919
    p[0] = imgCubicHCh(icurve, 0, p[0]*k, 0);
ea5919
    p[1] = imgCubicHCh(icurve, 1, p[1]*k, 0);
ea5919
    p[2] = imgCubicHCh(icurve, 2, p[2]*k, 0);
ea5919
    p[3] = imgCubicHCh(icurve, 3, p[3]*k, 0);
ea5919
  }
ea5919
}
ea5919
ea5919
ea5919
void filterCurveCh(Img *img, Img *icurve, int dstCh, int srcCh, int curveCh) {
ea5919
  if (!img->data || !icurve->data) return;
ea5919
  double k = icurve->w;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4)
ea5919
    p[dstCh] = imgCubicHCh(icurve, curveCh, p[srcCh]*k, 0);
ea5919
}
ea5919
ea5919
ea5919
void filterCurveByCh(Img *img, Img *icurve, int ch) {
ea5919
  if (!img->data || !icurve->data) return;
ea5919
  double k = icurve->w;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4)
ea5919
    imgCubicH(icurve, p[ch]*k, 0, p);
ea5919
}
ea5919
ea5919
ade35a
void filterPow(Img *img, double val) {
ade35a
  if (!img->data) return;
ade35a
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4) {
ade35a
    p[0] = pow(p[0], val);
ade35a
    p[1] = pow(p[1], val);
ade35a
    p[2] = pow(p[2], val);
ade35a
    p[3] = pow(p[3], val);
ade35a
  }
ade35a
}
ade35a
ade35a
ade35a
void filterPowCh(Img *img, int ch, double val) {
ade35a
  if (!img->data) return;
ade35a
  for(double *p = img->data + ch, *e = p + 4*img->w*img->h; p < e; p += 4)
ade35a
    *p = pow(*p, val);
ade35a
}
ade35a
ade35a
ea5919
void filterScreenToCompositeHSV(Img *img) {
ea5919
  if (!img->data) return;
ea5919
  for(double *p = img->data, *e = p + 4*img->w*img->h; p < e; p += 4) {
ea5919
    rgbToHsv(p, p);
ea5919
    p[3] = p[2]; p[2] = 1;
ea5919
    hsvToRgb(p, p);
ea5919
  }
ea5919
}
ea5919