264 lines
5.5 KiB
C
264 lines
5.5 KiB
C
|
/*
|
|||
|
pov_hf15c.c
|
|||
|
===========
|
|||
|
|
|||
|
Mixing operations beetween two height-fields.
|
|||
|
---------------------------------------------
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <string.h>
|
|||
|
#include <math.h>
|
|||
|
#include <stdlib.h>
|
|||
|
|
|||
|
#include "../tthimage.h"
|
|||
|
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/*
|
|||
|
* new 10 D<EFBFBD>cembre 2001
|
|||
|
*
|
|||
|
* Le coefficient K va de 0 a 10000 !
|
|||
|
*/
|
|||
|
int
|
|||
|
Image_hf15_mix(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst, int k)
|
|||
|
{
|
|||
|
int foo, x, y, h1, h2, hd;
|
|||
|
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "%s: k = %d\n", __func__, k);
|
|||
|
#endif
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(s1, s2)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "hf15 mix: err on sources: %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
if ( (foo=Image_compare_desc(s1, dst)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "hf15 mix: err on dest: %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
|
|||
|
for (y=0; y<s1->height; y++)
|
|||
|
{
|
|||
|
for (x=0; x<s1->width; x++)
|
|||
|
{
|
|||
|
h1 = Image_hf15_height(s1, x, y);
|
|||
|
h2 = Image_hf15_height(s2, x, y);
|
|||
|
hd = ((h1*k) + (h2*(10000-k))) / 10000;
|
|||
|
Image_hf15_plot(dst, x, y, hd);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "Image hf15 mix: done.\n");
|
|||
|
#endif
|
|||
|
|
|||
|
dst->modified = 1;
|
|||
|
|
|||
|
return FUNC_IS_BETA;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/*
|
|||
|
* new 5 Janvier 2003
|
|||
|
* il y a probablement des problemes d'overflow ici.
|
|||
|
*/
|
|||
|
int
|
|||
|
Image_hf15_mult_i(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst)
|
|||
|
{
|
|||
|
int foo, x, y, h1, h2, hd;
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(s1, s2)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "hf15 mult i: err on srces: %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
if ( (foo=Image_compare_desc(s1, dst)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "hf15 mult: err on dest: %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
|
|||
|
for (y=0; y<s1->height; y++)
|
|||
|
{
|
|||
|
for (x=0; x<s1->width; x++)
|
|||
|
{
|
|||
|
h1 = Image_hf15_height(s1, x, y);
|
|||
|
h2 = Image_hf15_height(s2, x, y);
|
|||
|
hd = (h1 * h2) / 32768;
|
|||
|
Image_hf15_plot(dst, x, y, hd);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
dst->modified = 1;
|
|||
|
|
|||
|
return FUNC_IS_BETA;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/* nouveau 17 novembre 2009 - avenue St Exupery */
|
|||
|
int
|
|||
|
Image_hf15_mult_k(Image_Desc *s, Image_Desc *d, float dk)
|
|||
|
{
|
|||
|
int foo, x, y, h1, h2;
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(s, d)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "hf15 mult k: error: %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
|
|||
|
for (y=0; y<s->height; y++)
|
|||
|
{
|
|||
|
for (x=0; x<s->width; x++)
|
|||
|
{
|
|||
|
h1 = Image_hf15_height(s, x, y);
|
|||
|
h2 = (int)( (float)h1 * dk );
|
|||
|
Image_hf15_plot(d, x, y, h2);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return FULL_NUCKED;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/* nouveau Juin 2008 - avenue St Exupery */
|
|||
|
int
|
|||
|
Image_hf15_div_i(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst)
|
|||
|
{
|
|||
|
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "%s ( %p %p %p )\n", __func__, s1, s2, dst);
|
|||
|
#endif
|
|||
|
|
|||
|
return FULL_NUCKED;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/* nouveau Juin 2008 - avenue St Exupery */
|
|||
|
int
|
|||
|
Image_hf15_sqrt(Image_Desc *src, Image_Desc *dst)
|
|||
|
{
|
|||
|
int x, y, h;
|
|||
|
int foo;
|
|||
|
float rh, mean_a;
|
|||
|
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "%s ( %p , %p )\n", __func__, src, dst);
|
|||
|
#endif
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(src, dst)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "hf15 sqrt: (failed) : %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
|
|||
|
mean_a = 0.0;
|
|||
|
|
|||
|
for (y=0; y<src->height; y++)
|
|||
|
{
|
|||
|
for (x=0; x<src->width; x++)
|
|||
|
{
|
|||
|
h = Image_hf15_height(src, x, y);
|
|||
|
if (h < 0)
|
|||
|
{
|
|||
|
fprintf(stderr, "WTF ! %s %p %d,%d %d\n",
|
|||
|
__func__,
|
|||
|
src, x, y, h);
|
|||
|
#if FORCE_ABORT
|
|||
|
fflush(stdout);
|
|||
|
abort();
|
|||
|
#endif
|
|||
|
}
|
|||
|
rh = (float)h / 32767.0;
|
|||
|
mean_a += rh; /* c'est quoi ? */
|
|||
|
h = (int)(sqrt(rh) * 32767.0);
|
|||
|
Image_hf15_plot(dst, x, y, h);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return FUNC_IS_BETA;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/* nouveau Novembre 2008 - avenue St Exupery */
|
|||
|
int
|
|||
|
Image_hf15_pow(Image_Desc *src, Image_Desc *dst, double p0w44)
|
|||
|
{
|
|||
|
int x, y, h;
|
|||
|
int foo;
|
|||
|
/* hu ho 27 jan 2010 : pourquoi on ne calcule pas en double precision ? */
|
|||
|
float rh;
|
|||
|
float minh, maxh;
|
|||
|
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "%s ( %p , %p, %g )\n", __func__, src, dst, p0w44);
|
|||
|
#endif
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(src, dst)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "%s : (fail) : %s\n", __func__, Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
minh = 999999.99;
|
|||
|
maxh = -999999.99;
|
|||
|
for (y=0; y<src->height; y++)
|
|||
|
{
|
|||
|
for (x=0; x<src->width; x++)
|
|||
|
{
|
|||
|
h = Image_hf15_height(src, x, y);
|
|||
|
rh = (float)h / 32768.0;
|
|||
|
rh = pow(rh, p0w44);
|
|||
|
if (rh < minh) minh = rh;
|
|||
|
if (rh > maxh) maxh = rh;
|
|||
|
h = (int)(rh * 32767.0);
|
|||
|
Image_hf15_plot(dst, x, y, h);
|
|||
|
}
|
|||
|
}
|
|||
|
fprintf(stderr, "%s -> %f %f\n", __func__, minh, maxh);
|
|||
|
|
|||
|
return FUNC_IS_BETA;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
int Image_hf15_exp1(Image_Desc *src, Image_Desc *dst)
|
|||
|
{
|
|||
|
int foo, x, y, h;
|
|||
|
/*
|
|||
|
* on va calculer en double precision, parce que je suis un dino et
|
|||
|
* que ma machine de dev ne connait pas 'expf'
|
|||
|
*/
|
|||
|
double rh;
|
|||
|
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "%s ( %p , %p )\n", __func__, src, dst);
|
|||
|
#endif
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(src, dst)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "%s : (fail) : %s\n", __func__, Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
|
|||
|
for (y=0; y<src->height; y++)
|
|||
|
{
|
|||
|
for (x=0; x<src->width; x++)
|
|||
|
{
|
|||
|
h = Image_hf15_height(src, x, y);
|
|||
|
rh = (double)h / 32768.0;
|
|||
|
rh = exp(rh) - 1.0;
|
|||
|
|
|||
|
h = (int)(rh * 32767.0);
|
|||
|
Image_hf15_plot(dst, x, y, h);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return FUNC_IS_ALPHA;
|
|||
|
}
|
|||
|
|
|||
|
int Image_hf15_exp2(Image_Desc *src, Image_Desc *dst)
|
|||
|
{
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "%s ( %p , %p )\n", __func__, src, dst);
|
|||
|
#endif
|
|||
|
return FULL_NUCKED;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
|