File: gsdiff.c

package info (click to toggle)
grass 6.0.2-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 40,044 kB
  • ctags: 31,303
  • sloc: ansic: 321,125; tcl: 25,676; sh: 11,176; cpp: 10,098; makefile: 5,025; fortran: 1,846; yacc: 493; lex: 462; perl: 133; sed: 1
file content (74 lines) | stat: -rw-r--r-- 1,628 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
* $Id: gsdiff.c,v 2.0 2004/11/09 12:30:45 bernhard Exp $
*/

/*  gsdiff.c
    Bill Brown, USACERL  
    November 1994
routines to set up automatic on-the-fly recalculation
of surface elevations, doing a "scaled difference" using another
surface for reference

Note that we're using a true difference here, between data set values,
no translations, etc.

TODO: generalize this concept to allow transform functions which are
dependent on surfaces that are dependent on other surfaces, etc., as long
as the dependency doesn't loop back.

*/

#include <stdio.h>

#include "gstypes.h"
#include "gsget.h"

static geosurf *Refsurf = NULL;
static typbuff *Refbuff = NULL;
static float Refscale = 1.0;

/***********************************************************************/
void gsdiff_set_SDscale(float scale)
{
    Refscale = scale;

    return;
}

/***********************************************************************/
float gsdiff_get_SDscale(void)
{
    return (Refscale);
}

/***********************************************************************/
void gsdiff_set_SDref(geosurf * gsref)
{
    Refsurf = gsref;
    Refbuff = gs_get_att_typbuff(gsref, ATT_TOPO, 0);

    return;
}

/***********************************************************************/
geosurf *gsdiff_get_SDref(void)
{
    if (Refsurf && Refbuff) {
	return (Refsurf);
    }

    return (NULL);
}

/***********************************************************************/
float gsdiff_do_SD(float val, int offset)
{
    float ref;

    if (Refbuff) {
	GET_MAPATT(Refbuff, offset, ref);
	return (ref + (val - ref) * Refscale);
    }

    return (val);
}