GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: src/hoover/methodsHoover.c Lines: 0 100 0.0 %
Date: 2017-05-26 Branches: 0 88 0.0 %

Line Branch Exec Source
1
/*
2
  Teem: Tools to process and visualize scientific data and images             .
3
  Copyright (C) 2013, 2012, 2011, 2010, 2009  University of Chicago
4
  Copyright (C) 2008, 2007, 2006, 2005  Gordon Kindlmann
5
  Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998  University of Utah
6
7
  This library is free software; you can redistribute it and/or
8
  modify it under the terms of the GNU Lesser General Public License
9
  (LGPL) as published by the Free Software Foundation; either
10
  version 2.1 of the License, or (at your option) any later version.
11
  The terms of redistributing and/or modifying this software also
12
  include exceptions to the LGPL that facilitate static linking.
13
14
  This library is distributed in the hope that it will be useful,
15
  but WITHOUT ANY WARRANTY; without even the implied warranty of
16
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
  Lesser General Public License for more details.
18
19
  You should have received a copy of the GNU Lesser General Public License
20
  along with this library; if not, write to Free Software Foundation, Inc.,
21
  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22
*/
23
24
#include "hoover.h"
25
26
hooverContext *
27
hooverContextNew() {
28
  hooverContext *ctx;
29
30
  ctx = (hooverContext *)calloc(1, sizeof(hooverContext));
31
  if (ctx) {
32
    ctx->cam = limnCameraNew();
33
    ELL_3V_SET(ctx->volSize, 0, 0, 0);
34
    ELL_3V_SET(ctx->volSpacing, AIR_NAN, AIR_NAN, AIR_NAN);
35
    ctx->volCentering = hooverDefVolCentering;
36
    ctx->shape = NULL;
37
    ctx->imgSize[0] = ctx->imgSize[1] = 0;
38
    ctx->imgCentering = hooverDefImgCentering;
39
    ctx->user = NULL;
40
    ctx->numThreads = 1;
41
    ctx->workIdx = 0;
42
    ctx->workMutex = NULL;
43
    ctx->renderBegin = hooverStubRenderBegin;
44
    ctx->threadBegin = hooverStubThreadBegin;
45
    ctx->rayBegin = hooverStubRayBegin;
46
    ctx->sample = hooverStubSample;
47
    ctx->rayEnd = hooverStubRayEnd;
48
    ctx->threadEnd = hooverStubThreadEnd;
49
    ctx->renderEnd = hooverStubRenderEnd;
50
  }
51
  return(ctx);
52
}
53
54
int
55
hooverContextCheck(hooverContext *ctx) {
56
  static const char me[]="hooverContextCheck";
57
  int sxe, sye, sze, minSize, centr;
58
59
  if (!ctx) {
60
    biffAddf(HOOVER, "%s: got NULL pointer", me);
61
    return 1;
62
  }
63
  if (airEnumValCheck(nrrdCenter, ctx->imgCentering)) {
64
    biffAddf(HOOVER, "%s: pixel centering (%d) invalid",
65
             me, ctx->imgCentering);
66
    return 1;
67
  }
68
  centr = (ctx->shape ? ctx->shape->center : ctx->volCentering);
69
  if (airEnumValCheck(nrrdCenter, centr)) {
70
    biffAddf(HOOVER, "%s: voxel centering (%d) invalid", me, centr);
71
    return 1;
72
  }
73
  if (limnCameraAspectSet(ctx->cam,
74
                          ctx->imgSize[0], ctx->imgSize[1], ctx->imgCentering)
75
      || limnCameraUpdate(ctx->cam)) {
76
    biffMovef(HOOVER, LIMN, "%s: trouble setting up camera", me);
77
    return 1;
78
  }
79
  if (ctx->shape) {
80
    if (!ELL_4M_EXISTS(ctx->shape->ItoW)) {
81
      biffAddf(HOOVER, "%s: given shape doesn't seem to be set", me);
82
      return 1;
83
    }
84
  } else {
85
    minSize = (nrrdCenterCell == centr ? 1 : 2);
86
    if (!(ctx->volSize[0] >= minSize
87
          && ctx->volSize[1] >= minSize
88
          && ctx->volSize[2] >= minSize)) {
89
      biffAddf(HOOVER, "%s: volume dimensions (%dx%dx%d) too small", me,
90
               ctx->volSize[0], ctx->volSize[1], ctx->volSize[2]);
91
      return 1;
92
    }
93
    sxe = AIR_EXISTS(ctx->volSpacing[0]);
94
    sye = AIR_EXISTS(ctx->volSpacing[1]);
95
    sze = AIR_EXISTS(ctx->volSpacing[2]);
96
    if (!sxe && !sye && !sze) {
97
      /* none of the incoming spacings existed, we'll go out on a limb
98
         and assume unit spacing */
99
      ctx->volSpacing[0] = nrrdDefaultSpacing;
100
      ctx->volSpacing[1] = ctx->volSpacing[2] = ctx->volSpacing[0];
101
      fprintf(stderr, "%s: WARNING: assuming spacing %g for all axes\n",
102
              me, ctx->volSpacing[0]);
103
      /* HEY : nrrdDefaultSpacing need not be the same as gageParm's
104
         defaultSpacing, but we don't know anything about gage here,
105
         so what else can we do? */
106
    } else if (sxe && sye && sze) {
107
      /* all existed */
108
      if (!(ctx->volSpacing[0] > 0.0
109
            && ctx->volSpacing[1] > 0.0
110
            && ctx->volSpacing[2] > 0.0)) {
111
        biffAddf(HOOVER, "%s: volume spacing (%gx%gx%g) invalid", me,
112
                 ctx->volSpacing[0], ctx->volSpacing[1], ctx->volSpacing[2]);
113
        return 1;
114
      }
115
    } else {
116
      /* some existed, some didn't */
117
      biffAddf(HOOVER, "%s: spacings %g, %g, %g don't all exist or not", me,
118
               ctx->volSpacing[0], ctx->volSpacing[1], ctx->volSpacing[2]);
119
      return 1;
120
    }
121
  }
122
  if (!(ctx->imgSize[0] > 0 && ctx->imgSize[1] > 0)) {
123
    biffAddf(HOOVER, "%s: image dimensions (%dx%d) invalid", me,
124
             ctx->imgSize[0], ctx->imgSize[1]);
125
    return 1;
126
  }
127
  if (!(ctx->numThreads >= 1)) {
128
    biffAddf(HOOVER, "%s: number threads (%d) invalid", me, ctx->numThreads);
129
    return 1;
130
  }
131
  if (!(ctx->numThreads <= HOOVER_THREAD_MAX)) {
132
    biffAddf(HOOVER, "%s: sorry, number threads (%d) > max (%d)", me,
133
             ctx->numThreads, HOOVER_THREAD_MAX);
134
    return 1;
135
  }
136
  if (!ctx->renderBegin) {
137
    biffAddf(HOOVER, "%s: need a non-NULL begin rendering callback", me);
138
    return 1;
139
  }
140
  if (!ctx->rayBegin) {
141
    biffAddf(HOOVER, "%s: need a non-NULL begin ray callback", me);
142
    return 1;
143
  }
144
  if (!ctx->threadBegin) {
145
    biffAddf(HOOVER, "%s: need a non-NULL begin thread callback", me);
146
    return 1;
147
  }
148
  if (!ctx->sample) {
149
    biffAddf(HOOVER, "%s: need a non-NULL sampler callback function", me);
150
    return 1;
151
  }
152
  if (!ctx->rayEnd) {
153
    biffAddf(HOOVER, "%s: need a non-NULL end ray callback", me);
154
    return 1;
155
  }
156
  if (!ctx->threadEnd) {
157
    biffAddf(HOOVER, "%s: need a non-NULL end thread callback", me);
158
    return 1;
159
  }
160
  if (!ctx->renderEnd) {
161
    biffAddf(HOOVER, "%s: need a non-NULL end render callback", me);
162
    return 1;
163
  }
164
165
  return 0;
166
}
167
168
void
169
hooverContextNix(hooverContext *ctx) {
170
171
  if (ctx) {
172
    limnCameraNix(ctx->cam);
173
    /* workMutex is cleaned up at end of render */
174
    free(ctx);
175
  }
176
}
177