IIINSTRUMENT Pipeline Reference Manual 4.5.1
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
56visir_imglist *
57visir_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
68void
69visir_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
85void
86visir_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
101static void
102visir_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
110void
111visir_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
122void
123visir_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
133cpl_size
134visir_imglist_get_size(const visir_imglist * imgs)
135{
136 return imgs->_size;
137}
138
139cpl_image *
140visir_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
147cpl_error_code
148visir_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
157cpl_error_code
158visir_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
170void *
171visir_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
178void
179visir_imglist_set_mplist(visir_imglist * imgs, cpl_propertylist * mplist)
180{
181 imgs->mplist = mplist;
182}
183
184cpl_propertylist *
185visir_imglist_get_mplist(const visir_imglist * imgs)
186{
187 return imgs->mplist;
188}
189
190cpl_imagelist *
191visir_imglist_get_imglist(const visir_imglist * imgs)
192{
193 return imgs->imgs;
194}