/* * The Npic library * * Copyright (C) 2003 Edouard Thiel * * This library is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ /* DO NOT EDIT !!! Generated by npic-templa from "calc_algeb.ct" */ /* * calc_algeb.c - 05/01/2009 * * Simple algebraic operations */ #include /*----------------------------------------------------------------------------*/ /* * dest := src1 * c1 + c2 * Set each pixel of dest to a linear combination of corresponding pixels in * src1. Do not modify border pixels. * * The two images have same type and size; * they can have the same address in memory. * * Do nothing if dest or src1 is not ok. set not ok for dest on error. Verbose. */ void NpicLinearSum (Npic_image *dest, Npic_image *src1, double c1, double c2) { if (NpicImageIsOK_DS1 (dest, src1, __func__) != NPIC_SUCCESS) return; if (NpicSameImage (dest, src1, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS) { dest->gen.ok = NpicError (__func__, NPIC_ERR_INCOMPAT, ""); return; } switch (dest->type) { case NPIC_IMAGE_2C : { Npic_image_2c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + c2; return; } case NPIC_IMAGE_2L : { Npic_image_2l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + c2; return; } case NPIC_IMAGE_2D : { Npic_image_2d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + c2; return; } case NPIC_IMAGE_3C : { Npic_image_3c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + c2; return; } case NPIC_IMAGE_3L : { Npic_image_3l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + c2; return; } case NPIC_IMAGE_3D : { Npic_image_3d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + c2; return; } case NPIC_IMAGE_4C : { Npic_image_4c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_4L : { Npic_image_4l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_4D : { Npic_image_4d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_5C : { Npic_image_5c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_5L : { Npic_image_5l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_5D : { Npic_image_5d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_6C : { Npic_image_6c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_6L : { Npic_image_6l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_6D : { Npic_image_6d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + c2; return; } case NPIC_IMAGE_2Q : { Npic_image_2q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[y][x].a = p1->pix[y][x].a*c1 + c2; pr->pix[y][x].b = p1->pix[y][x].b*c1 + c2; pr->pix[y][x].c = p1->pix[y][x].c*c1 + c2; pr->pix[y][x].d = p1->pix[y][x].d*c1 + c2; } return; } case NPIC_IMAGE_3Q : { Npic_image_3q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[z][y][x].a = p1->pix[z][y][x].a*c1 + c2; pr->pix[z][y][x].b = p1->pix[z][y][x].b*c1 + c2; pr->pix[z][y][x].c = p1->pix[z][y][x].c*c1 + c2; pr->pix[z][y][x].d = p1->pix[z][y][x].d*c1 + c2; } return; } case NPIC_IMAGE_4Q : { Npic_image_4q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[t][z][y][x].a = p1->pix[t][z][y][x].a*c1 + c2; pr->pix[t][z][y][x].b = p1->pix[t][z][y][x].b*c1 + c2; pr->pix[t][z][y][x].c = p1->pix[t][z][y][x].c*c1 + c2; pr->pix[t][z][y][x].d = p1->pix[t][z][y][x].d*c1 + c2; } return; } case NPIC_IMAGE_5Q : { Npic_image_5q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[s][t][z][y][x].a = p1->pix[s][t][z][y][x].a*c1 + c2; pr->pix[s][t][z][y][x].b = p1->pix[s][t][z][y][x].b*c1 + c2; pr->pix[s][t][z][y][x].c = p1->pix[s][t][z][y][x].c*c1 + c2; pr->pix[s][t][z][y][x].d = p1->pix[s][t][z][y][x].d*c1 + c2; } return; } case NPIC_IMAGE_6Q : { Npic_image_6q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[r][s][t][z][y][x].a = p1->pix[r][s][t][z][y][x].a*c1 + c2; pr->pix[r][s][t][z][y][x].b = p1->pix[r][s][t][z][y][x].b*c1 + c2; pr->pix[r][s][t][z][y][x].c = p1->pix[r][s][t][z][y][x].c*c1 + c2; pr->pix[r][s][t][z][y][x].d = p1->pix[r][s][t][z][y][x].d*c1 + c2; } return; } default : dest->gen.ok = NpicError (__func__, NPIC_ERR_UNEX_NPIC, ""); } } /*----------------------------------------------------------------------------*/ /* * dest := src1 * c1 + src2 * c2 + c3 * Set each pixel of dest to a linear combination of corresponding pixels in * src1 and src2. Do not modify border pixels. * * The three images have same type and size; * they can have the same address in memory. * * Do nothing if dest, src1 or src2 is not ok. set not ok for dest on error. Verbose. */ void NpicBilinearSum (Npic_image *dest, Npic_image *src1, Npic_image *src2, double c1, double c2, double c3) { if (NpicImageIsOK_DS2 (dest, src1, src2, __func__) != NPIC_SUCCESS) return; if (NpicSameImage (dest, src1, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS || NpicSameImage (dest, src2, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS ) { dest->gen.ok = NpicError (__func__, NPIC_ERR_INCOMPAT, ""); return; } switch (dest->type) { case NPIC_IMAGE_2C : { Npic_image_2c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + p2->pix[y][x]*c2 + c3; return; } case NPIC_IMAGE_2L : { Npic_image_2l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + p2->pix[y][x]*c2 + c3; return; } case NPIC_IMAGE_2D : { Npic_image_2d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + p2->pix[y][x]*c2 + c3; return; } case NPIC_IMAGE_3C : { Npic_image_3c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + p2->pix[z][y][x]*c2 + c3; return; } case NPIC_IMAGE_3L : { Npic_image_3l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + p2->pix[z][y][x]*c2 + c3; return; } case NPIC_IMAGE_3D : { Npic_image_3d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + p2->pix[z][y][x]*c2 + c3; return; } case NPIC_IMAGE_4C : { Npic_image_4c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + p2->pix[t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_4L : { Npic_image_4l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + p2->pix[t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_4D : { Npic_image_4d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + p2->pix[t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_5C : { Npic_image_5c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + p2->pix[s][t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_5L : { Npic_image_5l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + p2->pix[s][t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_5D : { Npic_image_5d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + p2->pix[s][t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_6C : { Npic_image_6c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + p2->pix[r][s][t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_6L : { Npic_image_6l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + p2->pix[r][s][t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_6D : { Npic_image_6d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + p2->pix[r][s][t][z][y][x]*c2 + c3; return; } case NPIC_IMAGE_2Q : { Npic_image_2q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[y][x].a = p1->pix[y][x].a*c1 + p2->pix[y][x].a*c2 + c3; pr->pix[y][x].b = p1->pix[y][x].b*c1 + p2->pix[y][x].b*c2 + c3; pr->pix[y][x].c = p1->pix[y][x].c*c1 + p2->pix[y][x].c*c2 + c3; pr->pix[y][x].d = p1->pix[y][x].d*c1 + p2->pix[y][x].d*c2 + c3; } return; } case NPIC_IMAGE_3Q : { Npic_image_3q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[z][y][x].a = p1->pix[z][y][x].a*c1 + p2->pix[z][y][x].a*c2 + c3; pr->pix[z][y][x].b = p1->pix[z][y][x].b*c1 + p2->pix[z][y][x].b*c2 + c3; pr->pix[z][y][x].c = p1->pix[z][y][x].c*c1 + p2->pix[z][y][x].c*c2 + c3; pr->pix[z][y][x].d = p1->pix[z][y][x].d*c1 + p2->pix[z][y][x].d*c2 + c3; } return; } case NPIC_IMAGE_4Q : { Npic_image_4q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[t][z][y][x].a = p1->pix[t][z][y][x].a*c1 + p2->pix[t][z][y][x].a*c2 + c3; pr->pix[t][z][y][x].b = p1->pix[t][z][y][x].b*c1 + p2->pix[t][z][y][x].b*c2 + c3; pr->pix[t][z][y][x].c = p1->pix[t][z][y][x].c*c1 + p2->pix[t][z][y][x].c*c2 + c3; pr->pix[t][z][y][x].d = p1->pix[t][z][y][x].d*c1 + p2->pix[t][z][y][x].d*c2 + c3; } return; } case NPIC_IMAGE_5Q : { Npic_image_5q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[s][t][z][y][x].a = p1->pix[s][t][z][y][x].a*c1 + p2->pix[s][t][z][y][x].a*c2 + c3; pr->pix[s][t][z][y][x].b = p1->pix[s][t][z][y][x].b*c1 + p2->pix[s][t][z][y][x].b*c2 + c3; pr->pix[s][t][z][y][x].c = p1->pix[s][t][z][y][x].c*c1 + p2->pix[s][t][z][y][x].c*c2 + c3; pr->pix[s][t][z][y][x].d = p1->pix[s][t][z][y][x].d*c1 + p2->pix[s][t][z][y][x].d*c2 + c3; } return; } case NPIC_IMAGE_6Q : { Npic_image_6q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[r][s][t][z][y][x].a = p1->pix[r][s][t][z][y][x].a*c1 + p2->pix[r][s][t][z][y][x].a*c2 + c3; pr->pix[r][s][t][z][y][x].b = p1->pix[r][s][t][z][y][x].b*c1 + p2->pix[r][s][t][z][y][x].b*c2 + c3; pr->pix[r][s][t][z][y][x].c = p1->pix[r][s][t][z][y][x].c*c1 + p2->pix[r][s][t][z][y][x].c*c2 + c3; pr->pix[r][s][t][z][y][x].d = p1->pix[r][s][t][z][y][x].d*c1 + p2->pix[r][s][t][z][y][x].d*c2 + c3; } return; } default : dest->gen.ok = NpicError (__func__, NPIC_ERR_UNEX_NPIC, ""); } } /*----------------------------------------------------------------------------*/ /* * dest := src1 * c1 + src2 * c2 + src3 * c3 + c4 * Set each pixel of dest to a linear combination of corresponding pixels in * src1, src2 and src3. Do not modify border pixels. * * The Four images have same type and size; * they can have the same address in memory. * * Do nothing if dest or src? is not ok. set not ok for dest on error. Verbose. */ void NpicTrilinearSum (Npic_image *dest, Npic_image *src1, Npic_image *src2, Npic_image *src3, double c1, double c2, double c3, double c4) { if (NpicImageIsOK_DS3 (dest, src1, src2, src3, __func__) != NPIC_SUCCESS) return; if (NpicSameImage (dest, src1, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS || NpicSameImage (dest, src2, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS || NpicSameImage (dest, src3, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS ) { dest->gen.ok = NpicError (__func__, NPIC_ERR_INCOMPAT, ""); return; } switch (dest->type) { case NPIC_IMAGE_2C : { Npic_image_2c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + p2->pix[y][x]*c2 + p3->pix[y][x]*c3 + c4; return; } case NPIC_IMAGE_2L : { Npic_image_2l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + p2->pix[y][x]*c2 + p3->pix[y][x]*c3 + c4; return; } case NPIC_IMAGE_2D : { Npic_image_2d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[y][x] = p1->pix[y][x]*c1 + p2->pix[y][x]*c2 + p3->pix[y][x]*c3 + c4; return; } case NPIC_IMAGE_3C : { Npic_image_3c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + p2->pix[z][y][x]*c2 + p3->pix[z][y][x]*c3 + c4; return; } case NPIC_IMAGE_3L : { Npic_image_3l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + p2->pix[z][y][x]*c2 + p3->pix[z][y][x]*c3 + c4; return; } case NPIC_IMAGE_3D : { Npic_image_3d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[z][y][x] = p1->pix[z][y][x]*c1 + p2->pix[z][y][x]*c2 + p3->pix[z][y][x]*c3 + c4; return; } case NPIC_IMAGE_4C : { Npic_image_4c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + p2->pix[t][z][y][x]*c2 + p3->pix[t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_4L : { Npic_image_4l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + p2->pix[t][z][y][x]*c2 + p3->pix[t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_4D : { Npic_image_4d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[t][z][y][x] = p1->pix[t][z][y][x]*c1 + p2->pix[t][z][y][x]*c2 + p3->pix[t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_5C : { Npic_image_5c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + p2->pix[s][t][z][y][x]*c2 + p3->pix[s][t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_5L : { Npic_image_5l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + p2->pix[s][t][z][y][x]*c2 + p3->pix[s][t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_5D : { Npic_image_5d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[s][t][z][y][x] = p1->pix[s][t][z][y][x]*c1 + p2->pix[s][t][z][y][x]*c2 + p3->pix[s][t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_6C : { Npic_image_6c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + p2->pix[r][s][t][z][y][x]*c2 + p3->pix[r][s][t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_6L : { Npic_image_6l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + p2->pix[r][s][t][z][y][x]*c2 + p3->pix[r][s][t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_6D : { Npic_image_6d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) pr->pix[r][s][t][z][y][x] = p1->pix[r][s][t][z][y][x]*c1 + p2->pix[r][s][t][z][y][x]*c2 + p3->pix[r][s][t][z][y][x]*c3 + c4; return; } case NPIC_IMAGE_2Q : { Npic_image_2q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[y][x].a = p1->pix[y][x].a*c1 + p2->pix[y][x].a*c2 + p3->pix[y][x].a*c3 + c4; pr->pix[y][x].b = p1->pix[y][x].b*c1 + p2->pix[y][x].b*c2 + p3->pix[y][x].b*c3 + c4; pr->pix[y][x].c = p1->pix[y][x].c*c1 + p2->pix[y][x].c*c2 + p3->pix[y][x].c*c3 + c4; pr->pix[y][x].d = p1->pix[y][x].d*c1 + p2->pix[y][x].d*c2 + p3->pix[y][x].d*c3 + c4; } return; } case NPIC_IMAGE_3Q : { Npic_image_3q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[z][y][x].a = p1->pix[z][y][x].a*c1 + p2->pix[z][y][x].a*c2 + p3->pix[z][y][x].a*c3 + c4; pr->pix[z][y][x].b = p1->pix[z][y][x].b*c1 + p2->pix[z][y][x].b*c2 + p3->pix[z][y][x].b*c3 + c4; pr->pix[z][y][x].c = p1->pix[z][y][x].c*c1 + p2->pix[z][y][x].c*c2 + p3->pix[z][y][x].c*c3 + c4; pr->pix[z][y][x].d = p1->pix[z][y][x].d*c1 + p2->pix[z][y][x].d*c2 + p3->pix[z][y][x].d*c3 + c4; } return; } case NPIC_IMAGE_4Q : { Npic_image_4q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[t][z][y][x].a = p1->pix[t][z][y][x].a*c1 + p2->pix[t][z][y][x].a*c2 + p3->pix[t][z][y][x].a*c3 + c4; pr->pix[t][z][y][x].b = p1->pix[t][z][y][x].b*c1 + p2->pix[t][z][y][x].b*c2 + p3->pix[t][z][y][x].b*c3 + c4; pr->pix[t][z][y][x].c = p1->pix[t][z][y][x].c*c1 + p2->pix[t][z][y][x].c*c2 + p3->pix[t][z][y][x].c*c3 + c4; pr->pix[t][z][y][x].d = p1->pix[t][z][y][x].d*c1 + p2->pix[t][z][y][x].d*c2 + p3->pix[t][z][y][x].d*c3 + c4; } return; } case NPIC_IMAGE_5Q : { Npic_image_5q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[s][t][z][y][x].a = p1->pix[s][t][z][y][x].a*c1 + p2->pix[s][t][z][y][x].a*c2 + p3->pix[s][t][z][y][x].a*c3 + c4; pr->pix[s][t][z][y][x].b = p1->pix[s][t][z][y][x].b*c1 + p2->pix[s][t][z][y][x].b*c2 + p3->pix[s][t][z][y][x].b*c3 + c4; pr->pix[s][t][z][y][x].c = p1->pix[s][t][z][y][x].c*c1 + p2->pix[s][t][z][y][x].c*c2 + p3->pix[s][t][z][y][x].c*c3 + c4; pr->pix[s][t][z][y][x].d = p1->pix[s][t][z][y][x].d*c1 + p2->pix[s][t][z][y][x].d*c2 + p3->pix[s][t][z][y][x].d*c3 + c4; } return; } case NPIC_IMAGE_6Q : { Npic_image_6q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2), *p3 = NpicCastImage (src3); int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { pr->pix[r][s][t][z][y][x].a = p1->pix[r][s][t][z][y][x].a*c1 + p2->pix[r][s][t][z][y][x].a*c2 + p3->pix[r][s][t][z][y][x].a*c3 + c4; pr->pix[r][s][t][z][y][x].b = p1->pix[r][s][t][z][y][x].b*c1 + p2->pix[r][s][t][z][y][x].b*c2 + p3->pix[r][s][t][z][y][x].b*c3 + c4; pr->pix[r][s][t][z][y][x].c = p1->pix[r][s][t][z][y][x].c*c1 + p2->pix[r][s][t][z][y][x].c*c2 + p3->pix[r][s][t][z][y][x].c*c3 + c4; pr->pix[r][s][t][z][y][x].d = p1->pix[r][s][t][z][y][x].d*c1 + p2->pix[r][s][t][z][y][x].d*c2 + p3->pix[r][s][t][z][y][x].d*c3 + c4; } return; } default : dest->gen.ok = NpicError (__func__, NPIC_ERR_UNEX_NPIC, ""); } } /*----------------------------------------------------------------------------*/ /* * dest := src1^2 * c1 + src1 * c2 + c3 * Set each pixel of dest to a quadratic combination of corresponding pixels in * src1. Do not modify border pixels. * * The two images have same type and size; * they can have the same address in memory. * * Do nothing if dest or src1 is not ok. set not ok for dest on error. Verbose. */ void NpicQuadraticSum (Npic_image *dest, Npic_image *src1, double c1, double c2, double c3) { if (NpicImageIsOK_DS1 (dest, src1, __func__) != NPIC_SUCCESS) return; if (NpicSameImage (dest, src1, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS ) { dest->gen.ok = NpicError (__func__, NPIC_ERR_INCOMPAT, ""); return; } switch (dest->type) { case NPIC_IMAGE_2C : { Npic_image_2c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_c v1; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x]; pr->pix[y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_2L : { Npic_image_2l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_l v1; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x]; pr->pix[y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_2D : { Npic_image_2d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_d v1; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x]; pr->pix[y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_3C : { Npic_image_3c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_c v1; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x]; pr->pix[z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_3L : { Npic_image_3l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_l v1; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x]; pr->pix[z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_3D : { Npic_image_3d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_d v1; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x]; pr->pix[z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_4C : { Npic_image_4c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_c v1; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x]; pr->pix[t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_4L : { Npic_image_4l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_l v1; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x]; pr->pix[t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_4D : { Npic_image_4d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_d v1; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x]; pr->pix[t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_5C : { Npic_image_5c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_c v1; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x]; pr->pix[s][t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_5L : { Npic_image_5l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_l v1; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x]; pr->pix[s][t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_5D : { Npic_image_5d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_d v1; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x]; pr->pix[s][t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_6C : { Npic_image_6c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_c v1; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x]; pr->pix[r][s][t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_6L : { Npic_image_6l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_l v1; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x]; pr->pix[r][s][t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_6D : { Npic_image_6d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_d v1; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x]; pr->pix[r][s][t][z][y][x] = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_2Q : { Npic_image_2q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_uint16 v1; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x].a; pr->pix[y][x].a = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[y][x].b; pr->pix[y][x].b = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[y][x].c; pr->pix[y][x].c = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[y][x].d; pr->pix[y][x].d = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_3Q : { Npic_image_3q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_uint16 v1; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x].a; pr->pix[z][y][x].a = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[z][y][x].b; pr->pix[z][y][x].b = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[z][y][x].c; pr->pix[z][y][x].c = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[z][y][x].d; pr->pix[z][y][x].d = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_4Q : { Npic_image_4q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_uint16 v1; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x].a; pr->pix[t][z][y][x].a = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[t][z][y][x].b; pr->pix[t][z][y][x].b = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[t][z][y][x].c; pr->pix[t][z][y][x].c = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[t][z][y][x].d; pr->pix[t][z][y][x].d = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_5Q : { Npic_image_5q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_uint16 v1; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x].a; pr->pix[s][t][z][y][x].a = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[s][t][z][y][x].b; pr->pix[s][t][z][y][x].b = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[s][t][z][y][x].c; pr->pix[s][t][z][y][x].c = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[s][t][z][y][x].d; pr->pix[s][t][z][y][x].d = (c1 * v1 + c2) * v1 + c3; } return; } case NPIC_IMAGE_6Q : { Npic_image_6q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1); Npic_uint16 v1; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x].a; pr->pix[r][s][t][z][y][x].a = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[r][s][t][z][y][x].b; pr->pix[r][s][t][z][y][x].b = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[r][s][t][z][y][x].c; pr->pix[r][s][t][z][y][x].c = (c1 * v1 + c2) * v1 + c3; v1 = p1->pix[r][s][t][z][y][x].d; pr->pix[r][s][t][z][y][x].d = (c1 * v1 + c2) * v1 + c3; } return; } default : dest->gen.ok = NpicError (__func__, NPIC_ERR_UNEX_NPIC, ""); } } /*----------------------------------------------------------------------------*/ /* * dest := src1^2 * c1 + src1 * c2 + src2^2 * c3 + src2 * c4 + c5 * Set each pixel of dest to a quadratic combination of corresponding pixels in * src1 and src2. Do not modify border pixels. * * The three images have same type and size; * they can have the same address in memory. * * Do nothing if dest, src1 or src2 is not ok. set not ok for dest on error. Verbose. */ void NpicBiQuadraticSum (Npic_image *dest, Npic_image *src1, Npic_image *src2, double c1, double c2, double c3, double c4, double c5) { if (NpicImageIsOK_DS2 (dest, src1, src2, __func__) != NPIC_SUCCESS) return; if (NpicSameImage (dest, src1, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS || NpicSameImage (dest, src2, NPIC_TYPE | NPIC_SIZE) != NPIC_SUCCESS ) { dest->gen.ok = NpicError (__func__, NPIC_ERR_INCOMPAT, ""); return; } switch (dest->type) { case NPIC_IMAGE_2C : { Npic_image_2c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_c v1, v2; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x]; v2 = p2->pix[y][x]; pr->pix[y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_2L : { Npic_image_2l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_l v1, v2; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x]; v2 = p2->pix[y][x]; pr->pix[y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_2D : { Npic_image_2d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_d v1, v2; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x]; v2 = p2->pix[y][x]; pr->pix[y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_3C : { Npic_image_3c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_c v1, v2; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x]; v2 = p2->pix[z][y][x]; pr->pix[z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_3L : { Npic_image_3l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_l v1, v2; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x]; v2 = p2->pix[z][y][x]; pr->pix[z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_3D : { Npic_image_3d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_d v1, v2; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x]; v2 = p2->pix[z][y][x]; pr->pix[z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_4C : { Npic_image_4c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_c v1, v2; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x]; v2 = p2->pix[t][z][y][x]; pr->pix[t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_4L : { Npic_image_4l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_l v1, v2; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x]; v2 = p2->pix[t][z][y][x]; pr->pix[t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_4D : { Npic_image_4d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_d v1, v2; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x]; v2 = p2->pix[t][z][y][x]; pr->pix[t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_5C : { Npic_image_5c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_c v1, v2; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x]; v2 = p2->pix[s][t][z][y][x]; pr->pix[s][t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_5L : { Npic_image_5l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_l v1, v2; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x]; v2 = p2->pix[s][t][z][y][x]; pr->pix[s][t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_5D : { Npic_image_5d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_d v1, v2; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x]; v2 = p2->pix[s][t][z][y][x]; pr->pix[s][t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_6C : { Npic_image_6c *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_c v1, v2; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x]; v2 = p2->pix[r][s][t][z][y][x]; pr->pix[r][s][t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_6L : { Npic_image_6l *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_l v1, v2; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x]; v2 = p2->pix[r][s][t][z][y][x]; pr->pix[r][s][t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_6D : { Npic_image_6d *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_d v1, v2; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x]; v2 = p2->pix[r][s][t][z][y][x]; pr->pix[r][s][t][z][y][x] = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_2Q : { Npic_image_2q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_uint16 v1, v2; int y, x; for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[y][x].a; v2 = p2->pix[y][x].a; pr->pix[y][x].a = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[y][x].b; v2 = p2->pix[y][x].b; pr->pix[y][x].b = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[y][x].c; v2 = p2->pix[y][x].c; pr->pix[y][x].c = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[y][x].d; v2 = p2->pix[y][x].d; pr->pix[y][x].d = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_3Q : { Npic_image_3q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_uint16 v1, v2; int z, y, x; for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[z][y][x].a; v2 = p2->pix[z][y][x].a; pr->pix[z][y][x].a = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[z][y][x].b; v2 = p2->pix[z][y][x].b; pr->pix[z][y][x].b = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[z][y][x].c; v2 = p2->pix[z][y][x].c; pr->pix[z][y][x].c = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[z][y][x].d; v2 = p2->pix[z][y][x].d; pr->pix[z][y][x].d = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_4Q : { Npic_image_4q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_uint16 v1, v2; int t, z, y, x; for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[t][z][y][x].a; v2 = p2->pix[t][z][y][x].a; pr->pix[t][z][y][x].a = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[t][z][y][x].b; v2 = p2->pix[t][z][y][x].b; pr->pix[t][z][y][x].b = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[t][z][y][x].c; v2 = p2->pix[t][z][y][x].c; pr->pix[t][z][y][x].c = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[t][z][y][x].d; v2 = p2->pix[t][z][y][x].d; pr->pix[t][z][y][x].d = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_5Q : { Npic_image_5q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_uint16 v1, v2; int s, t, z, y, x; for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[s][t][z][y][x].a; v2 = p2->pix[s][t][z][y][x].a; pr->pix[s][t][z][y][x].a = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[s][t][z][y][x].b; v2 = p2->pix[s][t][z][y][x].b; pr->pix[s][t][z][y][x].b = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[s][t][z][y][x].c; v2 = p2->pix[s][t][z][y][x].c; pr->pix[s][t][z][y][x].c = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[s][t][z][y][x].d; v2 = p2->pix[s][t][z][y][x].d; pr->pix[s][t][z][y][x].d = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } case NPIC_IMAGE_6Q : { Npic_image_6q *pr = NpicCastImage (dest), *p1 = NpicCastImage (src1), *p2 = NpicCastImage (src2); Npic_uint16 v1, v2; int r, s, t, z, y, x; for (r = 0; r < pr->rmax; r++) for (s = 0; s < pr->smax; s++) for (t = 0; t < pr->tmax; t++) for (z = 0; z < pr->zmax; z++) for (y = 0; y < pr->ymax; y++) for (x = 0; x < pr->xmax; x++) { v1 = p1->pix[r][s][t][z][y][x].a; v2 = p2->pix[r][s][t][z][y][x].a; pr->pix[r][s][t][z][y][x].a = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[r][s][t][z][y][x].b; v2 = p2->pix[r][s][t][z][y][x].b; pr->pix[r][s][t][z][y][x].b = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[r][s][t][z][y][x].c; v2 = p2->pix[r][s][t][z][y][x].c; pr->pix[r][s][t][z][y][x].c = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; v1 = p1->pix[r][s][t][z][y][x].d; v2 = p2->pix[r][s][t][z][y][x].d; pr->pix[r][s][t][z][y][x].d = (c1 * v1 + c2) * v1 + (c3 * v2 + c4) * v2 + c5; } return; } default : dest->gen.ok = NpicError (__func__, NPIC_ERR_UNEX_NPIC, ""); } } /*----------------------------------------------------------------------------*/