static BOOL _findStrings ( HWND hDlg, DWORD minLength, BOOL ascii, BOOL unicode, BOOL showOffset, BOOL searchBoth ) { PBYTE fileptr = g_object; PBYTE fileend = g_object; DWORD filelen = 0; CHAR str[MAX_STRING_LEN] = { 0 }; CHAR strsfound[30] = { 0 }; int strlen = 0; int offset = 0; int index = 0; DWORD steplen = 0; int stepOffset = 0; char isUnicode = 0; int longestStr = 0; BOOL stop = FALSE; BOOL err = FALSE; if (minLength < MIN_STRING_LEN) { minLength = MIN_STRING_LEN; } ResetEvent(g_event); filelen = CFFApi.eaGetObjectSize(hDlg); fileend += filelen; steplen = filelen / 100; if (searchBoth) { steplen *= 2; } while (fileptr + offset < fileend && !stop) { ZeroMemory(str, sizeof(str)); strlen = string(fileptr, filelen, offset, unicode, str, sizeof(str) - 1, &isUnicode); if (strlen >= (int)minLength) { if (index < MAXINT16) { if (strlen > longestStr) { longestStr = strlen; } if ((ascii && !isUnicode) || (unicode && isUnicode)) { _insertString(hDlg, str, strlen + 1, showOffset, offset, searchBoth, isUnicode, index); index++; } } else { Edit_SetText(GetDlgItem(hDlg, IDC_STATUS), "ERROR: Exceeded string display limit (~32K strings). Increase min string length."); err = TRUE; break; } } offset += (strlen == 0) ? 1 : (isUnicode ? strlen * 2 : strlen); if (offset - stepOffset > (int)steplen) { SendDlgItemMessageA(hDlg, IDC_PROGRESS, PBM_STEPIT, 0, (LPARAM)0); stepOffset = offset; } if (WAIT_OBJECT_0 == WaitForSingleObject(g_event, 0)) { stop = TRUE; } } ListView_SetColumnWidth(GetDlgItem(hDlg, IDC_STRINGLIST), showOffset + searchBoth, longestStr * PIXELS_PER_CHAR); if (!stop) { if (!err) { ZeroMemory(strsfound, sizeof(strsfound)); _snprintf_s(strsfound, sizeof(strsfound), sizeof(strsfound), "Found %d strings.", index); Edit_SetText(GetDlgItem(hDlg, IDC_STATUS), strsfound); } } return stop || err; }
void StatisticsCASARegion::_getStatsFromCalculator( casa::ImageInterface<casa::Float>* image, const casa::Record& region, const std::vector<int>& slice, QList<Carta::Lib::StatInfo>& stats, const QString& regionType ){ //If the region record is empty, there are not stats - just return. int fieldCount = region.nfields(); if ( fieldCount == 0 ){ return; } std::shared_ptr<const casa::ImageInterface<casa::Float> > imagePtr( image->cloneII() ); casa::CoordinateSystem cs = image->coordinates(); casa::Vector<casa::Int> displayAxes = cs.directionAxesNumbers(); casa::Quantum<casa::Double> pix0( 0, "pix"); casa::IPosition shape = image->shape(); int nAxes = shape.nelements(); casa::Vector<casa::Quantum<casa::Double> > blcq( nAxes, pix0); casa::Vector<casa::Quantum<casa::Double> > trcq( nAxes, pix0); for ( int i = 0; i < nAxes; i++ ){ if ( i == displayAxes[0] || i == displayAxes[1]){ trcq[i].setValue( shape[i] ); } else { blcq[i].setValue( slice[i] ); trcq[i].setValue( slice[i] ); } } casa::WCBox box( blcq, trcq, cs, casa::Vector<casa::Int>()); casa::ImageRegion* imgBox = new casa::ImageRegion( box ); std::shared_ptr<casa::SubImage<casa::Float> > boxImage( new casa::SubImage<Float>(*image, *imgBox ) ); ImageStatsCalculator calc( boxImage, ®ion, "", true); calc.setList(False); Record result = calc.calculate(); const casa::String blcKey( "blc"); const casa::String trcKey( "trc"); _insertScalar( result, "npts", Carta::Lib::StatInfo::StatType::FrameCount, stats ); _insertScalar( result, "sum", Carta::Lib::StatInfo::StatType::Sum, stats ); _insertScalar( result, "sumsq", Carta::Lib::StatInfo::StatType::SumSq, stats ); _insertScalar( result, "min", Carta::Lib::StatInfo::StatType::Min, stats ); _insertScalar( result, "max", Carta::Lib::StatInfo::StatType::Max, stats ); _insertScalar( result, "mean", Carta::Lib::StatInfo::StatType::Mean, stats ); _insertScalar( result, "sigma", Carta::Lib::StatInfo::StatType::Sigma, stats ); _insertScalar( result, "rms", Carta::Lib::StatInfo::StatType::RMS, stats ); _insertScalar( result, "flux", Carta::Lib::StatInfo::StatType::FluxDensity, stats ); _insertList( result, blcKey, Carta::Lib::StatInfo::StatType::Blc, stats ); _insertList( result, trcKey, Carta::Lib::StatInfo::StatType::Trc, stats ); _insertList( result, "minpos", Carta::Lib::StatInfo::StatType::MinPos, stats ); _insertList( result, "maxpos", Carta::Lib::StatInfo::StatType::MaxPos, stats ); _insertString( result, "blcf", Carta::Lib::StatInfo::StatType::Blcf, stats ); _insertString( result, "trcf", Carta::Lib::StatInfo::StatType::Trcf, stats ); _insertString( result, "minposf", Carta::Lib::StatInfo::StatType::MinPosf, stats ); _insertString( result, "maxposf", Carta::Lib::StatInfo::StatType::MaxPosf, stats ); //Put in an identifier. if ( result.isDefined( blcKey ) && result.isDefined( trcKey ) ){ casa::Vector<int> blcArray = result.asArrayInt( blcKey ); QString blcVal = _vectorToString( blcArray ); casa::Vector<int> trcArray = result.asArrayInt( trcKey ); QString trcVal = _vectorToString( trcArray ); QString idVal = regionType + ":" + blcVal; if ( blcVal != trcVal ){ idVal = idVal + " x " + trcVal; } Carta::Lib::StatInfo info( Carta::Lib::StatInfo::StatType::Name ); info.setValue( idVal ); info.setImageStat( false ); stats.append( info ); } }