44#include "config_hdf.h"
62inline int min(
int t1,
int t2)
64 return (t1 < t2 ? t1 : t2);
68void hdfistream_gri::_init(
void)
70 _ri_id = _attr_index = _pal_index = 0;
71 _npals = _nri = _nattrs = _nfattrs = _gr_id = _file_id = 0;
72 _index = _interlace_mode = -1;
73 _meta = _slab.set =
false;
78void hdfistream_gri::_get_fileinfo(
void)
80 if (GRfileinfo(_gr_id, &_nri, &_nfattrs) < 0)
86void hdfistream_gri::_get_iminfo(
void)
88 char junk0[hdfclass::MAXSTR];
89 int32 junk1, junk2, junk3, junk4[2];
90 if (GRgetiminfo(_ri_id, junk0, &junk1, &junk2, &junk3, junk4, &_nattrs)
94 GRgetlutinfo(GRgetlutid(_ri_id, 0), &junk1, &junk2, &junk3,
105void hdfistream_gri::_close_ri(
void)
109 _ri_id = _attr_index = _pal_index = _nattrs = 0;
116hdfistream_gri::hdfistream_gri(
const string& filename):
hdfistream_obj
120 if (_filename.size() != 0)
121 hdfistream_gri::open(_filename.c_str());
126void hdfistream_gri::open(
const char *filename)
128 if (filename ==
nullptr)
129 THROW(hcerr_openfile);
132 if ((_file_id = Hopen((
char *) filename, DFACC_RDONLY, 0)) < 0)
133 THROW(hcerr_openfile);
134 _filename = filename;
135 if ((_gr_id = GRstart(_file_id)) < 0)
136 THROW(hcerr_openfile);
143void hdfistream_gri::close(
void)
150 _file_id = _gr_id = 0;
156void hdfistream_gri::seek(
int index)
158 if (_filename.size() == 0)
159 THROW(hcerr_invstream);
162 _ri_id = GRselect(_gr_id, _index);
163 if (!eos() && !bos())
168void hdfistream_gri::seek(
const char *name)
170 if (_filename.size() == 0)
171 THROW(hcerr_invstream);
172 int32 index = GRnametoindex(_gr_id, (
char *) name);
177void hdfistream_gri::seek_ref(
int ref)
179 if (_filename.size() == 0)
180 THROW(hcerr_invstream);
181 int32 index = GRreftoindex(_gr_id, (uint16)ref);
186void hdfistream_gri::rewind(
void)
188 if (_filename.size() == 0)
189 THROW(hcerr_invstream);
196bool hdfistream_gri::bos(
void)
const
198 if (_filename.size() == 0)
199 THROW(hcerr_invstream);
210bool hdfistream_gri::eos(
void)
const
212 if (_filename.size() == 0)
213 THROW(hcerr_invstream);
220 return (_index >= _nri);
226bool hdfistream_gri::eo_attr(
void)
const
228 if (_filename.size() == 0)
229 THROW(hcerr_invstream);
234 return (_attr_index >= _nfattrs);
236 return (_attr_index >= _nattrs);
241void hdfistream_gri::setinterlace(int32 interlace_mode)
243 if (interlace_mode == MFGR_INTERLACE_PIXEL ||
244 interlace_mode == MFGR_INTERLACE_COMPONENT ||
245 interlace_mode == MFGR_INTERLACE_LINE)
246 _interlace_mode = interlace_mode;
248 THROW(hcerr_interlace);
253bool hdfistream_gri::eo_pal(
void)
const
255 if (_filename.size() == 0)
256 THROW(hcerr_invstream);
263 return (_pal_index >= _npals);
268void hdfistream_gri::setslab(vector < int >start, vector < int >edge,
269 vector < int >stride,
bool reduce_rank)
272 if (start.size() != edge.size() || edge.size() != stride.size() ||
274 THROW(hcerr_invslab);
276 if (start.size() == 3) {
278 start.erase(start.begin());
279 edge.erase(edge.begin());
280 stride.erase(stride.begin());
283 for (
int i = 0; i < 2; ++i) {
285 THROW(hcerr_invslab);
287 THROW(hcerr_invslab);
289 THROW(hcerr_invslab);
292 _slab.start[1 - i] = start[i];
293 _slab.edge[1 - i] = edge[i];
294 _slab.stride[1 - i] = stride[i];
297 _slab.reduce_rank = reduce_rank;
303 if (_filename.size() == 0)
304 THROW(hcerr_invstream);
306 hr.palettes = vector < hdf_palette > ();
307 hr.attrs = vector < hdf_attr > ();
308 hr.image = hdf_genvec();
315 char name[hdfclass::MAXSTR];
322 (_ri_id, name, &ncomp, &data_type, &il, dim_sizes, &nattrs) < 0)
323 THROW(hcerr_griinfo);
324 hr.ref = GRidtoref(_ri_id);
326 hr.dims[0] = dim_sizes[0];
327 hr.dims[1] = dim_sizes[1];
329 if (_interlace_mode == -1) {
334 *
this >> hr.palettes;
337 hr.image.import_vec(data_type);
342 nelts = _slab.edge[0] * _slab.edge[1] * ncomp;
344 int imagesize = nelts * DFKNTsize(data_type);
345 image =
new char[imagesize];
346 if (image ==
nullptr)
347 THROW(hcerr_nomemory);
349 GRreqimageil(_ri_id, _interlace_mode);
351 cerr <<
"ncomp: " << ncomp <<
" imagesize: " << imagesize <<
353 cerr <<
"_slab.start = " << _slab.start[0] <<
"," << _slab.
354 start[1] <<
" _slab.edge = " << _slab.
355 edge[0] <<
"," << _slab.
356 edge[1] <<
" _slab.stride = " << _slab.
357 stride[0] <<
"," << _slab.stride[1] << endl;
360 (_ri_id, _slab.start, _slab.stride, _slab.edge,
363 THROW(hcerr_griread);
367 zero[0] = zero[1] = 0;
368 nelts = dim_sizes[0] * dim_sizes[1] * ncomp;
370 int imagesize = nelts * DFKNTsize(data_type);
371 image =
new char[imagesize];
372 if (image ==
nullptr)
373 THROW(hcerr_nomemory);
375 GRreqimageil(_ri_id, _interlace_mode);
377 cerr <<
"dim_sizes[0] = " << dim_sizes[0] <<
" dim_sizes[1] = "
378 << dim_sizes[1] << endl;
380 if (GRreadimage(_ri_id, zero,
nullptr, dim_sizes, image) < 0) {
382 THROW(hcerr_griread);
385 hr.image.import_vec(data_type, image, nelts);
393hdfistream_gri & hdfistream_gri::operator>>(vector < hdf_gri > &hrv)
395 for (hdf_gri gri; !eos();) {
405 if (_filename.size() == 0)
406 THROW(hcerr_invstream);
418 char name[hdfclass::MAXSTR];
421 if (GRattrinfo(
id, _attr_index, name, &number_type, &count) < 0)
422 THROW(hcerr_griinfo);
425 data =
new char[count * DFKNTsize(number_type)];
427 THROW(hcerr_nomemory);
429 if (GRgetattr(
id, _attr_index, data) < 0) {
431 THROW(hcerr_griinfo);
435 if (number_type == DFNT_CHAR)
436 count = (int32) min((
int) count, (
int) strlen((
char *) data));
438 ha.values.import_vec(number_type, data, count);
447hdfistream_gri & hdfistream_gri::operator>>(vector < hdf_attr > &hav)
449 for (hdf_attr att; !eo_attr();) {
459 if (_filename.size() == 0)
460 THROW(hcerr_invstream);
465 if ((pal_id = GRgetlutid(_ri_id, _pal_index)) < 0)
466 THROW(hcerr_griinfo);
468 int32 ncomp = 0, number_type = 0, num_entries = 0, junk0;
469 if (GRgetlutinfo(pal_id, &ncomp, &number_type, &junk0, &num_entries) <
471 THROW(hcerr_griinfo);
474 hp.num_entries = num_entries;
479 if (number_type == DFNT_UCHAR8)
480 number_type = DFNT_UINT8;
482 int32 count = ncomp * num_entries;
483 if (number_type != 0) {
485 pal_data =
new char[count * DFKNTsize(number_type)];
486 if (pal_data ==
nullptr)
487 THROW(hcerr_nomemory);
489 GRreqlutil(pal_id, MFGR_INTERLACE_PIXEL);
490 if (GRreadlut(pal_id, pal_data) < 0) {
492 THROW(hcerr_griinfo);
494 hp.table.import_vec(number_type, pal_data, count);
502hdfistream_gri & hdfistream_gri::operator>>(vector < hdf_palette > &hpv)
504 for (hdf_palette pal; !eo_pal();) {
514bool hdf_gri::_ok()
const
518 bool ok = (dims[0] * dims[1] * num_comp == image.size());
522 for (
int i = 0; i < int (palettes.size()) && ok; i++)
523 ok = (palettes[i].ncomp * palettes[i].num_entries ==
524 palettes[i].table.size());