1 -----------------------------------------------------------------------------
2 Proposed Template of an entry in this TODO:
3 (Note: Date is the date of registering of first demand.)
14 -----------------------------------------------------------------------------
15 Description: gdcmJpeg8 is strictly a copy/paste of gdcmJpeg12.cxx.
19 We should write the code in a common place, then include this 'cxx' file so
20 the define from gdcm_mangle redefine to the proper one.
22 This will be usefull since I may need in the future a 16bits version of this
24 -----------------------------------------------------------------------------
25 Description: Change jpeg 'exit' call to standard c++ exception using the jpeg
32 -----------------------------------------------------------------------------
33 Description: Add kwsys as a subdir somewhere in gdcm
38 -----------------------------------------------------------------------------
43 Comments: ljpeg was rip from medcon and not the official one. medcon tried to
44 optimised function using MACRO (doh!), so it make its very unreadable and very
45 hard to fix warnings. Should go back to official source, copy proper copyright
46 and fix warnings on dashboard
47 13/10: update apparently no dicom toolkit use this lib as it is too buggy.
48 We should use the ls-patch for ijg instead. Thus we can safely get rid of that
50 14/10: PHILIPS_Gyroscan-12-MONO2-Jpeg_Lossless.dcm prove that I was right the
51 old Cornwell lib is buggy and does not read anything.
52 -----------------------------------------------------------------------------
53 Description: Extent reading support
57 Comments: All ITK/VTK readers support selecting extent. gdcm should support
58 selecting extent before being inserted into ITK
59 -----------------------------------------------------------------------------
60 Description: Generate new UID each time we write DICOM
64 Comments: According to DICOM ref a new UID should be created each we write a
65 DICOM images. I guess it should be an option so that we can still use md5sum to
66 check dicom file. The proposed way was:
67 http://www.creatis.insa-lyon.fr/pipermail/dcmlib/2004-September/000611.html
69 Bah, comme Win32 pose encore pb:
71 0000000 147 144 143 155 012
73 radical + 147.144.143.155 + IP + time()
75 -----------------------------------------------------------------------------
76 Description: [BUG] Better handling of unfound Dicom dictionary.
77 When gdcm doesn't find the Dicom dictionary (because it's
78 path to the directory of dictionary is uncorrect, either
79 because the install relative layout was broken after file moves
80 or because the environnement variable GDCM_DICT_PATH is
81 unpropely set), gdcm will:
83 2/ throw an exception (that is internaly UNcatched by gdcm)
84 that in most cases provoques the caller application to
85 exit uncleanly (uncatched excpetions in fine call abort() ).
86 Additionaly on Win32 the warning print isn't displayed because
87 exiting occurs prior to cerr or cout is flushed properly.
90 Details: fixes (from dirty to clean)
91 1/ force Win32 to flush it's buffer so at least the user gets some
92 reason why it's application exited (when called in command
93 environement). Note: it looks like the "cerr << flush" fails. Sigh.
94 2/ within gdcm catch the exception, display a decent warning, and
96 3/ see the comment below on how to enhance the API and fix things
98 Comments: ENH proposal:
99 The caller migth not be aware of the path to the dictionaries
100 on invocation of gdcm (think this path is set by the Interface
101 because the caller wants to skip the default gdcm dictionary in order
102 to provide his own ones e.g. another language based one).
103 Hence, gdcm should postpone the parsing of the default dictionary
104 instead of doing it on library entry.
105 This would enable two things:
106 - It would give a chance to the caller to set the path to
107 the dictionaries he whishes to use, through a call to
108 newly created DictSet::SetDictionaryPath( string ).
109 - It would avoid the burden of using the GDCM_DICT_PATH
110 environnement variable and enable GDCM CONTROL FROM WITHIN
111 THE API. Optionaly, if the caller didn't use the API to
112 provide his prefered path, gdcm could still default to
114 -----------------------------------------------------------------------------
115 Description: vtk/vtkGdcmReader doesn't positionate the normal to the image
118 Details: vtkGdcmReader::CheckFileCoherence() sets the DataOrigin[i]
119 but doesn't set the plane (image seen in 3D) normal (is it
120 possible any how). This plane normal could be extracted from
121 the "orientation" info of the gdcmHeader ( refer to
122 grep "Orientation" Dicts/dicomV3.dic).
123 Problem exhibiting this defect: cine loop on a pile of images
124 whose Origin is correct, but whose normal is not set will
127 * vtkGdcmReader inherits from vtkImageReader which aggregates
128 a vtkTranform. vtkGdcmReader could store (when the user requires
129 it, see below) the origin/normal taken from the Dicom Header
130 within this vtkTransform (looks like a natural place to store
131 this spacial information).
132 * Both settings of the origin and/OR the normal of the plane (image)
133 should be an option defined with a flag (On/Off) in the
135 -----------------------------------------------------------------------------
136 Description: Fix the Python wrappers
141 -----------------------------------------------------------------------------
142 Description: clean up gdcmFile/gdcmHeader relationship
146 * simplify the API for the user (no need to call GetImageData() before
148 * avoid memory leaks with with Pixel_Data.
150 -----------------------------------------------------------------------------
151 Description: remove all autotools references
156 -----------------------------------------------------------------------------
157 Description: introduce namespace "gdcm"
162 1/ Problem: using enum with name like 'Unknow' on .Net, or LP on cygwin
164 2/ Question: when introducing the namespace, should we remove the gdcm
165 prefix from classes or keep it ?
166 -----------------------------------------------------------------------------
167 Description: complete the doxygen Documentation
172 -----------------------------------------------------------------------------
173 Description: test the private dictionary part.
178 * Frog: where can we obtain such a private/dictionary and the corresponding
179 Dicom file ? Any examples on-line ?
180 -----------------------------------------------------------------------------
181 Description: fix definitively the memory leaks problems.
185 Comments: There is a nightly dashboard that run valgrind every night
186 (zorglub | GDCM-Linux-g++)
187 -----------------------------------------------------------------------------
188 Description: test gdcm on a big endian OS.
192 Comments: There is a nightly dashboard that run on MacOSX each nite
193 (midworld.kitwarein | GDCM-DarwinG5-g++ )
194 -----------------------------------------------------------------------------
195 Description: More tests !
199 * an example of new test could be to clone a Dicom image by
200 copying gdcmDocEntry one after the other
202 * look at traversal used in Example/FlatHashTablePrint.cxx
203 -----------------------------------------------------------------------------
204 Description: revoir la gestion des resources, win32 permet d'inclure des
205 fichiers texte (=dicomV3.dic) dans une dll ou quelquechose du genre.
210 * Frog: no comprendo !? De plus est-ce portable ?
211 * To improve load time it could be usefull to have the dictionary directly in
212 'c++' code or in a more binary format.
213 * This will also solve some issues where /dummy/ user did nor set
214 GDCM_DICT_PATH properly neither 'make install'
215 -----------------------------------------------------------------------------
216 Description: Convert the C-like IO to C++ IO:
220 remove all the C-oriented IO references like FILE*, fread...
221 and replace them with the C++ fstream notation.
222 Provide overload of operators << and >> for any gdcm class using file IO.
224 * Question: the underlying jpeg libraries (written in C) use the FILE*
225 notation. Is there a way to still use fstream in gdcm, and
226 build or pass the proper FILE* to jpeg libs ?
227 * Binary IO references are available at
228 http://www.angelfire.com/country/aldev0/cpphowto/cpp_BinaryFileIO.html
229 * The internal API should be rewritten so that gdcm speaking to jpeg lib is
230 done with stream/string and not directly opened FILE*
231 * No stdio.h anymore anywhere tolerated !
232 -----------------------------------------------------------------------------
233 Description: generate methods based on VM.
237 * cmake should parse le DICOM dictionary to generate methods like
238 gdcm???::SetImagePosition(int, int)
240 //generated content do not edit
243 gdcm???::SetImageNumber(int)
245 //generated content do not edit
249 * Regrain: a dicom dictionary entry name is NOT UNIQUE [this means
250 two tags=(group, element) can share the same name].
251 What should the wrapper do in such a case !?
252 * Frog: what does VM stand for ?
253 * VM = Value Multiplicity
254 -----------------------------------------------------------------------------
255 Description: Add information on supported imagers (constructor/model)
258 Details: in order to promote gdcm make a list (on the web pages)
259 of images successfully parsed based on a constructor/model ordering
260 Comments: * frog: gdcmData only lists pathological images. How to collect
261 the ones gdcm works smoothly with (hopefully gdcmData is a small
262 subset of what we would like).
263 -----------------------------------------------------------------------------
264 Description: Add a GetVersion() global function.
267 Details: This is to be used for version assertion with gdcmPython
269 -----------------------------------------------------------------------------
270 -----------------------------------------------------------------------------
271 * vtk/vtkGdcmHeader.cxx: if speed becomes a concern some changes can
272 be made at the cost of memory consumption (refer to header of
273 vtk/vtkGdcmHeader.cxx)
274 -----------------------------------------------------------------------------
275 * gdcmElValSet::SetElValueLengthByNumber IMNSHO should be trashed.
276 It's only purpose is a onliner substitute to calling GetElValueByNumber
277 and then SetLength. This only obfuscates the caller code more than
279 Besides the definition of gdcmElValSet::SetElValueLengthByNumber itself
280 it quite poor since it is a almost exact copy of
281 gdcmElValSet::GetElValueByNumber except for the returned code.
282 gdcmHeader::SetPubElValLengthByNumber (which is based on
283 gdcmElValSet::SetElValueLengthByNumber) is used nowhere...
284 -----------------------------------------------------------------------------
285 * Fix the bug in Test/bug1.cxx (see first comment line): Win32 only.
286 -----------------------------------------------------------------------------
287 * All (or at least many of) the methods of gdcmHeader whose only arguments
288 are an ElValue* (e.g. FindLength, FindVR, LoadElementValue...) can
289 be moved away to ElValue class on condition of transmitting the
290 gdcmHeader.fp attribute. This change should be considered since it
291 would allow those method to avoid artificial calls to ElValue::GetElement(),
293 -----------------------------------------------------------------------------
294 * Eat leading_trailing_whitespace (found in python/gdcmPython/gdcmi) should
295 be used when parsing the dictionary in C++ !
296 -----------------------------------------------------------------------------
297 * Group length is not a unique tag in a file. Hence avoid putting it
298 in the element values dictionary without doing something smarter
299 (say, instead of storing the length store the group and the length
300 so we can related a length to a group).
301 -----------------------------------------------------------------------------
302 * GetPubElValByNumber doit faire la difference entre chaine vide
303 et chaine pas touve''. Eventuellement raiser une exception ?
304 -----------------------------------------------------------------------------
305 * gdcmHeader::LoadElements only loads the element whose length is
306 below the specified size. When accessing the value of such an element
307 the content is unfound ! Find a decent way of loading the value on
309 -----------------------------------------------------------------------------
310 * JPR: fournir une method qui ne fait que lire les elements passes en arguments
311 sous forme d'une liste.
312 -----------------------------------------------------------------------------
313 * JPR: gdcmHeader::CheckSwap() dans le cas ACR pas propre, degager tout de
314 suite si on a deduit que c'en est pas...
315 -----------------------------------------------------------------------------
316 * python /usr/lib/python2.2/site-packages/DaVaW/demo/dvwDcmReader.py
317 and load image /home/frog/cvs/DCMlib/Data/CT-MONO2-16-ankle.dcm
318 will yield wrong coloring scheme as opposed to
319 affim filein=/home/frog/cvs/DCMlib/Data/CT-MONO2-16-ankle.dcm
320 -----------------------------------------------------------------------------
321 * gdcmFile should implement the following API:
323 WriteDicom.SetFileName("MyDicomFile.dcm");
324 string * AllTags = gdcmHeader.GetDcmTagNames();
325 WriteDicom.SetDcmTag(AllTags[5], "253");
326 WriteDicom.SetDcmTag("Patient Name", "bozo");
327 WriteDicom.SetDcmTag("Patient Name", "bozo");
328 WriteDicom.SetImageData(Image);
331 Anonymize(ostream& output) {
332 a = gdcmFile("toto1");
333 a.SetPubValueByName("Patient Name", "");
334 a.SetPubValueByName("Date", "");
335 a.SetPubValueByName("Study Date", "");
338 -----------------------------------------------------------------------------