IMAGE *apply_filter(IMAGE *original, FILTER *filter) { IMAGE *result = image_create_blank(original); int x, y; for(y = 0; y < original->height; y++) for(x = 0; x < original->width; x++) apply_to_pixel(x, y, original, result, filter); return result; }
IMAGE *master_recv_blur(IMAGE *src, int radius, int n_slaves) { //Allocate mem for the new image IMAGE *result = image_create_blank(src); //Copy first and last "radius" rows int i, j; for(i = 0; i < radius; i++) for(j = 0; j < src->width; j++) { (result->pixels)[i][j] = (src->pixels)[i][j]; (result->pixels)[src->height-1-i][j] = (src->pixels)[src->height-1-i][j]; } //Init metadata METADATA meta; meta_init(&meta, src->width, src->height, 0, radius, 0); //Prepare pixel type MPI_Datatype PIXEL; create_pixel_type(&PIXEL); //Calculate the total data size(ignoring the endges) int data_size = src->height - 2*meta.radius; int index = 0; const int max_size = src->height / n_slaves; //Update and send the metadata for(i = 0; i < n_slaves && data_size != 0; i++) { //Update metadata master_update_metadata(&meta, &data_size, max_size); //Recv data recv_subimage(result, &PIXEL, i+1, index+radius, meta.height-radius); //Update index index += meta.height - 2*meta.radius; } return result; }