CachedPage::UnitPtr DicomRasterPager::fetchUnit(DataRequest *pOriginalRequest) { VERIFYRV(pOriginalRequest != NULL, CachedPage::UnitPtr()); unsigned int frame = pOriginalRequest->getStartBand().getOriginalNumber(); if(mConvertRgb) { frame /= 3; } const RasterDataDescriptor *pDesc = static_cast<const RasterDataDescriptor*>(getRasterElement()->getDataDescriptor()); unsigned int bpp = pDesc->getBytesPerElement() * 8; size_t bufsize = mpImage->getOutputDataSize(bpp); char *pBuffer = new char[bufsize]; if(!mpImage->getOutputData(pBuffer, bufsize, bpp, frame, 1)) { delete pBuffer; return CachedPage::UnitPtr(); } if(mConvertRgb) { unsigned int band = pOriginalRequest->getStartBand().getOriginalNumber(); size_t bandsize = bufsize / 3; char *pNewBuffer = new char[bandsize]; memcpy(pNewBuffer, pBuffer + (band * bandsize), bandsize); delete pBuffer; pBuffer = pNewBuffer; bufsize = bandsize; } return CachedPage::UnitPtr(new CachedPage::CacheUnit(pBuffer, pDesc->getRows()[0], pDesc->getRowCount(), bufsize)); }
bool DicomRasterPager::openFile(const std::string &filename) { mpImage.reset(new DicomImage(filename.c_str())); if(mpImage->getStatus() != EIS_Normal) { VERIFY_MSG(false, DicomImage::getString(mpImage->getStatus())); } if((mpImage->getPhotometricInterpretation() == EPI_RGB || mpImage->getPhotometricInterpretation() == EPI_PaletteColor) && static_cast<const RasterDataDescriptor*>(getRasterElement()->getDataDescriptor())->getBandCount() != mpImage->getFrameCount()) { mConvertRgb = true; } return true; }
CachedPage::UnitPtr DiHdfRasterPager::fetchUnit(DataRequest *pOriginalRequest) { VERIFYRV(pOriginalRequest != NULL, CachedPage::UnitPtr()); unsigned int frame = pOriginalRequest->getStartBand().getOnDiskNumber(); if (mHdf.toFrame(frame) == FAIL) { return CachedPage::UnitPtr(); } const RasterDataDescriptor *pDesc = static_cast<const RasterDataDescriptor*>(getRasterElement()->getDataDescriptor()); unsigned int bpp = pDesc->getBytesPerElement(); size_t bufsize = pOriginalRequest->getConcurrentRows() * pDesc->getColumnCount() * bpp; char* pBuffer = new char[bufsize]; int32 pStart[] = {pDesc->getActiveColumn(0).getOnDiskNumber(), pOriginalRequest->getStartRow().getOnDiskNumber()}; int32 pCount[] = {pDesc->getColumnCount(), pOriginalRequest->getConcurrentRows()}; int32 pStride[] = {1, 1}; if (GRreadimage(mHdf.riid(), pStart, pStride, pCount, pBuffer) == FAIL) { delete pBuffer; return CachedPage::UnitPtr(); } return CachedPage::UnitPtr(new CachedPage::CacheUnit( pBuffer, pOriginalRequest->getStartRow(), pOriginalRequest->getConcurrentRows(), bufsize, pOriginalRequest->getStartBand())); }
CachedPage::UnitPtr Jpeg2000Pager::populateImageData(const DimensionDescriptor& startRow, const DimensionDescriptor& startColumn, unsigned int concurrentRows, unsigned int concurrentColumns) const { VERIFYRV(startRow.isOnDiskNumberValid() == true, CachedPage::UnitPtr()); VERIFYRV(startColumn.isOnDiskNumberValid() == true, CachedPage::UnitPtr()); VERIFYRV(concurrentRows > 0, CachedPage::UnitPtr()); VERIFYRV(concurrentColumns > 0, CachedPage::UnitPtr()); // Get the rows, colums, and bands to load unsigned int onDiskStartRow = startRow.getOnDiskNumber(); unsigned int onDiskStopRow = onDiskStartRow + concurrentRows; unsigned int onDiskStartColumn = startColumn.getOnDiskNumber(); unsigned int onDiskStopColumn = onDiskStartColumn + concurrentColumns; const RasterElement* pRaster = getRasterElement(); VERIFYRV(pRaster != NULL, CachedPage::UnitPtr()); const RasterDataDescriptor* pDescriptor = dynamic_cast<const RasterDataDescriptor*>(pRaster->getDataDescriptor()); VERIFYRV(pDescriptor != NULL, CachedPage::UnitPtr()); const RasterFileDescriptor* pFileDescriptor = dynamic_cast<const RasterFileDescriptor*>(pDescriptor->getFileDescriptor()); VERIFYRV(pFileDescriptor != NULL, CachedPage::UnitPtr()); const std::vector<DimensionDescriptor>& allBands = pFileDescriptor->getBands(); if (allBands.empty() == true) { return CachedPage::UnitPtr(); } // Create the output data unsigned int numPixels = concurrentRows * concurrentColumns * allBands.size(); unsigned int numBytes = numPixels * getBytesPerBand(); if (numPixels > static_cast<unsigned int>(std::numeric_limits<int>::max())) // ArrayResource only allocates up // to INT_MAX number of values { return CachedPage::UnitPtr(); } ArrayResource<Out> pDestination(numPixels, true); char* pDest = reinterpret_cast<char*>(pDestination.get()); if (pDest == NULL) { return CachedPage::UnitPtr(); } memset(pDest, 0, numPixels); // Decode the image from the file, first trying the codestream format then the file format opj_image_t* pImage = decodeImage(onDiskStartRow, onDiskStartColumn, onDiskStopRow, onDiskStopColumn, Jpeg2000Utilities::J2K_CFMT); if (pImage == NULL) { pImage = decodeImage(onDiskStartRow, onDiskStartColumn, onDiskStopRow, onDiskStopColumn, Jpeg2000Utilities::JP2_CFMT); } if (pImage == NULL) { return CachedPage::UnitPtr(); } // Populate the output image data int bandFactor = 1; std::string filename = pRaster->getFilename(); if (filename.empty() == false) { QStringList parts = QString::fromStdString(filename).split('.'); foreach (QString part, parts) { bool error; EncodingType dataType = StringUtilities::fromXmlString<EncodingType>(part.toStdString(), &error); if (dataType.isValid() == true && error == false) { int currentBandFactor = Jpeg2000Utilities::get_num_bands(dataType); if (currentBandFactor > 0) { bandFactor = currentBandFactor; break; } } }
CachedPage::UnitPtr Jpeg2000Pager::fetchUnit(DataRequest* pOriginalRequest) { if (pOriginalRequest == NULL) { return CachedPage::UnitPtr(); } // Check for interleave conversions, which are not supported by this pager const RasterElement* pRaster = getRasterElement(); VERIFYRV(pRaster != NULL, CachedPage::UnitPtr()); const RasterDataDescriptor* pDescriptor = dynamic_cast<const RasterDataDescriptor*>(pRaster->getDataDescriptor()); VERIFYRV(pDescriptor != NULL, CachedPage::UnitPtr()); const RasterFileDescriptor* pFileDescriptor = dynamic_cast<const RasterFileDescriptor*>(pDescriptor->getFileDescriptor()); VERIFYRV(pFileDescriptor != NULL, CachedPage::UnitPtr()); if (pFileDescriptor->getBandCount() > 1) { InterleaveFormatType requestedInterleave = pOriginalRequest->getInterleaveFormat(); InterleaveFormatType fileInterleave = pFileDescriptor->getInterleaveFormat(); if (requestedInterleave != fileInterleave) { return CachedPage::UnitPtr(); } VERIFYRV(requestedInterleave == BIP, CachedPage::UnitPtr()); // The JPEG2000 data is stored BIP } // Get and validate the extents of the data to be loaded DimensionDescriptor startRow = pOriginalRequest->getStartRow(); DimensionDescriptor stopRow = pOriginalRequest->getStopRow(); unsigned int concurrentRows = pOriginalRequest->getConcurrentRows(); DimensionDescriptor startColumn = pOriginalRequest->getStartColumn(); DimensionDescriptor stopColumn = pOriginalRequest->getStopColumn(); unsigned int concurrentColumns = pOriginalRequest->getConcurrentColumns(); DimensionDescriptor startBand = pOriginalRequest->getStartBand(); DimensionDescriptor stopBand = pOriginalRequest->getStopBand(); if ((startRow.isOnDiskNumberValid() == false) || (stopRow.isOnDiskNumberValid() == false) || (startColumn.isOnDiskNumberValid() == false) || (stopColumn.isOnDiskNumberValid() == false) || (startBand.isOnDiskNumberValid() == false) || (stopBand.isOnDiskNumberValid() == false)) { return CachedPage::UnitPtr(); } if ((startRow.getOnDiskNumber() > stopRow.getOnDiskNumber()) || (startColumn.getOnDiskNumber() > stopColumn.getOnDiskNumber()) || (startBand.getOnDiskNumber() > stopBand.getOnDiskNumber())) { return CachedPage::UnitPtr(); } if ((startRow.getActiveNumber() + concurrentRows - 1) > stopRow.getActiveNumber()) { concurrentRows = stopRow.getActiveNumber() - startRow.getActiveNumber() + 1; } if ((startColumn.getActiveNumber() + concurrentColumns - 1) > stopColumn.getActiveNumber()) { concurrentColumns = stopColumn.getActiveNumber() - startColumn.getActiveNumber() + 1; } // Populate the image data based on the output data type EncodingType outputDataType = pDescriptor->getDataType(); switch (outputDataType) { case INT1UBYTE: return populateImageData<unsigned char>(startRow, startColumn, concurrentRows, concurrentColumns); case INT1SBYTE: return populateImageData<signed char>(startRow, startColumn, concurrentRows, concurrentColumns); case INT2UBYTES: return populateImageData<unsigned short>(startRow, startColumn, concurrentRows, concurrentColumns); case INT2SBYTES: return populateImageData<signed short>(startRow, startColumn, concurrentRows, concurrentColumns); case INT4UBYTES: return populateImageData<unsigned int>(startRow, startColumn, concurrentRows, concurrentColumns); case INT4SBYTES: return populateImageData<signed int>(startRow, startColumn, concurrentRows, concurrentColumns); case FLT4BYTES: return populateImageData<float>(startRow, startColumn, concurrentRows, concurrentColumns); case FLT8BYTES: return populateImageData<double>(startRow, startColumn, concurrentRows, concurrentColumns); default: break; } return CachedPage::UnitPtr(); }
bool NefImporter::execute(PlugInArgList* pInArgList, PlugInArgList* pOutArgList) { if (pInArgList == NULL || pOutArgList == NULL) { return false; } //setting up mpRasterElement parseInputArgList(pInArgList); RasterElement* pRaster = getRasterElement(); VERIFY(pRaster != NULL); RasterDataDescriptor *pDescriptor = dynamic_cast<RasterDataDescriptor*>(pRaster->getDataDescriptor()); VERIFY(pDescriptor != NULL); FileDescriptor *pFileDescriptor = pDescriptor->getFileDescriptor(); VERIFY(pFileDescriptor != NULL); //data accessor //RED DimensionDescriptor firstBand = pDescriptor->getActiveBand(0); FactoryResource<DataRequest> pRequest; pRequest->setInterleaveFormat(BSQ); pRequest->setBands(firstBand, firstBand); pRequest->setWritable(true); DataAccessor firstBandDa = pRaster->getDataAccessor(pRequest.release()); //GREEN DimensionDescriptor secondBand = pDescriptor->getActiveBand(1); FactoryResource<DataRequest> qRequest; qRequest->setInterleaveFormat(BSQ); qRequest->setBands(secondBand, secondBand); qRequest->setWritable(true); DataAccessor secondBandDa = pRaster->getDataAccessor(qRequest.release()); //BLUE DimensionDescriptor thirdBand = pDescriptor->getActiveBand(2); FactoryResource<DataRequest> rRequest; rRequest->setInterleaveFormat(BSQ); rRequest->setBands(thirdBand, thirdBand); rRequest->setWritable(true); DataAccessor thirdBandDa = pRaster->getDataAccessor(rRequest.release()); std::string filename = pRaster->getFilename(); Progress *pProgress = getProgress(); FactoryResource<Filename> pFilename; pFilename->setFullPathAndName(filename); LibRaw RawProcessor; putenv ((char*)"TZ=UTC"); #define P1 RawProcessor.imgdata.idata #define S RawProcessor.imgdata.sizes #define C RawProcessor.imgdata.color #define T RawProcessor.imgdata.thumbnail #define P2 RawProcessor.imgdata.other #define OUT RawProcessor.imgdata.params const char *fname=filename.c_str(); RawProcessor.open_file(fname); // Let us unpack the image if (RawProcessor.unpack() != LIBRAW_SUCCESS) { return false; } /* unsigned int *r=NULL; unsigned int *g=NULL; unsigned int *b=NULL; unsigned int *h=NULL; */ unsigned int *zero=0; int row=0,col=0,r=0,c=0; /* r=(unsigned int*)(&RawProcessor.imgdata.image[i][0]); g=(unsigned int*)(&RawProcessor.imgdata.image[i][1]); b=(unsigned int*)(&RawProcessor.imgdata.image[i][2]); h=(unsigned int*)(&RawProcessor.imgdata.image[i][3]); */ //secondBandDa->toPixel(row,col); //thirdBandDa->toPixel(row,col); unsigned short *pData=reinterpret_cast<unsigned short*>(pRaster->getRawData()); if (pData == NULL) { return NULL; } memcpy(pData, RawProcessor.imgdata.rawdata.raw_image, sizeof(unsigned short) * RawProcessor.imgdata.sizes.raw_height * RawProcessor.imgdata.sizes.raw_width); /* if(i%2==0) //RG1 {memcpy(firstBandDa->getColumn(),(unsigned int*)RawProcessor.imgdata.image[i][0],sizeof(unsigned int)); memcpy(thirdBandDa->getColumn(),(unsigned int*)RawProcessor.imgdata.image[i][2],sizeof(unsigned int)); memcpy(secondBandDa->getColumn(),zero,sizeof(unsigned int)); } else{ //G2B memcpy(thirdBandDa->getColumn(),(unsigned int*)RawProcessor.imgdata.image[i][3],sizeof(unsigned int)); memcpy(secondBandDa->getColumn(),(unsigned int*)RawProcessor.imgdata.image[i][1],sizeof(unsigned int)); memcpy(firstBandDa->getColumn(),zero,sizeof(unsigned int)); } */ unsigned short *ptr=NULL; //band 0 Red for(row=0,r=0;row<S.iheight;row++,r++) { for(col=0,c=0;col<S.iwidth;col++,c++) { if(row%2==0) //RG row { if(col%2==0) //Red pixel { ptr=reinterpret_cast<unsigned short*>(firstBandDa->getColumn()); *ptr=pData[c+(r*S.iwidth)+(0*S.iheight*S.iwidth)]; } else { *ptr=0; c--; } } else //GB row { *ptr=0; } firstBandDa->nextColumn(); } if(row%2!=0) r--; firstBandDa->nextRow(); } //band 2 Blue for(row=0,r=0;row<S.iheight;row++,r++) { for(col=0,c=0;col<S.iwidth;col++,c++) { if(row%2!=0) //GB row { if(col%2!=0) //Blue pixel { ptr=reinterpret_cast<unsigned short*>(secondBandDa->getColumn()); *ptr=pData[c+(r*S.iwidth)+(2*S.iheight*S.iwidth)]; } else { *ptr=0; c--; } } else //RG row { *ptr=0; } secondBandDa->nextColumn(); } if(row%2==0) r--; secondBandDa->nextRow(); } //band 1 Green for(row=0,r=0;row<S.iheight;row++,r++) { for(col=0,c=0;col<S.iwidth;col++,c++) { if(row%2==0) //RG row { if(col%2!=0) //Green pixel { ptr=reinterpret_cast<unsigned short*>(thirdBandDa->getColumn()); *ptr=pData[c+(r*S.iwidth)+(1*S.iheight*S.iwidth)]; //g1 } else { *ptr=0; c--; } } else //GB row { if(col%2==0) //Green pixel { ptr=reinterpret_cast<unsigned short*>(thirdBandDa->getColumn()); *ptr=pData[c+(r*S.iwidth)+(3*S.iheight*S.iwidth)]; //g2 } else { *ptr=0; c--; } } thirdBandDa->nextColumn(); } thirdBandDa->nextRow(); } if (createView() == NULL) { return false; } RawProcessor.recycle(); return true; }