41 for(i = 0; i < 8; i++) {
48 frame[width * 8 + width - 1 - i] = v;
50 frame[width * i + 8] = v;
52 frame[width * (i + 1) + 8] = v;
56 for(i = 0; i < 7; i++) {
63 frame[width * (width - 7 + i) + 8] = v;
65 frame[width * 8 + 7] = v;
67 frame[width * 8 + 6 - i] = v;
84 #define MASKMAKER(__exp__) \
88 for(y = 0; y < width; y++) {\
89 for(x = 0; x < width; x++) {\
93 *d = *s ^ ((__exp__) == 0);\
101 static int Mask_mask0(
int width,
const unsigned char *s,
unsigned char *d)
106 static int Mask_mask1(
int width,
const unsigned char *s,
unsigned char *d)
111 static int Mask_mask2(
int width,
const unsigned char *s,
unsigned char *d)
116 static int Mask_mask3(
int width,
const unsigned char *s,
unsigned char *d)
121 static int Mask_mask4(
int width,
const unsigned char *s,
unsigned char *d)
126 static int Mask_mask5(
int width,
const unsigned char *s,
unsigned char *d)
131 static int Mask_mask6(
int width,
const unsigned char *s,
unsigned char *d)
136 static int Mask_mask7(
int width,
const unsigned char *s,
unsigned char *d)
142 typedef int MaskMaker(
int,
const unsigned char *,
unsigned char *);
149 unsigned char *Mask_makeMaskedFrame(
int width,
unsigned char *frame,
int mask)
151 unsigned char *masked;
153 masked = (
unsigned char *)
malloc((
size_t)(width * width));
154 if(masked == NULL)
return NULL;
164 unsigned char *masked;
166 if(mask < 0 || mask >=
maskNum) {
171 masked = (
unsigned char *)
malloc((
size_t)(width * width));
172 if(masked == NULL)
return NULL;
192 for(i = 0; i < length; i++) {
193 if(runLength[i] >= 5) {
194 demerit +=
N1 + (runLength[i] - 5);
198 if(i >= 3 && i < length-2 && (runLength[i] % 3) == 0) {
199 fact = runLength[i] / 3;
200 if(runLength[i-2] == fact &&
201 runLength[i-1] == fact &&
202 runLength[i+1] == fact &&
203 runLength[i+2] == fact) {
204 if(i == 3 || runLength[i-3] >= 4 * fact) {
207 }
else if(i+4 >= length || runLength[i+3] >= 4 * fact) {
223 unsigned char b22, w22;
226 p = frame + width + 1;
227 for(y = 1; y < width; y++) {
228 for(x = 1; x < width; x++) {
229 b22 = p[0] & p[-1] & p[-width] & p [-width-1];
230 w22 = p[0] | p[-1] | p[-width] | p [-width-1];
231 if((b22 | (w22 ^ 1))&1) {
257 for(i = 1; i < width; i++) {
258 if((frame[i] ^ prev) & 1) {
285 for(i = 1; i < width; i++) {
286 if((frame[i * width] ^ prev) & 1) {
289 prev = frame[i * width];
307 for(y = 0; y < width; y++) {
312 for(x = 0; x < width; x++) {
323 unsigned char *mask, *bestMask;
324 int minDemerit = INT_MAX;
328 int w2 = width * width;
330 mask = (
unsigned char *)
malloc((
size_t)w2);
331 if(mask == NULL)
return NULL;
332 bestMask = (
unsigned char *)
malloc((
size_t)w2);
333 if(bestMask == NULL) {
343 bratio = (200 * blacks + w2) / w2 / 2;
344 demerit = (abs(bratio - 50) / 5) *
N4;
348 if(demerit < minDemerit) {
349 minDemerit = demerit;
350 memcpy(bestMask, mask, (
size_t)w2);
static int Mask_mask3(int width, const unsigned char *s, unsigned char *d)
static int Mask_mask2(int width, const unsigned char *s, unsigned char *d)
static int Mask_mask1(int width, const unsigned char *s, unsigned char *d)
#define STATIC_IN_RELEASE
unsigned int QRspec_getFormatInfo(int mask, QRecLevel level)
Return BCH encoded format information pattern.
QRecLevel
Level of error correction.
static int Mask_mask6(int width, const unsigned char *s, unsigned char *d)
static int Mask_mask5(int width, const unsigned char *s, unsigned char *d)
static int Mask_mask0(int width, const unsigned char *s, unsigned char *d)
static MaskMaker * maskMakers[maskNum]
#define MASKMAKER(__exp__)
int MaskMaker(int, const unsigned char *, unsigned char *)
unsigned char * Mask_makeMask(int width, unsigned char *frame, int mask, QRecLevel level)
unsigned char * Mask_mask(int width, unsigned char *frame, QRecLevel level)
static int Mask_mask4(int width, const unsigned char *s, unsigned char *d)
STATIC_IN_RELEASE int Mask_calcN2(int width, unsigned char *frame)
STATIC_IN_RELEASE int Mask_calcRunLengthV(int width, unsigned char *frame, int *runLength)
#define N1
Demerit coefficients.
static int Mask_mask7(int width, const unsigned char *s, unsigned char *d)
#define QRSPEC_WIDTH_MAX
Maximum width of a symbol.
STATIC_IN_RELEASE int Mask_calcN1N3(int length, int *runLength)
STATIC_IN_RELEASE int Mask_calcRunLengthH(int width, unsigned char *frame, int *runLength)
STATIC_IN_RELEASE int Mask_evaluateSymbol(int width, unsigned char *frame)
STATIC_IN_RELEASE int Mask_writeFormatInformation(int width, unsigned char *frame, int mask, QRecLevel level)