/* * fimg-core.c * * */ #include #include #include #include #include #include "../floatimg.h" extern int verbosity; /* must be declared around main() */ /* ---------------------------------------------------------------- */ float fimg_get_maxvalue(FloatImg *head) { float maxval; int foo; if (head->type != FIMG_TYPE_RGB && head->type != FIMG_TYPE_GRAY) { fprintf(stderr, "%s : type %d invalide\n", __func__, head->type); return nanf("wtf ?"); } maxval = 0.0; /* no negative values allowed */ switch (head->type) { case FIMG_TYPE_RGB: for (foo=0; foo<(head->width*head->height); foo++) { if (head->R[foo] > maxval) maxval = head->R[foo]; if (head->G[foo] > maxval) maxval = head->G[foo]; if (head->B[foo] > maxval) maxval = head->B[foo]; } case FIMG_TYPE_GRAY: for (foo=0; foo<(head->width*head->height); foo++) { if (head->R[foo] > maxval) maxval = head->R[foo]; } } return maxval; } /* ---------------------------------------------------------------- */ int fimg_meanvalues(FloatImg *head, float means[4]) { int idx, surface; surface = head->width * head->height; if (surface < 1) return -1; memset(means, 0, 4*sizeof(float)); for (idx=0; idxR[idx]; if (head->type > 2) { means[1] += head->G[idx]; means[2] += head->B[idx]; } } for (idx=0; idx<4; idx++) means[idx] /= (float)surface; return 0; } /* ---------------------------------------------------------------- */ /* * more elaborate functions are in fimg-2gray.c */ int fimg_to_gray(FloatImg *head) { float add; int foo; if (head->type != FIMG_TYPE_RGB) { fprintf(stderr, "%s : type %d invalide\n", __func__, head->type); return -3; } for (foo=0; foo<(head->width*head->height); foo++) { add = head->R[foo]; add += head->G[foo]; add += head->B[foo]; head->R[foo] = head->G[foo] = head->B[foo] = add; } return -1; } /* ---------------------------------------------------------------- */ void fimg_add_cste(FloatImg *fi, float value) { int nbre, idx; if (fi->type != FIMG_TYPE_RGB) { fprintf(stderr, "%s : type %d invalide\n", __func__, fi->type); return; } nbre = fi->width * fi->height * fi->type; #if DEBUG_LEVEL fprintf(stderr, "%s, nbre is %d\n", __func__, nbre); #endif for (idx=0; idxR[idx] += value; } } /* ---------------------------------------------------------------- */ /* Warning: this function is _very_ slow */ void fimg_drand48(FloatImg *fi, float kmul) { int nbre, idx; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %g )\n", __func__, fi, kmul); #endif nbre = fi->width * fi->height * fi->type; for (idx=0; idxR[idx] = drand48() * kmul; } } /* ---------------------------------------------------------------- */