void PixmapCompressor::searchJob(const std::vector<SubPixmap>& rangeRegions, const std::vector<SubPixmap>& domainRegions, unsigned short start, unsigned short end, std::map<unsigned short, Result>& results, unsigned short& status) { status = 0; //For each domain region this thread must handle for (int i = start; i < end; ++i) { //Store every transformations for this domain region to avoid computing them several times Pixmap* transformationsResults[16]; transformationsResults[0] = domainRegions[i].pixmap->downscale(m_rangeRegionSize); transformationsResults[1] = transformationsResults[0]->applyTransformation(ROTATION_90); //ROTATION_90 = 1 transformationsResults[2] = transformationsResults[0]->applyTransformation(ROTATION_180); //ROTATION_180 = 2 transformationsResults[3] = transformationsResults[0]->applyTransformation(ROTATION_270); //ROTATION_270 = 3 transformationsResults[4] = transformationsResults[0]->applyTransformation(FLIP); //FLIP = 4 transformationsResults[5] = transformationsResults[4]->applyTransformation(ROTATION_90); //ROTATION_90 | FLIP = 5 transformationsResults[6] = transformationsResults[4]->applyTransformation(ROTATION_180); //ROTATION_90 | FLIP = 6 transformationsResults[7] = transformationsResults[4]->applyTransformation(ROTATION_270); //ROTATION_90 | FLIP = 7 transformationsResults[8] = transformationsResults[0]->applyTransformation(INVERT); //INVERT = 8 transformationsResults[9] = transformationsResults[8]->applyTransformation(ROTATION_90); //ROTATION_90 | INVERT = 9 transformationsResults[10] = transformationsResults[8]->applyTransformation(ROTATION_180); //ROTATION_180 | INVERT = 10 transformationsResults[11] = transformationsResults[8]->applyTransformation(ROTATION_270); //ROTATION_270 | INVERT = 11 transformationsResults[12] = transformationsResults[8]->applyTransformation(FLIP); //FLIP | INVERT = 12 transformationsResults[13] = transformationsResults[12]->applyTransformation(ROTATION_90); //ROTATION_90 | FLIP | INVERT = 13 transformationsResults[14] = transformationsResults[12]->applyTransformation(ROTATION_180); //ROTATION_180 | FLIP | INVERT = 14 transformationsResults[15] = transformationsResults[12]->applyTransformation(ROTATION_270); //ROTATION_270 | FLIP | INVERT = 15 //For each range region for (unsigned int r = 0; r < rangeRegions.size(); ++r) { auto& currentResult = results[r]; Pixmap* currentRegion = rangeRegions[r].pixmap; //For each transformation //If we already got a perfect match, skip for (int j = 0; currentResult.variance > 0 && j < 16; ++j) { unsigned short variance = currentRegion->computeVariance(*transformationsResults[j]); //We're looking for the minimum variance (best match) if (variance < currentResult.variance) { currentResult.variance = variance; currentResult.transformationId = j; currentResult.domainId = i; } } } //Clean stored transformations for (int j = 0; j < 16; ++j) delete transformationsResults[j]; ++status; } status = STATUS_DONE; }