Date: 2004 Oct 13
Attributed:
Details:
-We should write the code in a common place, then include this 'cxx' file so the the define from gdcm_mangle redefine to the proper one.
+We should write the code in a common place, then include this 'cxx' file so
+the define from gdcm_mangle redefine to the proper one.
Comments:
-This will be usefull since I may need in the future a 16bits version of this reading
+This will be usefull since I may need in the future a 16bits version of this
+reading
-----------------------------------------------------------------------------
-Description: Change jpeg 'exit' call to standard c++ exception using the jpeg error
+Description: Change jpeg 'exit' call to standard c++ exception using the jpeg
+ error
handler
Date: 2004 Oct 8
Attributed:
optimised function using MACRO (doh!), so it make its very unreadable and very
hard to fix warnings. Should go back to official source, copy proper copyright
and fix warnings on dashboard
-13/10: update apparently no dicom toolkit use this lib as it is too buggy. We should use the ls-patch for ijg instead. Thus we can safely get rid of that lib.
-14/10: PHILIPS_Gyroscan-12-MONO2-Jpeg_Lossless.dcm prove that I was right the old Cornwell lib is buggy and does not read anything.
+13/10: update apparently no dicom toolkit use this lib as it is too buggy.
+We should use the ls-patch for ijg instead. Thus we can safely get rid of that
+lib.
+14/10: PHILIPS_Gyroscan-12-MONO2-Jpeg_Lossless.dcm prove that I was right the
+old Cornwell lib is buggy and does not read anything.
-----------------------------------------------------------------------------
Description: Extent reading support
Date: 2004 Oct 8
Attributed: Mathieu
Details:
-Comments: All ITK/VTK readers support selecting extent. gdcm should support selecting
-extent before being inserted into ITK
+Comments: All ITK/VTK readers support selecting extent. gdcm should support
+selecting extent before being inserted into ITK
-----------------------------------------------------------------------------
Description: Generate new UID each time we write DICOM
Date: 2004 Oct 8
Program: gdcm
Module: $RCSfile: gdcmPixelConvert.cxx,v $
Language: C++
- Date: $Date: 2004/10/25 17:07:16 $
- Version: $Revision: 1.21 $
+ Date: $Date: 2004/10/28 22:21:57 $
+ Version: $Revision: 1.22 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
namespace gdcm
{
-
#define str2num(str, typeNum) *((typeNum *)(str))
// For JPEG 2000, body in file gdcmJpeg2000.cxx
{
int nbPixels = XSize * YSize;
uint16_t* localDecompres = (uint16_t*)Decompressed;
-
+
for( int p = 0; p < nbPixels; p += 2 )
{
uint8_t b0, b1, b2;
throw FormatError( "PixelConvert::ReadAndDecompress12BitsTo16Bits()",
"Unfound second block" );
}
-
+
// Two steps are necessary to please VC++
//
// 2 pixels 12bit = [0xABCDEF]
*localDecompres++ = ((b0 >> 4) << 8) + ((b0 & 0x0f) << 4) + (b1 & 0x0f);
// F C E
*localDecompres++ = ((b2 & 0x0f) << 8) + ((b1 >> 4) << 4) + (b2 >> 4);
-
+
/// \todo JPR Troubles expected on Big-Endian processors ?
}
}
int8_t count;
long numberOfOutputBytes = 0;
long numberOfReadBytes = 0;
-
+
while( numberOfOutputBytes < decompressedSegmentSize )
{
fp->read( (char*)&count, 1 );
// Loop on the fragments
for( unsigned int k = 1; k <= (*it)->NumberFragments; k++ )
{
- //fseek( fp, (*it)->Offset[k] ,SEEK_SET );
fp->seekg( (*it)->Offset[k] , std::ios_base::beg );
(void)ReadAndDecompressRLEFragment( subDecompressed,
(*it)->Length[k],
subDecompressed += decompressedSegmentSize;
}
}
-
+
if ( BitsAllocated == 16 )
{
// Try to deal with RLE 16 Bits
(void)DecompressRLE16BitsFromRLE8Bits( ZSize );
}
-
+
return true;
}
void PixelConvert::ConvertSwapZone()
{
unsigned int i;
-
+
if( BitsAllocated == 16 )
{
uint16_t* im16 = (uint16_t*)Decompressed;
it != JPEGInfo->Fragments.end();
++it )
{
- //fseek( fp, (*it)->Offset, SEEK_SET );
fp->seekg( (*it)->Offset, std::ios_base::beg);
if ( IsJPEG2000 )
"jpeg lossy compression ");
return false;
}
-
+
// Advance to next free location in Decompressed
// for next fragment decompression (if any)
int length = XSize * YSize * SamplesPerPixel;
int numberBytes = BitsAllocated / 8;
-
+
localDecompressed += length * numberBytes;
}
return true;
uint8_t* localDecompressed = Decompressed;
uint8_t* copyDecompressed = new uint8_t[ DecompressedSize ];
memmove( copyDecompressed, localDecompressed, DecompressedSize );
-
+
// to see the tricks about YBR_FULL, YBR_FULL_422,
// YBR_PARTIAL_422, YBR_ICT, YBR_RCT have a look at :
// ftp://medical.nema.org/medical/dicom/final/sup61_ft.pdf
//
int l = XSize * YSize;
int nbFrames = ZSize;
-
+
uint8_t* a = copyDecompressed;
uint8_t* b = copyDecompressed + l;
uint8_t* c = copyDecompressed + l + l;
double R, G, B;
-
+
/// \todo : Replace by the 'well known' integer computation
/// counterpart. Refer to
/// http://lestourtereaux.free.fr/papers/data/yuvrgb.pdf
/// for code optimisation.
-
+
for ( int i = 0; i < nbFrames; i++ )
{
for ( int j = 0; j < l; j++ )
R = 1.164 *(*a-16) + 1.596 *(*c -128) + 0.5;
G = 1.164 *(*a-16) - 0.813 *(*c -128) - 0.392 *(*b -128) + 0.5;
B = 1.164 *(*a-16) + 2.017 *(*b -128) + 0.5;
-
+
if (R < 0.0) R = 0.0;
if (G < 0.0) G = 0.0;
if (B < 0.0) B = 0.0;
if (R > 255.0) R = 255.0;
if (G > 255.0) G = 255.0;
if (B > 255.0) B = 255.0;
-
+
*(localDecompressed++) = (uint8_t)R;
*(localDecompressed++) = (uint8_t)G;
*(localDecompressed++) = (uint8_t)B;
uint8_t* localDecompressed = Decompressed;
uint8_t* copyDecompressed = new uint8_t[ DecompressedSize ];
memmove( copyDecompressed, localDecompressed, DecompressedSize );
-
+
int l = XSize * YSize * ZSize;
-
+
uint8_t* a = copyDecompressed;
uint8_t* b = copyDecompressed + l;
uint8_t* c = copyDecompressed + l + l;
-
+
for (int j = 0; j < l; j++)
{
*(localDecompressed++) = *(a++);
"unavailable file pointer." );
return false;
}
-
- //if ( fseek( fp, PixelOffset, SEEK_SET ) == -1 )
+
fp->seekg( PixelOffset, std::ios_base::beg );
if( fp->fail() || fp->eof()) //Fp->gcount() == 1
{
"unable to find PixelOffset in file." );
return false;
}
-
+
//////////////////////////////////////////////////
//// Second stage: read from disk dans decompress.
if ( BitsAllocated == 12 )
bool PixelConvert::IsDecompressedRGB()
{
if ( IsMonochrome
- || ( PlanarConfiguration == 2 )
+ || PlanarConfiguration == 2
|| IsPaletteColor )
{
return false;
DocEntry* lutRedDataEntry = header->GetDocEntryByNumber( 0x0028,
0x1201 );
LutRedData = new uint8_t[ lutRedDataEntry->GetLength() ];
- //fseek( fp, lutRedDataEntry->GetOffset() ,SEEK_SET );
fp->seekg( lutRedDataEntry->GetOffset() ,std::ios_base::beg );
- fp->read( (char*)LutRedData, (size_t)lutRedDataEntry->GetLength());
- //if ( numberItem != 1 )
- if ( fp->fail() || fp->eof())//Fp->gcount() == 1
+ fp->read( (char*)LutRedData, (size_t)lutRedDataEntry->GetLength());
+ if ( fp->fail() || fp->eof())//Fp->gcount() == 1
{
dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: "
"unable to read red LUT data" );
DocEntry* lutGreenDataEntry = header->GetDocEntryByNumber( 0x0028,
0x1202 );
LutGreenData = new uint8_t[ lutGreenDataEntry->GetLength() ];
- //fseek( fp, lutGreenDataEntry->GetOffset() ,SEEK_SET );
fp->seekg( lutGreenDataEntry->GetOffset() , std::ios_base::beg );
- fp->read( (char*)LutGreenData, (size_t)lutGreenDataEntry->GetLength() );
- //if ( numberItem != 1 )
- if ( fp->fail() || fp->eof())//Fp->gcount() == 1
+ fp->read( (char*)LutGreenData, (size_t)lutGreenDataEntry->GetLength() );
+ if ( fp->fail() || fp->eof())//Fp->gcount() == 1
{
dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: "
"unable to read green LUT data" );
DocEntry* lutBlueDataEntry = header->GetDocEntryByNumber( 0x0028,
0x1203 );
LutBlueData = new uint8_t[ lutBlueDataEntry->GetLength() ];
- //fseek( fp, lutBlueDataEntry->GetOffset() ,SEEK_SET );
fp->seekg( lutBlueDataEntry->GetOffset() , std::ios_base::beg );
fp->read( (char*)LutBlueData, (size_t)lutBlueDataEntry->GetLength() );
- //if ( numberItem != 1 )
- if ( fp->fail() || fp->eof())//Fp->gcount() == 1
+ if ( fp->fail() || fp->eof())//Fp->gcount() == 1
{
dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: "
"unable to read blue LUT data" );
return;
}
- if ( ( LutRedDescriptor == GDCM_UNFOUND )
- || ( LutGreenDescriptor == GDCM_UNFOUND )
- || ( LutBlueDescriptor == GDCM_UNFOUND ) )
+ if ( LutRedDescriptor == GDCM_UNFOUND
+ || LutGreenDescriptor == GDCM_UNFOUND
+ || LutBlueDescriptor == GDCM_UNFOUND )
{
return;
}
{
if ( RGB )
{
- // The job is allready done.
+ // The job is already done.
return true;
}
Program: gdcm
Module: $RCSfile: gdcmUtil.cxx,v $
Language: C++
- Date: $Date: 2004/10/27 22:58:06 $
- Version: $Revision: 1.56 $
+ Date: $Date: 2004/10/28 22:21:57 $
+ Version: $Revision: 1.57 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
}
}
+
+template <class T>
+std::ostream& binary_write(std::ostream& os, const T& val)
+{
+ return os.write(reinterpret_cast<const char*>(&val), sizeof val);
+}
+
+std::ostream& binary_write(std::ostream& os, const uint16_t& val)
+{
+#ifdef GDCM_WORDS_BIGENDIAN
+ uint16_t *swap;
+ swap = (((*val>>8)&0xff) | ((*val&0xff)<<8));
+ return os.write(reinterpret_cast<const char*>(swap), 2);
+#else
+ return os.write(reinterpret_cast<const char*>(&val), 2);
+#endif //GDCM_WORDS_BIGENDIAN
+}
+
+std::ostream& binary_write(std::ostream& os, const uint32_t& val)
+{
+#ifdef GDCM_WORDS_BIGENDIAN
+ uint32_t *swap;
+ swap = ( ((val<<24) & 0xff000000) | ((val<<8) & 0x00ff0000) |
+ ((val>>8) & 0x0000ff00) | ((val>>24) & 0x000000ff) );
+ return os.write(reinterpret_cast<const char*>(swap), 4);
+#else
+ return os.write(reinterpret_cast<const char*>(&val), 4);
+#endif //GDCM_WORDS_BIGENDIAN
+}
+
+//template <>
+std::ostream& binary_write(std::ostream& os, const char* val)
+{
+ return os.write(val, strlen(val));
+}
+
+
} // end namespace gdcm