00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032
00033
00034
00035
00036 #include <cpl.h>
00037
00038 #include "visir_utils.h"
00039
00040 #include <string.h>
00041 #include <assert.h>
00042
00043
00044
00045
00046
00047
00053
00054
00055
00056 visir_imglist *
00057 visir_imglist_new(const cpl_size capacity, cpl_propertylist * mplist)
00058 {
00059 visir_imglist * l = cpl_calloc(1, sizeof(visir_imglist));
00060 l->_capacity = capacity <= 0 ? 1 : capacity;
00061 l->_size = 0;
00062 l->auxdata = cpl_calloc(l->_capacity, sizeof(void*));;
00063 l->mplist = mplist;
00064 l->imgs = cpl_imagelist_new();
00065 return l;
00066 }
00067
00068 void
00069 visir_imglist_delete(visir_imglist * l, visir_free aux_destructor)
00070 {
00071 if (l != NULL) {
00072 cpl_imagelist_delete(l->imgs);
00073 if (aux_destructor)
00074 for (cpl_size i = 0; i < visir_imglist_get_size(l); i++) {
00075 void * data = visir_imglist_get_data(l, i);
00076 if (data)
00077 aux_destructor(data);
00078 }
00079 cpl_free(l->auxdata);
00080
00081 cpl_free(l);
00082 }
00083 }
00084
00085 void
00086 visir_imglist_unwrap(visir_imglist * l, visir_free aux_destructor)
00087 {
00088 if (l != NULL) {
00089 visir_imagelist_unwrap(l->imgs);
00090 if (aux_destructor)
00091 for (cpl_size i = 0; i < visir_imglist_get_size(l); i++) {
00092 void * data = visir_imglist_get_data(l, i);
00093 if (data)
00094 aux_destructor(data);
00095 }
00096 cpl_free(l->auxdata);
00097 cpl_free(l);
00098 }
00099 }
00100
00101 static void
00102 visir_imglist_resize(visir_imglist *imgs, const cpl_size n)
00103 {
00104 if (n < imgs->_capacity)
00105 return;
00106 imgs->auxdata = cpl_realloc(imgs->auxdata, n * sizeof(void *));
00107 imgs->_capacity = n;
00108 }
00109
00110 void
00111 visir_imglist_append(visir_imglist * l, cpl_image * img,
00112 void *auxdata)
00113 {
00114 if (l->_size == l->_capacity)
00115 visir_imglist_resize(l, l->_capacity * 2);
00116 cpl_imagelist_set(l->imgs, img, cpl_imagelist_get_size(l->imgs));
00117 l->auxdata[l->_size] = auxdata;
00118 l->_size++;
00119 assert(l->_size == cpl_imagelist_get_size(l->imgs));
00120 }
00121
00122 void
00123 visir_imglist_append_imglist(visir_imglist * l, cpl_imagelist * imgs,
00124 void ** auxdata)
00125 {
00126 for (cpl_size i = 0; i < cpl_imagelist_get_size(imgs); i++) {
00127 void * data = auxdata == NULL ? NULL : auxdata[i];
00128 cpl_image * img = cpl_imagelist_get(imgs, i);
00129 visir_imglist_append(l, cpl_image_duplicate(img), data);
00130 }
00131 }
00132
00133 cpl_size
00134 visir_imglist_get_size(const visir_imglist * imgs)
00135 {
00136 return imgs->_size;
00137 }
00138
00139 cpl_image *
00140 visir_imglist_get_img(const visir_imglist * imgs, const cpl_size index)
00141 {
00142 cpl_ensure(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
00143 cpl_ensure(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
00144 return cpl_imagelist_get(imgs->imgs, index);
00145 }
00146
00147 cpl_error_code
00148 visir_imglist_set_data(visir_imglist * imgs,
00149 const cpl_size index, void * auxdata)
00150 {
00151 cpl_ensure_code(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE);
00152 cpl_ensure_code(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
00153 imgs->auxdata[index] = auxdata;
00154 return CPL_ERROR_NONE;
00155 }
00156
00157 cpl_error_code
00158 visir_imglist_get(const visir_imglist * imgs, const cpl_size index,
00159 cpl_image ** img, void ** auxdata)
00160 {
00161 cpl_ensure_code(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE);
00162 cpl_ensure_code(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
00163 if (img)
00164 *img = visir_imglist_get_img(imgs, index);
00165 if (auxdata)
00166 *auxdata = visir_imglist_get_data(imgs, index);
00167 return CPL_ERROR_NONE;
00168 }
00169
00170 void *
00171 visir_imglist_get_data(const visir_imglist * imgs, const cpl_size index)
00172 {
00173 cpl_ensure(index < imgs->_size, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
00174 cpl_ensure(index >= 0, CPL_ERROR_ACCESS_OUT_OF_RANGE, NULL);
00175 return imgs->auxdata[index];
00176 }
00177
00178 void
00179 visir_imglist_set_mplist(visir_imglist * imgs, cpl_propertylist * mplist)
00180 {
00181 imgs->mplist = mplist;
00182 }
00183
00184 cpl_propertylist *
00185 visir_imglist_get_mplist(const visir_imglist * imgs)
00186 {
00187 return imgs->mplist;
00188 }
00189
00190 cpl_imagelist *
00191 visir_imglist_get_imglist(const visir_imglist * imgs)
00192 {
00193 return imgs->imgs;
00194 }