VISIR Pipeline Reference Manual  4.1.7
visir_imglist.c
1 /* $Id: visir_imglist.c,v 1.8 2013-03-22 16:20:04 jtaylor Exp $
2  *
3  * This file is part of the VISIR Pipeline
4  * Copyright (C) 2012 European Southern Observatory
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA
19  */
20 
21 /*
22  * $Author: jtaylor $
23  * $Date: 2013-03-22 16:20:04 $
24  * $Revision: 1.8 $
25  * $Name: not supported by cvs2svn $
26  */
27 
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31 
32 /*-----------------------------------------------------------------------------
33  Includes
34  -----------------------------------------------------------------------------*/
35 
36 #include <cpl.h>
37 
38 #include "visir_utils.h"
39 
40 #include <string.h>
41 #include <assert.h>
42 
43 /*-----------------------------------------------------------------------------
44  Define
45  -----------------------------------------------------------------------------*/
46 
47 /*----------------------------------------------------------------------------*/
53 /*----------------------------------------------------------------------------*/
54 
55 
57 visir_imglist_new(const cpl_size capacity, cpl_propertylist * mplist)
58 {
59  visir_imglist * l = cpl_calloc(1, sizeof(visir_imglist));
60  l->_capacity = capacity <= 0 ? 1 : capacity;
61  l->_size = 0;
62  l->auxdata = cpl_calloc(l->_capacity, sizeof(void*));;
63  l->mplist = mplist;
64  l->imgs = cpl_imagelist_new();
65  return l;
66 }
67 
68 void
69 visir_imglist_delete(visir_imglist * l, visir_free aux_destructor)
70 {
71  if (l != NULL) {
72  cpl_imagelist_delete(l->imgs);
73  if (aux_destructor)
74  for (cpl_size i = 0; i < visir_imglist_get_size(l); i++) {
75  void * data = visir_imglist_get_data(l, i);
76  if (data)
77  aux_destructor(data);
78  }
79  cpl_free(l->auxdata);
80 
81  cpl_free(l);
82  }
83 }
84 
85 void
86 visir_imglist_unwrap(visir_imglist * l, visir_free aux_destructor)
87 {
88  if (l != NULL) {
89  visir_imagelist_unwrap(l->imgs);
90  if (aux_destructor)
91  for (cpl_size i = 0; i < visir_imglist_get_size(l); i++) {
92  void * data = visir_imglist_get_data(l, i);
93  if (data)
94  aux_destructor(data);
95  }
96  cpl_free(l->auxdata);
97  cpl_free(l);
98  }
99 }
100 
101 static void
102 visir_imglist_resize(visir_imglist *imgs, const cpl_size n)
103 {
104  if (n < imgs->_capacity)
105  return;
106  imgs->auxdata = cpl_realloc(imgs->auxdata, n * sizeof(void *));
107  imgs->_capacity = n;
108 }
109 
110 void
111 visir_imglist_append(visir_imglist * l, cpl_image * img,
112  void *auxdata)
113 {
114  if (l->_size == l->_capacity)
115  visir_imglist_resize(l, l->_capacity * 2);
116  cpl_imagelist_set(l->imgs, img, cpl_imagelist_get_size(l->imgs));
117  l->auxdata[l->_size] = auxdata;
118  l->_size++;
119  assert(l->_size == cpl_imagelist_get_size(l->imgs));
120 }
121 
122 void
123 visir_imglist_append_imglist(visir_imglist * l, cpl_imagelist * imgs,
124  void ** auxdata)
125 {
126  for (cpl_size i = 0; i < cpl_imagelist_get_size(imgs); i++) {
127  void * data = auxdata == NULL ? NULL : auxdata[i];
128  cpl_image * img = cpl_imagelist_get(imgs, i);
129  visir_imglist_append(l, cpl_image_duplicate(img), data);
130  }
131 }
132 
133 cpl_size
134 visir_imglist_get_size(const visir_imglist * imgs)
135 {
136  return imgs->_size;
137 }
138 
139 cpl_image *
140 visir_imglist_get_img(const visir_imglist * imgs, const cpl_size index)
141 {
142  cpl_ensure(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
143  cpl_ensure(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
144  return cpl_imagelist_get(imgs->imgs, index);
145 }
146 
147 cpl_error_code
148 visir_imglist_set_data(visir_imglist * imgs,
149  const cpl_size index, void * auxdata)
150 {
151  cpl_ensure_code(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE);
152  cpl_ensure_code(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
153  imgs->auxdata[index] = auxdata;
154  return CPL_ERROR_NONE;
155 }
156 
157 cpl_error_code
158 visir_imglist_get(const visir_imglist * imgs, const cpl_size index,
159  cpl_image ** img, void ** auxdata)
160 {
161  cpl_ensure_code(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE);
162  cpl_ensure_code(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
163  if (img)
164  *img = visir_imglist_get_img(imgs, index);
165  if (auxdata)
166  *auxdata = visir_imglist_get_data(imgs, index);
167  return CPL_ERROR_NONE;
168 }
169 
170 void *
171 visir_imglist_get_data(const visir_imglist * imgs, const cpl_size index)
172 {
173  cpl_ensure(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
174  cpl_ensure(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
175  return imgs->auxdata[index];
176 }
177 
178 void
179 visir_imglist_set_mplist(visir_imglist * imgs, cpl_propertylist * mplist)
180 {
181  imgs->mplist = mplist;
182 }
183 
184 cpl_propertylist *
185 visir_imglist_get_mplist(const visir_imglist * imgs)
186 {
187  return imgs->mplist;
188 }
189 
190 cpl_imagelist *
191 visir_imglist_get_imglist(const visir_imglist * imgs)
192 {
193  return imgs->imgs;
194 }