[Gdcm-hackers] gdcm-git:Grassroots DICOM branch release updated. c97f3276f7e9496d72fccf4967af684b42
Cross-platform DICOM implementation
Brought to you by:
malat
|
From: Mathieu M. <ma...@us...> - 2019-09-18 13:06:03
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Grassroots DICOM".
The branch, release has been updated
via c97f3276f7e9496d72fccf4967af684b42dd6056 (commit)
via aa29b8af0fba99d25317f8a11135b4dd872e8965 (commit)
via ba2ebdd753e17dc29a7c4141314ba8527b8a366a (commit)
via 2ed561335f0aa0337aed9544f21161c04987bcb1 (commit)
via 93c7a196a0efe4da9c30dd5594069214676496c7 (commit)
via b5bb56c9da38c540e181ff344c8e43291d67374f (commit)
via 581ea7a75d009c33a2362b4d0ac53cec9ecceae0 (commit)
via 578823bbc78c794663e36065f74c14c16094d947 (commit)
via c8613ca822725524bccb59e90d7adddc4c622cbc (commit)
via ac160ad71a827936b172302e8adf1d2005fa0548 (commit)
via 64c6ae61c9494217710adfedd5bcd0c63d9cd4a9 (commit)
via c90d130534ba12a44c47b8227355f4c2485e29ed (commit)
via 850f372fee95c955199d9dd4e7dd9cfc7e93c276 (commit)
via 42b5f5c84a5cd296ab14dd68c9d08f994c647df9 (commit)
via b8d5c21c807d2a4e35d92da1aea864288c20e062 (commit)
via 08f5eb3a6efcd949c159e58902bc2c47dda229f6 (commit)
via 462b280dbdbc9c8d2fb1cbf3c42fe9b3bbe34782 (commit)
via 095609370c9f5bb133a814b3a7525abbbcf41670 (commit)
via 67651fa5484e2fc3314c3215daba9530caaee000 (commit)
via ecd16ab388fe5aba997c981b413f6a1a6f87097e (commit)
via f2ad036b2febe54c2039991c98f940dc1d68c42f (commit)
via c9874de1eed9e89eacd10350daad0722bbac0ff7 (commit)
via ae471b46b63527460b4d166fea93879c6fdd1482 (commit)
via bc9e9d057d7287029a670c1eb2fec0c4f7c94f5f (commit)
via a1c4b4631dda74147b2efb3c86739d8781c2f4ee (commit)
via 56e90a962b8948952cf88e401b1a3764c04b7ff6 (commit)
from 2fef7bebab084aaca50f386a34106a68cbc9494b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
https://sourceforge.net/p/gdcm/gdcm/ci/c97f3276f7e9496d72fccf4967af684b42dd6056/
commit c97f3276f7e9496d72fccf4967af684b42dd6056
Merge: 2fef7beba aa29b8af0
Author: Mathieu Malaterre <mat...@gm...>
Date: Wed Sep 18 15:05:45 2019 +0200
Merge branch 'release-2-8' into release
https://sourceforge.net/p/gdcm/gdcm/ci/aa29b8af0fba99d25317f8a11135b4dd872e8965/
commit aa29b8af0fba99d25317f8a11135b4dd872e8965
Author: Mathieu Malaterre <mat...@gm...>
Date: Wed Sep 18 15:01:56 2019 +0200
Remove bad use of assert()
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmElement.h b/Source/DataStructureAndEncodingDefinition/gdcmElement.h
index 417d2614d..bda0fc3db 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmElement.h
+++ b/Source/DataStructureAndEncodingDefinition/gdcmElement.h
@@ -236,10 +236,10 @@ public:
char sep;
//std::cout << "GetLength: " << af->GetLength() << std::endl;
for(unsigned long i=1; i<length;++i) {
- assert( _is );
+ //assert( _is );
// Get the separator in between the values
_is >> std::ws >> sep; //_is.get(sep);
- assert( sep == '\\' ); // FIXME: Bad use of assert
+ //assert( sep == '\\' ); // FIXME: Bad use of assert
_is >> std::ws >> data[i];
}
}
https://sourceforge.net/p/gdcm/gdcm/ci/ba2ebdd753e17dc29a7c4141314ba8527b8a366a/
commit ba2ebdd753e17dc29a7c4141314ba8527b8a366a
Author: Mathieu Malaterre <mat...@gm...>
Date: Thu Sep 12 11:13:50 2019 +0200
Start working on version 10
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 726a5f4e1..a0ae20c02 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -43,7 +43,7 @@ set(GDCM_PACKAGE_CONTACT "GDCM Developers <gdc...@li...
#----------------------------------------------------------------------------
set(GDCM_MAJOR_VERSION 2)
set(GDCM_MINOR_VERSION 8)
-set(GDCM_BUILD_VERSION 9)
+set(GDCM_BUILD_VERSION 10)
set(GDCM_VERSION
"${GDCM_MAJOR_VERSION}.${GDCM_MINOR_VERSION}.${GDCM_BUILD_VERSION}")
# let advanced user the option to define GDCM_API_VERSION:
https://sourceforge.net/p/gdcm/gdcm/ci/2ed561335f0aa0337aed9544f21161c04987bcb1/
commit 2ed561335f0aa0337aed9544f21161c04987bcb1
Author: Mathieu Malaterre <mat...@gm...>
Date: Thu Sep 5 16:41:59 2019 +0200
Handle multiframe with single slice
diff --git a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
index f5a1f13c7..ad6308364 100644
--- a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
@@ -207,9 +207,10 @@ static bool ComputeZSpacingFromIPP(const DataSet &ds, double &zspacing)
dc.Cross( normal );
// For each item
- std::vector<double> distances;
SequenceOfItems::SizeType nitems = sqi->GetNumberOfItems();
+ if( nitems > 1 ) {
std::vector<double> dircos_subds2; dircos_subds2.resize(6);
+ std::vector<double> distances;
for(SequenceOfItems::SizeType i0 = 1; i0 <= nitems; ++i0)
{
const Item &item = sqi->GetItem(i0);
@@ -280,6 +281,31 @@ static bool ComputeZSpacingFromIPP(const DataSet &ds, double &zspacing)
prev = distances[i];
}
}
+ } else {
+ // single slice
+ const Tag tfgs0(0x5200,0x9229);
+ if( !ds.FindDataElement( tfgs0 ) ) return false;
+ SmartPointer<SequenceOfItems> sqi = ds.GetDataElement( tfgs0 ).GetValueAsSQ();
+ if( !(sqi && sqi->GetNumberOfItems() > 0) ) return false;
+ // Get first item:
+ const Item &item = sqi->GetItem(1);
+ const DataSet & subds = item.GetNestedDataSet();
+ // <entry group="0028" element="9110" vr="SQ" vm="1" name="Pixel Measures Sequence"/>
+ const Tag tpms(0x0028,0x9110);
+ if( !subds.FindDataElement(tpms) ) return false;
+ //const SequenceOfItems * sqi2 = subds.GetDataElement( tpms ).GetSequenceOfItems();
+ SmartPointer<SequenceOfItems> sqi2 = subds.GetDataElement( tpms ).GetValueAsSQ();
+ assert( sqi2 );
+ const Item &item2 = sqi2->GetItem(1);
+ const DataSet & subds2 = item2.GetNestedDataSet();
+ // <entry group="0028" element="0030" vr="DS" vm="2" name="Pixel Spacing"/>
+ const Tag tps(0x0018,0x0088);
+ if( !subds2.FindDataElement(tps) ) return false;
+ const DataElement &de = subds2.GetDataElement( tps );
+ Attribute<0x0018,0x0088> at;
+ at.SetFromDataElement( de );
+ zspacing = at.GetValue();
+ }
return true;
}
https://sourceforge.net/p/gdcm/gdcm/ci/93c7a196a0efe4da9c30dd5594069214676496c7/
commit 93c7a196a0efe4da9c30dd5594069214676496c7
Author: Mathieu Malaterre <mat...@gm...>
Date: Wed Sep 4 11:24:29 2019 +0200
Fix for single bit and true color
diff --git a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
index 6584903c0..f5a1f13c7 100644
--- a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
@@ -424,8 +424,10 @@ std::vector<double> ImageHelper::GetOriginValue(File const & f)
|| ms == MediaStorage::EnhancedMRImageStorage
|| ms == MediaStorage::EnhancedPETImageStorage
|| ms == MediaStorage::OphthalmicTomographyImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
@@ -552,8 +554,10 @@ std::vector<double> ImageHelper::GetDirectionCosinesValue(File const & f)
if( ms == MediaStorage::EnhancedCTImageStorage
|| ms == MediaStorage::EnhancedMRImageStorage
|| ms == MediaStorage::EnhancedPETImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
@@ -883,8 +887,10 @@ void ImageHelper::SetDimensionsValue(File& f, const Pixmap & img)
if( ms == MediaStorage::EnhancedCTImageStorage
|| ms == MediaStorage::EnhancedMRImageStorage
|| ms == MediaStorage::EnhancedPETImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
@@ -983,8 +989,10 @@ std::vector<double> ImageHelper::GetRescaleInterceptSlopeValue(File const & f)
|| ms == MediaStorage::ComputedRadiographyImageStorage
|| ms == MediaStorage::PETImageStorage
|| ms == MediaStorage::SecondaryCaptureImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ForceRescaleInterceptSlope
)
{
@@ -1220,8 +1228,10 @@ Warning - Dicom dataset contains attributes not present in standard DICOM IOD -
case MediaStorage::UltrasoundMultiFrameImageStorageRetired:
// SC:
case MediaStorage::SecondaryCaptureImageStorage:
+ case MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage:
case MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage:
case MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage:
+ case MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage:
case MediaStorage::HardcopyGrayscaleImageStorage:
t = Tag(0xffff,0xffff);
break;
@@ -1259,8 +1269,10 @@ std::vector<double> ImageHelper::GetSpacingValue(File const & f)
|| ms == MediaStorage::EnhancedMRImageStorage
|| ms == MediaStorage::EnhancedPETImageStorage
|| ms == MediaStorage::OphthalmicTomographyImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
@@ -1559,8 +1571,10 @@ void ImageHelper::SetSpacingValue(DataSet & ds, const std::vector<double> & spac
if( ms == MediaStorage::EnhancedCTImageStorage
|| ms == MediaStorage::EnhancedMRImageStorage
|| ms == MediaStorage::EnhancedPETImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
@@ -1830,8 +1844,10 @@ void ImageHelper::SetOriginValue(DataSet & ds, const Image & image)
&& ms != MediaStorage::PETImageStorage
//&& ms != MediaStorage::ComputedRadiographyImageStorage
&& ms != MediaStorage::SegmentationStorage
- && ms != MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
&& ms != MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
&& ms != MediaStorage::XRay3DAngiographicImageStorage
&& ms != MediaStorage::XRay3DCraniofacialImageStorage
&& ms != MediaStorage::EnhancedMRImageStorage
@@ -1853,8 +1869,10 @@ void ImageHelper::SetOriginValue(DataSet & ds, const Image & image)
|| ms == MediaStorage::EnhancedPETImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForPresentation
|| ms == MediaStorage::IVOCTForProcessing
@@ -1925,8 +1943,10 @@ void ImageHelper::SetOriginValue(DataSet & ds, const Image & image)
// C.7.6.6.1.2 Frame Increment Pointer
// (0028,0009) AT (0018,2005) # 4,1-n Frame Increment Pointer
- if( ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
- || ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage )
+ if( ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage )
{
if( dimz > 1 ) {
Attribute<0x0028,0x0009> fip;
@@ -1967,8 +1987,10 @@ void ImageHelper::SetDirectionCosinesValue(DataSet & ds, const std::vector<doubl
&& ms != MediaStorage::RTDoseStorage
&& ms != MediaStorage::PETImageStorage
//&& ms != MediaStorage::ComputedRadiographyImageStorage
- && ms != MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
&& ms != MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
&& ms != MediaStorage::SegmentationStorage
&& ms != MediaStorage::XRay3DAngiographicImageStorage
&& ms != MediaStorage::XRay3DCraniofacialImageStorage
@@ -2008,8 +2030,10 @@ void ImageHelper::SetDirectionCosinesValue(DataSet & ds, const std::vector<doubl
if( ms == MediaStorage::EnhancedCTImageStorage
|| ms == MediaStorage::EnhancedMRImageStorage
|| ms == MediaStorage::EnhancedPETImageStorage
- || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ || ms == MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
@@ -2097,8 +2121,10 @@ void ImageHelper::SetRescaleInterceptSlopeValue(File & f, const Image & img)
&& ms != MediaStorage::PETImageStorage
&& ms != MediaStorage::RTDoseStorage
&& ms != MediaStorage::SecondaryCaptureImageStorage
- && ms != MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeSingleBitSecondaryCaptureImageStorage
&& ms != MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeGrayscaleWordSecondaryCaptureImageStorage
+ && ms != MediaStorage::MultiframeTrueColorSecondaryCaptureImageStorage
&& ms != MediaStorage::EnhancedMRImageStorage
&& ms != MediaStorage::EnhancedCTImageStorage
&& ms != MediaStorage::EnhancedPETImageStorage
https://sourceforge.net/p/gdcm/gdcm/ci/b5bb56c9da38c540e181ff344c8e43291d67374f/
commit b5bb56c9da38c540e181ff344c8e43291d67374f
Author: Mathieu Malaterre <mat...@gm...>
Date: Mon Sep 2 11:26:09 2019 +0200
Make sure to handle 3D image storing 2D slice
We need to remove the Number of Frame when IOD is 2D, but image is
declared as 3D (Z=1).
diff --git a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
index 9a8fce95a..6584903c0 100644
--- a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
@@ -847,10 +847,12 @@ void ImageHelper::SetDimensionsValue(File& f, const Pixmap & img)
ds.Replace( columns.GetAsDataElement() );
Attribute<0x0028,0x0008> numframes = { 0 };
numframes.SetValue( dims[2] );
- if( img.GetNumberOfDimensions() == 3 && dims[2] > 1 )
+ if( img.GetNumberOfDimensions() == 3 && dims[2] >= 1 )
{
if( ms.MediaStorage::GetModalityDimension() > 2 )
ds.Replace( numframes.GetAsDataElement() );
+ else if( ms.MediaStorage::GetModalityDimension() == 2 && dims[2] == 1 )
+ ds.Remove( numframes.GetTag() );
else
{
gdcmErrorMacro( "MediaStorage does not allow 3rd dimension. But value is: " << dims[2] );
https://sourceforge.net/p/gdcm/gdcm/ci/581ea7a75d009c33a2362b4d0ac53cec9ecceae0/
commit 581ea7a75d009c33a2362b4d0ac53cec9ecceae0
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Jul 19 09:07:19 2019 +0200
Do not require multi-frame
diff --git a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
index e9d17b6da..9a8fce95a 100644
--- a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
@@ -859,9 +859,20 @@ void ImageHelper::SetDimensionsValue(File& f, const Pixmap & img)
}
else if( img.GetNumberOfDimensions() == 2 && dims[2] == 1 )
{
- // This is a MF instances, need to set Number of Frame to 1
- if( ms.MediaStorage::GetModalityDimension() > 2 )
- ds.Replace( numframes.GetAsDataElement() );
+ // This is a MF instances, need to set Number of Frame to 1 when Required
+ if (ms.MediaStorage::GetModalityDimension() > 2)
+ {
+ // Only include Multi-Frame when required (not Conditional):
+ if( ms == MediaStorage::XRayAngiographicImageStorage // A.14.3 XA Image IOD Module Table: Multi-frame C.7.6.6 C - Required if pixel data is Multi - frame Cine data
+ )
+ {
+ ds.Remove(numframes.GetTag());
+ }
+ else
+ {
+ ds.Replace(numframes.GetAsDataElement());
+ }
+ }
}
else // cleanup
ds.Remove( numframes.GetTag() );
https://sourceforge.net/p/gdcm/gdcm/ci/578823bbc78c794663e36065f74c14c16094d947/
commit 578823bbc78c794663e36065f74c14c16094d947
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Oct 26 10:10:07 2018 -0400
Fix TestImageReaderRandomEmpty
diff --git a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
index 6194a137c..e9d17b6da 100644
--- a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
@@ -98,6 +98,7 @@ static bool GetDirectionCosinesValueFromSequence(const DataSet& ds, const Tag& t
if( !subds.FindDataElement(tpms) ) return false;
//const SequenceOfItems * sqi2 = subds.GetDataElement( tpms ).GetSequenceOfItems();
SmartPointer<SequenceOfItems> sqi2 = subds.GetDataElement( tpms ).GetValueAsSQ();
+ if( !(sqi2 && sqi2->GetNumberOfItems()) ) return false;
assert( sqi2 && sqi2->GetNumberOfItems() );
// Take it from the first item
const Item &item2 = sqi2->GetItem(1);
@@ -199,6 +200,7 @@ static bool ComputeZSpacingFromIPP(const DataSet &ds, double &zspacing)
if( !ds.FindDataElement( tfgs ) ) return false;
//const SequenceOfItems * sqi = ds.GetDataElement( tfgs ).GetSequenceOfItems();
SmartPointer<SequenceOfItems> sqi = ds.GetDataElement( tfgs ).GetValueAsSQ();
+ if( !sqi ) return false;
assert( sqi );
double normal[3];
DirectionCosines dc( &cosines[0] );
https://sourceforge.net/p/gdcm/gdcm/ci/c8613ca822725524bccb59e90d7adddc4c622cbc/
commit c8613ca822725524bccb59e90d7adddc4c622cbc
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Oct 26 08:32:16 2018 -0400
Add a helper to insert or update an existing sequence
diff --git a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
index de4c945d7..6194a137c 100644
--- a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
@@ -885,6 +885,7 @@ void ImageHelper::SetDimensionsValue(File& f, const Pixmap & img)
{
SmartPointer<SequenceOfItems> sqi = ds.GetDataElement( tfgs ).GetValueAsSQ();
assert( sqi );
+ sqi->SetLengthToUndefined();
sqi->SetNumberOfItems( dims[2] );
}
}
@@ -1502,6 +1503,27 @@ $ dcmdump D_CLUNIE_NM1_JPLL.dcm" | grep 0028,0009
return sp;
}
+static SmartPointer<SequenceOfItems> InsertOrReplaceSQ( DataSet & ds, const Tag &tag )
+{
+ SmartPointer<SequenceOfItems> sqi;
+ if( !ds.FindDataElement( tag ) )
+ {
+ sqi = new SequenceOfItems;
+ DataElement de( tag );
+ de.SetVR( VR::SQ );
+ de.SetValue( *sqi );
+ assert( de.GetVL().IsUndefined() );
+ de.SetVLToUndefined();
+ ds.Insert( de );
+ }
+ sqi = ds.GetDataElement( tag ).GetValueAsSQ();
+ sqi->SetLengthToUndefined();
+ DataElement de_dup = ds.GetDataElement( tag );
+ de_dup.SetValue( *sqi );
+ ds.Replace( de_dup );
+ return sqi;
+}
+
void ImageHelper::SetSpacingValue(DataSet & ds, const std::vector<double> & spacing)
{
MediaStorage ms;
@@ -1544,50 +1566,24 @@ void ImageHelper::SetSpacingValue(DataSet & ds, const std::vector<double> & spac
*/
{
const Tag tfgs(0x5200,0x9229);
- SmartPointer<SequenceOfItems> sqi;
- if( !ds.FindDataElement( tfgs ) )
- {
- sqi = new SequenceOfItems;
- DataElement de( tfgs );
- de.SetVR( VR::SQ );
- de.SetValue( *sqi );
- de.SetVLToUndefined();
- ds.Insert( de );
- }
- //sqi = (SequenceOfItems*)ds.GetDataElement( tfgs ).GetSequenceOfItems();
- sqi = ds.GetDataElement( tfgs ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ SmartPointer<SequenceOfItems> sqi = InsertOrReplaceSQ( ds, tfgs );
if( !sqi->GetNumberOfItems() )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item1 = sqi->GetItem(1);
+ item1.SetVLToUndefined();
DataSet &subds = item1.GetNestedDataSet();
const Tag tpms(0x0028,0x9110);
- if( !subds.FindDataElement( tpms ) )
- {
- SequenceOfItems *sqi2 = new SequenceOfItems;
- DataElement de( tpms );
- de.SetVR( VR::SQ );
- de.SetValue( *sqi2 );
- de.SetVLToUndefined();
- subds.Insert( de );
- }
-
- //sqi = (SequenceOfItems*)subds.GetDataElement( tpms ).GetSequenceOfItems();
- sqi = subds.GetDataElement( tpms ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ sqi = InsertOrReplaceSQ( subds, tpms );
if( !sqi->GetNumberOfItems() )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item2 = sqi->GetItem(1);
+ item2.SetVLToUndefined();
DataSet &subds2 = item2.GetNestedDataSet();
// <entry group="0028" element="9110" vr="SQ" vm="1" name="Pixel Measures Sequence"/>
@@ -1605,13 +1601,12 @@ void ImageHelper::SetSpacingValue(DataSet & ds, const std::vector<double> & spac
const Tag tfgs(0x5200,0x9230);
if( ds.FindDataElement( tfgs ) )
{
- SmartPointer<SequenceOfItems> sqi = ds.GetDataElement( tfgs ).GetValueAsSQ();
- assert( sqi );
+ SmartPointer<SequenceOfItems> sqi = InsertOrReplaceSQ( ds, tfgs );
SequenceOfItems::SizeType nitems = sqi->GetNumberOfItems();
for(SequenceOfItems::SizeType i0 = 1; i0 <= nitems; ++i0)
{
- // Get first item:
Item &item = sqi->GetItem(i0);
+ item.SetVLToUndefined();
DataSet & subds = item.GetNestedDataSet();
const Tag tpms(0x0028,0x9110);
subds.Remove(tpms);
@@ -1770,50 +1765,24 @@ void ImageHelper::SetSpacingValue(DataSet & ds, const std::vector<double> & spac
static void SetDataElementInSQAsItemNumber(DataSet & ds, DataElement const & de, Tag const & sqtag, unsigned int itemidx)
{
const Tag tfgs = sqtag; //(0x5200,0x9230);
- SmartPointer<SequenceOfItems> sqi;
- if( !ds.FindDataElement( tfgs ) )
- {
- sqi = new SequenceOfItems;
- DataElement detmp( tfgs );
- detmp.SetVR( VR::SQ );
- detmp.SetValue( *sqi );
- detmp.SetVLToUndefined();
- ds.Insert( detmp );
- }
- //sqi = (SequenceOfItems*)ds.GetDataElement( tfgs ).GetSequenceOfItems();
- sqi = ds.GetDataElement( tfgs ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ SmartPointer<SequenceOfItems> sqi = InsertOrReplaceSQ( ds, tfgs );
if( sqi->GetNumberOfItems() < itemidx )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item1 = sqi->GetItem(itemidx);
+ item1.SetVLToUndefined();
DataSet &subds = item1.GetNestedDataSet();
const Tag tpms(0x0020,0x9113);
- if( !subds.FindDataElement( tpms ) )
- {
- SequenceOfItems *sqi2 = new SequenceOfItems;
- DataElement detmp( tpms );
- detmp.SetVR( VR::SQ );
- detmp.SetValue( *sqi2 );
- detmp.SetVLToUndefined();
- subds.Insert( detmp );
- }
-
- //sqi = (SequenceOfItems*)subds.GetDataElement( tpms ).GetSequenceOfItems();
- sqi = subds.GetDataElement( tpms ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ sqi = InsertOrReplaceSQ( subds, tpms );
if( !sqi->GetNumberOfItems() )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item2 = sqi->GetItem(1);
+ item2.SetVLToUndefined();
DataSet &subds2 = item2.GetNestedDataSet();
//Attribute<0x0020,0x0032> ipp = {{0,0,0}}; // default value
@@ -1925,6 +1894,7 @@ void ImageHelper::SetOriginValue(DataSet & ds, const Image & image)
{
// Get first item:
Item &item = sqi->GetItem(i0);
+ item.SetVLToUndefined();
DataSet & subds = item.GetNestedDataSet();
const Tag tpms(0x0020,0x9113);
subds.Remove(tpms);
@@ -2044,50 +2014,24 @@ void ImageHelper::SetDirectionCosinesValue(DataSet & ds, const std::vector<doubl
*/
{
const Tag tfgs(0x5200,0x9229);
- SmartPointer<SequenceOfItems> sqi;
- if( !ds.FindDataElement( tfgs ) )
- {
- sqi = new SequenceOfItems;
- DataElement de( tfgs );
- de.SetVR( VR::SQ );
- de.SetValue( *sqi );
- de.SetVLToUndefined();
- ds.Insert( de );
- }
- //sqi = (SequenceOfItems*)ds.GetDataElement( tfgs ).GetSequenceOfItems();
- sqi = ds.GetDataElement( tfgs ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ SmartPointer<SequenceOfItems> sqi = InsertOrReplaceSQ( ds, tfgs );
if( !sqi->GetNumberOfItems() )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item1 = sqi->GetItem(1);
+ item1.SetVLToUndefined();
DataSet &subds = item1.GetNestedDataSet();
const Tag tpms(0x0020,0x9116);
- if( !subds.FindDataElement( tpms ) )
- {
- SequenceOfItems *sqi2 = new SequenceOfItems;
- DataElement de( tpms );
- de.SetVR( VR::SQ );
- de.SetValue( *sqi2 );
- de.SetVLToUndefined();
- subds.Insert( de );
- }
-
- //sqi = (SequenceOfItems*)subds.GetDataElement( tpms ).GetSequenceOfItems();
- sqi = subds.GetDataElement( tpms ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ sqi = InsertOrReplaceSQ( subds, tpms );
if( !sqi->GetNumberOfItems() )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item2 = sqi->GetItem(1);
+ item2.SetVLToUndefined();
DataSet &subds2 = item2.GetNestedDataSet();
subds2.Replace( iop.GetAsDataElement() );
@@ -2104,6 +2048,7 @@ void ImageHelper::SetDirectionCosinesValue(DataSet & ds, const std::vector<doubl
{
// Get first item:
Item &item = sqi->GetItem(i0);
+ item.SetVLToUndefined();
DataSet & subds = item.GetNestedDataSet();
const Tag tpms(0x0020,0x9116);
subds.Remove(tpms);
@@ -2179,50 +2124,24 @@ void ImageHelper::SetRescaleInterceptSlopeValue(File & f, const Image & img)
*/
{
const Tag tfgs(0x5200,0x9229);
- SmartPointer<SequenceOfItems> sqi;
- if( !ds.FindDataElement( tfgs ) )
- {
- sqi = new SequenceOfItems;
- DataElement de( tfgs );
- de.SetVR( VR::SQ );
- de.SetValue( *sqi );
- de.SetVLToUndefined();
- ds.Insert( de );
- }
- //sqi = (SequenceOfItems*)ds.GetDataElement( tfgs ).GetSequenceOfItems();
- sqi = ds.GetDataElement( tfgs ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ SmartPointer<SequenceOfItems> sqi = InsertOrReplaceSQ( ds, tfgs );
if( !sqi->GetNumberOfItems() )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item1 = sqi->GetItem(1);
+ item1.SetVLToUndefined();
DataSet &subds = item1.GetNestedDataSet();
const Tag tpms(0x0028,0x9145);
- if( !subds.FindDataElement( tpms ) )
- {
- SequenceOfItems *sqi2 = new SequenceOfItems;
- DataElement de( tpms );
- de.SetVR( VR::SQ );
- de.SetValue( *sqi2 );
- de.SetVLToUndefined();
- subds.Insert( de );
- }
-
- //sqi = (SequenceOfItems*)subds.GetDataElement( tpms ).GetSequenceOfItems();
- sqi = subds.GetDataElement( tpms ).GetValueAsSQ();
- sqi->SetLengthToUndefined();
-
+ sqi = InsertOrReplaceSQ( subds, tpms );
if( !sqi->GetNumberOfItems() )
{
Item item; //( Tag(0xfffe,0xe000) );
- item.SetVLToUndefined();
sqi->AddItem( item );
}
Item &item2 = sqi->GetItem(1);
+ item2.SetVLToUndefined();
DataSet &subds2 = item2.GetNestedDataSet();
Attribute<0x0028,0x1052> at1;
https://sourceforge.net/p/gdcm/gdcm/ci/ac160ad71a827936b172302e8adf1d2005fa0548/
commit ac160ad71a827936b172302e8adf1d2005fa0548
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Oct 26 10:03:36 2018 -0400
Fix TestIcon
diff --git a/Source/MediaStorageAndFileFormat/gdcmIconImageFilter.cxx b/Source/MediaStorageAndFileFormat/gdcmIconImageFilter.cxx
index 504d91d01..4e1b40eae 100644
--- a/Source/MediaStorageAndFileFormat/gdcmIconImageFilter.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmIconImageFilter.cxx
@@ -50,7 +50,7 @@ void IconImageFilter::ExtractIconImages()
const DataElement &iconimagesq = rootds.GetDataElement( ticonimage );
SmartPointer<SequenceOfItems> sq = iconimagesq.GetValueAsSQ();
// Is SQ empty ?
- if( sq )
+ if( sq && sq->GetNumberOfItems() == 1 )
{
gdcmAssertAlwaysMacro( sq->GetNumberOfItems() == 1 );
https://sourceforge.net/p/gdcm/gdcm/ci/64c6ae61c9494217710adfedd5bcd0c63d9cd4a9/
commit 64c6ae61c9494217710adfedd5bcd0c63d9cd4a9
Author: Mathieu Malaterre <mat...@gm...>
Date: Thu Sep 12 10:42:08 2019 +0200
Prefer size_t
diff --git a/Source/MediaStorageAndFileFormat/gdcmBitmap.cxx b/Source/MediaStorageAndFileFormat/gdcmBitmap.cxx
index 96f9dd75d..c598c9a0f 100644
--- a/Source/MediaStorageAndFileFormat/gdcmBitmap.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmBitmap.cxx
@@ -286,7 +286,7 @@ unsigned long Bitmap::GetBufferLength() const
{
assert( PF.GetSamplesPerPixel() == 1 );
const size_t bytesPerRow = Dimensions[0] / 8 + (Dimensions[0] % 8 != 0 ? 1 : 0);
- unsigned int save = bytesPerRow * Dimensions[1];
+ size_t save = bytesPerRow * Dimensions[1];
if( NumberOfDimensions > 2 )
save *= Dimensions[2];
if(Dimensions[0] % 8 == 0 )
https://sourceforge.net/p/gdcm/gdcm/ci/c90d130534ba12a44c47b8227355f4c2485e29ed/
commit c90d130534ba12a44c47b8227355f4c2485e29ed
Author: Mathieu Malaterre <mat...@gm...>
Date: Wed May 29 16:38:19 2019 +0200
Kill a warning
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmPDBHeader.cxx b/Source/DataStructureAndEncodingDefinition/gdcmPDBHeader.cxx
index 1a059081d..20f72dabe 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmPDBHeader.cxx
+++ b/Source/DataStructureAndEncodingDefinition/gdcmPDBHeader.cxx
@@ -159,7 +159,8 @@ int PDBHeader::readprotocoldatablock(const char *input, size_t inputlen, bool ve
{
(void)verbose;
// First 4 bytes are the length (again)
- uint32_t len = *(const uint32_t*)input;
+ uint32_t len; // = *(const uint32_t*)input;
+ memcpy(&len, input, sizeof len);
SwapperNoOp::SwapArray(&len,1);
//if( verbose )
// std::cout << len << "," << inputlen << std::endl;
https://sourceforge.net/p/gdcm/gdcm/ci/850f372fee95c955199d9dd4e7dd9cfc7e93c276/
commit 850f372fee95c955199d9dd4e7dd9cfc7e93c276
Author: Hans Johnson <han...@ui...>
Date: Tue Jan 15 20:56:07 2019 -0600
PERF: readability container size empty
The emptiness of a container should be checked using the empty() method
instead of the size() method. It is not guaranteed that size() is a
constant-time function, and it is generally more efficient and also
shows clearer intent to use empty(). Furthermore some containers may
implement the empty() method but not implement the size() method. Using
empty() whenever possible makes it easier to switch to another container
in the future.
SRCDIR=/Users/johnsonhj/src/gdcm #My local SRC
BLDDIR=/Users/johnsonhj/src/gdcm-bld/ #My local BLD
cd /Users/johnsonhj/src/gdcm-bld/
run-clang-tidy.py -extra-arg=-D__clang__ -checks=-*,readability-container-size-empty -header-filter=.* -fix
diff --git a/Examples/Cxx/DumpImageHeaderInfo.cxx b/Examples/Cxx/DumpImageHeaderInfo.cxx
index 7b56ec40d..2476f7421 100644
--- a/Examples/Cxx/DumpImageHeaderInfo.cxx
+++ b/Examples/Cxx/DumpImageHeaderInfo.cxx
@@ -58,7 +58,7 @@ std::istream & element::read( std::istream & is )
os << str << " (" << l << ")" << std::endl;
std::vector<char> bytes;
bytes.resize( l - 16 );
- if( bytes.size() )
+ if( !bytes.empty() )
{
is.read( &bytes[0], l - 16 );
}
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmDataSet.cxx b/Source/DataStructureAndEncodingDefinition/gdcmDataSet.cxx
index 1d6cc3d9b..40f8a69cb 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmDataSet.cxx
+++ b/Source/DataStructureAndEncodingDefinition/gdcmDataSet.cxx
@@ -44,7 +44,7 @@ std::string DataSet::GetPrivateCreator(const Tag &t) const
std::string owner = std::string(bv->GetPointer(),bv->GetLength());
// There should not be any trailing space character...
// TODO: tmp.erase(tmp.find_last_not_of(' ') + 1);
- while( owner.size() && owner[owner.size()-1] == ' ' )
+ while( !owner.empty() && owner[owner.size()-1] == ' ' )
{
// osirix/AbdominalCT/36382443
owner.erase(owner.size()-1,1);
@@ -135,7 +135,7 @@ MediaStorage DataSet::GetMediaStorage() const
}
}
// Paranoid check: if last character of a VR=UI is space let's pretend this is a \0
- if( ts.size() )
+ if( !ts.empty() )
{
char &last = ts[ts.size()-1];
if( last == ' ' )
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmFileMetaInformation.cxx b/Source/DataStructureAndEncodingDefinition/gdcmFileMetaInformation.cxx
index 55621c672..0f623a0de 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmFileMetaInformation.cxx
+++ b/Source/DataStructureAndEncodingDefinition/gdcmFileMetaInformation.cxx
@@ -878,7 +878,7 @@ std::string FileMetaInformation::GetMediaStorageAsString() const
}
}
// Paranoid check: if last character of a VR=UI is space let's pretend this is a \0
- if( ts.size() )
+ if( !ts.empty() )
{
char &last = ts[ts.size()-1];
if( last == ' ' )
diff --git a/Source/MediaStorageAndFileFormat/gdcmBitmap.h b/Source/MediaStorageAndFileFormat/gdcmBitmap.h
index a100290e4..906a44d56 100644
--- a/Source/MediaStorageAndFileFormat/gdcmBitmap.h
+++ b/Source/MediaStorageAndFileFormat/gdcmBitmap.h
@@ -121,7 +121,7 @@ public:
const PhotometricInterpretation &GetPhotometricInterpretation() const;
void SetPhotometricInterpretation(PhotometricInterpretation const &pi);
- bool IsEmpty() const { return Dimensions.size() == 0; }
+ bool IsEmpty() const { return Dimensions.empty(); }
void Clear();
/// Return the length of the image after decompression
https://sourceforge.net/p/gdcm/gdcm/ci/42b5f5c84a5cd296ab14dd68c9d08f994c647df9/
commit 42b5f5c84a5cd296ab14dd68c9d08f994c647df9
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Jul 19 09:04:57 2019 +0200
Report to user before null deref
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmDataElement.h b/Source/DataStructureAndEncodingDefinition/gdcmDataElement.h
index ceedc2567..7162e2826 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmDataElement.h
+++ b/Source/DataStructureAndEncodingDefinition/gdcmDataElement.h
@@ -92,7 +92,10 @@ public:
/// Set/Get Value (bytes array, SQ of items, SQ of fragments):
Value const &GetValue() const { gdcmAssertAlwaysMacro(ValueField); return *ValueField; }
- Value &GetValue() { return *ValueField; }
+ Value &GetValue() {
+ gdcmAssertAlwaysMacro(ValueField);
+ return *ValueField;
+ }
/// \warning you need to set the ValueLengthField explicitly
void SetValue(Value const & vl) {
//assert( ValueField == 0 );
https://sourceforge.net/p/gdcm/gdcm/ci/b8d5c21c807d2a4e35d92da1aea864288c20e062/
commit b8d5c21c807d2a4e35d92da1aea864288c20e062
Author: Mathieu Malaterre <mat...@gm...>
Date: Mon Jul 15 10:42:48 2019 +0200
Handle VS2019 where behavior of &Internal[0] is undefined when empty
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmByteValue.cxx b/Source/DataStructureAndEncodingDefinition/gdcmByteValue.cxx
index 7af458933..b48f6de8b 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmByteValue.cxx
+++ b/Source/DataStructureAndEncodingDefinition/gdcmByteValue.cxx
@@ -95,7 +95,7 @@ namespace gdcm_ns
// so we need an inequality
if( length <= Internal.size() )
{
- memcpy(buffer, &Internal[0], length);
+ if(!Internal.empty()) memcpy(buffer, &Internal[0], length);
return true;
}
gdcmDebugMacro( "Could not handle length= " << length );
https://sourceforge.net/p/gdcm/gdcm/ci/08f5eb3a6efcd949c159e58902bc2c47dda229f6/
commit 08f5eb3a6efcd949c159e58902bc2c47dda229f6
Author: Mathieu Malaterre <mat...@gm...>
Date: Mon Jan 8 10:53:35 2018 +0100
Prefer _WIN32 for mingw
diff --git a/Source/Common/gdcmWin32.h b/Source/Common/gdcmWin32.h
index 022a8233e..12f510567 100644
--- a/Source/Common/gdcmWin32.h
+++ b/Source/Common/gdcmWin32.h
@@ -20,7 +20,7 @@
#endif
//-----------------------------------------------------------------------------
// http://gcc.gnu.org/wiki/Visibility
-#if defined(WIN32) && defined(GDCM_BUILD_SHARED_LIBS)
+#if defined(_WIN32) && defined(GDCM_BUILD_SHARED_LIBS)
#if (defined(gdcmCommon_EXPORTS) || defined(gdcmDICT_EXPORTS) || defined(gdcmDSED_EXPORTS) || defined(gdcmIOD_EXPORTS) || defined(gdcmMSFF_EXPORTS) || defined(gdcmMEXD_EXPORTS)|| defined(_gdcmswig_EXPORTS)) || defined(vtkgdcm_EXPORTS)
#define GDCM_EXPORT __declspec( dllexport )
#else
https://sourceforge.net/p/gdcm/gdcm/ci/462b280dbdbc9c8d2fb1cbf3c42fe9b3bbe34782/
commit 462b280dbdbc9c8d2fb1cbf3c42fe9b3bbe34782
Author: Mathieu Malaterre <mat...@gm...>
Date: Mon Jan 8 10:54:23 2018 +0100
Prefer _WIN32 for mingw
diff --git a/Source/Common/gdcmCryptoFactory.cxx b/Source/Common/gdcmCryptoFactory.cxx
index 3ebfa0dd6..7066cfc52 100644
--- a/Source/Common/gdcmCryptoFactory.cxx
+++ b/Source/Common/gdcmCryptoFactory.cxx
@@ -13,7 +13,7 @@
=========================================================================*/
#include "gdcmCryptoFactory.h"
-#ifdef WIN32
+#ifdef _WIN32
#include "gdcmCAPICryptoFactory.h"
#endif
@@ -29,7 +29,7 @@ namespace gdcm
CryptoFactory* CryptoFactory::GetFactoryInstance(CryptoLib id)
{
-#ifdef WIN32
+#ifdef _WIN32
static CAPICryptoFactory capi(CryptoFactory::CAPI);
#endif
#ifdef GDCM_USE_SYSTEM_OPENSSL
@@ -50,9 +50,9 @@ CryptoFactory* CryptoFactory::GetFactoryInstance(CryptoLib id)
#endif // GDCM_HAVE_CMS_RECIPIENT_PASSWORD
#endif // GDCM_USE_SYSTEM_OPENSSL
// We always prefer native API (by default):
-#ifdef WIN32
+#ifdef _WIN32
id = CryptoFactory::CAPI;
-#endif // WIN32
+#endif // _WIN32
}
std::map<CryptoLib, CryptoFactory*>::iterator it = getInstanceMap().find(id);
diff --git a/Source/Common/gdcmTerminal.cxx b/Source/Common/gdcmTerminal.cxx
index 8a8b8ca28..700346ae1 100644
--- a/Source/Common/gdcmTerminal.cxx
+++ b/Source/Common/gdcmTerminal.cxx
@@ -17,7 +17,7 @@
#include <iostream>
#include <fstream>
-#ifdef WIN32
+#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h> /* SetConsoleTextAttribute */
#endif
@@ -40,7 +40,7 @@ class ConsoleImp
{
private:
// console implementation details:
-#ifdef WIN32
+#ifdef _WIN32
HANDLE hConsoleHandle;
CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
WORD wNormalAttributes;
@@ -52,7 +52,7 @@ private:
public:
ConsoleImp()
{
-#ifdef WIN32
+#ifdef _WIN32
hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleHandle, &ConsoleInfo);
wNormalAttributes = ConsoleInfo.wAttributes;
@@ -61,7 +61,7 @@ public:
}
~ConsoleImp()
{
-#ifdef WIN32
+#ifdef _WIN32
SetConsoleTextAttribute(hConsoleHandle, wNormalAttributes);
}
WORD get_attributes() {
@@ -85,7 +85,7 @@ public:
return command;
}
void set_attributes(int color) {
-#ifdef WIN32
+#ifdef _WIN32
static const int colors[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
WORD wAttributes;
@@ -154,7 +154,7 @@ public:
SetConsoleTextAttribute(hConsoleHandle, wAttributes);
#else
(void)color;
-#endif //WIN32
+#endif //_WIN32
}
};
diff --git a/Source/Common/zipstreamimpl.h b/Source/Common/zipstreamimpl.h
index 59858b949..49f77a29e 100644
--- a/Source/Common/zipstreamimpl.h
+++ b/Source/Common/zipstreamimpl.h
@@ -64,7 +64,7 @@ zran.c
#include <gdcm_zlib.h>
-#ifdef WIN32 /* Window 95 & Windows NT */
+#ifdef _WIN32 /* Window 95 & Windows NT */
# define OS_CODE 0x0b
#endif
#if defined(MACOS) || defined(TARGET_OS_MAC)
https://sourceforge.net/p/gdcm/gdcm/ci/095609370c9f5bb133a814b3a7525abbbcf41670/
commit 095609370c9f5bb133a814b3a7525abbbcf41670
Author: Dženan ZukiÄ <dze...@ki...>
Date: Wed Dec 5 10:18:15 2018 -0500
COMP: compile with Visual Studio in conformance mode AKA /permissive-
Conflicts:
Source/Common/gdcmCAPICryptographicMessageSyntax.cxx
diff --git a/Source/Common/gdcmCAPICryptographicMessageSyntax.cxx b/Source/Common/gdcmCAPICryptographicMessageSyntax.cxx
index 338ae7cbf..928bc0aa0 100644
--- a/Source/Common/gdcmCAPICryptographicMessageSyntax.cxx
+++ b/Source/Common/gdcmCAPICryptographicMessageSyntax.cxx
@@ -192,7 +192,11 @@ bool CAPICryptographicMessageSyntax::Decrypt(char *output, size_t &outlen, const
BYTE* cek = NULL;
HCRYPTMSG hMsg = NULL;
PCMSG_CMS_RECIPIENT_INFO recipientInfo = NULL;
+ DWORD dwMessageType, cbMessageTypeLen = sizeof(DWORD);
PCRYPT_ALGORITHM_IDENTIFIER cekAlg = NULL;
+ ALG_ID kekAlg;
+ DWORD kekAlgLen = sizeof(ALG_ID);
+ DWORD nrOfRecipeints, nrOfRecipientsLen = sizeof(DWORD);
BYTE* bareContent = NULL;
struct {
BLOBHEADER header;
@@ -218,7 +222,6 @@ bool CAPICryptographicMessageSyntax::Decrypt(char *output, size_t &outlen, const
goto err;
}
- DWORD dwMessageType, cbMessageTypeLen = sizeof(DWORD);
if(! CryptMsgGetParam(hMsg, CMSG_TYPE_PARAM, 0, &dwMessageType, &cbMessageTypeLen))
{
gdcmErrorMacro( "CryptMsgGetParam CMSG_TYPE_PARAM failed with error 0x" << std::hex << GetLastError() );
@@ -231,8 +234,6 @@ bool CAPICryptographicMessageSyntax::Decrypt(char *output, size_t &outlen, const
goto err;
}
- ALG_ID kekAlg;
- DWORD kekAlgLen = sizeof(ALG_ID);
if(! CryptGetKeyParam(hRsaPrivK, KP_ALGID, (BYTE*)&kekAlg, &kekAlgLen, 0))
{
gdcmErrorMacro( "MsgGetParam KP_ALGID failed with error 0x" << std::hex << GetLastError() );
@@ -244,7 +245,6 @@ bool CAPICryptographicMessageSyntax::Decrypt(char *output, size_t &outlen, const
goto err;
}
- DWORD nrOfRecipeints, nrOfRecipientsLen = sizeof(DWORD);
if(! CryptMsgGetParam(hMsg, CMSG_RECIPIENT_COUNT_PARAM, 0, &nrOfRecipeints, &nrOfRecipientsLen))
{
gdcmErrorMacro( "Decode CMSG_RECIPIENT_COUNT_PARAM failed with error 0x" << std::hex << GetLastError() );
https://sourceforge.net/p/gdcm/gdcm/ci/67651fa5484e2fc3314c3215daba9530caaee000/
commit 67651fa5484e2fc3314c3215daba9530caaee000
Author: Mathieu Malaterre <mat...@gm...>
Date: Thu Jun 20 16:18:22 2019 +0200
Relax requirement for dumb mode
diff --git a/Applications/Cxx/gdcmanon.cxx b/Applications/Cxx/gdcmanon.cxx
index cbf68b774..1fb3b52c3 100644
--- a/Applications/Cxx/gdcmanon.cxx
+++ b/Applications/Cxx/gdcmanon.cxx
@@ -723,33 +723,36 @@ int main(int argc, char *argv[])
}
gdcm::FileMetaInformation::SetSourceApplicationEntityTitle( "gdcmanon" );
- gdcm::Global& g = gdcm::Global::GetInstance();
- if( !resourcespath )
- {
- const char *xmlpathenv = getenv("GDCM_RESOURCES_PATH");
- if( xmlpathenv )
+ if( !dumb_mode )
+ {
+ gdcm::Global& g = gdcm::Global::GetInstance();
+ if( !resourcespath )
{
- // Make sure to look for XML dict in user explicitly specified dir first:
- xmlpath = xmlpathenv;
- resourcespath = 1;
+ const char *xmlpathenv = getenv("GDCM_RESOURCES_PATH");
+ if( xmlpathenv )
+ {
+ // Make sure to look for XML dict in user explicitly specified dir first:
+ xmlpath = xmlpathenv;
+ resourcespath = 1;
+ }
}
- }
- if( resourcespath )
- {
- // xmlpath is set either by the cmd line option or the env var
- if( !g.Prepend( xmlpath.c_str() ) )
+ if( resourcespath )
+ {
+ // xmlpath is set either by the cmd line option or the env var
+ if( !g.Prepend( xmlpath.c_str() ) )
+ {
+ std::cerr << "Specified Resources Path is not valid: " << xmlpath << std::endl;
+ return 1;
+ }
+ }
+ // All set, then load the XML files:
+ if( !g.LoadResourcesFiles() )
{
- std::cerr << "Specified Resources Path is not valid: " << xmlpath << std::endl;
+ std::cerr << "Could not load XML file from specified path" << std::endl;
return 1;
}
- }
- // All set, then load the XML files:
- if( !g.LoadResourcesFiles() )
- {
- std::cerr << "Could not load XML file from specified path" << std::endl;
- return 1;
- }
- const gdcm::Defs &defs = g.GetDefs(); (void)defs;
+ const gdcm::Defs &defs = g.GetDefs(); (void)defs;
+ }
if( !rootuid )
{
// only read the env var if no explicit cmd line option
https://sourceforge.net/p/gdcm/gdcm/ci/ecd16ab388fe5aba997c981b413f6a1a6f87097e/
commit ecd16ab388fe5aba997c981b413f6a1a6f87097e
Author: Mathieu Malaterre <mat...@gm...>
Date: Tue Sep 10 15:34:14 2019 +0200
Accept keyword as input
Conflicts:
Applications/Cxx/gdcmscanner.cxx
diff --git a/Applications/Cxx/gdcmscanner.cxx b/Applications/Cxx/gdcmscanner.cxx
index 3267707eb..9669103ad 100644
--- a/Applications/Cxx/gdcmscanner.cxx
+++ b/Applications/Cxx/gdcmscanner.cxx
@@ -32,6 +32,10 @@
#include "gdcmTrace.h"
#include "gdcmVersion.h"
#include "gdcmSimpleSubjectWatcher.h"
+#include "gdcmGlobal.h"
+#include "gdcmDicts.h"
+#include "gdcmDict.h"
+#include "gdcmDictEntry.h"
#include <string>
#include <iostream>
@@ -55,8 +59,9 @@ static void PrintHelp()
std::cout << "Usage: gdcmscanner [OPTION] -d directory -t tag(s)" << std::endl;
std::cout << "Scan a directory containing DICOM files.\n";
std::cout << "Parameter (required):" << std::endl;
- std::cout << " -d --dir DICOM directory" << std::endl;
- std::cout << " -t --tag %d,%d DICOM tag(s) to look for" << std::endl;
+ std::cout << " -d --dir DICOM directory" << std::endl;
+ std::cout << " -t --tag %d,%d DICOM tag(s) to look for" << std::endl;
+ std::cout << " -k --keyword %s DICOM keyword(s) to look for" << std::endl;
std::cout << " -P --private-tag %d,%d,%s DICOM private tag(s) to look for" << std::endl;
std::cout << "Options:" << std::endl;
std::cout << " -p --print Print output." << std::endl;
@@ -122,6 +127,9 @@ int main(int argc, char *argv[])
VectorPrivateTags privatetags;
gdcm::Tag tag;
gdcm::PrivateTag privatetag;
+ static const gdcm::Global &g = gdcm::Global::GetInstance();
+ static const gdcm::Dicts &dicts = g.GetDicts();
+ static const gdcm::Dict &pubdict = dicts.GetPublicDict();
int strict = 0;
int table = 0;
@@ -136,26 +144,27 @@ int main(int argc, char *argv[])
//int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
- {"dir", 1, 0, 0},
- {"tag", 1, 0, 0},
- {"recursive", 1, 0, 0},
- {"print", 1, 0, 0},
- {"private-tag", 1, 0, 0},
- {"strict", 0, &strict, 1},
- {"table", 0, &table, 1},
+ {"dir", required_argument, 0, 'd'},
+ {"tag", required_argument, 0, 't'},
+ {"recursive", no_argument, 0, 'r'},
+ {"print", no_argument, 0, 'p'},
+ {"private-tag", required_argument, 0, 'P'},
+ {"keyword", required_argument, 0, 'k'},
+ {"strict", no_argument, &strict, 1},
+ {"table", no_argument, &table, 1},
// General options !
- {"verbose", 0, &verbose, 1},
- {"warning", 0, &warning, 1},
- {"debug", 0, &debug, 1},
- {"error", 0, &error, 1},
- {"help", 0, &help, 1},
- {"version", 0, &version, 1},
+ {"verbose", no_argument, 0, 'V'},
+ {"warning", no_argument, 0, 'W'},
+ {"debug", no_argument, 0, 'D'},
+ {"error", no_argument, 0, 'E'},
+ {"help", no_argument, 0, 'H'},
+ {"version", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
- c = getopt_long (argc, argv, "d:t:rpP:VWDEhv",
+ c = getopt_long (argc, argv, "d:t:rpP:k:VWDEhv",
long_options, &option_index);
if (c == -1)
{
@@ -165,18 +174,10 @@ int main(int argc, char *argv[])
switch (c)
{
case 0:
+ if (optarg)
{
- //const char *s = long_options[option_index].name;
- //printf ("option %s", s);
- //if (optarg)
- // {
- // if( option_index == 0 ) /* input */
- // {
- // assert( strcmp(s, "input") == 0 );
- // }
- // printf (" with arg %s", optarg);
- // }
- //printf ("\n");
+ const char *s = long_options[option_index].name; (void)s;
+ assert(0);
}
break;
@@ -190,6 +191,20 @@ int main(int argc, char *argv[])
//std::cerr << optarg << std::endl;
break;
+ case 'k':
+ {
+ const char * keyword = optarg;
+ /*const gdcm::DictEntry &dictentry =*/ pubdict.GetDictEntryByKeyword(keyword, tag);
+ if( tag != gdcm::Tag(0xffff,0xffff) )
+ tags.push_back( tag );
+ else
+ {
+ std::cerr << "Invalid keyword: " << keyword << std::endl;
+ return 1;
+ }
+ }
+ break;
+
case 'P':
privatetag.ReadFromCommaSeparatedString(optarg);
privatetags.push_back( privatetag );
https://sourceforge.net/p/gdcm/gdcm/ci/f2ad036b2febe54c2039991c98f940dc1d68c42f/
commit f2ad036b2febe54c2039991c98f940dc1d68c42f
Author: Mathieu Malaterre <mat...@gm...>
Date: Tue Sep 10 14:17:17 2019 +0200
Return an error when no file (bogus dir?)
diff --git a/Applications/Cxx/gdcmscanner.cxx b/Applications/Cxx/gdcmscanner.cxx
index 9838afdd8..3267707eb 100644
--- a/Applications/Cxx/gdcmscanner.cxx
+++ b/Applications/Cxx/gdcmscanner.cxx
@@ -300,6 +300,11 @@ int main(int argc, char *argv[])
gdcm::Directory d;
unsigned int nfiles = d.Load( dirname.c_str(), recursive );
+ if( !nfiles )
+ {
+ std::cerr << "No files found in: " << dirname << std::endl;
+ return 1;
+ }
if( verbose ) d.Print( std::cout );
if( !table )
std::cout << "done retrieving file list " << nfiles << " files found." << std::endl;
https://sourceforge.net/p/gdcm/gdcm/ci/c9874de1eed9e89eacd10350daad0722bbac0ff7/
commit c9874de1eed9e89eacd10350daad0722bbac0ff7
Author: Mathieu Malaterre <mat...@gm...>
Date: Tue Sep 10 14:15:19 2019 +0200
Properly return the correct type
diff --git a/Source/Common/gdcmDirectory.cxx b/Source/Common/gdcmDirectory.cxx
index db27359e1..045cf2a1e 100644
--- a/Source/Common/gdcmDirectory.cxx
+++ b/Source/Common/gdcmDirectory.cxx
@@ -40,7 +40,7 @@ unsigned int Directory::Load(FilenameType const &name, bool recursive)
Toplevel = name;
return Explore( Toplevel, recursive );
}
- return false;
+ return 0;
}
unsigned int Directory::Explore(FilenameType const &name, bool recursive)
https://sourceforge.net/p/gdcm/gdcm/ci/ae471b46b63527460b4d166fea93879c6fdd1482/
commit ae471b46b63527460b4d166fea93879c6fdd1482
Author: Mathieu Malaterre <mat...@gm...>
Date: Tue Sep 10 12:21:27 2019 +0200
Minimal work to have a dctable equivalent tool
diff --git a/Applications/Cxx/gdcmscanner.cxx b/Applications/Cxx/gdcmscanner.cxx
index f8064acf5..9838afdd8 100644
--- a/Applications/Cxx/gdcmscanner.cxx
+++ b/Applications/Cxx/gdcmscanner.cxx
@@ -62,6 +62,7 @@ static void PrintHelp()
std::cout << " -p --print Print output." << std::endl;
std::cout << " -r --recursive Recusively descend directory." << std::endl;
std::cout << " --strict Use strict parser (faster but less tolerant with bogus DICOM files)." << std::endl;
+ std::cout << " --table Use Table output." << std::endl;
std::cout << "General Options:" << std::endl;
std::cout << " -V --verbose more verbose (warning+error)." << std::endl;
std::cout << " -W --warning print warning info." << std::endl;
@@ -76,7 +77,7 @@ typedef std::vector<gdcm::PrivateTag> VectorPrivateTags;
template < typename TScanner >
static int DoIt(
gdcm::Directory const & d,
- bool const & print ,
+ bool const & print , int table,
VectorTags const & tags,
VectorPrivateTags const & privatetags)
{
@@ -97,7 +98,13 @@ static int DoIt(
std::cerr << "Scanner failed" << std::endl;
return 1;
}
- if (print) s.Print( std::cout );
+ if (print)
+ {
+ if(table)
+ s.PrintTable( std::cout );
+ else
+ s.Print( std::cout );
+ }
return 0;
}
@@ -117,6 +124,7 @@ int main(int argc, char *argv[])
gdcm::PrivateTag privatetag;
int strict = 0;
+ int table = 0;
int verbose = 0;
int warning = 0;
int debug = 0;
@@ -134,6 +142,7 @@ int main(int argc, char *argv[])
{"print", 1, 0, 0},
{"private-tag", 1, 0, 0},
{"strict", 0, &strict, 1},
+ {"table", 0, &table, 1},
// General options !
{"verbose", 0, &verbose, 1},
@@ -292,9 +301,10 @@ int main(int argc, char *argv[])
gdcm::Directory d;
unsigned int nfiles = d.Load( dirname.c_str(), recursive );
if( verbose ) d.Print( std::cout );
- std::cout << "done retrieving file list " << nfiles << " files found." << std::endl;
+ if( !table )
+ std::cout << "done retrieving file list " << nfiles << " files found." << std::endl;
if( strict )
- return DoIt<gdcm::StrictScanner>(d,print,tags,privatetags);
- return DoIt<gdcm::Scanner>(d,print,tags,privatetags);
+ return DoIt<gdcm::StrictScanner>(d,print,table,tags,privatetags);
+ return DoIt<gdcm::Scanner>(d,print,table,tags,privatetags);
}
diff --git a/Source/MediaStorageAndFileFormat/gdcmAnonymizer.cxx b/Source/MediaStorageAndFileFormat/gdcmAnonymizer.cxx
index bcb23fe13..05372a0d0 100644
--- a/Source/MediaStorageAndFileFormat/gdcmAnonymizer.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmAnonymizer.cxx
@@ -744,7 +744,7 @@ catch(...)
}
-bool IsVRUI(Tag const &tag)
+static bool IsVRUI(Tag const &tag)
{
static const Global &g = Global::GetInstance();
static const Dicts &dicts = g.GetDicts();
diff --git a/Source/MediaStorageAndFileFormat/gdcmScanner.cxx b/Source/MediaStorageAndFileFormat/gdcmScanner.cxx
index 0f6486be7..df9e3fdbf 100644
--- a/Source/MediaStorageAndFileFormat/gdcmScanner.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmScanner.cxx
@@ -203,6 +203,51 @@ void Scanner::Print( std::ostream & os ) const
}
}
+static bool IsVRUI(Tag const &tag)
+{
+ static const Global &g = Global::GetInstance();
+ static const Dicts &dicts = g.GetDicts();
+ const DictEntry &dictentry = dicts.GetDictEntry(tag);
+ if( dictentry.GetVR() == VR::UI ) return true;
+ //if( tag == Tag(0x0020,0x000d) // Study Instance UID : UI
+ // || tag == Tag(0x0020,0x0052) //
+ // || tag == Tag(0x0020,0x000e) ) // Series Instance UID : UI
+ // {
+ // return true;
+ // }
+ return false;
+}
+
+void Scanner::PrintTable( std::ostream & os ) const
+{
+ Directory::FilenamesType::const_iterator file = Filenames.begin();
+ for(; file != Filenames.end(); ++file)
+ {
+ const char *filename = file->c_str();
+ assert( filename && *filename );
+ bool b = IsKey(filename);
+ const char *comment = !b ? "could not be read" : "could be read";
+ os << '"' << filename << '"' << "\t";
+ //const FilenameToValue &mapping = Mappings[*tag];
+ TagsType::const_iterator tag = Tags.begin();
+ const TagToValue &mapping = GetMapping(filename);
+ for( ; tag != Tags.end(); ++tag )
+ {
+ const Tag &t = *tag;
+ bool isui = IsVRUI(t);
+ const char *value = "";
+ if( mapping.find(t) != mapping.end() ) {
+ const char * v = mapping.find(t)->second;
+ //const char* value = this->GetValue(filename, *tag);
+ if(v) value = v;
+ }
+ os << '"' << (isui ? String<>::Trim( value ) : value) << '"';
+ os << "\t";
+ }
+ ...
[truncated message content] |