From 90034aefc764a5b6c4815c9073606d36956acab1 Mon Sep 17 00:00:00 2001 From: malaterre Date: Fri, 11 Feb 2005 19:00:39 +0000 Subject: [PATCH] ENH: First pass at my big endian emulation on little endian --- src/gdcmBinEntry.cxx | 51 ++++++++----------------------------- src/gdcmJpeg.cxx | 8 +++--- src/gdcmUtil.cxx | 60 ++++++++++++++++++++++++++++++++++++++++++-- src/gdcmUtil.h | 6 +++-- 4 files changed, 77 insertions(+), 48 deletions(-) diff --git a/src/gdcmBinEntry.cxx b/src/gdcmBinEntry.cxx index 21895ef4..70a27780 100644 --- a/src/gdcmBinEntry.cxx +++ b/src/gdcmBinEntry.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmBinEntry.cxx,v $ Language: C++ - Date: $Date: 2005/02/11 16:36:52 $ - Version: $Revision: 1.69 $ + Date: $Date: 2005/02/11 19:00:39 $ + Version: $Revision: 1.70 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -18,8 +18,7 @@ #include "gdcmBinEntry.h" #include "gdcmContentEntry.h" - -#include "gdcmDebug.h" +#include "gdcmUtil.h" #include #include @@ -74,61 +73,33 @@ BinEntry::~BinEntry() void BinEntry::WriteContent(std::ofstream *fp, FileType filetype) { DocEntry::WriteContent(fp, filetype); - void* binArea = GetBinArea(); - int lgr = GetLength(); - if (binArea) // the binArea was *actually* loaded + uint8_t* binArea8 = BinArea; //safe notation + size_t lgr = GetLength(); + if (BinArea) // the binArea was *actually* loaded { - /// \todo Probabely, the same operation will have to be done when we want /// to write image with Big Endian Transfert Syntax, /// and we are working on Little Endian Processor #ifdef GDCM_WORDS_BIGENDIAN - const int BUFFER_SIZE = 4096; /// \todo FIXME Right now, we only care of Pixels element /// we should deal with *all* the BinEntries + /// well not really since we are not interpreting values read... // 8 Bits Pixels *are* OB, 16 Bits Pixels *are* OW // -value forced while Reading process- if (GetGroup() == 0x7fe0 && GetVR() == "OW") { - uint16_t *buffer = new uint16_t[BUFFER_SIZE/2]; - - // how many BUFFER_SIZE long pieces in binArea ? - int nbPieces = lgr/BUFFER_SIZE; //(16 bits = 2 Bytes) - int remainingSize = lgr%BUFFER_SIZE; - - uint16_t *binArea16 = (uint16_t*)binArea; - for (int j=0;j> 8) | (binArea16[i] << 8); - uint16_t val = binArea16[i]; - buffer[i] = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); - } - fp->write ( (char*)buffer, BUFFER_SIZE ); - binArea16 += BUFFER_SIZE/2; - } - if ( remainingSize > 0) - { - for (int i = 0; i < remainingSize/2; i++) - { - //buffer[i] = (binArea16[i] >> 8) | (binArea16[i] << 8); - uint16_t val = binArea16[i]; - buffer[i] = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); - } - fp->write ( (char*)buffer, remainingSize ); - } - delete[] buffer; + uint16_t *binArea16 = (uint16_t*)binArea8; + binary_write (*fp, binArea16, lgr ); } else { // For any other VR, BinEntry is re-written as-is - fp->write ( (char*)binArea, lgr ); + binary_write (*fp, binArea8, lgr ); } #else - fp->write ( (char*)binArea, lgr ); // Elem value + binary_write ( *fp, binArea8, lgr ); // Elem value #endif //GDCM_WORDS_BIGENDIAN } diff --git a/src/gdcmJpeg.cxx b/src/gdcmJpeg.cxx index 7cce70bf..da85bd4b 100644 --- a/src/gdcmJpeg.cxx +++ b/src/gdcmJpeg.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJpeg.cxx,v $ Language: C++ - Date: $Date: 2005/02/05 15:15:26 $ - Version: $Revision: 1.46 $ + Date: $Date: 2005/02/11 19:00:39 $ + Version: $Revision: 1.47 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -259,7 +259,7 @@ bool JPEGFragment::ReadJPEGFile (std::ifstream *fp, void *image_buffer, int &sta jerr.pub.error_exit = my_error_exit; // for any output message call my_output_message //jerr.pub.output_message = my_output_message; - + // Establish the setjmp return context for my_error_exit to use. if (setjmp(jerr.setjmp_buffer)) { @@ -289,7 +289,7 @@ bool JPEGFragment::ReadJPEGFile (std::ifstream *fp, void *image_buffer, int &sta // Suspension in jpeg_read_header statesuspension = 2; } - + // Step 4: set parameters for decompression // prevent the library from performing any color space conversion if( cinfo.process == JPROC_LOSSLESS ) diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index 0e08e053..20861332 100644 --- a/src/gdcmUtil.cxx +++ b/src/gdcmUtil.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmUtil.cxx,v $ Language: C++ - Date: $Date: 2005/02/11 15:22:18 $ - Version: $Revision: 1.133 $ + Date: $Date: 2005/02/11 19:00:39 $ + Version: $Revision: 1.134 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -873,6 +873,62 @@ std::ostream &binary_write(std::ostream &os, std::string const &val) return os.write(val.c_str(), val.size()); } +/** + * \brief binary_write binary_write + * @param os ostream to write to + * @param val val + */ +std::ostream &binary_write(std::ostream &os, const uint8_t *val, size_t len) +{ + // We are writting sizeof(char) thus no need to swap bytes + return os.write(reinterpret_cast(val), len); +} + +/** + * \brief binary_write binary_write + * @param os ostream to write to + * @param val val + */ +std::ostream &binary_write(std::ostream &os, const uint16_t *val, size_t len) +{ +// This is tricky since we are writting two bytes buffer. Be carefull with little endian +// vs big endian. Also this other trick is to allocate a small (efficient) buffer that store +// intermidiate result before writting it. +#ifdef GDCM_WORDS_BIGENDIAN + const int BUFFER_SIZE = 4096; + uint16_t *buffer = new uint16_t[BUFFER_SIZE/2]; + + // how many BUFFER_SIZE long pieces in binArea ? + int nbPieces = lgr/BUFFER_SIZE; //(16 bits = 2 Bytes) + int remainingSize = lgr%BUFFER_SIZE; + + for (int j=0;j> 8) | (binArea16[i] << 8); + uint16_t val = binArea16[i]; + buffer[i] = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); + } + fp->write ( (char*)buffer, BUFFER_SIZE ); + binArea16 += BUFFER_SIZE/2; + } + if ( remainingSize > 0) + { + for (int i = 0; i < remainingSize/2; i++) + { + //buffer[i] = (binArea16[i] >> 8) | (binArea16[i] << 8); + uint16_t val = binArea16[i]; + buffer[i] = ((( val << 8 ) & 0xff00 ) | (( val >> 8 ) & 0x00ff ) ); + } + fp->write ( (char*)buffer, remainingSize ); + } + delete[] buffer; +#else + return os.write(reinterpret_cast(val), len); +#endif +} + //------------------------------------------------------------------------- // Protected diff --git a/src/gdcmUtil.h b/src/gdcmUtil.h index f6de2c7d..86cee144 100644 --- a/src/gdcmUtil.h +++ b/src/gdcmUtil.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmUtil.h,v $ Language: C++ - Date: $Date: 2005/02/02 15:07:41 $ - Version: $Revision: 1.53 $ + Date: $Date: 2005/02/11 19:00:39 $ + Version: $Revision: 1.54 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -77,6 +77,8 @@ GDCM_EXPORT std::ostream &binary_write(std::ostream &os, const uint16_t &val); GDCM_EXPORT std::ostream &binary_write(std::ostream &os, const uint32_t &val); GDCM_EXPORT std::ostream &binary_write(std::ostream &os, const char *val); GDCM_EXPORT std::ostream &binary_write(std::ostream &os, std::string const &val); +GDCM_EXPORT std::ostream &binary_write(std::ostream &os, const uint8_t *val, size_t len); +GDCM_EXPORT std::ostream &binary_write(std::ostream &os, const uint16_t *val, size_t len); } // end namespace gdcm //----------------------------------------------------------------------------- #endif -- 2.48.1