qrspec.c ( File view )

  • By green75 2014-11-06
  • View(s):334
  • Download(s):8
  • Point(s): 3
			/*
 * qrencode - QR Code encoder
 *
 * QR Code specification in convenient format. 
 * Copyright (C) 2006-2011 Kentaro Fukuchi <kentaro@fukuchi.org>
 *
 * The following data / specifications are taken from
 * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
 *  or
 * "Automatic identification and data capture techniques -- 
 *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#if HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifdef HAVE_LIBPTHREAD
#include <pthread.h>
#endif

#include "qrspec.h"
#include "qrinput.h"

/******************************************************************************
 * Version and capacity
 *****************************************************************************/

typedef struct {

	int width; //< Edge length of the symbol
	int words;  //< Data capacity (bytes)
	int remainder; //< Remainder bit (bits)
	int ec[4];  //< Number of ECC code (bytes)

} QRspec_Capacity;

/**
 * Table of the capacity of symbols
 * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
 */
static const QRspec_Capacity qrspecCapacity[QRSPEC_VERSION_MAX + 1] = {

	{
  0,    0, 0, {
   0,    0,    0,    0
}
},
	{
 21,   26, 0, {
   7,   10,   13,   17
}
}, // 1
	{
 25,   44, 7, {
  10,   16,   22,   28
}
},
	{
 29,   70, 7, {
  15,   26,   36,   44
}
},
	{
 33,  100, 7, {
  20,   36,   52,   64
}
},
	{
 37,  134, 7, {
  26,   48,   72,   88
}
}, // 5
	{
 41,  172, 7, {
  36,   64,   96,  112
}
},
	{
 45,  196, 0, {
  40,   72,  108,  130
}
},
	{
 49,  242, 0, {
  48,   88,  132,  156
}
},
	{
 53,  292, 0, {
  60,  110,  160,  192
}
},
	{
 57,  346, 0, {
  72,  130,  192,  224
}
}, //10
	{
 61,  404, 0, {
  80,  150,  224,  264
}
},
	{
 65,  466, 0, {
  96,  176,  260,  308
}
},
	{
 69,  532, 0, {
 104,  198,  288,  352
}
},
	{
 73,  581, 3, {
 120,  216,  320,  384
}
},
	{
 77,  655, 3, {
 132,  240,  360,  432
}
}, //15
	{
 81,  733, 3, {
 144,  280,  408,  480
}
},
	{
 85,  815, 3, {
 168,  308,  448,  532
}
},
	{
 89,  901, 3, {
 180,  338,  504,  588
}
},
	{
 93,  991, 3, {
 196,  364,  546,  650
}
},
	{
 97, 1085, 3, {
 224,  416,  600,  700
}
}, //20
	{
101, 1156, 4, {
 224,  442,  644,  750
}
},
	{
105, 1258, 4, {
 252,  476,  690,  816
}
},
	{
109, 1364, 4, {
 270,  504,  750,  900
}
},
	{
113, 1474, 4, {
 300,  560,  810,  960
}
},
	{
117, 1588, 4, {
 312,  588,  870, 1050
}
}, //25
	{
121, 1706, 4, {
 336,  644,  952, 1110
}
},
	{
125, 1828, 4, {
 360,  700, 1020, 1200
}
},
	{
129, 1921, 3, {
 390,  728, 1050, 1260
}
},
	{
133, 2051, 3, {
 420,  784, 1140, 1350
}
},
	{
137, 2185, 3, {
 450,  812, 1200, 1440
}
}, //30
	{
141, 2323, 3, {
 480,  868, 1290, 1530
}
},
	{
145, 2465, 3, {
 510,  924, 1350, 1620
}
},
	{
149, 2611, 3, {
 540,  980, 1440, 1710
}
},
	{
153, 2761, 3, {
 570, 1036, 1530, 1800
}
},
	{
157, 2876, 0, {
 570, 1064, 1590, 1890
}
}, //35
	{
161, 3034, 0, {
 600, 1120, 1680, 1980
}
},
	{
165, 3196, 0, {
 630, 1204, 1770, 2100
}
},
	{
169, 3362, 0, {
 660, 1260, 1860, 2220
}
},
	{
173, 3532, 0, {
 720, 1316, 1950, 2310
}
},
	{
177, 3706, 0, {
 750, 1372, 2040, 2430
}
} //40

};

int QRspec_getDataLength(int version, QRecLevel level)
{

	return qrspecCapacity[version].words - qrspecCapacity[version].ec[level];

}

int QRspec_getECCLength(int version, QRecLevel level)
{

	return qrspecCapacity[version].ec[level];

}

