28#include "hdrl_frameiter.h"
51 const cpl_frameset * frames;
57 intptr_t dim[MAX_DIM];
59 intptr_t pos[MAX_DIM];
61 intptr_t cnt[MAX_DIM];
63 intptr_t offsets[MAX_DIM];
65 intptr_t strides[MAX_DIM];
67 intptr_t axes[MAX_DIM];
70 hdrl_frameiter_data data;
71} hdrl_frameiter_state;
73static cpl_size hdrl_frameiter_length(hdrl_iter * it);
74static void hdrl_frameiter_delete(
void * it);
75static void * hdrl_frameiter_next(hdrl_iter * it);
113 intptr_t * axes, intptr_t * offsets, intptr_t * strides,
116 hdrl_frameiter_state * state = cpl_calloc(
sizeof(*state), 1);
117 state->frames = frames;
118 state->naxes = naxes;
122 state->dim[HDRL_FRAMEITER_AXIS_FRAME] = cpl_frameset_get_size(frames);
123 for (cpl_size i = 0; i < cpl_frameset_get_size(frames); i++) {
124 const cpl_frame * frm = cpl_frameset_get_position_const(frames, i);
125 const char * fn = cpl_frame_get_filename(frm);
126 cpl_size next = cpl_frame_get_nextensions(frm);
128 state->dim[HDRL_FRAMEITER_AXIS_EXT] = next + 1;
129 for (cpl_size j = 0; j < next + 1; j++) {
130 cpl_propertylist * plist =
131 cpl_propertylist_load_regexp(fn, j,
"NAXIS.*", 0);
132 if (!cpl_propertylist_has(plist,
"NAXIS")) {
133 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
"NO DATA");
135 state->naxes_max = HDRL_FRAMEITER_AXIS_EXT + cpl_propertylist_get_int(plist,
"NAXIS");
136 for (
int k = 0; k < cpl_propertylist_get_int(plist,
"NAXIS"); k++) {
137 char * buf = cpl_sprintf(
"NAXIS%d", k + 1);
138 state->dim[HDRL_FRAMEITER_AXIS_NAXIS1 + k] = cpl_propertylist_get_int(plist, buf);
141 cpl_propertylist_delete(plist);
144 if (state->naxes_max > HDRL_FRAMEITER_AXIS_NAXIS2 ||
145 naxes > HDRL_FRAMEITER_AXIS_NAXIS2) {
146 cpl_error_set_message(cpl_func, CPL_ERROR_UNSUPPORTED_MODE,
149 if (cpl_error_get_code()) {
155 for (intptr_t i = 0; i < naxes; i++) {
156 intptr_t offset = offsets == NULL ? 0 : offsets[i];
157 intptr_t stride = strides == NULL ? 1 : strides[i];
158 state->pos[axes[i]] = offset;
159 state->offsets[axes[i]] = offset;
160 state->strides[axes[i]] = stride;
161 if (dims && dims[i] > 0) {
163 state->dim[axes[i]] = dims[i];
166 state->dim[axes[i]] -= offset;
168 if (state->dim[axes[i]] % stride) {
169 state->dim[axes[i]] /= stride;
170 state->dim[axes[i]] += 1;
173 state->dim[axes[i]] /= stride;
177 state->axes[i] = axes[i];
179 return hdrl_iter_init(&hdrl_frameiter_next, NULL,
180 &hdrl_frameiter_length,
181 &hdrl_frameiter_delete,
182 HDRL_ITER_INPUT | HDRL_ITER_IMAGE | flags, state);
185static cpl_size hdrl_frameiter_length(hdrl_iter * it)
187 hdrl_frameiter_state * state = hdrl_iter_state(it);
189 for (intptr_t i = 0; i < state->naxes; i++) {
190 sz *= state->dim[state->axes[i]];
195static void hdrl_frameiter_delete(
void * it)
199 hdrl_frameiter_state * state = hdrl_iter_state(it);
200 if (hdrl_iter_check(it, HDRL_ITER_OWNS_DATA)) {
201 cpl_image_delete(state->data.image);
202 cpl_propertylist_delete(state->data.plist);
207static cpl_boolean hdrl_frameiter_done(hdrl_iter * it)
209 hdrl_frameiter_state * state = hdrl_iter_state(it);
210 return state->index >= hdrl_frameiter_length(it);
213static void get_data(hdrl_frameiter_state * state)
215 if (state->naxes == 2 && state->naxes_max == HDRL_FRAMEITER_AXIS_NAXIS2) {
217 if (state->axes[0] <= HDRL_FRAMEITER_AXIS_EXT &&
218 state->axes[1] <= HDRL_FRAMEITER_AXIS_EXT ){
220 cpl_msg_debug(cpl_func,
"Getting frame %zd, ext %zd",
221 state->pos[HDRL_FRAMEITER_AXIS_FRAME],
222 state->pos[HDRL_FRAMEITER_AXIS_EXT]);
224 const cpl_frame *frm = cpl_frameset_get_position_const(
225 state->frames, state->pos[HDRL_FRAMEITER_AXIS_FRAME]);
227 state->data.image = cpl_image_load(cpl_frame_get_filename(frm),
228 CPL_TYPE_UNSPECIFIED, 0, state->pos[HDRL_FRAMEITER_AXIS_EXT]);
230 state->data.plist = cpl_propertylist_load(
231 cpl_frame_get_filename(frm), state->pos[HDRL_FRAMEITER_AXIS_EXT]);
234 cpl_error_set_message(cpl_func, CPL_ERROR_UNSUPPORTED_MODE,
"UNSUPPORTED MODE");
237 }
else if (state->naxes == 1 &&
238 state->axes[0] == HDRL_FRAMEITER_AXIS_FRAME ){
243 const cpl_frame * frm = cpl_frameset_get_position_const(
244 state->frames, state->pos[HDRL_FRAMEITER_AXIS_FRAME]);
246 state->data.image = cpl_image_load(
247 cpl_frame_get_filename(frm), CPL_TYPE_UNSPECIFIED, 0, 0);
249 state->data.plist = cpl_propertylist_load(
250 cpl_frame_get_filename(frm), 0);
252 }
else if (state->naxes == 1 &&
253 state->axes[0] == HDRL_FRAMEITER_AXIS_EXT ){
255 cpl_msg_debug(cpl_func,
"Getting frame 0, ext %zd",
256 state->pos[HDRL_FRAMEITER_AXIS_EXT]);
258 const cpl_frame * frm = cpl_frameset_get_position_const(
261 state->data.image = cpl_image_load(cpl_frame_get_filename(frm),
262 CPL_TYPE_UNSPECIFIED, 0, state->pos[HDRL_FRAMEITER_AXIS_EXT]);
264 state->data.plist = cpl_propertylist_load(cpl_frame_get_filename(frm),
265 state->pos[HDRL_FRAMEITER_AXIS_EXT]);
268 cpl_error_set_message(cpl_func, CPL_ERROR_UNSUPPORTED_MODE,
"UNSUPPORTED MODE");
272static void * hdrl_frameiter_next(hdrl_iter * it)
274 hdrl_frameiter_state * state = hdrl_iter_state(it);
278 for (intptr_t i = state->naxes - 1; state->index > 0 && i >= 0; i--) {
279 intptr_t idx = state->axes[i];
280 if (state->cnt[idx] + 1 < state->dim[idx]) {
282 state->pos[idx] += state->strides[idx];
287 state->pos[idx] = state->offsets[idx];
291 if (hdrl_iter_check(it, HDRL_ITER_OWNS_DATA)) {
292 cpl_image_delete(state->data.image);
293 cpl_propertylist_delete(state->data.plist);
294 state->data.image = NULL;
295 state->data.plist = NULL;
298 if (hdrl_frameiter_done(it)) {
hdrl_iter * hdrl_frameiter_new(const cpl_frameset *frames, hdrl_iter_flags flags, intptr_t naxes, intptr_t *axes, intptr_t *offsets, intptr_t *strides, intptr_t *dims)
create iterator over cpl_frameset