+bool File::CheckWriteIntegrity()
+{
+ if(PixelWriteConverter->GetUserData())
+ {
+ int numberBitsAllocated = HeaderInternal->GetBitsAllocated();
+ if ( numberBitsAllocated == 0 || numberBitsAllocated == 12 )
+ {
+ numberBitsAllocated = 16;
+ }
+
+ size_t decSize = HeaderInternal->GetXSize()
+ * HeaderInternal->GetYSize()
+ * HeaderInternal->GetZSize()
+ * ( numberBitsAllocated / 8 )
+ * HeaderInternal->GetSamplesPerPixel();
+ size_t rgbSize = decSize;
+ if( HeaderInternal->HasLUT() )
+ rgbSize = decSize * 3;
+
+ switch(WriteMode)
+ {
+ case WMODE_RAW :
+ if( decSize!=PixelWriteConverter->GetUserDataSize() )
+ {
+ gdcmVerboseMacro( "Data size is incorrect (Raw)" << decSize
+ << " / " << PixelWriteConverter->GetUserDataSize() );
+ return false;
+ }
+ break;
+ case WMODE_RGB :
+ if( rgbSize!=PixelWriteConverter->GetUserDataSize() )
+ {
+ gdcmVerboseMacro( "Data size is incorrect (RGB)" << decSize
+ << " / " << PixelWriteConverter->GetUserDataSize() );
+ return false;
+ }
+ break;
+ }
+ }
+
+ return true;
+}
+
+void File::SetWriteToRaw()
+{
+ if( HeaderInternal->GetNumberOfScalarComponents() == 3
+ && !HeaderInternal->HasLUT())
+ {
+ SetWriteToRGB();
+ }
+ else
+ {
+ ValEntry *photInt = CopyValEntry(0x0028,0x0004);
+ if(HeaderInternal->HasLUT())
+ {
+ photInt->SetValue("PALETTE COLOR ");
+ }
+ else
+ {
+ photInt->SetValue("MONOCHROME1 ");
+ }
+
+ PixelWriteConverter->SetReadData(PixelReadConverter->GetRaw(),
+ PixelReadConverter->GetRawSize());
+
+ BinEntry *pixel =
+ CopyBinEntry(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
+ pixel->SetValue(GDCM_BINLOADED);
+ pixel->SetBinArea(PixelWriteConverter->GetData(),false);
+ pixel->SetLength(PixelWriteConverter->GetDataSize());
+
+ Archive->Push(photInt);
+ Archive->Push(pixel);
+ }
+}
+
+void File::SetWriteToRGB()
+{
+ if(HeaderInternal->GetNumberOfScalarComponents()==3)
+ {
+ PixelReadConverter->BuildRGBImage();
+
+ ValEntry *spp = CopyValEntry(0x0028,0x0002);
+ spp->SetValue("3 ");
+
+ ValEntry *planConfig = CopyValEntry(0x0028,0x0006);
+ planConfig->SetValue("0 ");
+
+ ValEntry *photInt = CopyValEntry(0x0028,0x0004);
+ photInt->SetValue("RGB ");
+
+ if(PixelReadConverter->GetRGB())
+ {
+ PixelWriteConverter->SetReadData(PixelReadConverter->GetRGB(),
+ PixelReadConverter->GetRGBSize());
+ }
+ else // Raw data
+ {
+ PixelWriteConverter->SetReadData(PixelReadConverter->GetRaw(),
+ PixelReadConverter->GetRawSize());
+ }
+
+ BinEntry *pixel =
+ CopyBinEntry(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
+ pixel->SetValue(GDCM_BINLOADED);
+ pixel->SetBinArea(PixelWriteConverter->GetData(),false);
+ pixel->SetLength(PixelWriteConverter->GetDataSize());
+
+ Archive->Push(spp);
+ Archive->Push(planConfig);
+ Archive->Push(photInt);
+ Archive->Push(pixel);
+
+ // Remove any LUT
+ Archive->Push(0x0028,0x1101);
+ Archive->Push(0x0028,0x1102);
+ Archive->Push(0x0028,0x1103);
+ Archive->Push(0x0028,0x1201);
+ Archive->Push(0x0028,0x1202);
+ Archive->Push(0x0028,0x1203);
+
+ // For old ACR-NEMA
+ // Thus, we have a RGB image and the bits allocated = 24 and
+ // samples per pixels = 1 (in the read file)
+ if(HeaderInternal->GetBitsAllocated()==24)
+ {
+ ValEntry *bitsAlloc = CopyValEntry(0x0028,0x0100);
+ bitsAlloc->SetValue("8 ");
+
+ ValEntry *bitsStored = CopyValEntry(0x0028,0x0101);
+ bitsStored->SetValue("8 ");
+
+ ValEntry *highBit = CopyValEntry(0x0028,0x0102);
+ highBit->SetValue("7 ");
+
+ Archive->Push(bitsAlloc);
+ Archive->Push(bitsStored);
+ Archive->Push(highBit);
+ }
+ }
+ else
+ {
+ SetWriteToRaw();
+ }
+}
+
+void File::RestoreWrite()
+{
+ Archive->Restore(0x0028,0x0002);
+ Archive->Restore(0x0028,0x0004);
+ Archive->Restore(0x0028,0x0006);
+ Archive->Restore(GetHeader()->GetGrPixel(),GetHeader()->GetNumPixel());
+
+ // For old ACR-NEMA (24 bits problem)
+ Archive->Restore(0x0028,0x0100);
+ Archive->Restore(0x0028,0x0101);
+ Archive->Restore(0x0028,0x0102);
+
+ // For the LUT
+ Archive->Restore(0x0028,0x1101);
+ Archive->Restore(0x0028,0x1102);
+ Archive->Restore(0x0028,0x1103);
+ Archive->Restore(0x0028,0x1201);
+ Archive->Restore(0x0028,0x1202);
+ Archive->Restore(0x0028,0x1203);
+}
+
+void File::SetWriteFileTypeToACR()
+{
+ Archive->Push(0x0002,0x0010);
+}
+
+void File::SetWriteFileTypeToExplicitVR()
+{
+ std::string ts = Util::DicomString(
+ Global::GetTS()->GetSpecialTransferSyntax(TS::ExplicitVRLittleEndian) );
+
+ ValEntry *tss = CopyValEntry(0x0002,0x0010);
+ tss->SetValue(ts);
+
+ Archive->Push(tss);
+}
+
+void File::SetWriteFileTypeToImplicitVR()
+{
+ std::string ts = Util::DicomString(
+ Global::GetTS()->GetSpecialTransferSyntax(TS::ImplicitVRLittleEndian) );
+
+ ValEntry *tss = CopyValEntry(0x0002,0x0010);
+ tss->SetValue(ts);
+
+ Archive->Push(tss);
+}
+
+void File::RestoreWriteFileType()
+{
+ Archive->Restore(0x0002,0x0010);
+}
+
+void File::SetWriteToLibido()
+{
+ ValEntry *oldRow = dynamic_cast<ValEntry *>
+ (HeaderInternal->GetDocEntry(0x0028, 0x0010));
+ ValEntry *oldCol = dynamic_cast<ValEntry *>
+ (HeaderInternal->GetDocEntry(0x0028, 0x0011));
+
+ if( oldRow && oldCol )
+ {
+ std::string rows, columns;
+
+ ValEntry *newRow=new ValEntry(oldRow->GetDictEntry());
+ ValEntry *newCol=new ValEntry(oldCol->GetDictEntry());
+
+ newRow->Copy(oldCol);
+ newCol->Copy(oldRow);
+
+ newRow->SetValue(oldCol->GetValue());
+ newCol->SetValue(oldRow->GetValue());
+
+ Archive->Push(newRow);
+ Archive->Push(newCol);
+ }
+
+ ValEntry *libidoCode = CopyValEntry(0x0008,0x0010);
+ libidoCode->SetValue("ACRNEMA_LIBIDO_1.1");
+ Archive->Push(libidoCode);
+}