diff --git a/pipi/combine/blit.c b/pipi/combine/blit.c new file mode 100644 index 0000000..a4093c7 --- /dev/null +++ b/pipi/combine/blit.c @@ -0,0 +1,89 @@ +/* + * libpipi Pathetic image processing interface library + * Copyright (c) 2004-2008 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This library is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/* + * mean.c: Mean computation function + */ + +#include "config.h" + +#include + +#include "pipi.h" +#include "pipi_internals.h" + +pipi_image_t *pipi_blit(pipi_image_t *img1, pipi_image_t *img2, int x, int y) +{ + pipi_image_t *dst; + pipi_pixels_t *img1p, *img2p, *dstp; + float *img1data, *img2data, *dstdata; + int dx, dy, w1, h1, w2, h2; + + w1 = img1->w; + h1 = img1->h; + w2 = img2->w; + h2 = img2->h; + + dst = pipi_copy(img1); + dstp = pipi_get_pixels(dst, PIPI_PIXELS_RGBA_F32); + dstdata = (float *)dstp->pixels; + + img1p = pipi_get_pixels(img1, PIPI_PIXELS_RGBA_F32); + img1data = (float *)img1p->pixels; + img2p = pipi_get_pixels(img2, PIPI_PIXELS_RGBA_F32); + img2data = (float *)img2p->pixels; + + for(dy = 0; dy < h2; dy++) + { + if (y + dy < 0) + continue; + + if (y + dy >= h1) + break; + + for(dx = 0; dx < w2; dx++) + { + float p, q; + double t1, t2; + + if (x + dx < 0) + continue; + + if (x + dx >= w1) + break; + + t1 = img2data[4 * (dy * w2 + dx) + 3]; + t2 = 1.0 - t1; + + p = img1data[4 * ((y + dy) * w1 + (x + dx))]; + q = img2data[4 * (dy * w2 + dx)]; + dstdata[4 * ((y + dy) * w1 + (x + dx))] = t2 * p + t1 * q; + + p = img1data[4 * ((y + dy) * w1 + (x + dx)) + 1]; + q = img2data[4 * (dy * w2 + dx) + 1]; + dstdata[4 * ((y + dy) * w1 + (x + dx)) + 1] = t2 * p + t1 * q; + + p = img1data[4 * ((y + dy) * w1 + (x + dx)) + 2]; + q = img2data[4 * (dy * w2 + dx) + 2]; + dstdata[4 * ((y + dy) * w1 + (x + dx)) + 2] = t2 * p + t1 * q; + + p = img1data[4 * ((y + dy) * w1 + (x + dx)) + 3]; + q = img2data[4 * (dy * w2 + dx) + 3]; + dstdata[4 * ((y + dy) * w1 + (x + dx)) + 3] = t2 * p + t1 * q; + } + } + + return dst; +} +