Blame filter.blend.inc.c

ea5919
ea5919
ea5919
typedef void (*BlendFunc)(double *dst, double *src, double val);
ea5919
ea5919
ea5919
void bfuncCopy(double *dst, double *src, double val)
ea5919
  { memcpy(dst, src, 4*sizeof(double)); }
ea5919
ea5919
void bfuncMix(double *dst, double *src, double val) {
ea5919
  double iv = 1 - val;
ea5919
  dst[0] = dst[0]*iv + src[0]*val;
ea5919
  dst[1] = dst[1]*iv + src[1]*val;
ea5919
  dst[2] = dst[2]*iv + src[2]*val;
ea5919
  dst[3] = dst[3]*iv + src[3]*val;
ea5919
}
ea5919
ea5919
void bfuncComposite(double *dst, double *src, double val) {
ea5919
  val *= src[3];
ea5919
  double iv = 1 - val;
ea5919
  dst[0] = dst[0]*iv + src[0]*val;
ea5919
  dst[1] = dst[1]*iv + src[1]*val;
ea5919
  dst[2] = dst[2]*iv + src[2]*val;
ea5919
  dst[3] = 1 - (1 - dst[3])*val;
ea5919
}
ea5919
ea5919
void bfuncSum(double *dst, double *src, double val) {
ea5919
  val *= src[3];
ea5919
  dst[0] = dst[0] + src[0]*val;
ea5919
  dst[1] = dst[1] + src[1]*val;
ea5919
  dst[2] = dst[2] + src[2]*val;
ea5919
}
ea5919
ea5919
void bfuncMul(double *dst, double *src, double val) {
ea5919
  val *= src[3];
ea5919
  double iv = 1 - val;
ea5919
  dst[0] = dst[0]*iv + dst[0]*src[0]*val;
ea5919
  dst[1] = dst[1]*iv + dst[1]*src[1]*val;
ea5919
  dst[2] = dst[2]*iv + dst[2]*src[2]*val;
ea5919
}
ea5919
ea5919
ea5919
ea5919
void filterBlendEx(Img *img, Img *src, BlendFunc func, double val, int dx, int dy, int sx, int sy, int w, int h) {
ea5919
  if (!img->data || !src->data || !func) return;
ea5919
ea5919
  if (sx < 0) { dx -= sx; w += sx; sx = 0; }
ea5919
  if (sy < 0) { dy -= sy; h += sy; sy = 0; }
ea5919
  if (dx < 0) { sx -= dx; w += dx; dx = 0; }
ea5919
  if (dy < 0) { sy -= dy; h += dy; dy = 0; }
ea5919
ea5919
  if (w > img->w - dx) w = img->w - dx;
ea5919
  if (h > img->h - dy) h = img->h - dy;
ea5919
  if (w > src->w - sx) w = src->w - sx;
ea5919
  if (h > src->h - sy) h = src->h - sy;
ea5919
ea5919
  if (w <= 0 || h <= 0) return;
ea5919
  int dr = 4*(img->w - w);
ea5919
  int sr = 4*(src->w - w);
ea5919
ea5919
  if (img == src) {
ea5919
    int offset = ((sy - dy)*img->w + sx - dx)*4;
ea5919
    if (offset > 0) {
ea5919
      for(double *pd = imgPixel(img, dx, dy), *e = pd + 4*h*img->w; pd < e; pd += dr)
ea5919
        for(double *re = pd + 4*w; pd < re; pd += 4)
ea5919
          func(pd, pd + offset, val);
ea5919
    } else
ea5919
    if (offset < 0) {
ea5919
      for(double *pd = imgPixel(img, dx+w-1, dy+h-1), *e = pd - 4*h*img->w; pd > e; pd -= dr)
ea5919
        for(double *re = pd - 4*w; pd > re; pd -= 4)
ea5919
          func(pd, pd + offset, val);
ea5919
    } else {
ea5919
      double ps[4];
ea5919
      for(double *pd = imgPixel(img, dx, dy), *e = pd + 4*h*img->w; pd < e; pd += dr)
ea5919
        for(double *re = pd + 4*w; pd < re; pd += 4)
ea5919
          { memcpy(ps, pd, sizeof(ps)); func(pd, ps, val); }
ea5919
    }
ea5919
  } else {
ea5919
    for(double *pd = imgPixel(img, dx, dy), *ps = imgPixel(src, sx, sy), *e = pd + 4*h*img->w; pd < e; pd += dr, ps += sr)
ea5919
      for(double *re = pd + 4*w; pd < re; pd += 4, ps += 4)
ea5919
        func(pd, ps, val);
ea5919
  }
ea5919
}
ea5919
ea5919
void filterBlend(Img *img, Img *src, BlendFunc func, double val)
ea5919
  { filterBlendEx(img, src, func, val, 0, 0, 0, 0, src->w, src->h); }
ea5919
ea5919
ea5919
ea5919
ea5919
void imgCopyTo(Img *img, Img *src, int dx, int dy, int sx, int sy, int w, int h)
ea5919
  { filterBlendEx(img, src, bfuncCopy, 1, dx, dy, sx, sy, w, h); }
ea5919
ea5919
void imgCropTo(Img *img, Img *src, int x, int y, int w, int h) {
ea5919
  imgInit(img, w, h);
ea5919
  imgCopyTo(img, src, 0, 0, x, y, w, h);
ea5919
}
ea5919
ea5919
void imgCrop(Img *img, int x, int y, int w, int h) {
ea5919
  Img imgC = {};
ea5919
  imgSwap(img, &imgC);
ea5919
  imgCropTo(img, &imgC, x, y, w, h);
ea5919
  imgDestroy(&imgC);
ea5919
}
ea5919
ea5919
void imgCopy(Img *img, Img *src)
ea5919
  { imgCropTo(img, src, 0, 0, src->w, src->h); }