int copyDataToRasterElement(DataElement* pElement, DataPointerArgs* pArgs, void* pData) { RasterElement* pRaster = dynamic_cast<RasterElement*>(pElement); if (pRaster == NULL || pData == NULL) { setLastError(SIMPLE_BAD_PARAMS); return 1; } const RasterDataDescriptor* pDesc = static_cast<const RasterDataDescriptor*>(pRaster->getDataDescriptor()); void* pRawData = pRaster->getRawData(); if (pArgs == NULL && pRawData != NULL) { size_t len = pDesc->getRowCount() * pDesc->getColumnCount() * pDesc->getBandCount() * pDesc->getBytesPerElement(); memcpy(pRawData, pData, len); setLastError(SIMPLE_NO_ERROR); return 0; } DataPointerArgs args = { 0, pDesc->getRowCount() - 1, 0, pDesc->getColumnCount() - 1, 0, pDesc->getBandCount() - 1, 0 }; switch (pDesc->getInterleaveFormat()) { case BSQ: args.interleaveFormat = 0; break; case BIP: args.interleaveFormat = 1; break; case BIL: args.interleaveFormat = 2; break; } if (pArgs == NULL) { pArgs = &args; } bool success = true; switchOnComplexEncoding(pDesc->getDataType(), copySubcube, pData, pRaster, pArgs->rowStart, pArgs->rowEnd, pArgs->columnStart, pArgs->columnEnd, pArgs->bandStart, pArgs->bandEnd, true, success); if (!success) { setLastError(SIMPLE_OTHER_FAILURE); return 1; } setLastError(SIMPLE_NO_ERROR); return 0; }
void PseudocolorLayerImp::draw() { RasterElement* pRasterElement = dynamic_cast<RasterElement*>(getDataElement()); if (pRasterElement != NULL) { if (canRenderAsImage()) { generateImage(); VERIFYNRV(mpImage != NULL); mpImage->draw(GL_NEAREST); } else { DataAccessor accessor(NULL, NULL); bool usingRawData = false; int columns = 0; int rows = 0; EncodingType eType; void* pData = NULL; const RasterDataDescriptor* pDescriptor = dynamic_cast<const RasterDataDescriptor*>(pRasterElement->getDataDescriptor()); if (pDescriptor != NULL) { columns = static_cast<int>(pDescriptor->getColumnCount()); rows = static_cast<int>(pDescriptor->getRowCount()); eType = pDescriptor->getDataType(); } // There is an optimization when the full scene can be processed at once. // Check for if it can be done if (pDescriptor->getBandCount() == 1 || pDescriptor->getInterleaveFormat() == BSQ) { usingRawData = true; pData = pRasterElement->getRawData(); } if (pData == NULL) { FactoryResource<DataRequest> pRequest; pRequest->setInterleaveFormat(BSQ); accessor = pRasterElement->getDataAccessor(pRequest.release()); } SymbolType eSymbol = getSymbol(); int visStartColumn = 0; int visEndColumn = columns - 1; int visStartRow = 0; int visEndRow = rows - 1; DrawUtil::restrictToViewport(visStartColumn, visStartRow, visEndColumn, visEndRow); QMap<int, PseudocolorClass*>::Iterator iter = mClasses.begin(); while (iter != mClasses.end()) { PseudocolorClass* pClass = iter.value(); if (pClass != NULL) { if (pClass->isDisplayed()) { QColor clrMarker = pClass->getColor(); if (usingRawData) // all data in memory { switchOnEncoding(eType, drawPseudocolorMarkers, pData, columns - 1, rows - 1, visStartColumn, visStartRow, visEndColumn, visEndRow, eSymbol, clrMarker, pClass->getValue()); } else { for (int row = 0; row < rows; ++row) { if (!accessor.isValid()) { break; } pData = accessor->getColumn(); switchOnEncoding(eType, drawPseudocolorMarkers, pData, columns - 1, row, visStartColumn, row, visEndColumn, row, eSymbol, clrMarker, pClass->getValue(), row); accessor->nextRow(); } accessor->toPixel(0, 0); } } } iter++; } } } }
void* createDataPointer(DataElement* pElement, DataPointerArgs* pArgs, int* pOwn) { RasterElement* pRaster = dynamic_cast<RasterElement*>(pElement); if (pRaster == NULL || pOwn == NULL) { setLastError(SIMPLE_BAD_PARAMS); return NULL; } void* pRawData = pRaster->getRawData(); if (pArgs == NULL && pRawData != NULL) { *pOwn = 0; setLastError(SIMPLE_NO_ERROR); return pRawData; } *pOwn = 1; const RasterDataDescriptor* pDesc = static_cast<const RasterDataDescriptor*>(pRaster->getDataDescriptor()); DataPointerArgs args = { 0, pDesc->getRowCount() - 1, 0, pDesc->getColumnCount() - 1, 0, pDesc->getBandCount() - 1, 0 }; switch (pDesc->getInterleaveFormat()) { case BSQ: args.interleaveFormat = 0; break; case BIP: args.interleaveFormat = 1; break; case BIL: args.interleaveFormat = 2; break; } if (pArgs == NULL) { pArgs = &args; } unsigned int rowCount = pArgs->rowEnd - pArgs->rowStart + 1; unsigned int columnCount = pArgs->columnEnd - pArgs->columnStart + 1; unsigned int bandCount = pArgs->bandEnd - pArgs->bandStart + 1; pRawData = new (std::nothrow) char[rowCount * columnCount * bandCount * pDesc->getBytesPerElement()]; if (pRawData == NULL) { setLastError(SIMPLE_NO_MEM); return NULL; } bool success = true; switchOnComplexEncoding(pDesc->getDataType(), copySubcube, pRawData, pRaster, pArgs->rowStart, pArgs->rowEnd, pArgs->columnStart, pArgs->columnEnd, pArgs->bandStart, pArgs->bandEnd, false, success); if (!success) { delete [] pRawData; setLastError(SIMPLE_OTHER_FAILURE); return NULL; } setLastError(SIMPLE_NO_ERROR); return pRawData; }
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; }