int QRspec_getMinimumVersion(int size, QRecLevel level)
{

	int i;
	int words;

	for(i=1; i<= QRSPEC_VERSION_MAX; i++) {

		words  = qrspecCapacity[i].words - qrspecCapacity[i].ec[level];
		if(words >= size) return i;
	
}

	return -1;

}

int QRspec_getWidth(int version)
{

	return qrspecCapacity[version].width;

}

int QRspec_getRemainder(int version)
{

	return qrspecCapacity[version].remainder;

}

/******************************************************************************
 * Length indicator
 *****************************************************************************/

static const int lengthTableBits[4][3] = {

	{
10, 12, 14
},
	{
 9, 11, 13
},
	{
 8, 16, 16
},
	{
 8, 10, 12
}

};

int QRspec_lengthIndicator(QRencodeMode mode, int version)
{

	int l;

	if(!QRinput_isSplittableMode(mode)) return 0;
	if(version <= 9) {

		l = 0;
	
} else if(version <= 26) {

		l = 1;
	
} else {

		l = 2;
	
}

	return lengthTableBits[mode][l];

}

int QRspec_maximumWords(QRencodeMode mode, int version)
{

	int l;
	int bits;
	int words;

	if(!QRinput_isSplittableMode(mode)) return 0;
	if(version <= 9) {

		l = 0;
	
} else if(version <= 26) {

		l = 1;
	
} else {

		l = 2;
	
}

	bits = lengthTableBits[mode][l];
	words = (1 << bits) - 1;
	if(mode == QR_MODE_KANJI) {

		words *= 2; // the number of bytes is required
	
}

	return words;

}

/******************************************************************************
 * Error correction code
 *****************************************************************************/

/**
 * Table of the error correction code (Reed-Solomon block)
 * See Table 12-16 (pp.30-36), JIS X0510:2004.
 */
static const int eccTable[QRSPEC_VERSION_MAX+1][4][2] = {

	{
{
 0,  0
}, {
 0,  0
}, {
 0,  0
}, {
 0,  0
}
},
	{
{
 1,  0
}, {
 1,  0
}, {
 1,  0
}, {
 1,  0
}
}, // 1
	{
{
 1,  0
}, {
 1,  0
}, {
 1,  0
}, {
 1,  0
}
},
	{
{
 1,  0
}, {
 1,  0
}, {
 2,  0
}, {
 2,  0
}
},
	{
{
 1,  0
}, {
 2,  0
}, {
 2,  0
}, {
 4,  0
}
},
	{
{
 1,  0
}, {
 2,  0
}, {
 2,  2
}, {
 2,  2
}
}, // 5
	{
{
 2,  0
}, {
 4,  0
}, {
 4,  0
}, {
 4,  0
}
},
	{
{
 2,  0
}, {
 4,  0
}, {
 2,  4
}, {
 4,  1
}
},
	{
{
 2,  0
}, {
 2,  2
}, {
 4,  2
}, {
 4,  2
}
},
	{
{
 2,  0
}, {
 3,  2
}, {
 4,  4
}, {
 4,  4
}
},
	{
{
 2,  2
}, {
 4,  1
}, {
 6,  2
}, {
 6,  2
}
}, //10
	{
{
 4,  0
}, {
 1,  4
}, {
 4,  4
}, {
 3,  8
}
},
	{
{
 2,  2
}, {
 6,  2
}, {
 4,  6
}, {
 7,  4
}
},
	{
{
 4,  0
}, {
 8,  1
}, {
 8,  4
}, {
12,  4
}
},
	{
{
 3,  1
}, {
 4,  5
}, {
11,  5
}, {
11,  5
}
},
	{
{
 5,  1
}, {
 5,  5
}, {
 5,  7
}, {
11,  7
}
}, //15
	{
{
 5,  1
}, {
 7,  3
}, {
15,  2
}, {
 3, 13
}
},
	{
{
 1,  5
}, {
10,  1
}, {
 1, 15
}, {
 2, 17
}
},
	{
{
 5,  1
}, {
 9,  4
}, {
17,  1
}, {
 2, 19
}
},
	{
{
 3,  4
}, {
 3, 11
}, {
17,  4
}, {
 9, 16
}
},
	{
{
 3,  5
}, {
 3, 13
}, {
15,  5
}, {
15, 10
}
}, //20
	{
{
 4,  4
}, {
17,  0
}, {
17,  6
}, {
19,  6
}
},
	{
{
 2,  7
}, {
17,  0
}, {
 7, 16
}, {
34,  0
}
},
	{
{
 4,  5
}, {
 4, 14
}, {
11, 14
}, {
16, 14
}
},
	{
{
 6,  4
}, {
 6, 14
}, {
11, 16
}, {
30,  2
}
},
	{
{
 8,  4
}, {
 8, 13
}, {
 7, 22
}, {
22, 13
}
}, //25
	{
{
10,  2
}, {
19,  4
}, {
28,  6
}, {
33,  4
}
},
	{
{
 8,  4
}, {
22,  3
}, {
 8, 26
}, {
12, 28
}
},
	{
{
 3, 10
}, {
 3, 23
}, {
 4, 31
}, {
11, 31
}
},
	{
{
 7,  7
}, {
21,  7
}, {
 1, 37
}, {
19, 26
}
},
	{
{
 5, 10
}, {
19, 10
}, {
15, 25
}, {
23, 25
}
}, //30
	{
{
13,  3
}, {
 2, 29
}, {
42,  1
}, {
23, 28
}
},
	{
{
17,  0
}, {
10, 23
}, {
10, 35
}, {
19, 35
}
},
	{
{
17,  1
}, {
14, 21
}, {
29, 19
}, {
11, 46
}
},
	{
{
13,  6
}, {
14, 23
}, {
44,  7
}, {
59,  1
}
},
	{
{
12,  7
}, {
12, 26
}, {
39, 14
}, {
22, 41
}
}, //35
	{
{
 6, 14
}, {
 6, 34
}, {
46, 10
}, {
 2, 64
}
},
	{
{
17,  4
}, {
29, 14
}, {
49, 10
}, {
24, 46
}
},
	{
{
 4, 18
}, {
13, 32
}, {
48, 14
}, {
42, 32
}
},
	{
{
20,  4
}, {
40,  7
}, {
43, 22
}, {
10, 67
}
},
	{
{
19,  6
}, {
18, 31
}, {
34, 34
}, {
20, 61
}
},//40

};

void QRspec_getEccSpec(int version, QRecLevel level, int spec[5])
{

	int b1, b2;
	int data, ecc;

	b1 = eccTable[version][level][0];
	b2 = eccTable[version][level][1];
	data = QRspec_getDataLength(version, level);
	ecc  = QRspec_getECCLength(version, level);

	if(b2 == 0) {

		spec[0] = b1;
		spec[1] = data / b1;
		spec[2] = ecc / b1;
		spec[3] = spec[4] = 0;
	
} else {

		spec[0] = b1;
		spec[1] = data / (b1 + b2);
		spec[2] = ecc  / (b1 + b2);
		spec[3] = b2;
		spec[4] = spec[1] + 1;
	
}

}

/******************************************************************************
 * Alignment pattern
 *****************************************************************************/

/**
 * Positions of alignment patterns.
 * This array includes only the second and the third position of the alignment
 * patterns. Rest of them can be calculated from the distance between them.
 *
 * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
 */
static const int alignmentPattern[QRSPEC_VERSION_MAX+1][2] = {

	{
 0,  0
},
	{
 0,  0
}, {
18,  0
}, {
22,  0
}, {
26,  0
}, {
30,  0
}, // 1- 5
	{
34,  0
}, {
22, 38
}, {
24, 42
}, {
26, 46
}, {
28, 50
}, // 6-10
	{
30, 54
}, {
32, 58
}, {
34, 62
}, {
26, 46
}, {
26, 48
}, //11-15
	{
26, 50
}, {
30, 54
}, {
30, 56
}, {
30, 58
}, {
34, 62
}, //16-20
	{
28, 50
}, {
26, 50
}, {
30, 54
}, {
28, 54
}, {
32, 58
}, //21-25
	{
30, 58
}, {
34, 62
}, {
26, 50
}, {
30, 54
}, {
26, 52
}, //26-30
	{
30, 56
}, {
34, 60
}, {
30, 58
}, {
34, 62
}, {
30, 54
}, //31-35
	{
24, 50
}, {
28, 54
}, {
32, 58
}, {
26, 54
}, {
30, 58
}, //35-40

};

/**
 * Put an alignment marker.
 * @param frame
 * @param width
 * @param ox,oy center coordinate of the pattern
 */
static void QRspec_putAlignmentMarker(unsigned char *frame, int width, int ox, int oy)
{

	static const unsigned char finder[] = {

		0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
		0xa1, 0xa0, 0xa0, 0xa0, 0xa1,
		0xa1, 0xa0, 0xa1, 0xa0, 0xa1,
		0xa1, 0xa0, 0xa0, 0xa0, 0xa1,
		0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
	
};
	int x, y;
	const unsigned char *s;

	frame += (oy - 2) * width + ox - 2;
	s = finder;
	for(y=0; y<5; y++) {

		for(x=0; x<5; x++) {

			frame[x] = s[x];
		
}
		frame += width;
		s += 5;
	
}

}

static void QRspec_putAlignmentPattern(int version, unsigned char *frame, int width)
{

	int d, w, x, y, cx, cy;

	if(version < 2) return;

	d = alignmentPattern[version][1] - alignmentPattern[version][0];
	if(d < 0) {

		w = 2;
	
} else {

		w = (width - alignmentPattern[version][0]) / d + 2;
	
}

	if(w * w - 3 == 1) {

		x = alignmentPattern[version][0];
		y = alignmentPattern[version][0];
		QRspec_putAlignmentMarker(frame, width, x, y);
		return;
	
}

	cx = alignmentPattern[version][0];
	for(x=1; x<w - 1; x++) {

		QRspec_putAlignmentMarker(frame, width,  6, cx);
		QRspec_putAlignmentMarker(frame, width, cx,  6);
		cx += d;
	
}

	cy = alignmentPattern[version][0];
	for(y=0; y<w-1; y+
...
...
(Not finished, please download and read the complete file)
			
...
Expand> <Close

Want complete source code? Download it here

Point(s): 3

Download
0 lines left, continue to read
Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
01.97 kB
01.97 kB
QRGenerator.ilk366.95 kB2013-06-11|12:21
01.97 kB
01.97 kB
BuildLog.htm15.69 kB2013-06-11|12:21
01.97 kB
bitstream.c4.21 kB2013-05-15|12:07
bitstream.h1.40 kB2013-05-15|12:07
config.h230.00 B2013-05-15|12:07
mask.c6.79 kB2013-05-15|12:07
mask.h1.52 kB2013-05-15|12:07
mmask.c4.01 kB2013-05-15|12:07
mmask.h1.37 kB2013-05-15|12:07
mqrspec.c6.92 kB2013-05-15|12:07
mqrspec.h4.66 kB2013-05-15|12:07
qrenc.c21.53 kB2013-06-05|16:59
qrencode.c19.60 kB2013-05-15|12:07
qrencode.h20.17 kB2013-05-15|12:07
qrencode_inner.h2.71 kB2013-05-15|12:07
qrinput.c38.05 kB2013-05-15|12:07
qrinput.h3.57 kB2013-05-15|12:07
qrspec.c15.35 kB2013-05-15|12:07
qrspec.h5.70 kB2013-05-15|12:07
rscode.c8.96 kB2013-05-15|12:07
rscode.h1.43 kB2013-05-15|12:07
split.c7.20 kB2013-05-15|12:07
split.h1.87 kB2013-05-15|12:07
QRGenerator.cpp6.14 kB2013-05-15|12:07
QRGenerator.vcproj5.68 kB2013-06-11|12:20
QRGenerator.vcproj.NCC1701A.TWOTM.user1.39 kB2013-06-11|12:21
QRGenerator.vcproj.PROXIMA.TWOTM.user1.38 kB2013-05-15|12:07
01.97 kB
bitstream.obj15.25 kB2013-06-11|12:21
BuildLog.htm10.58 kB2013-06-11|12:21
mask.obj19.98 kB2013-06-11|12:21
mmask.obj12.95 kB2013-06-11|12:21
mqrspec.obj16.01 kB2013-06-11|12:21
mt.dep62.00 B2013-06-11|12:21
qrencode.obj40.71 kB2013-06-11|12:21
QRGenerator.exe.intermediate.manifest616.00 B2013-06-11|12:21
QRGenerator.obj34.64 kB2013-06-11|12:21
qrinput.obj62.77 kB2013-06-11|12:21
qrspec.obj26.07 kB2013-06-11|12:21
rscode.obj14.36 kB2013-06-11|12:21
split.obj16.79 kB2013-06-11|12:21
stdafx.obj25.93 kB2013-06-11|12:21
vc90.idb83.00 kB2013-06-11|12:21
vc90.pdb76.00 kB2013-06-11|12:21
stdafx.cpp298.00 B2013-05-15|12:07
stdafx.h320.00 B2013-05-15|12:07
targetver.h765.00 B2013-05-15|12:07
QRGenerator.ncb683.00 kB2013-06-11|12:21
QRGenerator.sln899.00 B2013-05-15|12:07
QRGenerator.suo23.00 kB2013-06-11|12:21
01.97 kB
QRGenerator.exe28.00 kB2013-06-11|12:21
QRGenerator.pdb267.00 kB2013-06-11|12:21
...
Sponsored links

qrspec.c (497.86 kB)

Need 3 point
Your Point(s)

Your Point isn't enough.

Get point immediately by PayPal

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more point

LOGIN

Don't have an account? Register now
Need any help?
Mail to: support@codeforge.com

切换到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D