libdmtx 0.7.8.7
libdmtx is a software library that enables programs to read and write Data Matrix barcodes of the modern ECC200 variety.
Loading...
Searching...
No Matches
dmtxsymbol.c
Go to the documentation of this file.
1
18#include "dmtx.h"
19
26extern int getSizeIdxFromSymbolDimension(int rows, int cols)
27{
28 int symbolRows, symbolCols, i;
29 for (i = 0; i < 30; i++) {
32 if (rows == symbolRows && cols == symbolCols) {
33 return i;
34 }
35 }
36 return -1;
37}
38
45extern int dmtxGetSymbolAttribute(int attribute, int sizeIdx)
46{
47 static const int symbolRows[] = {10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52,
48 64, 72, 80, 88, 96, 104, 120, 132, 144, 8, 8, 12, 12, 16, 16};
49
50 static const int symbolCols[] = {10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52,
51 64, 72, 80, 88, 96, 104, 120, 132, 144, 18, 32, 26, 36, 36, 48};
52
53 static const int dataRegionRows[] = {8, 10, 12, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24,
54 14, 16, 18, 20, 22, 24, 18, 20, 22, 6, 6, 10, 10, 14, 14};
55
56 static const int dataRegionCols[] = {8, 10, 12, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24,
57 14, 16, 18, 20, 22, 24, 18, 20, 22, 16, 14, 24, 16, 16, 22};
58
59 static const int horizDataRegions[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
60 4, 4, 4, 4, 4, 4, 6, 6, 6, 1, 2, 1, 2, 2, 2};
61
62 static const int interleavedBlocks[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
63 2, 4, 4, 4, 4, 6, 6, 8, 10, 1, 1, 1, 1, 1, 1};
64
65 static const int symbolDataWords[] = {3, 5, 8, 12, 18, 22, 30, 36, 44, 62, 86, 114, 144, 174, 204,
66 280, 368, 456, 576, 696, 816, 1050, 1304, 1558, 5, 10, 16, 22, 32, 49};
67
68 static const int blockErrorWords[] = {5, 7, 10, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 68, 42,
69 56, 36, 48, 56, 68, 56, 68, 62, 62, 7, 11, 14, 18, 24, 28};
70
71 static const int blockMaxCorrectable[] = {2, 3, 5, 6, 7, 9, 10, 12, 14, 18, 21, 24, 28, 34, 21,
72 28, 18, 24, 28, 34, 28, 34, 31, 31, 3, 5, 7, 9, 12, 14};
73
74 if (sizeIdx < 0 || sizeIdx >= DmtxSymbolSquareCount + DmtxSymbolRectCount) {
75 return DmtxUndefined;
76 }
77
78 switch (attribute) {
80 return symbolRows[sizeIdx];
82 return symbolCols[sizeIdx];
84 return dataRegionRows[sizeIdx];
86 return dataRegionCols[sizeIdx];
88 return horizDataRegions[sizeIdx];
90 return (sizeIdx < DmtxSymbolSquareCount) ? horizDataRegions[sizeIdx] : 1;
92 return dataRegionRows[sizeIdx] * dmtxGetSymbolAttribute(DmtxSymAttribVertDataRegions, sizeIdx);
94 return dataRegionCols[sizeIdx] * horizDataRegions[sizeIdx];
96 return interleavedBlocks[sizeIdx];
98 return blockErrorWords[sizeIdx];
100 return blockMaxCorrectable[sizeIdx];
102 return symbolDataWords[sizeIdx];
104 return blockErrorWords[sizeIdx] * interleavedBlocks[sizeIdx];
106 return blockMaxCorrectable[sizeIdx] * interleavedBlocks[sizeIdx];
107 }
108
109 return DmtxUndefined;
110}
111
118extern int dmtxGetBlockDataSize(int sizeIdx, int blockIdx)
119{
120 int symbolDataWords;
121 int interleavedBlocks;
122 int count;
123
124 symbolDataWords = dmtxGetSymbolAttribute(DmtxSymAttribSymbolDataWords, sizeIdx);
125 interleavedBlocks = dmtxGetSymbolAttribute(DmtxSymAttribInterleavedBlocks, sizeIdx);
126
127 if (symbolDataWords < 1 || interleavedBlocks < 1) {
128 return DmtxUndefined;
129 }
130
131 count = (int)(symbolDataWords / interleavedBlocks);
132
133 return (sizeIdx == DmtxSymbol144x144 && blockIdx < 8) ? count + 1 : count;
134}
135
142static int findSymbolSize(int dataWords, int sizeIdxRequest)
143{
144 int sizeIdx;
145 int idxBeg, idxEnd;
146
147 if (dataWords <= 0) {
148 return DmtxUndefined;
149 }
150
151 if (sizeIdxRequest == DmtxSymbolSquareAuto || sizeIdxRequest == DmtxSymbolRectAuto) {
152 if (sizeIdxRequest == DmtxSymbolSquareAuto) {
153 idxBeg = 0;
154 idxEnd = DmtxSymbolSquareCount;
155 } else {
156 idxBeg = DmtxSymbolSquareCount;
158 }
159
160 for (sizeIdx = idxBeg; sizeIdx < idxEnd; sizeIdx++) {
161 if (dmtxGetSymbolAttribute(DmtxSymAttribSymbolDataWords, sizeIdx) >= dataWords) {
162 break;
163 }
164 }
165
166 if (sizeIdx == idxEnd) {
167 return DmtxUndefined;
168 }
169 } else {
170 sizeIdx = sizeIdxRequest;
171 }
172
173 if (dataWords > dmtxGetSymbolAttribute(DmtxSymAttribSymbolDataWords, sizeIdx)) {
174 return DmtxUndefined;
175 }
176
177 return sizeIdx;
178}
libdmtx - Data Matrix Encoding/Decoding Library Copyright 2008, 2009 Mike Laughton.
@ DmtxSymAttribHorizDataRegions
水平方向区块个数
Definition dmtx.h:158
@ DmtxSymAttribBlockMaxCorrectable
Definition dmtx.h:164
@ DmtxSymAttribBlockErrorWords
Definition dmtx.h:163
@ DmtxSymAttribSymbolErrorWords
Definition dmtx.h:166
@ DmtxSymAttribSymbolRows
二维码码元总行数(包括L形框和点线)
Definition dmtx.h:154
@ DmtxSymAttribVertDataRegions
垂直方向区块个数
Definition dmtx.h:159
@ DmtxSymAttribSymbolDataWords
Definition dmtx.h:165
@ DmtxSymAttribDataRegionCols
单区块二维码数据区码元列数(不包括L形框和点线)
Definition dmtx.h:157
@ DmtxSymAttribSymbolCols
二维码码元总列数(包括L形框和点线)
Definition dmtx.h:155
@ DmtxSymAttribMappingMatrixRows
二维码数据区码元总行数(不包括L形框和点线)
Definition dmtx.h:160
@ DmtxSymAttribDataRegionRows
单区块二维码数据区码元行数(不包括L形框和点线)
Definition dmtx.h:156
@ DmtxSymAttribMappingMatrixCols
二维码数据区码元总列数(不包括L形框和点线)
Definition dmtx.h:161
@ DmtxSymAttribSymbolMaxCorrectable
Definition dmtx.h:167
@ DmtxSymAttribInterleavedBlocks
Definition dmtx.h:162
#define DmtxUndefined
Definition dmtx.h:40
#define DmtxSymbolRectCount
长方形二维码种类个数
Definition dmtx.h:54
#define DmtxSymbolSquareCount
正方形二维码种类个数
Definition dmtx.h:53
@ DmtxSymbol144x144
Definition dmtx.h:128
@ DmtxSymbolRectAuto
Definition dmtx.h:100
@ DmtxSymbolSquareAuto
Definition dmtx.h:101
int getSizeIdxFromSymbolDimension(int rows, int cols)
Retrieve symbol index from rows and columns.
Definition dmtxsymbol.c:26
int dmtxGetSymbolAttribute(int attribute, int sizeIdx)
根据规格索引返回二维码规格各个参数
Definition dmtxsymbol.c:45
int dmtxGetBlockDataSize(int sizeIdx, int blockIdx)
Retrieve data size for a specific symbol size and block number.
Definition dmtxsymbol.c:118
static int findSymbolSize(int dataWords, int sizeIdxRequest)
Determine symbol size based on data size and requested properties.
Definition dmtxsymbol.c:142