Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:nandcd:15.4
libdmtx
nand_grading_support.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File nand_grading_support.patch of Package libdmtx
diff --git a/dmtx.h b/dmtx.h index 7651c1e..0d236e2 100644 --- a/dmtx.h +++ b/dmtx.h @@ -528,6 +528,36 @@ typedef struct DmtxQuadruplet_struct { unsigned char value[4]; } DmtxQuadruplet; +typedef struct DmtxDecodeErrorsInfo_struct { + int errors[10]; + int maxCorrectableErrors[10]; + int checkedBlocks; + int totalBlocks; + DmtxBoolean readError; +} DmtxDecodeErrorsInfo; + +typedef struct DmtxDecodeStructureInfo_struct { + int codeModulesX; + int codeModulesY; + int fixedXSize; + int fixedYSize; + int* fixedElementsXs; + int* fixedElementsYs; + long* structureModules; + long* structureFixedModules; + long* structureSymbols; + long* structureSegments; + long* structureBlocks; + long* structureParityData; + int structureSize; + long* helperInverseStructure; +} DmtxDecodeStructureInfo; + +typedef struct DmtxExtractedCodeInfo_struct { + DmtxDecodeErrorsInfo errors; + DmtxDecodeStructureInfo structure; +} DmtxExtractedCodeInfo; + /* dmtxtime.c */ extern DmtxTime dmtxTimeNow(void); extern DmtxTime dmtxTimeAdd(DmtxTime t, long msec); @@ -549,9 +579,16 @@ extern int dmtxDecodeGetProp(DmtxDecode *dec, int prop); extern /*@exposed@*/ unsigned char *dmtxDecodeGetCache(DmtxDecode *dec, int x, int y); extern DmtxPassFail dmtxDecodeGetPixelValue(DmtxDecode *dec, int x, int y, int channel, /*@out@*/ int *value); extern DmtxMessage *dmtxDecodeMatrixRegion(DmtxDecode *dec, DmtxRegion *reg, int fix); +extern DmtxMessage *dmtxDecodeMatrixRegion2(DmtxDecode *dec, DmtxRegion *reg, int fix, DmtxExtractedCodeInfo* infoOut); extern DmtxMessage *dmtxDecodePopulatedArray(int sizeIdx, DmtxMessage *msg, int fix); +extern DmtxMessage *dmtxDecodePopulatedArray2(int sizeIdx, DmtxMessage *msg, int fix, DmtxExtractedCodeInfo* infoOut); extern DmtxMessage *dmtxDecodeMosaicRegion(DmtxDecode *dec, DmtxRegion *reg, int fix); extern unsigned char *dmtxDecodeCreateDiagnostic(DmtxDecode *dec, /*@out@*/ int *totalBytes, /*@out@*/ int *headerBytes, int style); +extern float dmtxGetUEC(const DmtxDecodeErrorsInfo* info); +extern int dmtxFindTotalErrors(const DmtxDecodeErrorsInfo* info); +extern int dmtxIsValidResult(const DmtxDecodeErrorsInfo* info); +extern DmtxExtractedCodeInfo* dmtxExtractedCodeInfoCreate(const DmtxRegion *reg); +extern DmtxPassFail dmtxExtractedCodeInfoDestroy(DmtxExtractedCodeInfo **info); /* dmtxregion.c */ extern DmtxRegion *dmtxRegionCreate(DmtxRegion *reg); diff --git a/dmtxdecode.c b/dmtxdecode.c index 567d101..5eeda09 100644 --- a/dmtxdecode.c +++ b/dmtxdecode.c @@ -328,7 +328,7 @@ CacheFillQuad(DmtxDecode *dec, DmtxPixelLoc p0, DmtxPixelLoc p1, DmtxPixelLoc p2 * \return Decoded message */ extern DmtxMessage * -dmtxDecodeMatrixRegion(DmtxDecode *dec, DmtxRegion *reg, int fix) +dmtxDecodeMatrixRegion2(DmtxDecode *dec, DmtxRegion *reg, int fix, DmtxExtractedCodeInfo* infoOut) { //fprintf(stdout, "libdmtx::dmtxDecodeMatrixRegion()\n"); DmtxMessage *msg; @@ -339,7 +339,7 @@ dmtxDecodeMatrixRegion(DmtxDecode *dec, DmtxRegion *reg, int fix) if(msg == NULL) return NULL; - if(PopulateArrayFromMatrix(dec, reg, msg) != DmtxPass) { + if(PopulateArrayFromMatrix(dec, reg, msg, ((infoOut) ? &infoOut->structure : NULL)) != DmtxPass) { dmtxMessageDestroy(&msg); return NULL; } @@ -365,7 +365,13 @@ dmtxDecodeMatrixRegion(DmtxDecode *dec, DmtxRegion *reg, int fix) CacheFillQuad(dec, pxTopLeft, pxTopRight, pxBottomRight, pxBottomLeft); - return dmtxDecodePopulatedArray(reg->sizeIdx, msg, fix); + return dmtxDecodePopulatedArray2(reg->sizeIdx, msg, fix, infoOut); +} + +extern DmtxMessage * +dmtxDecodeMatrixRegion(DmtxDecode *dec, DmtxRegion *reg, int fix) +{ + return dmtxDecodeMatrixRegion2(dec, reg, fix, NULL); } /** @@ -379,7 +385,7 @@ dmtxDecodeMatrixRegion(DmtxDecode *dec, DmtxRegion *reg, int fix) * ex: msg = dmtxDecodePopulatedArray(sizeidx, msg, fix); */ DmtxMessage * -dmtxDecodePopulatedArray(int sizeIdx, DmtxMessage *msg, int fix) +dmtxDecodePopulatedArray2(int sizeIdx, DmtxMessage *msg, int fix, DmtxExtractedCodeInfo* infoOut) { /* * Example msg->array indices for a 12x12 datamatrix. @@ -399,10 +405,11 @@ dmtxDecodePopulatedArray(int sizeIdx, DmtxMessage *msg, int fix) * XX XX XX XX XX XX XX XX XX XX XX XX * */ - - ModulePlacementEcc200(msg->array, msg->code, sizeIdx, DmtxModuleOnRed | DmtxModuleOnGreen | DmtxModuleOnBlue); - if(RsDecode(msg->code, sizeIdx, fix) == DmtxFail){ + ModulePlacementEcc200(msg->array, msg->code, sizeIdx, DmtxModuleOnRed | DmtxModuleOnGreen | DmtxModuleOnBlue, + ((infoOut) ? &infoOut->structure : NULL)); + + if(RsDecode(msg->code, sizeIdx, infoOut) == DmtxFail && infoOut == NULL){ dmtxMessageDestroy(&msg); msg = NULL; return NULL; @@ -417,6 +424,12 @@ dmtxDecodePopulatedArray(int sizeIdx, DmtxMessage *msg, int fix) return msg; } +DmtxMessage * +dmtxDecodePopulatedArray(int sizeIdx, DmtxMessage *msg, int fix) +{ + return dmtxDecodePopulatedArray2(sizeIdx, msg, fix, NULL); +} + /** * \brief Convert fitted Data Mosaic region into a decoded message * \param dec @@ -693,7 +706,7 @@ TallyModuleJumps(DmtxDecode *dec, DmtxRegion *reg, int tally[][24], int xOrigin, * \return DmtxPass | DmtxFail */ static DmtxPassFail -PopulateArrayFromMatrix(DmtxDecode *dec, DmtxRegion *reg, DmtxMessage *msg) +PopulateArrayFromMatrix(DmtxDecode *dec, DmtxRegion *reg, DmtxMessage *msg, DmtxDecodeStructureInfo* structureInfoOut) { //fprintf(stdout, "libdmtx::PopulateArrayFromMatrix()\n"); int weightFactor; @@ -704,6 +717,7 @@ PopulateArrayFromMatrix(DmtxDecode *dec, DmtxRegion *reg, DmtxMessage *msg) int mapCol, mapRow; int colTmp, rowTmp, idx; int tally[24][24]; /* Large enough to map largest single region */ + int regionMarker = 0; /* memset(msg->array, 0x00, msg->arraySize); */ @@ -745,12 +759,22 @@ PopulateArrayFromMatrix(DmtxDecode *dec, DmtxRegion *reg, DmtxMessage *msg) /* Y location of mapping region origin in symbol coordinates */ yOrigin = yRegionCount * (mapHeight + 2) + 1; + if (structureInfoOut && structureInfoOut->fixedElementsYs) { + structureInfoOut->fixedElementsYs[yRegionCount * 2] = yOrigin - 1; + structureInfoOut->fixedElementsYs[yRegionCount * 2 + 1] = yOrigin + mapHeight; + } + for(xRegionCount = 0; xRegionCount < xRegionTotal; xRegionCount++) { /* X location of mapping region origin in symbol coordinates */ xOrigin = xRegionCount * (mapWidth + 2) + 1; //fprintf(stdout, "libdmtx::PopulateArrayFromMatrix::xOrigin: %d\n", xOrigin); + if (structureInfoOut && structureInfoOut->fixedElementsXs) { + structureInfoOut->fixedElementsXs[xRegionCount * 2] = xOrigin - 1; + structureInfoOut->fixedElementsXs[xRegionCount * 2 + 1] = xOrigin + mapWidth; + } + memset(tally, 0x00, 24 * 24 * sizeof(int)); TallyModuleJumps(dec, reg, tally, xOrigin, yOrigin, mapWidth, mapHeight, DmtxDirUp); TallyModuleJumps(dec, reg, tally, xOrigin, yOrigin, mapWidth, mapHeight, DmtxDirLeft); @@ -770,18 +794,211 @@ PopulateArrayFromMatrix(DmtxDecode *dec, DmtxRegion *reg, DmtxMessage *msg) //fprintf(stdout, "%c ",tally[mapRow][mapCol]==DmtxModuleOff ? 'X' : ' '); if(tally[mapRow][mapCol]/(double)weightFactor >= 0.5){ msg->array[idx] = DmtxModuleOnRGB; + if (structureInfoOut && structureInfoOut->structureModules) { + structureInfoOut->structureModules[idx] = 1; + } //fprintf(stdout, "X "); } else { msg->array[idx] = DmtxModuleOff; + if (structureInfoOut && structureInfoOut->structureModules) { + structureInfoOut->structureModules[idx] = 0; + } //fprintf(stdout, " "); } msg->array[idx] |= DmtxModuleAssigned; + + if (structureInfoOut && structureInfoOut->structureSegments) { + structureInfoOut->structureSegments[idx] = regionMarker; + } } //fprintf(stdout, "\n"); } + ++regionMarker; } } return DmtxPass; } + +extern float +dmtxGetUEC(const DmtxDecodeErrorsInfo* info) +{ + float minUEC = 1.0; + + if (info->checkedBlocks != info->totalBlocks || info->readError == DmtxTrue) + return 0.0; + + for (int i = 0; i < info->checkedBlocks; ++i) + { + float blockUEC; + + if (info->errors[i] > info->maxCorrectableErrors[i]) + { + minUEC = 0.0; + break; + } + + blockUEC = 1.0 - (float)info->errors[i] / info->maxCorrectableErrors[i]; + if (blockUEC < minUEC) + minUEC = blockUEC; + } + + return minUEC; +} + +extern int +dmtxFindTotalErrors(const DmtxDecodeErrorsInfo* info) +{ + int totalErrors = 0; + + for (int i = 0; i < info->checkedBlocks; ++i) + totalErrors += info->errors[i]; + + return totalErrors; +} + +extern int +dmtxIsValidResult(const DmtxDecodeErrorsInfo* info) +{ + if (info->checkedBlocks != info->totalBlocks || info->readError == DmtxTrue) + return 0; + + for (int i = 0; i < info->checkedBlocks; ++i) + if (info->errors[i] > info->maxCorrectableErrors[i]) + return 0; + + return 1; +} + +extern DmtxExtractedCodeInfo* +dmtxExtractedCodeInfoCreate(const DmtxRegion *reg) +{ + DmtxExtractedCodeInfo *info; + info = (DmtxExtractedCodeInfo *)calloc(1, sizeof(DmtxExtractedCodeInfo)); + if(info == NULL) { + return NULL; + } + + info->structure.structureSize = dmtxGetSymbolAttribute(DmtxSymAttribMappingMatrixRows, reg->sizeIdx) * + dmtxGetSymbolAttribute(DmtxSymAttribMappingMatrixCols, reg->sizeIdx); + info->structure.structureModules = (long*)calloc(1, sizeof(long) * info->structure.structureSize); + if(info->structure.structureModules == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + info->structure.structureFixedModules = (long*)calloc(1, sizeof(long) * info->structure.structureSize); + if(info->structure.structureFixedModules == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + info->structure.structureSymbols = (long*)calloc(1, sizeof(long) * info->structure.structureSize); + if(info->structure.structureSymbols == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + info->structure.structureSegments = (long*)calloc(1, sizeof(long) * info->structure.structureSize); + if(info->structure.structureSegments == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + info->structure.structureBlocks = (long*)calloc(1, sizeof(long) * info->structure.structureSize); + if(info->structure.structureBlocks == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + info->structure.structureParityData = (long*)calloc(1, sizeof(long) * info->structure.structureSize); + if(info->structure.structureParityData == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + info->structure.helperInverseStructure = (long*)calloc(1, sizeof(long) * info->structure.structureSize); + if(info->structure.helperInverseStructure == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + for (int i = 0; i < info->structure.structureSize; ++i) { + info->structure.structureModules[i]= -1; + info->structure.structureFixedModules[i]= -1; + info->structure.structureSymbols[i]= -1; + info->structure.structureSegments[i]= -1; + info->structure.structureBlocks[i]= -1; + info->structure.structureParityData[i]= -1; + info->structure.helperInverseStructure[i]= -1; + } + info->structure.codeModulesX = dmtxGetSymbolAttribute(DmtxSymAttribSymbolCols, reg->sizeIdx); + info->structure.codeModulesY = dmtxGetSymbolAttribute(DmtxSymAttribSymbolRows, reg->sizeIdx); + info->structure.fixedXSize = dmtxGetSymbolAttribute(DmtxSymAttribHorizDataRegions, reg->sizeIdx) * 2; + info->structure.fixedYSize = dmtxGetSymbolAttribute(DmtxSymAttribVertDataRegions, reg->sizeIdx) * 2; + info->structure.fixedElementsXs = (int*)calloc(1, sizeof(int) * info->structure.fixedXSize); + if(info->structure.fixedElementsXs == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + info->structure.fixedElementsYs = (int*)calloc(1, sizeof(int) * info->structure.fixedYSize); + if(info->structure.fixedElementsYs == NULL) { + perror("Calloc failed"); + dmtxExtractedCodeInfoDestroy(&info); + return NULL; + } + for (int i = 0; i < info->structure.fixedXSize; ++i) { + info->structure.fixedElementsXs[i]= -1; + } + for (int i = 0; i < info->structure.fixedYSize; ++i) { + info->structure.fixedElementsYs[i]= -1; + } + + info->errors.checkedBlocks = 0; + info->errors.totalBlocks = dmtxGetSymbolAttribute(DmtxSymAttribInterleavedBlocks, reg->sizeIdx); + info->errors.readError = DmtxTrue; + + return info; +} + +extern DmtxPassFail +dmtxExtractedCodeInfoDestroy(DmtxExtractedCodeInfo **info) +{ + if(info == NULL || *info == NULL) + return DmtxFail; + + if((*info)->structure.structureModules != NULL) { + free((*info)->structure.structureModules); + } + if((*info)->structure.structureFixedModules != NULL) { + free((*info)->structure.structureFixedModules); + } + if((*info)->structure.structureSymbols != NULL) { + free((*info)->structure.structureSymbols); + } + if((*info)->structure.structureSegments != NULL) { + free((*info)->structure.structureSegments); + } + if((*info)->structure.structureBlocks != NULL) { + free((*info)->structure.structureBlocks); + } + if((*info)->structure.structureParityData != NULL) { + free((*info)->structure.structureParityData); + } + if((*info)->structure.helperInverseStructure != NULL) { + free((*info)->structure.helperInverseStructure); + } + if((*info)->structure.fixedElementsXs != NULL) { + free((*info)->structure.fixedElementsXs); + } + if((*info)->structure.fixedElementsYs != NULL) { + free((*info)->structure.fixedElementsYs); + } + + free(*info); + *info = NULL; + + return DmtxPass; +} diff --git a/dmtxencode.c b/dmtxencode.c index 584769d..e0fcc0c 100644 --- a/dmtxencode.c +++ b/dmtxencode.c @@ -203,7 +203,7 @@ dmtxEncodeDataMatrix(DmtxEncode *enc, int inputSize, unsigned char *inputString) /* Module placement in region */ ModulePlacementEcc200(enc->message->array, enc->message->code, - enc->region.sizeIdx, DmtxModuleOnRGB); + enc->region.sizeIdx, DmtxModuleOnRGB, NULL); width = 2 * enc->marginSize + (enc->region.symbolCols * enc->moduleSize); height = 2 * enc->marginSize + (enc->region.symbolRows * enc->moduleSize); @@ -345,7 +345,7 @@ dmtxEncodeDataMosaic(DmtxEncode *enc, int inputSize, unsigned char *inputString) memset(enc->message->array, 0x00, sizeof(unsigned char) * enc->region.mappingRows * enc->region.mappingCols); - ModulePlacementEcc200(enc->message->array, encR->message->code, sizeIdxAttempt, DmtxModuleOnRed); + ModulePlacementEcc200(enc->message->array, encR->message->code, sizeIdxAttempt, DmtxModuleOnRed, NULL); /* Reset DmtxModuleAssigned and DMX_MODULE_VISITED bits */ for(row = 0; row < mappingRows; row++) { @@ -354,7 +354,7 @@ dmtxEncodeDataMosaic(DmtxEncode *enc, int inputSize, unsigned char *inputString) } } - ModulePlacementEcc200(enc->message->array, encG->message->code, sizeIdxAttempt, DmtxModuleOnGreen); + ModulePlacementEcc200(enc->message->array, encG->message->code, sizeIdxAttempt, DmtxModuleOnGreen, NULL); /* Reset DmtxModuleAssigned and DMX_MODULE_VISITED bits */ for(row = 0; row < mappingRows; row++) { @@ -363,7 +363,7 @@ dmtxEncodeDataMosaic(DmtxEncode *enc, int inputSize, unsigned char *inputString) } } - ModulePlacementEcc200(enc->message->array, encB->message->code, sizeIdxAttempt, DmtxModuleOnBlue); + ModulePlacementEcc200(enc->message->array, encB->message->code, sizeIdxAttempt, DmtxModuleOnBlue, NULL); /* Destroy encR, encG, and encB */ dmtxEncodeDestroy(&encR); diff --git a/dmtxplacemod.c b/dmtxplacemod.c index 8cd111a..c965a4b 100644 --- a/dmtxplacemod.c +++ b/dmtxplacemod.c @@ -65,10 +65,11 @@ dmtxSymbolModuleStatus(DmtxMessage *message, int sizeIdx, int symbolRow, int sym * \return Number of codewords read */ static int -ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int sizeIdx, int moduleOnColor) +ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int sizeIdx, int moduleOnColor, DmtxDecodeStructureInfo* structureInfoOut) { int row, col, chr; int mappingRows, mappingCols; + long marker = 0; assert(moduleOnColor & (DmtxModuleOnRed | DmtxModuleOnGreen | DmtxModuleOnBlue)); @@ -83,19 +84,29 @@ ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int size do { /* Repeatedly first check for one of the special corner cases */ if((row == mappingRows) && (col == 0)) - PatternShapeSpecial1(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor); + PatternShapeSpecial1(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor, + ((structureInfoOut) ? structureInfoOut->structureSymbols : NULL), &marker, + ((structureInfoOut) ? structureInfoOut->helperInverseStructure : NULL)); else if((row == mappingRows-2) && (col == 0) && (mappingCols%4 != 0)) - PatternShapeSpecial2(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor); + PatternShapeSpecial2(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor, + ((structureInfoOut) ? structureInfoOut->structureSymbols : NULL), &marker, + ((structureInfoOut) ? structureInfoOut->helperInverseStructure : NULL)); else if((row == mappingRows-2) && (col == 0) && (mappingCols%8 == 4)) - PatternShapeSpecial3(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor); + PatternShapeSpecial3(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor, + ((structureInfoOut) ? structureInfoOut->structureSymbols : NULL), &marker, + ((structureInfoOut) ? structureInfoOut->helperInverseStructure : NULL)); else if((row == mappingRows+4) && (col == 2) && (mappingCols%8 == 0)) - PatternShapeSpecial4(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor); + PatternShapeSpecial4(modules, mappingRows, mappingCols, &(codewords[chr++]), moduleOnColor, + ((structureInfoOut) ? structureInfoOut->structureSymbols : NULL), &marker, + ((structureInfoOut) ? structureInfoOut->helperInverseStructure : NULL)); /* Sweep upward diagonally, inserting successive characters */ do { if((row < mappingRows) && (col >= 0) && !(modules[row*mappingCols+col] & DmtxModuleVisited)) - PatternShapeStandard(modules, mappingRows, mappingCols, row, col, &(codewords[chr++]), moduleOnColor); + PatternShapeStandard(modules, mappingRows, mappingCols, row, col, &(codewords[chr++]), moduleOnColor, + ((structureInfoOut) ? structureInfoOut->structureSymbols : NULL), &marker, + ((structureInfoOut) ? structureInfoOut->helperInverseStructure : NULL)); row -= 2; col += 2; } while ((row >= 0) && (col < mappingCols)); @@ -106,7 +117,9 @@ ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int size do { if((row >= 0) && (col < mappingCols) && !(modules[row*mappingCols+col] & DmtxModuleVisited)) - PatternShapeStandard(modules, mappingRows, mappingCols, row, col, &(codewords[chr++]), moduleOnColor); + PatternShapeStandard(modules, mappingRows, mappingCols, row, col, &(codewords[chr++]), moduleOnColor, + ((structureInfoOut) ? structureInfoOut->structureSymbols : NULL), &marker, + ((structureInfoOut) ? structureInfoOut->helperInverseStructure : NULL)); row += 2; col -= 2; } while ((row < mappingRows) && (col >= 0)); @@ -121,6 +134,13 @@ ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int size modules[mappingRows * mappingCols - 1] |= moduleOnColor; modules[(mappingRows * mappingCols) - mappingCols - 2] |= moduleOnColor; + + if (structureInfoOut && structureInfoOut->structureSymbols) { + structureInfoOut->structureSymbols[mappingRows * mappingCols - 1] = -1; + structureInfoOut->structureSymbols[mappingRows * mappingCols - 2] = -1; + structureInfoOut->structureSymbols[(mappingRows * mappingCols) - mappingCols - 1] = -1; + structureInfoOut->structureSymbols[(mappingRows * mappingCols) - mappingCols - 2] = -1; + } } /* XXX should this fixed pattern also be used in reading somehow? */ /* XXX compare that chr == region->dataSize here */ @@ -139,16 +159,18 @@ ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int size * \return void */ static void -PatternShapeStandard(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, unsigned char *codeword, int moduleOnColor) +PatternShapeStandard(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper) { - PlaceModule(modules, mappingRows, mappingCols, row-2, col-2, codeword, DmtxMaskBit1, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, row-2, col-1, codeword, DmtxMaskBit2, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, row-1, col-2, codeword, DmtxMaskBit3, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, row-1, col-1, codeword, DmtxMaskBit4, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, row-1, col, codeword, DmtxMaskBit5, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, row, col-2, codeword, DmtxMaskBit6, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, row, col-1, codeword, DmtxMaskBit7, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, row, col, codeword, DmtxMaskBit8, moduleOnColor); + PlaceModule(modules, mappingRows, mappingCols, row-2, col-2, codeword, DmtxMaskBit1, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, row-2, col-1, codeword, DmtxMaskBit2, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, row-1, col-2, codeword, DmtxMaskBit3, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, row-1, col-1, codeword, DmtxMaskBit4, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, row-1, col, codeword, DmtxMaskBit5, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, row, col-2, codeword, DmtxMaskBit6, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, row, col-1, codeword, DmtxMaskBit7, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, row, col, codeword, DmtxMaskBit8, moduleOnColor, structure, marker, helper); + ++(*marker); } /** @@ -161,16 +183,18 @@ PatternShapeStandard(unsigned char *modules, int mappingRows, int mappingCols, i * \return void */ static void -PatternShapeSpecial1(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor) +PatternShapeSpecial1(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper) { - PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit1, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 1, codeword, DmtxMaskBit2, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 2, codeword, DmtxMaskBit3, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit4, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit5, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit6, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 2, mappingCols-1, codeword, DmtxMaskBit7, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 3, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit1, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 1, codeword, DmtxMaskBit2, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 2, codeword, DmtxMaskBit3, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit4, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit5, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit6, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 2, mappingCols-1, codeword, DmtxMaskBit7, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 3, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor, structure, marker, helper); + ++(*marker); } /** @@ -183,16 +207,18 @@ PatternShapeSpecial1(unsigned char *modules, int mappingRows, int mappingCols, u * \return void */ static void -PatternShapeSpecial2(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor) +PatternShapeSpecial2(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper) { - PlaceModule(modules, mappingRows, mappingCols, mappingRows-3, 0, codeword, DmtxMaskBit1, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, mappingRows-2, 0, codeword, DmtxMaskBit2, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit3, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-4, codeword, DmtxMaskBit4, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-3, codeword, DmtxMaskBit5, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit6, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit7, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-3, 0, codeword, DmtxMaskBit1, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-2, 0, codeword, DmtxMaskBit2, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit3, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-4, codeword, DmtxMaskBit4, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-3, codeword, DmtxMaskBit5, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit6, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit7, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor, structure, marker, helper); + ++(*marker); } /** @@ -205,16 +231,18 @@ PatternShapeSpecial2(unsigned char *modules, int mappingRows, int mappingCols, u * \return void */ static void -PatternShapeSpecial3(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor) +PatternShapeSpecial3(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper) { - PlaceModule(modules, mappingRows, mappingCols, mappingRows-3, 0, codeword, DmtxMaskBit1, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, mappingRows-2, 0, codeword, DmtxMaskBit2, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit3, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit4, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit5, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit6, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 2, mappingCols-1, codeword, DmtxMaskBit7, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 3, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-3, 0, codeword, DmtxMaskBit1, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-2, 0, codeword, DmtxMaskBit2, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit3, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit4, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit5, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit6, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 2, mappingCols-1, codeword, DmtxMaskBit7, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 3, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor, structure, marker, helper); + ++(*marker); } /** @@ -227,16 +255,18 @@ PatternShapeSpecial3(unsigned char *modules, int mappingRows, int mappingCols, u * \return void */ static void -PatternShapeSpecial4(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor) +PatternShapeSpecial4(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper) { - PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit1, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, mappingCols-1, codeword, DmtxMaskBit2, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-3, codeword, DmtxMaskBit3, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit4, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit5, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-3, codeword, DmtxMaskBit6, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-2, codeword, DmtxMaskBit7, moduleOnColor); - PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, 0, codeword, DmtxMaskBit1, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, mappingRows-1, mappingCols-1, codeword, DmtxMaskBit2, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-3, codeword, DmtxMaskBit3, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-2, codeword, DmtxMaskBit4, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 0, mappingCols-1, codeword, DmtxMaskBit5, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-3, codeword, DmtxMaskBit6, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-2, codeword, DmtxMaskBit7, moduleOnColor, structure, marker, helper); + PlaceModule(modules, mappingRows, mappingCols, 1, mappingCols-1, codeword, DmtxMaskBit8, moduleOnColor, structure, marker, helper); + ++(*marker); } /** @@ -252,7 +282,8 @@ PatternShapeSpecial4(unsigned char *modules, int mappingRows, int mappingCols, u * \return void */ static void -PlaceModule(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, unsigned char *codeword, int mask, int moduleOnColor) +PlaceModule(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, unsigned char *codeword, int mask, int moduleOnColor, + long* structure, long* marker, long* helper) { if(row < 0) { row += mappingRows; @@ -269,6 +300,36 @@ PlaceModule(unsigned char *modules, int mappingRows, int mappingCols, int row, i *codeword |= mask; else *codeword &= (0xff ^ mask); + + if (structure && helper && marker) { + structure[row*mappingCols+col] = *marker; + switch (mask) { + case DmtxMaskBit1: + helper[(*marker) * 8 + 0] = row*mappingCols+col; + break; + case DmtxMaskBit2: + helper[(*marker) * 8 + 1] = row*mappingCols+col; + break; + case DmtxMaskBit3: + helper[(*marker) * 8 + 2] = row*mappingCols+col; + break; + case DmtxMaskBit4: + helper[(*marker) * 8 + 3] = row*mappingCols+col; + break; + case DmtxMaskBit5: + helper[(*marker) * 8 + 4] = row*mappingCols+col; + break; + case DmtxMaskBit6: + helper[(*marker) * 8 + 5] = row*mappingCols+col; + break; + case DmtxMaskBit7: + helper[(*marker) * 8 + 6] = row*mappingCols+col; + break; + case DmtxMaskBit8: + helper[(*marker) * 8 + 7] = row*mappingCols+col; + break; + } + } } /* Otherwise we are encoding the codewords into a pattern */ else { diff --git a/dmtxreedsol.c b/dmtxreedsol.c index 96b08b9..1d767ef 100644 --- a/dmtxreedsol.c +++ b/dmtxreedsol.c @@ -148,7 +148,7 @@ RsEncode(DmtxMessage *message, int sizeIdx) #undef CHKPASS #define CHKPASS { if(passFail == DmtxFail) return DmtxFail; } static DmtxPassFail -RsDecode(unsigned char *code, int sizeIdx, int fix) +RsDecode(unsigned char *code, int sizeIdx, DmtxExtractedCodeInfo* infoOut) { int i; int blockStride, blockIdx; @@ -156,6 +156,8 @@ RsDecode(unsigned char *code, int sizeIdx, int fix) // int blockDataWords, blockErrorWords, blockTotalWords, blockMaxCorrectable; int symbolDataWords, symbolErrorWords, symbolTotalWords; DmtxBoolean error, repairable; + DmtxBoolean globalError; + int currErrs; DmtxPassFail passFail; unsigned char *word; DmtxByte elpStorage[MAX_ERROR_WORD_COUNT]; @@ -174,6 +176,13 @@ RsDecode(unsigned char *code, int sizeIdx, int fix) symbolErrorWords = dmtxGetSymbolAttribute(DmtxSymAttribSymbolErrorWords, sizeIdx); symbolTotalWords = symbolDataWords + symbolErrorWords; + if (infoOut) { + infoOut->errors.checkedBlocks = 0; + infoOut->errors.totalBlocks = blockStride; + } + + globalError = DmtxFalse; + /* For each interleaved block */ for(blockIdx = 0; blockIdx < blockStride; blockIdx++) { @@ -188,6 +197,14 @@ RsDecode(unsigned char *code, int sizeIdx, int fix) word = code + symbolTotalWords + blockIdx - blockStride; for(i = 0; i < blockErrorWords; i++) { + if (infoOut && infoOut->structure.helperInverseStructure && infoOut->structure.structureBlocks && infoOut->structure.structureParityData) { + int idx = (word - code) * 8; + for (int bn = 0; bn < 8; ++bn) { + infoOut->structure.structureBlocks[infoOut->structure.helperInverseStructure[idx + bn]] = blockIdx; + infoOut->structure.structureParityData[infoOut->structure.helperInverseStructure[idx + bn]] = 1; + } + } + dmtxByteListPush(&rec, *word, &passFail); CHKPASS; word -= blockStride; } @@ -196,6 +213,14 @@ RsDecode(unsigned char *code, int sizeIdx, int fix) word = code + blockIdx + (blockStride * (blockDataWords - 1)); for(i = 0; i < blockDataWords; i++) { + if (infoOut && infoOut->structure.helperInverseStructure && infoOut->structure.structureBlocks && infoOut->structure.structureParityData) { + int idx = (word - code) * 8; + for (int bn = 0; bn < 8; ++bn) { + infoOut->structure.structureBlocks[infoOut->structure.helperInverseStructure[idx + bn]] = blockIdx; + infoOut->structure.structureParityData[infoOut->structure.helperInverseStructure[idx + bn]] = 0; + } + } + dmtxByteListPush(&rec, *word, &passFail); CHKPASS; word -= blockStride; } @@ -203,21 +228,38 @@ RsDecode(unsigned char *code, int sizeIdx, int fix) /* Compute syndromes (syn) */ error = RsComputeSyndromes(&syn, &rec, blockErrorWords); + currErrs = 0; /* Error(s) detected: Attempt repair */ if(error) { /* Find error locator polynomial (elp) */ - repairable = RsFindErrorLocatorPoly(&elp, &syn, blockErrorWords, blockMaxCorrectable); - if(!repairable) - return DmtxFail; + repairable = RsFindErrorLocatorPoly(&elp, &syn, blockErrorWords, blockMaxCorrectable, &currErrs); - /* Find error positions (loc) */ - repairable = RsFindErrorLocations(&loc, &elp); - if(!repairable) - return DmtxFail; + if (!repairable) + { + globalError = DmtxTrue; + } + else + { + /* Find error positions (loc) */ + repairable = RsFindErrorLocations(&loc, &elp); + + if (!repairable) + { + globalError = DmtxTrue; + } + else + { + /* Find error values and repair */ + RsRepairErrors(&rec, &loc, &elp, &syn); + } + } + } - /* Find error values and repair */ - RsRepairErrors(&rec, &loc, &elp, &syn); + if (infoOut) { + infoOut->errors.errors[blockIdx] = currErrs; + infoOut->errors.maxCorrectableErrors[blockIdx] = blockMaxCorrectable; + infoOut->errors.checkedBlocks += 1; } /* @@ -229,6 +271,19 @@ RsDecode(unsigned char *code, int sizeIdx, int fix) for(i = 0; i < blockDataWords; i++) { *word = dmtxByteListPop(&rec, &passFail); CHKPASS; + + if (infoOut && infoOut->structure.helperInverseStructure && infoOut->structure.structureFixedModules) { + int idx = (word - code) * 8; + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 0]] = !!(*word & DmtxMaskBit1); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 1]] = !!(*word & DmtxMaskBit2); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 2]] = !!(*word & DmtxMaskBit3); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 3]] = !!(*word & DmtxMaskBit4); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 4]] = !!(*word & DmtxMaskBit5); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 5]] = !!(*word & DmtxMaskBit6); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 6]] = !!(*word & DmtxMaskBit7); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 7]] = !!(*word & DmtxMaskBit8); + } + word += blockStride; } @@ -237,11 +292,27 @@ RsDecode(unsigned char *code, int sizeIdx, int fix) for(i = 0; i < blockErrorWords; i++) { *word = dmtxByteListPop(&rec, &passFail); CHKPASS; + + if (infoOut && infoOut->structure.helperInverseStructure && infoOut->structure.structureFixedModules) { + int idx = (word - code) * 8; + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 0]] = !!(*word & DmtxMaskBit1); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 1]] = !!(*word & DmtxMaskBit2); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 2]] = !!(*word & DmtxMaskBit3); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 3]] = !!(*word & DmtxMaskBit4); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 4]] = !!(*word & DmtxMaskBit5); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 5]] = !!(*word & DmtxMaskBit6); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 6]] = !!(*word & DmtxMaskBit7); + infoOut->structure.structureFixedModules[infoOut->structure.helperInverseStructure[idx + 7]] = !!(*word & DmtxMaskBit8); + } + word += blockStride; } } - return DmtxPass; + if (infoOut) { + infoOut->errors.readError = globalError; + } + return (globalError) ? DmtxFail : DmtxPass; } /** @@ -327,7 +398,7 @@ RsComputeSyndromes(DmtxByteList *syn, const DmtxByteList *rec, int blockErrorWor #undef CHKPASS #define CHKPASS { if(passFail == DmtxFail) return DmtxFalse; } static DmtxBoolean -RsFindErrorLocatorPoly(DmtxByteList *elpOut, const DmtxByteList *syn, int errorWordCount, int maxCorrectable) +RsFindErrorLocatorPoly(DmtxByteList *elpOut, const DmtxByteList *syn, int errorWordCount, int maxCorrectable, int* errorsOut) { int i, iNext, j; int m, mCmp, lambda; @@ -381,7 +452,7 @@ RsFindErrorLocatorPoly(DmtxByteList *elpOut, const DmtxByteList *syn, int errorW } lambda = elp[iNext].length - 1; - if(i == errorWordCount || i >= lambda + maxCorrectable) + if(i == errorWordCount || i > lambda + maxCorrectable) break; /* Calculate discrepancy dis.b[i] */ @@ -394,6 +465,8 @@ RsFindErrorLocatorPoly(DmtxByteList *elpOut, const DmtxByteList *syn, int errorW dmtxByteListCopy(elpOut, &elp[iNext], &passFail); CHKPASS; + *errorsOut = lambda; + return (lambda <= maxCorrectable) ? DmtxTrue : DmtxFalse; } diff --git a/dmtxstatic.h b/dmtxstatic.h index e467e92..562227f 100644 --- a/dmtxstatic.h +++ b/dmtxstatic.h @@ -154,7 +154,7 @@ static DmtxPassFail BresLineStep(DmtxBresLine *line, int travel, int outward); /* dmtxdecode.c */ static void TallyModuleJumps(DmtxDecode *dec, DmtxRegion *reg, int tally[][24], int xOrigin, int yOrigin, int mapWidth, int mapHeight, DmtxDirection dir); -static DmtxPassFail PopulateArrayFromMatrix(DmtxDecode *dec, DmtxRegion *reg, DmtxMessage *msg); +static DmtxPassFail PopulateArrayFromMatrix(DmtxDecode *dec, DmtxRegion *reg, DmtxMessage *msg, DmtxDecodeStructureInfo* structureInfoOut); /* dmtxdecodescheme.c */ static DmtxPassFail DecodeDataStream(DmtxMessage *msg, int sizeIdx, unsigned char *outputStart); @@ -174,21 +174,26 @@ static void PrintPattern(DmtxEncode *encode); static int EncodeDataCodewords(DmtxByteList *input, DmtxByteList *output, int sizeIdxRequest, DmtxScheme scheme, int fnc1); /* dmtxplacemod.c */ -static int ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int sizeIdx, int moduleOnColor); -static void PatternShapeStandard(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, unsigned char *codeword, int moduleOnColor); -static void PatternShapeSpecial1(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor); -static void PatternShapeSpecial2(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor); -static void PatternShapeSpecial3(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor); -static void PatternShapeSpecial4(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor); -static void PlaceModule(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, - unsigned char *codeword, int mask, int moduleOnColor); +static int ModulePlacementEcc200(unsigned char *modules, unsigned char *codewords, int sizeIdx, int moduleOnColor, DmtxDecodeStructureInfo* structureInfoOuts); +static void PatternShapeStandard(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper); +static void PatternShapeSpecial1(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper); +static void PatternShapeSpecial2(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper); +static void PatternShapeSpecial3(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper); +static void PatternShapeSpecial4(unsigned char *modules, int mappingRows, int mappingCols, unsigned char *codeword, int moduleOnColor, + long* structure, long* marker, long* helper); +static void PlaceModule(unsigned char *modules, int mappingRows, int mappingCols, int row, int col, unsigned char *codeword, int mask, int moduleOnColor, + long* structure, long* marker, long* helper); /* dmtxreedsol.c */ static DmtxPassFail RsEncode(DmtxMessage *message, int sizeIdx); -static DmtxPassFail RsDecode(unsigned char *code, int sizeIdx, int fix); +static DmtxPassFail RsDecode(unsigned char *code, int sizeIdx, DmtxExtractedCodeInfo* infoOut); static DmtxPassFail RsGenPoly(DmtxByteList *gen, int errorWordCount); static DmtxBoolean RsComputeSyndromes(DmtxByteList *syn, const DmtxByteList *rec, int blockErrorWords); -static DmtxBoolean RsFindErrorLocatorPoly(DmtxByteList *elp, const DmtxByteList *syn, int errorWordCount, int maxCorrectable); +static DmtxBoolean RsFindErrorLocatorPoly(DmtxByteList *elp, const DmtxByteList *syn, int errorWordCount, int maxCorrectable, int* errorsOut); static DmtxBoolean RsFindErrorLocations(DmtxByteList *loc, const DmtxByteList *elp); static DmtxPassFail RsRepairErrors(DmtxByteList *rec, const DmtxByteList *loc, const DmtxByteList *elp, const DmtxByteList *syn);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor